web-dev-qa-db-fra.com

Comment puis-je faire en sorte que la complétion de l'onglet bash se comporte comme la complétion de l'onglet vim et parcourir les correspondances correspondantes?

Je voulais trouver une solution pour cela depuis des années.

Je suis tellement plus productif dans vim lors de la manipulation de fichiers que bash pour cette raison.

Si j'ai

file_12390983421
file_12391983421
file_12340983421
file_12390986421

Dans bash et tapez file_1-> tab, il répertorie évidemment:

file_12390983421 file_12391983421 file_12340983421 file_12390986421

Et c'est un ennui horrible et douloureux à travailler.

La même séquence dans vim parcourra les fichiers un par un.

S'il vous plaît, quelqu'un me dit comment faire cela en bash, ou s'il y a un autre Shell qui peut le faire, je changerai demain.

71
pixelearth

Par défaut, TAB est lié à la commande complete readline. Votre comportement souhaité serait menu-complete au lieu. Vous pouvez modifier vos paramètres de lignes de lecture en modifiant ~/.inputrc. Pour relier TAB, ajoutez cette ligne:

TAB: menu-complete

Pour plus de détails, consultez la section READLINE dans man bash.

79
sth

Pour bash> = 4, vous aimerez peut-être ces paramètres:

# If there are multiple matches for completion, Tab should cycle through them

bind 'TAB':menu-complete

# Display a list of the matching files

bind "set show-all-if-ambiguous on"

# Perform partial completion on the first Tab press,
# only start cycling full results on the second Tab press

bind "set menu-complete-display-prefix on"

Cette configuration est similaire à Vim's set wildmode=longest:full:list,full

J'ai extrait ces paramètres de cette question sur le site Unix et Linux.

17
joeytwiddle

Au dessus de

# cycle forward
Control-k: menu-complete
# cycle backward
Control-j: menu-complete-backward

vous pouvez également envisager d'ajouter

# display one column with matches
set completion-display-width 1

De cette façon, vous conservez la fonctionnalité Tab actuelle et faites en sorte que bash affiche les possibilités dans une colonne. Donc au lieu de

file_12340983421 file_12390983421 file_12390986421 file_12391983421

vous obtiendrez

file_12340983421
file_12390983421
file_12390986421
file_12391983421

P.S. Vous pouvez obtenir la bibliothèque readline à jour à partir de ce site Web The GNU Readline Library .

14
Johnny Baloney

Grâce à @sth, j'ai trouvé ce qui fonctionne le mieux pour moi:

Pour conserver l'achèvement normal de l'onglet bash, puis utilisez ctl-f pour faire défiler lorsque cela est nécessaire à l'aide de menu-complete

mettez ceci dans votre fichier .inputrc:

"\C-f": menu-complete
6
pixelearth

D'après mon expérience, la solution fournie dans la réponse de sth n'a jamais complètement fonctionné pour moi. TL; DR: Ajoutez set -o vi à ton ~/.bashrc.

Lorsque j'utilise menu-complete en conjonction avec des raccourcis clavier vi, je dois m'assurer que mon ~/.bashrc a:

set -o vi

Ça n'a jamais été suffisant pour mon ~/.inputrc juste pour avoir:

TAB: menu-complete

set editing-mode vi
set keymap vi

Je suppose que d'une manière ou d'une autre set editing-mode et set keymap secouent le TAB: ... paramètre, mais je n'ai pas examiné la documentation à fond pour comprendre pourquoi c'est le cas.

0
jez