13. Interaktive Eingabe-Bearbeitung und Ersetzung des Verlaufs¶
Einige Versionen des Python-Interpreters unterstützen die Bearbeitung der aktuellen Zeile und die Ersetzung des Verlaufs ähnlich der Möglichkeiten die die Korn-Shell oder die GNU Bash-Shell bieten. Dies wird durch die Benutzung der GNU Readline-Bibliothek implementiert, die eine Bearbeitung im Emacs- oder vi-Stil ermöglicht. Da diese Bibliothek eine eigene Dokumentation hat, wird sie hier nicht neu geschrieben, aber die Grundlagen lassen sich einfach erklären. Die hier beschriebenen Möglichkeiten sind in der Unix- und Cygwin-Version des Interpreters optional vorhanden.
Dieses Kapitel beschäftigt sich weder mit den Bearbeitungsmöglichkeiten, die Mark Hammonds PythonWin-Paket bereitstellt, noch mit denen der auf Tk basierten Entwicklungsumgebung IDLE, die mit Python verteilt wird. Der Kommandozeilen-Rückruf, den es innerhalb der DOS-Boxen unter NT und ein paar anderen DOS- und Windows-Versionen gibt, ist auch eine ganz andere Angelegenheit.
13.1. Zeilenbearbeitung¶
Falls unterstützt, ist die Bearbeitung der Eingabezeile immer dann aktiv, wenn
der Interpreter eine primäre oder sekundäre Eingabeaufforderung ausgibt. Die
aktuelle Zeile kann mit den üblichen Emacs-Steuerzeichen bearbeitet werden. Die
wichtigsten davon sind: Strg-A
bewegt den Cursor zum Anfang der Zeile,
Strg-E
zum Ende. Strg-B
bewegt ihn ein Zeichen nach links,
Strg-F
nach rechts. Strg-K
löscht (“killt”) den Rest der Zeile
rechts vom Cursor, Strg-Y
fügt die zuletzt gelöschten Zeichen wieder ein
(“yankt”). Strg-_
macht die zuletzt getätigte Änderung rückgängig und
kann wiederholt werden, um sie mehrmals auszuführen.
13.2. Ersetzung des Verlaufs¶
Die Ersetzung des Verlaufs funktioniert so: Alle eingetippten, nicht-leeren
Zeilen werden in einem Verlaufspuffer gespeichert. Wird eine neue
Eingabeaufforderung ausgegeben, ist man am Ende dieses Puffers platziert.
Strg-P
bewegt einen eine Zeile im Puffer zurück, Strg-N
eine Zeile
vorwärts. Jede Zeile im Verlaufspuffer kann bearbeitet werden; ein Sternchen vor
der Eingabeaufforderung markiert eine Zeile als geändert. Drückt man die
Enter
-Taste, wird die aktuelle Zeile an den Interpreter übergeben.
Strg-R
startet eine inkrementelle Rückwärtssuche, Strg-S
eine
Vorwärtssuche.
13.3. Tastenkombinationen¶
Die Tastenkombinationen und ein paar andere Parameter der Readline-Bibliothek
können angepasst werden, indem man Befehle in eine Initialisierungsdatei namens
~/.inputrc
schreibt. Tastenkombinationen haben die Form
Tastenname: Funktionsname
oder
"Zeichenkette": Funktionsname
und Optionen können so verändert werden:
set Optionsname Wert
Zum Beispiel:
#Ich bevorzuge den Bearbeitungsstil von vi:
set editing-mode vi
#Auf einer einzelnen Zeile bearbeiten:
set horizontal-scroll-mode On
#Ein paar Tastenkombinationen verändern:
Meta-h: backward-kill-word
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
Beachte, dass in Python die Standardkombination für Tab
das Einfügen
eines Tab
-Zeichens ist, anstatt dem Readline-Standard, die Funktion zum
vervollständigen von Dateinamen. Bestehst du aber darauf, kannst du das mit
Tab: complete
in deiner ~/.inputrc
überschreiben. (Aber natürlich erschwert das das
Schreiben von eingerückten Fortsetzungszeilen, wenn man es gewöhnt ist,
Tab
dafür zu benutzen.)
Automatische Vervollständigung von Variablen- und Modulnamen ist optional verfügbar. Um sie im Interaktiven Modus des Interpreters zu aktivieren, füge folgendes in deine Startup-Datei[#]_ ein:
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
Dies bindet die Tab
-Taste an die Vervollständigungsfunktion, tippt man
sie also zweimal bekommt man Vorschläge zur Vervollständigung; die Funktion
durchsucht die lokalen Variablen und die Namen in verfügbaren Module. Für
Ausdrücke mit Punkten, wie string.a
, wird sie den Ausdruck bis zum letzen
'.'
auswerten und dann Vervollständigungen aus den Attributen des sich
ergebenden Objektes vorschlagen. Beachte, dass dies von der Anwendung
definierten Code ausführen könnte, wenn ein Objekt mit einer
__getattr__`()
-Methode Teil des Ausdrucks ist.
Eine leistungsfähigere Startup-Datei könnte wie das Beispiel aussehen. Beachte,
dass sie die Namen löscht, sobald sie nicht mehr benötigt werden; dies wird
getan, da die Startup-Datei im selben Namensraum wie die interaktiven Befehle
ausgeführt wird und das Entfernen der Namen Nebeneffekte in der interaktiven
Umgebung vermeidet. Du könntest es nützlich finden manche der importierten
Module, wie os
, das in den meisten Interpreter-Sitzungen gebraucht wird,
zu behalten.
# 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
13.4. Alternativen zum Interaktiven Interpreter¶
Diese Möglichkeiten sind ein enormer Schritt vorwärts verglichen mit früheren Versionen des Interpreters, aber ein paar Wünsche sind noch offen: Es wäre nett, wenn die richtige Einrückung bei Fortsetzungszeilen vorgeschlagen würde (der Parser weiss, ob eine Einrückung benötigt wird). Der Vervollständigungsmechanismus könnte die Symbolstabelle des Interpreters nutzen. Und ein Befehl zum Überprüfen von passenden Klammern, Anführungszeichen, usw. (oder sie sogar vorschlägt) wäre auch nützlich.
Ein alternativer erweiterter interaktiver Interpreter, der schon seit einer Weile verfügbar ist, ist IPython. Er bietet Tab Completion, Erkundung von Objekten und eine fortschrittliche Verwaltung der Befehls-Chronik. Er kann komplett angepasst werden und auch in andere Anwendungen eingebettet werden. Eine weitere ähnlich fortschrittliche interaktive Umgebung ist bpython.
Fußnoten
[1] | Python wird beim Starten des Interaktiven Interpreters den Inhalt der
Datei ausführen, die von der Umgebungsvariable PYTHONSTARTUP
angegeben wird. Um Python sogar für den nicht-interaktiven Modus anzupassen,
siehe Die Customization Module. |