Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 1 | :mod:`readline` --- GNU readline interface |
| 2 | ========================================== |
| 3 | |
| 4 | .. module:: readline |
| 5 | :platform: Unix |
| 6 | :synopsis: GNU readline support for Python. |
Terry Jan Reedy | fa089b9 | 2016-06-11 15:02:54 -0400 | [diff] [blame] | 7 | |
Christian Heimes | 895627f | 2007-12-08 17:28:33 +0000 | [diff] [blame] | 8 | .. sectionauthor:: Skip Montanaro <skip@pobox.com> |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 9 | |
Terry Jan Reedy | fa089b9 | 2016-06-11 15:02:54 -0400 | [diff] [blame] | 10 | -------------- |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 11 | |
| 12 | The :mod:`readline` module defines a number of functions to facilitate |
| 13 | completion and reading/writing of history files from the Python interpreter. |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 14 | This module can be used directly, or via the :mod:`rlcompleter` module, which |
| 15 | supports completion of Python identifiers at the interactive prompt. Settings |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 16 | made using this module affect the behaviour of both the interpreter's |
Georg Brandl | 96593ed | 2007-09-07 14:15:41 +0000 | [diff] [blame] | 17 | interactive prompt and the prompts offered by the built-in :func:`input` |
| 18 | function. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 19 | |
Ezio Melotti | 6e40e27 | 2010-01-04 09:29:10 +0000 | [diff] [blame] | 20 | .. note:: |
Ronald Oussoren | 2efd924 | 2009-09-20 14:53:22 +0000 | [diff] [blame] | 21 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 22 | The underlying Readline library API may be implemented by |
Ronald Oussoren | 2efd924 | 2009-09-20 14:53:22 +0000 | [diff] [blame] | 23 | the ``libedit`` library instead of GNU readline. |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 24 | On MacOS X the :mod:`readline` module detects which library is being used |
| 25 | at run time. |
Ronald Oussoren | 2efd924 | 2009-09-20 14:53:22 +0000 | [diff] [blame] | 26 | |
| 27 | The configuration file for ``libedit`` is different from that |
Georg Brandl | 6faee4e | 2010-09-21 14:48:28 +0000 | [diff] [blame] | 28 | of GNU readline. If you programmatically load configuration strings |
Ronald Oussoren | 2efd924 | 2009-09-20 14:53:22 +0000 | [diff] [blame] | 29 | you can check for the text "libedit" in :const:`readline.__doc__` |
| 30 | to differentiate between GNU readline and libedit. |
| 31 | |
Martin Panter | 553245c | 2016-06-10 00:27:46 +0000 | [diff] [blame] | 32 | Readline keybindings may be configured via an initialization file, typically |
| 33 | ``.inputrc`` in your home directory. See `Readline Init File |
| 34 | <https://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC9>`_ |
| 35 | in the GNU Readline manual for information about the format and |
| 36 | allowable constructs of that file, and the capabilities of the |
| 37 | Readline library in general. |
| 38 | |
Ronald Oussoren | 2efd924 | 2009-09-20 14:53:22 +0000 | [diff] [blame] | 39 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 40 | Init file |
| 41 | --------- |
| 42 | |
| 43 | The following functions relate to the init file and user configuration: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 44 | |
| 45 | |
| 46 | .. function:: parse_and_bind(string) |
| 47 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 48 | Execute the init line provided in the *string* argument. This calls |
| 49 | :c:func:`rl_parse_and_bind` in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 50 | |
| 51 | |
| 52 | .. function:: read_init_file([filename]) |
| 53 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 54 | Execute a readline initialization file. The default filename is the last filename |
| 55 | used. This calls :c:func:`rl_read_init_file` in the underlying library. |
| 56 | |
| 57 | |
| 58 | Line buffer |
| 59 | ----------- |
| 60 | |
| 61 | The following functions operate on the line buffer: |
| 62 | |
| 63 | |
| 64 | .. function:: get_line_buffer() |
| 65 | |
| 66 | Return the current contents of the line buffer (:c:data:`rl_line_buffer` |
| 67 | in the underlying library). |
| 68 | |
| 69 | |
| 70 | .. function:: insert_text(string) |
| 71 | |
| 72 | Insert text into the line buffer at the cursor position. This calls |
| 73 | :c:func:`rl_insert_text` in the underlying library, but ignores |
| 74 | the return value. |
| 75 | |
| 76 | |
| 77 | .. function:: redisplay() |
| 78 | |
| 79 | Change what's displayed on the screen to reflect the current contents of the |
| 80 | line buffer. This calls :c:func:`rl_redisplay` in the underlying library. |
| 81 | |
| 82 | |
| 83 | History file |
| 84 | ------------ |
| 85 | |
| 86 | The following functions operate on a history file: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 87 | |
| 88 | |
| 89 | .. function:: read_history_file([filename]) |
| 90 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 91 | Load a readline history file, and append it to the history list. |
| 92 | The default filename is :file:`~/.history`. This calls |
| 93 | :c:func:`read_history` in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 94 | |
| 95 | |
| 96 | .. function:: write_history_file([filename]) |
| 97 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 98 | Save the history list to a readline history file, overwriting any |
| 99 | existing file. The default filename is :file:`~/.history`. This calls |
| 100 | :c:func:`write_history` in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 101 | |
| 102 | |
Benjamin Peterson | 33f8f15 | 2014-11-26 13:58:16 -0600 | [diff] [blame] | 103 | .. function:: append_history_file(nelements[, filename]) |
| 104 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 105 | Append the last *nelements* items of history to a file. The default filename is |
| 106 | :file:`~/.history`. The file must already exist. This calls |
Martin Panter | 6afbc65 | 2016-06-14 08:45:43 +0000 | [diff] [blame] | 107 | :c:func:`append_history` in the underlying library. This function |
| 108 | only exists if Python was compiled for a version of the library |
| 109 | that supports it. |
Benjamin Peterson | 33f8f15 | 2014-11-26 13:58:16 -0600 | [diff] [blame] | 110 | |
| 111 | .. versionadded:: 3.5 |
| 112 | |
| 113 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 114 | .. function:: get_history_length() |
| 115 | set_history_length(length) |
| 116 | |
| 117 | Set or return the desired number of lines to save in the history file. |
| 118 | The :func:`write_history_file` function uses this value to truncate |
| 119 | the history file, by calling :c:func:`history_truncate_file` in |
| 120 | the underlying library. Negative values imply |
| 121 | unlimited history file size. |
| 122 | |
| 123 | |
| 124 | History list |
| 125 | ------------ |
| 126 | |
| 127 | The following functions operate on a global history list: |
| 128 | |
| 129 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 130 | .. function:: clear_history() |
| 131 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 132 | Clear the current history. This calls :c:func:`clear_history` in the |
| 133 | underlying library. The Python function only exists if Python was |
| 134 | compiled for a version of the library that supports it. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 135 | |
| 136 | |
| 137 | .. function:: get_current_history_length() |
| 138 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 139 | Return the number of items currently in the history. (This is different from |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 140 | :func:`get_history_length`, which returns the maximum number of lines that will |
| 141 | be written to a history file.) |
| 142 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 143 | |
| 144 | .. function:: get_history_item(index) |
| 145 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 146 | Return the current contents of history item at *index*. The item index |
| 147 | is one-based. This calls :c:func:`history_get` in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 148 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 149 | |
| 150 | .. function:: remove_history_item(pos) |
| 151 | |
| 152 | Remove history item specified by its position from the history. |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 153 | The position is zero-based. This calls :c:func:`remove_history` in |
| 154 | the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 155 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 156 | |
| 157 | .. function:: replace_history_item(pos, line) |
| 158 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 159 | Replace history item specified by its position with *line*. |
| 160 | The position is zero-based. This calls :c:func:`replace_history_entry` |
| 161 | in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 162 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 163 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 164 | .. function:: add_history(line) |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 165 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 166 | Append *line* to the history buffer, as if it was the last line typed. |
| 167 | This calls :c:func:`add_history` in the underlying library. |
| 168 | |
| 169 | |
Martin Panter | f0dbf7a | 2016-05-15 01:26:25 +0000 | [diff] [blame] | 170 | .. function:: set_auto_history(enabled) |
| 171 | |
| 172 | Enable or disable automatic calls to :c:func:`add_history` when reading |
| 173 | input via readline. The *enabled* argument should be a Boolean value |
Serhiy Storchaka | 7d6dda4 | 2016-10-19 18:36:51 +0300 | [diff] [blame] | 174 | that when true, enables auto history, and that when false, disables |
Martin Panter | f0dbf7a | 2016-05-15 01:26:25 +0000 | [diff] [blame] | 175 | auto history. |
| 176 | |
| 177 | .. versionadded:: 3.6 |
| 178 | |
| 179 | .. impl-detail:: |
| 180 | Auto history is enabled by default, and changes to this do not persist |
| 181 | across multiple sessions. |
| 182 | |
| 183 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 184 | Startup hooks |
| 185 | ------------- |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 186 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 187 | |
| 188 | .. function:: set_startup_hook([function]) |
| 189 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 190 | Set or remove the function invoked by the :c:data:`rl_startup_hook` |
| 191 | callback of the underlying library. If *function* is specified, it will |
| 192 | be used as the new hook function; if omitted or ``None``, any function |
| 193 | already installed is removed. The hook is called with no |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 194 | arguments just before readline prints the first prompt. |
| 195 | |
| 196 | |
| 197 | .. function:: set_pre_input_hook([function]) |
| 198 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 199 | Set or remove the function invoked by the :c:data:`rl_pre_input_hook` |
| 200 | callback of the underlying library. If *function* is specified, it will |
| 201 | be used as the new hook function; if omitted or ``None``, any |
| 202 | function already installed is removed. The hook is called |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 203 | with no arguments after the first prompt has been printed and just before |
Martin Panter | 6afbc65 | 2016-06-14 08:45:43 +0000 | [diff] [blame] | 204 | readline starts reading input characters. This function only exists |
| 205 | if Python was compiled for a version of the library that supports it. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 206 | |
| 207 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 208 | Completion |
| 209 | ---------- |
| 210 | |
| 211 | The following functions relate to implementing a custom word completion |
| 212 | function. This is typically operated by the Tab key, and can suggest and |
| 213 | automatically complete a word being typed. By default, Readline is set up |
| 214 | to be used by :mod:`rlcompleter` to complete Python identifiers for |
| 215 | the interactive interpreter. If the :mod:`readline` module is to be used |
| 216 | with a custom completer, a different set of word delimiters should be set. |
| 217 | |
| 218 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 219 | .. function:: set_completer([function]) |
| 220 | |
| 221 | Set or remove the completer function. If *function* is specified, it will be |
| 222 | used as the new completer function; if omitted or ``None``, any completer |
| 223 | function already installed is removed. The completer function is called as |
| 224 | ``function(text, state)``, for *state* in ``0``, ``1``, ``2``, ..., until it |
| 225 | returns a non-string value. It should return the next possible completion |
| 226 | starting with *text*. |
| 227 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 228 | The installed completer function is invoked by the *entry_func* callback |
| 229 | passed to :c:func:`rl_completion_matches` in the underlying library. |
| 230 | The *text* string comes from the first parameter to the |
| 231 | :c:data:`rl_attempted_completion_function` callback of the |
| 232 | underlying library. |
| 233 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 234 | |
| 235 | .. function:: get_completer() |
| 236 | |
| 237 | Get the completer function, or ``None`` if no completer function has been set. |
| 238 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 239 | |
Thomas Wouters | 89d996e | 2007-09-08 17:39:28 +0000 | [diff] [blame] | 240 | .. function:: get_completion_type() |
| 241 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 242 | Get the type of completion being attempted. This returns the |
| 243 | :c:data:`rl_completion_type` variable in the underlying library as |
| 244 | an integer. |
Thomas Wouters | 89d996e | 2007-09-08 17:39:28 +0000 | [diff] [blame] | 245 | |
Thomas Wouters | 89d996e | 2007-09-08 17:39:28 +0000 | [diff] [blame] | 246 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 247 | .. function:: get_begidx() |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 248 | get_endidx() |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 249 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 250 | Get the beginning or ending index of the completion scope. |
| 251 | These indexes are the *start* and *end* arguments passed to the |
| 252 | :c:data:`rl_attempted_completion_function` callback of the |
| 253 | underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 254 | |
| 255 | |
| 256 | .. function:: set_completer_delims(string) |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 257 | get_completer_delims() |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 258 | |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 259 | Set or get the word delimiters for completion. These determine the |
| 260 | start of the word to be considered for completion (the completion scope). |
| 261 | These functions access the :c:data:`rl_completer_word_break_characters` |
| 262 | variable in the underlying library. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 263 | |
Georg Brandl | 6554cb9 | 2007-12-02 23:15:43 +0000 | [diff] [blame] | 264 | |
Thomas Wouters | 89d996e | 2007-09-08 17:39:28 +0000 | [diff] [blame] | 265 | .. function:: set_completion_display_matches_hook([function]) |
| 266 | |
| 267 | Set or remove the completion display function. If *function* is |
| 268 | specified, it will be used as the new completion display function; |
| 269 | if omitted or ``None``, any completion display function already |
Martin Panter | 0f76739 | 2016-04-05 07:37:22 +0000 | [diff] [blame] | 270 | installed is removed. This sets or clears the |
| 271 | :c:data:`rl_completion_display_matches_hook` callback in the |
| 272 | underlying library. The completion display function is called as |
Thomas Wouters | 89d996e | 2007-09-08 17:39:28 +0000 | [diff] [blame] | 273 | ``function(substitution, [matches], longest_match_length)`` once |
| 274 | each time matches need to be displayed. |
| 275 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 276 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 277 | .. _readline-example: |
| 278 | |
| 279 | Example |
| 280 | ------- |
| 281 | |
| 282 | The following example demonstrates how to use the :mod:`readline` module's |
| 283 | history reading and writing functions to automatically load and save a history |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 284 | file named :file:`.python_history` from the user's home directory. The code |
| 285 | below would normally be executed automatically during interactive sessions |
| 286 | from the user's :envvar:`PYTHONSTARTUP` file. :: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 287 | |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 288 | import atexit |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 289 | import os |
Georg Brandl | a102ae3 | 2010-10-06 05:08:32 +0000 | [diff] [blame] | 290 | import readline |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 291 | |
| 292 | histfile = os.path.join(os.path.expanduser("~"), ".python_history") |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 293 | try: |
| 294 | readline.read_history_file(histfile) |
Ezio Melotti | 7c018aa | 2016-01-11 23:30:56 +0200 | [diff] [blame] | 295 | # default history len is -1 (infinite), which may grow unruly |
| 296 | readline.set_history_length(1000) |
Antoine Pitrou | 62ab10a0 | 2011-10-12 20:10:51 +0200 | [diff] [blame] | 297 | except FileNotFoundError: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 298 | pass |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 299 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 300 | atexit.register(readline.write_history_file, histfile) |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 301 | |
| 302 | This code is actually automatically run when Python is run in |
| 303 | :ref:`interactive mode <tut-interactive>` (see :ref:`rlcompleter-config`). |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 304 | |
Benjamin Peterson | 33f8f15 | 2014-11-26 13:58:16 -0600 | [diff] [blame] | 305 | The following example achieves the same goal but supports concurrent interactive |
| 306 | sessions, by only appending the new history. :: |
| 307 | |
| 308 | import atexit |
| 309 | import os |
Berker Peksag | 964ec8b | 2015-11-01 00:55:12 +0300 | [diff] [blame] | 310 | import readline |
Benjamin Peterson | 33f8f15 | 2014-11-26 13:58:16 -0600 | [diff] [blame] | 311 | histfile = os.path.join(os.path.expanduser("~"), ".python_history") |
| 312 | |
| 313 | try: |
| 314 | readline.read_history_file(histfile) |
| 315 | h_len = readline.get_history_length() |
| 316 | except FileNotFoundError: |
| 317 | open(histfile, 'wb').close() |
| 318 | h_len = 0 |
| 319 | |
| 320 | def save(prev_h_len, histfile): |
| 321 | new_h_len = readline.get_history_length() |
Ezio Melotti | 7c018aa | 2016-01-11 23:30:56 +0200 | [diff] [blame] | 322 | readline.set_history_length(1000) |
Benjamin Peterson | 33f8f15 | 2014-11-26 13:58:16 -0600 | [diff] [blame] | 323 | readline.append_history_file(new_h_len - prev_h_len, histfile) |
| 324 | atexit.register(save, h_len, histfile) |
| 325 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 326 | The following example extends the :class:`code.InteractiveConsole` class to |
| 327 | support history save/restore. :: |
| 328 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 329 | import atexit |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 330 | import code |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 331 | import os |
Antoine Pitrou | 1a6cb30 | 2013-05-04 20:08:35 +0200 | [diff] [blame] | 332 | import readline |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 333 | |
| 334 | class HistoryConsole(code.InteractiveConsole): |
| 335 | def __init__(self, locals=None, filename="<console>", |
| 336 | histfile=os.path.expanduser("~/.console-history")): |
Georg Brandl | ee8783d | 2009-09-16 16:00:31 +0000 | [diff] [blame] | 337 | code.InteractiveConsole.__init__(self, locals, filename) |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 338 | self.init_history(histfile) |
| 339 | |
| 340 | def init_history(self, histfile): |
| 341 | readline.parse_and_bind("tab: complete") |
| 342 | if hasattr(readline, "read_history_file"): |
| 343 | try: |
| 344 | readline.read_history_file(histfile) |
Antoine Pitrou | 62ab10a0 | 2011-10-12 20:10:51 +0200 | [diff] [blame] | 345 | except FileNotFoundError: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 346 | pass |
| 347 | atexit.register(self.save_history, histfile) |
| 348 | |
| 349 | def save_history(self, histfile): |
Ezio Melotti | 7c018aa | 2016-01-11 23:30:56 +0200 | [diff] [blame] | 350 | readline.set_history_length(1000) |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 351 | readline.write_history_file(histfile) |