Dans Bash, il existe des opérateurs pratiques pour répéter des parties de la dernière commande:
!^
se développe au premier argument de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !^ echo one one
!$
se développe jusqu'au dernier argument de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
se développe à tous les arguments de la commande précédente, par exemple,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Pour autant que je sache, ce sont du sucre syntaxique pour !!:^
, !!:$
et !!:*
respectivement, où se !!
trouve un désignateur d'événement qui se développe à la commande précédente, et ^
, $
et *
sont des désignateurs de mots, voir le manuel de référence Bash ou man bash
.)
Ce sont souvent très pratiques. Mais cela devient encore plus cool avec des raccourcis clavier:
Lorsque vous appuyez sur Alt+ .ou Alt+ _, le dernier argument de la commande précédente est inséré dans la commande actuelle, de la même manière que si vous aviez écrit
!$
à ce stade.Il est également possible d'appuyer sur Alt+ Ctrl+ ypour insérer le premier argument de la commande précédente, comme si vous l'aviez écrit
!^
à ce moment-là.
(Voir la bibliothèque GNU Readline ou info readline
.)
J'ai tendance à préférer les raccourcis clavier aux opérateurs d'historique de Bash, car je peux voir ce que j'insère avant d'exécuter la commande. Cependant, il ne semble pas y avoir de raccourci qui me permette d'insérer tous les mots de la commande précédente, c'est-à-dire celui qui fait !*
l'affaire. Au moins, je ne pouvais pas le trouver.
Existe-t-il un tel raccourci? Sinon, est-il possible de configurer la bibliothèque readline pour en ajouter une, et comment?
la source
zsh
, si vous tapezecho !*
et appuyez sur TAB, vous obtenez l'effet souhaité. En général, TAB en ligne de lecture étendra tous les éléments extensibles. Très utile; bash aura probablement une configuration au même effet? @Seth, je pense que c'est la ligne de lecture dans bash, pas l'émulateur de terminal - pas sûr cependant.man bash
(quelque part sur la ligne 3030)\e.
et\e_
sont mappés à la fonction readlineyank-last-arg
et\e\C-y
sont mappés àyank-nth-arg
. Malheureusement, il ne semble pas y avoir de commande (unique) qui ajoute plusieurs arguments précédents à la fois.Réponses:
Si vous regardez la sortie de la commande suivante:
ou mieux pour:
vous pouvez voir qu'il n'existe aucune fonction de ligne de lecture pour tous les arguments comme l'est, par exemple,
yank-last-arg
pour le dernier argument - qui peut insérer le dernier argument à la commande précédente (le dernier mot de l'entrée d'historique précédente). Donc, si une telle fonction n'existe pas, il n'existe probablement pas de raccourci pour accomplir ce que vous souhaitez.Essayons de créer une approche à votre demande ...
Tout d'abord, regardez par exemple la sortie de la commande suivante:
La sortie est:
et peut être traduit comme suit:
yank-nth-arg
(qui insère le premier argument de la commande précédente - avec un argument n, insère le nième argument de la commande précédente) est lié à Alt+ Ctrl+ y.De la même manière peut être interprétée n'importe quelle ligne de la sortie de la
bind -p
commande.Faites maintenant attention aux scénarios suivants:
Si vous définissez la liaison suivante:
Alt+ Asera mappé sur Alt+ 2Alt+ .qui est mappé pour insérer le deuxième argument de la commande précédente. Ainsi, après avoir appuyé sur Alt+ A, le deuxième argument de la commande précédente est inséré dans la commande actuelle.
Si vous définissez:
Après avoir appuyé sur Alt+ A, les deux premiers arguments de la commande précédente sont insérés dans la commande actuelle. Si le nombre d'arguments de la commande précédente est au maximum 2, bien sûr, toute la commande précédente est insérée dans la commande actuelle.
Si vous définissez:
Après avoir appuyé sur Alt+ A, les trois premiers arguments de la commande précédente sont insérés dans la commande actuelle. Si le nombre d'arguments de la commande précédente est au maximum de 3 (comme dans votre cas), bien sûr, toute la commande précédente est insérée dans la commande actuelle.
Etc.
Pour les 10 premiers arguments, vous pouvez utiliser:
Et je pense que c'est assez long dans la mesure où je n'utilise pas trop souvent des commandes avec autant d'arguments.
Pour le rendre persistant, ajoutez la ligne suivante à votre
~/.inputrc
fichier:Dans cet exemple, j'ai choisi Alt+ Apour insérer tous les arguments (si le nombre d'arguments n'est pas supérieur à 10) de la commande précédente, mais vous pouvez choisir n'importe quelle autre combinaison avec en remplaçant dans la commande précédente la
\ea
chaîne.Ressources:
help -m bind
la source
funmap.c
, la fonctionyank-nth-arg
est mappée à la fonction Crl_yank_nth_arg
, qui à son tour est définie danskill.c
. Analogiquement pouryank-last-arg
. Bien sûr, il serait possible d'étendre readline avec une telle fonctionnalité, mais je ne veux pas le faire; Je préfère que ma ligne de lecture soit gérée parapt
, et cette fonctionnalité n'est pas si importante;)