mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 03:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. _tut-interacting:
 | 
						|
 | 
						|
**************************************************
 | 
						|
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.
 | 
						|
 | 
						|
 | 
						|
.. _tut-keybindings:
 | 
						|
 | 
						|
Key Bindings
 | 
						|
============
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
.. _tut-commentary:
 | 
						|
 | 
						|
Alternatives to the Interactive Interpreter
 | 
						|
===========================================
 | 
						|
 | 
						|
This facility is an enormous step forward compared to earlier versions of the
 | 
						|
interpreter; however, some wishes are left: It would be nice if the proper
 | 
						|
indentation were suggested on continuation lines (the parser knows if an indent
 | 
						|
token is required next).  The completion mechanism might use the interpreter's
 | 
						|
symbol table.  A command to check (or even suggest) matching parentheses,
 | 
						|
quotes, etc., would also be useful.
 | 
						|
 | 
						|
One alternative enhanced interactive interpreter that has been around for quite
 | 
						|
some time is `IPython`_, which features tab completion, object exploration and
 | 
						|
advanced history management.  It can also be thoroughly customized and embedded
 | 
						|
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.
 | 
						|
 | 
						|
 | 
						|
.. _GNU Readline: http://tiswww.case.edu/php/chet/readline/rltop.html
 | 
						|
.. _IPython: http://ipython.scipy.org/
 | 
						|
.. _bpython: http://www.bpython-interpreter.org/
 |