mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	 6d3dfc3ff2
			
		
	
	
		6d3dfc3ff2
		
	
	
	
	
		
			
			svn+ssh://pythondev@svn.python.org/python/trunk ........ r74074 | georg.brandl | 2009-07-18 05:03:10 -0400 (Sat, 18 Jul 2009) | 1 line #6513: fix example code: warning categories are classes, not instances. ........ r74077 | georg.brandl | 2009-07-18 05:43:40 -0400 (Sat, 18 Jul 2009) | 1 line #6489: fix an ambiguity in getiterator() documentation. ........ r74111 | benjamin.peterson | 2009-07-20 09:30:10 -0400 (Mon, 20 Jul 2009) | 1 line remove docs for deprecated -p option ........ r74188 | benjamin.peterson | 2009-07-23 10:25:31 -0400 (Thu, 23 Jul 2009) | 1 line use bools ........ r74192 | georg.brandl | 2009-07-24 12:28:38 -0400 (Fri, 24 Jul 2009) | 1 line Fix arg types of et#. ........ r74193 | georg.brandl | 2009-07-24 12:46:38 -0400 (Fri, 24 Jul 2009) | 1 line Dont put "void" in signature for nullary functions. ........ r74200 | georg.brandl | 2009-07-25 09:02:15 -0400 (Sat, 25 Jul 2009) | 1 line #6571: add index entries for more operators. ........ r74252 | georg.brandl | 2009-07-29 12:06:31 -0400 (Wed, 29 Jul 2009) | 1 line #6593: fix link targets. ........ r74253 | georg.brandl | 2009-07-29 12:09:17 -0400 (Wed, 29 Jul 2009) | 1 line #6591: add reference to ioctl in fcntl module for platforms other than Windows. ........ r74258 | georg.brandl | 2009-07-29 12:57:05 -0400 (Wed, 29 Jul 2009) | 1 line Add a link to readline, and mention IPython and bpython. ........ r74259 | georg.brandl | 2009-07-29 13:07:21 -0400 (Wed, 29 Jul 2009) | 1 line Fix some markup and small factual glitches found by M. Markert. ........ r74260 | georg.brandl | 2009-07-29 13:15:20 -0400 (Wed, 29 Jul 2009) | 1 line Fix a few markup glitches. ........ r74261 | georg.brandl | 2009-07-29 13:50:25 -0400 (Wed, 29 Jul 2009) | 1 line Rewrite the section about classes a bit; mostly tidbits, and a larger update to the section about "private" variables to reflect the Pythonic consensus better. ........
		
			
				
	
	
		
			177 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			6.6 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=/home/user/.pystartup" in bash.
 | |
|    #
 | |
|    # Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
 | |
|    # full path to your home directory.
 | |
| 
 | |
|    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/
 |