GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo hacer que un programa de línea de comandos de python autocompleta cosas arbitrarias NO intérprete

Usa el readline de Python ataduras Por ejemplo,

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)

Los documentos oficiales del módulo no son mucho más detallados, consulte los documentos de línea de lectura para obtener más información.


Siga la documentación de cmd y estará 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()

Salida para pestaña -> pestaña -> enviar -> pestaña -> pestaña -> f -> pestaña

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

Como dice "NO intérprete" en su pregunta, supongo que no quiere respuestas que involucren la línea de lectura de python y cosas por el estilo. (editar :en retrospectiva, obviamente ese no es el caso. Ho hum. Creo que esta información es interesante de todos modos, así que la dejaré aquí. )

Creo que podrías estar buscando esto.

Se trata de agregar finalización a nivel de shell a comandos arbitrarios, extendiendo la finalización de tabulación propia de bash.

En pocas palabras, creará un archivo que contiene una función de shell que generará posibles finalizaciones, guárdelo en /etc/bash_completion.d/ y regístralo con el comando complete . Aquí hay un fragmento de la página vinculada:

_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

En este caso, escribir foo --[TAB] le dará los valores en la variable opts , es decir, --help , --verbose y --version . Para sus propósitos, esencialmente querrá personalizar los valores que se colocan en opts .

Eche un vistazo al ejemplo en la página vinculada, todo es bastante sencillo.


Linux
  1. ¿Cómo hacer que cualquier programa funcione con el comando Tee?

  2. ¿Cómo hacer que un programa sea ejecutable desde cualquier lugar?

  3. ¿Cómo hacer que el programa se inicie automáticamente solo en Gnome?

  4. Cómo hacer que un script de Python se ejecute como un servicio o demonio en Linux

  5. Cómo finalizar un subproceso de python iniciado con shell=True

¿Hacer que el comando no se encuentre? Aquí está cómo solucionarlo

¿Cómo hacer que el script de Python se ejecute como servicio?

¿Cómo hacer que mi módulo Python esté disponible en todo el sistema en Linux?

Dos versiones de python en linux. cómo hacer que 2.7 sea el predeterminado

Archivo 'readline/readline.h' no encontrado

Cómo hacer que Zsh no almacene el comando fallido