Tab Completion in Python Command Line Interface - wie Tab Ereignisse fangen
-
20-09-2019 - |
Frage
Ich schreibe ein wenig CLI in Python (als Erweiterung Mercurial) und möchten Tab-Vervollständigung unterstützen. Genauer gesagt, würde ich Rastnasen in der Eingabeaufforderung mag und eine Liste passender Optionen zeigen (wie bash).
Beispiel: Geben Sie Abschnittsnamen:
ext*TAB*
extensions
extras
Das Problem ist, ich bin nicht sicher, wie die Tab Ereignisse zu fangen. Ich bin mit dem ui.prompt()
API von Mercurial, die nur raw_input()
unter der Haube anruft.
Soweit ich weiß, raw_input()
nur kehrt auf ‚Enter‘ und wenn ein Benutzer eine Registerkarte betritt, zurückgegeben die Zeichenfolge einfach eine "\t"
enthält.
Lösung
, die Sie verwenden die readline
Modul.
Einfachstes Code kann denke ich:
import readline
COMMANDS = ['extra', 'extension', 'stuff', 'errors',
'email', 'foobar', 'foo']
def complete(text, state):
for cmd in COMMANDS:
if cmd.startswith(text):
if not state:
return cmd
else:
state -= 1
readline.parse_and_bind("tab: complete")
readline.set_completer(complete)
raw_input('Enter section name: ')
Beispiel Nutzung:
Enter section name: <tab>
email errors extension extra foo foobar stuff
Enter section name: e<tab>
email errors extension extra
Enter section name: ext<tab>
extension extra
Neben der Fertigstellung readline
liefert Ihnen:
- Line Bearbeitung
- KeyBinding Konfiguration (Emacs und vi-Modi enthalten)
- Geschichte (Pfeil nach oben zum vorherige Wert erinnern)
- Geschichte Suchen, Speichern und Laden von
Andere Tipps
Ein ausgezeichnetes Beispiel dafür, wie Tab-Vervollständigung in Zusammenarbeit zu tun mit Readline- in der Standardbibliothek als rlcompleter Modul geliefert wird - kann man nicht es verwendet, wie sie ist (es zur Zeit in dem Python Haupt und builtin definierten anhand von Namen abgeschlossen hat), aber es zeigt, wie die allgemeine Aufgabe zu tun und wie man es Haken bis zu readline
.
Sie sollten an Sicherheit grenzender Wahrscheinlichkeit werden mit dem cmd Modul , die bereits implementiert Tabulatorvervollständigung und so weiter, und wahrscheinlich auch andere Teile von dem, was Sie zu tun versuchen, das readline- Modul und so weiter. Es gibt keinen Grund, das Rad neu zu erfinden.