2009-02-03 18 views
0

Question: J'ai une question qui est apparently not answered by this already-asked Bash completion question sur Stack Overflow. La question est, comment obtenir l'achèvement d'alias Bash (pour n'importe quel alias) sur une sous-chaîne partielle.De combien de façons puis-je obtenir l'achèvement d'alias Bash sur une sous-chaîne partielle?

Exemple: Par exemple, supposons que je les alias suivants:

open.alicehome="cd /usr/home/alice" 
open.bakerhome="cd /usr/home/baker" 
open.charliehome="cd /usr/home/charlie" 
gohomenow="shutdown -now" 

Je voudrais saisir paresseusement juste "boulanger {{TAB}}" pour invoquer le second alias.

Je voudrais paresseusement taper "home {{TAB}}" pour obtenir une liste de tous les alias ci-dessus que je peux ensuite choisir avec le clavier (optimal) ou choisir en tapant une sous-chaîne non ambiguë qui distingue parmi les trois options (moins qu'optimales).

.. OU ..

Je voudrais saisir paresseusement juste « maison », puis appuyez plusieurs fois sur {{TAB}} jusqu'à ce que l'alias spécifique que je veux apparaît, puis appuyez sur {{}} ENTRER pour exécuter il.

Ne hésitez pas à faire preuve de créativité: Si vous avez une façon de faire, même si elle nécessite le recours à carriole extrême gourou, s'il vous plaît ne hésitez pas à partager et ne hésitez pas à expliquer votre carriole gourou au niveau de un enfant de cinq ans qui devra essayer de mettre en œuvre son idée pour lui-même.

Les liens vers des pages Web existantes ou des RTFM sont les bienvenus.

Répondre

1

Vous pouvez générer les correspondances pour une sous-chaîne spécifiée avec compgen -c -X'!*substring*'

Pour inclure dans autocomplétion bash, vous pouvez créer un fichier .bash_completion dans votre répertoire contenant quelque chose comme ceci:

_comp() { 
    local cur 

    cur=${COMP_WORDS[$COMP_CWORD]} 

    COMPREPLY=($(compgen -c -X '!*'$cur'*')) 

} 
complete -F _comp $nospace eval 

Ce match fonction s'exécutera lorsque vous appuyez sur <TAB> sur les arguments de la commande eval.Je n'ai pas trouvé un moyen d'inclure une nouvelle fonction de correspondance pour la première recherche de commande dans bash, j'ai seulement trouvé la documentation sur la façon d'ajouter des compléments personnalisés pour une commande spécifique, comme eval ci-dessus.

Mais je suis un peu sceptique quant à son utilité ... Il n'y a aucun moyen facile de sélectionner la correspondance que vous voulez dans la liste.

1

Probablement, vous pouvez réaliser ce que vous voulez avec les paramètres personnalisés de complétion de bash_, mais je ne vais pas faire le travail pour vous, d'accord? :-)

Si vous ne savez pas de quoi je parle, voyez here et here pour plus de détails. Soit dit en passant, je trouverais très ennuyeux cette

Je voudrais simplement saisir paresseusement « maison », puis appuyez plusieurs fois sur {{TAB}} jusqu'à ce que l'alias spécifique I besoin apparaît, puis appuyez sur { {ENTER}} à l'exécuter.

que je pense est le M $ style de "fin" (vous venez pour l'environnement DOS/Windows?)

+0

Vérifiez les glaçons EMACS, il le fait. – dreftymac

2

Si vous voulez vraiment changer le comportement de l'onglet de bash,

# ~/.inputrc 
# The default binding for [Tab] is ``complete'', which is what we're used to. 
# ``menu-complete'' gives you irssi-like behavior: cycle through completions. 
"\t": menu-complete 

Ceci est documenté dans The GNU Readline Library # Letting Readline Type For You.