mirror of
https://github.com/python/cpython.git
synced 2025-11-01 10:45:30 +00:00
Issue #5845: Enable tab-completion in the interactive interpreter by default, thanks to a new sys.__interactivehook__.
(original patch by Éric Araujo)
This commit is contained in:
parent
4c14b5de1c
commit
1a6cb30a34
9 changed files with 143 additions and 165 deletions
|
|
@ -7,140 +7,27 @@ Interactive Input Editing and History Substitution
|
|||
Some versions of the Python interpreter support editing of the current input
|
||||
line and history substitution, similar to facilities found in the Korn shell and
|
||||
the GNU Bash shell. This is implemented using the `GNU Readline`_ library,
|
||||
which supports Emacs-style and vi-style editing. This library has its own
|
||||
documentation which I won't duplicate here; however, the basics are easily
|
||||
explained. The interactive editing and history described here are optionally
|
||||
available in the Unix and Cygwin versions of the interpreter.
|
||||
|
||||
This chapter does *not* document the editing facilities of Mark Hammond's
|
||||
PythonWin package or the Tk-based environment, IDLE, distributed with Python.
|
||||
The command line history recall which operates within DOS boxes on NT and some
|
||||
other DOS and Windows flavors is yet another beast.
|
||||
|
||||
|
||||
.. _tut-lineediting:
|
||||
|
||||
Line Editing
|
||||
============
|
||||
|
||||
If supported, input line editing is active whenever the interpreter prints a
|
||||
primary or secondary prompt. The current line can be edited using the
|
||||
conventional Emacs control characters. The most important of these are:
|
||||
:kbd:`C-A` (Control-A) moves the cursor to the beginning of the line, :kbd:`C-E`
|
||||
to the end, :kbd:`C-B` moves it one position to the left, :kbd:`C-F` to the
|
||||
right. Backspace erases the character to the left of the cursor, :kbd:`C-D` the
|
||||
character to its right. :kbd:`C-K` kills (erases) the rest of the line to the
|
||||
right of the cursor, :kbd:`C-Y` yanks back the last killed string.
|
||||
:kbd:`C-underscore` undoes the last change you made; it can be repeated for
|
||||
cumulative effect.
|
||||
|
||||
|
||||
.. _tut-history:
|
||||
|
||||
History Substitution
|
||||
====================
|
||||
|
||||
History substitution works as follows. All non-empty input lines issued are
|
||||
saved in a history buffer, and when a new prompt is given you are positioned on
|
||||
a new line at the bottom of this buffer. :kbd:`C-P` moves one line up (back) in
|
||||
the history buffer, :kbd:`C-N` moves one down. Any line in the history buffer
|
||||
can be edited; an asterisk appears in front of the prompt to mark a line as
|
||||
modified. Pressing the :kbd:`Return` key passes the current line to the
|
||||
interpreter. :kbd:`C-R` starts an incremental reverse search; :kbd:`C-S` starts
|
||||
a forward search.
|
||||
which supports various styles of editing. This library has its own
|
||||
documentation which we won't duplicate here.
|
||||
|
||||
|
||||
.. _tut-keybindings:
|
||||
|
||||
Key Bindings
|
||||
============
|
||||
Tab Completion and History Editing
|
||||
==================================
|
||||
|
||||
The key bindings and some other parameters of the Readline library can be
|
||||
customized by placing commands in an initialization file called
|
||||
:file:`~/.inputrc`. Key bindings have the form ::
|
||||
|
||||
key-name: function-name
|
||||
|
||||
or ::
|
||||
|
||||
"string": function-name
|
||||
|
||||
and options can be set with ::
|
||||
|
||||
set option-name value
|
||||
|
||||
For example::
|
||||
|
||||
# I prefer vi-style editing:
|
||||
set editing-mode vi
|
||||
|
||||
# Edit using a single line:
|
||||
set horizontal-scroll-mode On
|
||||
|
||||
# Rebind some keys:
|
||||
Meta-h: backward-kill-word
|
||||
"\C-u": universal-argument
|
||||
"\C-x\C-r": re-read-init-file
|
||||
|
||||
Note that the default binding for :kbd:`Tab` in Python is to insert a :kbd:`Tab`
|
||||
character instead of Readline's default filename completion function. If you
|
||||
insist, you can override this by putting ::
|
||||
|
||||
Tab: complete
|
||||
|
||||
in your :file:`~/.inputrc`. (Of course, this makes it harder to type indented
|
||||
continuation lines if you're accustomed to using :kbd:`Tab` for that purpose.)
|
||||
|
||||
.. index::
|
||||
module: rlcompleter
|
||||
module: readline
|
||||
|
||||
Automatic completion of variable and module names is optionally available. To
|
||||
enable it in the interpreter's interactive mode, add the following to your
|
||||
startup file: [#]_ ::
|
||||
|
||||
import rlcompleter, readline
|
||||
readline.parse_and_bind('tab: complete')
|
||||
|
||||
This binds the :kbd:`Tab` key to the completion function, so hitting the
|
||||
:kbd:`Tab` key twice suggests completions; it looks at Python statement names,
|
||||
the current local variables, and the available module names. For dotted
|
||||
expressions such as ``string.a``, it will evaluate the expression up to the
|
||||
final ``'.'`` and then suggest completions from the attributes of the resulting
|
||||
object. Note that this may execute application-defined code if an object with a
|
||||
:meth:`__getattr__` method is part of the expression.
|
||||
|
||||
A more capable startup file might look like this example. Note that this
|
||||
deletes the names it creates once they are no longer needed; this is done since
|
||||
the startup file is executed in the same namespace as the interactive commands,
|
||||
and removing the names avoids creating side effects in the interactive
|
||||
environment. You may find it convenient to keep some of the imported modules,
|
||||
such as :mod:`os`, which turn out to be needed in most sessions with the
|
||||
interpreter. ::
|
||||
|
||||
# Add auto-completion and a stored history file of commands to your Python
|
||||
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
|
||||
# bound to the Esc key by default (you can change it - see readline docs).
|
||||
#
|
||||
# Store the file in ~/.pystartup, and set an environment variable to point
|
||||
# to it: "export PYTHONSTARTUP=~/.pystartup" in bash.
|
||||
|
||||
import atexit
|
||||
import os
|
||||
import readline
|
||||
import rlcompleter
|
||||
|
||||
historyPath = os.path.expanduser("~/.pyhistory")
|
||||
|
||||
def save_history(historyPath=historyPath):
|
||||
import readline
|
||||
readline.write_history_file(historyPath)
|
||||
|
||||
if os.path.exists(historyPath):
|
||||
readline.read_history_file(historyPath)
|
||||
|
||||
atexit.register(save_history)
|
||||
del os, atexit, readline, rlcompleter, save_history, historyPath
|
||||
Completion of variable and module names is
|
||||
:ref:`automatically enabled <rlcompleter-config>` at interpreter startup so
|
||||
that the :kbd:`Tab` key invokes the completion function; it looks at
|
||||
Python statement names, the current local variables, and the available
|
||||
module names. For dotted expressions such as ``string.a``, it will evaluate
|
||||
the expression up to the final ``'.'`` and then suggest completions from
|
||||
the attributes of the resulting object. Note that this may execute
|
||||
application-defined code if an object with a :meth:`__getattr__` method
|
||||
is part of the expression. The default configuration also saves your
|
||||
history into a file named :file:`.python_history` in your user directory.
|
||||
The history will be available again during the next interactive interpreter
|
||||
session.
|
||||
|
||||
|
||||
.. _tut-commentary:
|
||||
|
|
@ -162,14 +49,6 @@ into other applications. Another similar enhanced interactive environment is
|
|||
bpython_.
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] Python will execute the contents of a file identified by the
|
||||
:envvar:`PYTHONSTARTUP` environment variable when you start an interactive
|
||||
interpreter. To customize Python even for non-interactive mode, see
|
||||
:ref:`tut-customize`.
|
||||
|
||||
|
||||
.. _GNU Readline: http://tiswww.case.edu/php/chet/readline/rltop.html
|
||||
.. _IPython: http://ipython.scipy.org/
|
||||
.. _bpython: http://www.bpython-interpreter.org/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue