Cómo hacer que [TAB] funcione con argumentos de alias para autocompletar como se puede hacer con el comando real

9

Tengo muchos alias que creé en mi .bash_aliasesarchivo, y son muy útiles, así que si quiero toda la información en un paquete, hago algo como:

allinfo software-center

Y eso hace el equivalente de:

apt-cache show software-center

Como el alias se establece como:

alias allinfo='apt-cache show'

Pero hay una desventaja de esto, actualmente no puedo completar automáticamente TABcuando uso en allinfolugar del comando real. Entonces, me preguntaba si había una manera de superar esta desventaja y lograr que allinfo software-ce[TAB]funcionara de la misma manera que cuando lo usa con el comando real, y no solo haciendo un gran espacio de tabulación.

Estoy usando gnome-terminal.


Información del sistema operativo:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:    15.04
Codename:   vivid

Información del paquete:

gnome-terminal:
  Installed: 3.14.2-0ubuntu3
  Candidate: 3.14.2-0ubuntu3
  Version table:
 *** 3.14.2-0ubuntu3 0
        500 http://gb.archive.ubuntu.com/ubuntu/ vivid/main amd64 Packages
        100 /var/lib/dpkg/status

fuente
Esta es una buena pregunta. Me encanta la idea detrás de esto. He estado buscando por todas partes y he encontrado algunas respuestas cercanas, pero fallan cuando las pruebo. Si se me ocurre algo, te lo haré saber. =)
Terrance

Respuestas:

6

Gran pregunta! Si su allinfocomando era el mismo que solo apt-cache(es decir, sin el show), podríamos ver la finalización apt-cachey aplicarlo a su allinfoalias.

Sin embargo, desea un subconjunto de la apt-cachefinalización, por lo que tenemos un poco más de trabajo por hacer.

Si buscamos en la definición de finalización para apt-cache- in /usr/share/bash-completion/completions/apt-cache, vemos que se utiliza lo siguiente para el showsubcomando:

        COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" 2> /dev/null ) )

- esto solo establece la COMPREPLYvariable en la lista de paquetes coincidentes.

Por lo tanto, podemos tomar prestado esto y escribir nuestra propia función, y vincularlo a su alias allinfo:

# define a function to print the possible completions for
# an allinfo invocation
_allinfo()
{
    _init_completion || return
    COMPREPLY=($(apt-cache --no-generate pkgnames "$cur" 2>/dev/null))
    return 0
}

# bind the above completion function to the 'allinfo' alias
complete -F _allinfo allinfo

Si agrega esa fragmentación a su .bashrcarchivo, debería hacer que las terminaciones funcionen como espera.

Jeremy Kerr
fuente
0

No tengo idea bash, pero funciona con zshalgunos complementos

Instale el z-shell con

sudo apt-get install zsh

y establezca el z-shell como su shell estándar

sudo chsh "$USER" -s $(which zsh)

e iniciar una nueva terminal para usar el z-shell

Añadir Antigen v1

cd
git clone https://github.com/zsh-users/antigen.git

Y configurar

# path to antigen clone
source ~/antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen use oh-my-zsh

# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen bundle git
antigen bundle heroku
antigen bundle pip
antigen bundle lein
antigen bundle command-not-found
antigen bundle zsh-users/zsh-completions src

# Syntax highlighting bundle.
antigen bundle zsh-users/zsh-syntax-highlighting

# Load the theme.
antigen theme robbyrussell
# antigen bundle nojhan/liquidprompt

# Tell antigen that you're done.
antigen apply

Algunas imágenes (el aviso es nojhan / liquidprompt)

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

AB
fuente
Ah, eso solo funciona para mí si hago exactamente lo que tú hiciste, de lo contrario, solo asume que estoy corriendo cdy hago lo de la ruta del archivo. ¿Cómo consigo que lea el .bash_aliasesarchivo?
Intenté instalar esos complementos, pero acabo de comenzar la antigen: command not foundconfiguración.