GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man ein Python-Befehlszeilenprogramm dazu bringt, beliebige Dinge automatisch zu vervollständigen, NICHT Interpreter

Verwenden Sie Pythons readline Bindungen. Zum Beispiel

import readline

def completer(text, state):
    options = [i for i in commands if i.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None

readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

Die offizielle Moduldokumentation ist nicht viel detaillierter, siehe die Readline-Dokumentation für weitere Informationen.


Befolgen Sie die cmd-Dokumentation und Sie werden in Ordnung sein

import cmd

addresses = [
    '[email protected]',
    '[email protected]',
    '[email protected]',
]

class MyCmd(cmd.Cmd):
    def do_send(self, line):
        pass

    def complete_send(self, text, line, start_index, end_index):
        if text:
            return [
                address for address in addresses
                if address.startswith(text)
            ]
        else:
            return addresses


if __name__ == '__main__':
    my_cmd = MyCmd()
    my_cmd.cmdloop()

Ausgabe für tab -> tab -> send -> tab -> tab -> f -> tab

(Cmd)
help  send
(Cmd) send
[email protected]            [email protected]         [email protected]
(Cmd) send [email protected]
(Cmd)

Da Sie in Ihrer Frage "NOT Interpreter" sagen, möchten Sie vermutlich keine Antworten mit Python-Readline und dergleichen. (bearbeiten :im Nachhinein ist das offensichtlich nicht der Fall. Ho hm. Ich denke, diese Informationen sind trotzdem interessant, also lasse ich sie hier. )

Ich denke, Sie könnten hinter dem her sein.

Es geht darum, beliebigen Befehlen eine Vervollständigung auf Shell-Ebene hinzuzufügen und die eigene Tab-Vervollständigung von bash zu erweitern.

Kurz gesagt, Sie erstellen eine Datei, die eine Shell-Funktion enthält, die mögliche Vervollständigungen generiert, speichern Sie sie in /etc/bash_completion.d/ und registrieren Sie es mit dem Befehl complete . Hier ist ein Ausschnitt von der verlinkten Seite:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo

In diesem Fall die Eingabe von foo --[TAB] gibt Ihnen die Werte in der Variablen opts , also --help , --verbose und --version . Für Ihre Zwecke sollten Sie im Wesentlichen die Werte anpassen, die in opts eingefügt werden .

Schauen Sie sich das Beispiel auf der verlinkten Seite an, es ist alles ziemlich einfach.


Linux
  1. Wie kann man jedes Programm mit dem Tee-Befehl zum Laufen bringen?

  2. Wie macht man ein Programm überall ausführbar?

  3. Wie mache ich Programm-Autostart nur in Gnome?

  4. Wie bringt man Ibus dazu, ~/.xcompose nicht zu ignorieren?

  5. Python Hello World Beispiel:Wie man ein Python-Programm unter Unix OS schreibt und ausführt

Make-Befehl nicht gefunden? So beheben Sie das Problem

Wie mache ich mein Python-Modul unter Linux systemweit verfügbar?

Zwei Versionen von Python unter Linux. wie man 2.7 zum Standard macht

Datei „readline/readline.h“ nicht gefunden

Wie man Zsh dazu bringt, fehlgeschlagene Befehle nicht zu speichern

Wie mache ich eine Datei NICHT änderbar?