GNU/Linux >> Tutoriels Linux >  >> Linux

Comment faire un python, un programme de ligne de commande auto-compléte des choses arbitraires NON interpréteur

Utiliser le readline de Python reliures. Par exemple,

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)

La documentation officielle du module n'est pas beaucoup plus détaillée, consultez la documentation readline pour plus d'informations.


Suivez la documentation cmd et tout ira bien

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

Sortie pour tab -> tab -> envoyer -> tab -> tab -> f -> tab

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

Puisque vous dites "PAS interprète" dans votre question, je suppose que vous ne voulez pas de réponses impliquant python readline et autres. (modifier  :avec le recul, ce n'est évidemment pas le cas. Ho hum. Je pense que cette information est intéressante de toute façon, donc je vais la laisser ici. )

Je pense que vous pourriez être après ça.

Il s'agit d'ajouter une complétion au niveau du shell à des commandes arbitraires, en étendant la propre complétion par tabulation de bash.

En un mot, vous allez créer un fichier contenant une fonction shell qui générera des complétions possibles, enregistrez-le dans /etc/bash_completion.d/ et enregistrez-le avec la commande complete . Voici un extrait de la page liée :

_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

Dans ce cas, la saisie foo --[TAB] vous donnera les valeurs dans la variable opts , soit --help , --verbose et --version . Pour vos besoins, vous voudrez essentiellement personnaliser les valeurs qui sont mises dans opts .

Jetez un œil à l'exemple sur la page liée, tout est assez simple.


Linux
  1. Comment faire fonctionner n'importe quel programme avec la commande Tee ?

  2. Comment rendre un programme exécutable de partout ?

  3. Comment faire en sorte qu'Ibus n'ignore pas ~/.xcompose ?

  4. Exemple Python Hello World :comment écrire et exécuter un programme Python sur le système d'exploitation Unix

  5. Comment faire fonctionner un script Python comme un service ou un démon sous Linux

Rendre la commande introuvable ? Voici comment y remédier

Comment faire fonctionner le script Python en tant que service ?

Comment rendre mon module Python disponible sur l'ensemble du système sous Linux ?

Deux versions de python sous Linux. comment faire de 2.7 la valeur par défaut

Comment faire en sorte que Zsh ne stocke pas la commande échouée

Comment rendre un fichier NON modifiable ?