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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top