9 votos

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

Tengo muchos alias que he creado en mi .bash_aliases y son muy útiles, así que si quiero toda la información de un paquete hago algo como

allinfo software-center

Y eso hace el equivalente a:

apt-cache show software-center

Como el alias se establece como:

alias allinfo='apt-cache show'

Pero esto tiene una desventaja, actualmente no puedo autocompletar con TAB cuando se utiliza allinfo en lugar del comando real. Así que me preguntaba si había una manera de superar esta desventaja y hacer que al hacer allinfo software-ce[TAB] ¿funcionará igual que cuando lo usas con el comando real, y no sólo hará un gran espacio de tabulación?

Estoy usando gnome-terminal .


Información sobre el 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

6voto

tags2k Puntos 11036

Gran pregunta. Si su allinfo era el mismo que el de apt-cache (es decir, sin el show ) entonces podríamos mirar la terminación para apt-cache y aplícalo a tu allinfo alias.

Sin embargo, usted quiere un subconjunto de la apt-cache terminación, así que tenemos un poco más de trabajo que hacer.

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

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

- esto es sólo establecer el COMPREPLY a la lista de paquetes coincidentes.

Por lo tanto, podemos tomar prestado esto y escribir nuestra propia función, y vincularla 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 añade ese fragmento a su .bashrc deberías conseguir que las terminaciones funcionen como esperas.

0voto

A.B. Puntos 44943

No tengo ni idea de bash pero funciona con zsh y algunos plugins

Instalar el z-Shell con

sudo apt-get install zsh

y establece el z-Shell como tu Shell estándar

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

e iniciar una nueva terminal para utilizar el z-Shell

Añadir Antígeno 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 prompt es nojhan/liquidprompt)

enter image description here

enter image description here

enter image description here

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: