GNU/Linux >> Linux Esercitazione >  >> Linux

Come creare un Python, programma da riga di comando che completa automaticamente cose arbitrarie NON interprete

Usa readline di Python attacchi. Ad esempio,

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)

I documenti ufficiali del modulo non sono molto più dettagliati, vedi i documenti readline per maggiori informazioni.


Segui la documentazione cmd e starai bene

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()

Output per tab -> tab -> invia -> tab -> tab -> f -> tab

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

Dato che dici "NON interprete" nella tua domanda, immagino che tu non voglia risposte che coinvolgono python readline e simili. (modifica :col senno di poi, ovviamente non è così. Uhm. Penso che queste informazioni siano comunque interessanti, quindi le lascerò qui. )

Penso che potresti essere alla ricerca di questo.

Si tratta di aggiungere il completamento a livello di shell a comandi arbitrari, estendendo il completamento tramite tabulazione di bash.

In poche parole, creerai un file contenente una funzione shell che genererà possibili completamenti, salvalo in /etc/bash_completion.d/ e registrarlo con il comando complete . Ecco uno snippet dalla pagina collegata:

_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 questo caso, la digitazione foo --[TAB] ti darà i valori nella variabile opts , ovvero --help , --verbose e --version . Per i tuoi scopi, vorrai essenzialmente personalizzare i valori inseriti in opts .

Dai un'occhiata all'esempio nella pagina collegata, è tutto piuttosto semplice.


Linux
  1. Come fa un programma a decidere se avere o meno stampe a colori?

  2. Come fare in modo che Ibus non ignori ~/.xcompose?

  3. Esempio Python Hello World:come scrivere ed eseguire il programma Python su sistema operativo Unix

  4. Cosa uso su Linux per rendere eseguibile un programma Python

  5. Come potrei creare Python da solo dal codice sorgente su Ubuntu?

Fai in modo che il comando non sia stato trovato? Ecco come risolverlo

Come rendere eseguibile un programma da qualsiasi luogo?

Come eseguire l'avvio automatico del programma solo in Gnome?

Come far funzionare uno script Python come un servizio o un demone in Linux

Come terminare un sottoprocesso Python avviato con shell=True

Come aggiungere il supporto readline nell'interprete polyml?