web-dev-qa-db-fra.com

Raccourci clavier historique Bash pour! *

Dans Bash, il existe des opérateurs pratiques pour répéter des parties de la dernière commande:

  • !^ passe 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
    
  • !* s'étend à 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, il s'agit d'un sucre syntaxique pour !!:^, !!:$ et !!:*, où !! est un indicateur 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 de Bash ou man bash.)

Celles-ci sont souvent très utiles. Mais cela devient encore plus cool avec les raccourcis clavier:

  • Quand vous frappez Alt+. ou Alt+_, le dernier argument de la commande précédente est inséré dans la commande en cours, comme si vous aviez écrit !$ à ce stade.

  • Il est également possible de frapper Alt+Ctrl+y pour insérer le premier argument de la commande précédente, comme si vous aviez écrit !^ à ce moment-là.

(Voir le bibliothèque GNU Readline Library 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 exister de raccourci qui me permette d’insérer tous les mots de la commande précédente, c’est-à-dire ceux qui font le travail de !*. Au moins je ne pouvais pas le trouver.

Y a-t-il un tel raccourci? Sinon, est-il possible de configurer la bibliothèque readline pour en ajouter une, et comment?

8
Malte Skoruppa

Si vous regardez le résultat de la commande suivante:

bind -l

ou mieux pour:

bind -l | grep arg

vous pouvez voir qu'il n'existe aucune fonction readline pour tous les arguments, comme par exemple yank-last-arg pour le dernier argument, ce qui permet d'insérer le dernier argument dans 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 personne approchée à votre demande ...

Tout d’abord, regardez par exemple le résultat de la commande suivante:

bind -p | grep yank-nth-arg

La sortie est:

"\e\C-y": yank-nth-arg

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 façon, toute ligne de la sortie de la commande bind -p peut être interprétée.

Maintenant, faites attention aux scénarios suivants:

  • Si vous définissez la liaison suivante:

    bind '"\ea": "\e2\e."'
    

    Alt+A sera mappé sur Alt+2Alt+. qui est mappé pour insérer le deuxième argument de la commande précédente. Donc, quand vous appuyez sur Alt+A, l'argument second de la commande précédente est inséré dans la commande en cours.

  • Si vous définissez:

    bind '"\ea": "\e1\e. \e2\e."'
    

    Après quand vous appuyez sur Alt+A, les deux premiers arguments de la commande précédente sont insérés dans la commande en cours. Si le nombre d'arguments de la commande précédente est au maximum de 2, bien sûr tout de la commande précédente est inséré dans la commande en cours.

  • Si vous définissez:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'
    

    Après quand vous appuyez sur Alt+A, les trois premiers arguments de la commande précédente sont insérés dans la commande en cours. Si le nombre d'arguments de la commande précédente est au maximum de 3 (comme dans votre cas), bien sûr tout de la commande précédente est inséré dans la commande en cours. commander.

  • Etc.

Pour les 10 premiers arguments, vous pouvez utiliser:

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

Et je pense que c'est assez long tant que je n'utilise pas trop souvent des commandes avec autant d'arguments.

Pour le rendre persistant, ajoutez la ligne suivante à votre fichier ~/.inputrc:

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

Dans cet exemple j'ai choisi Alt+A pour 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 en remplaçant dans la commande précédente la chaîne \ea.

Ressources:

5
Radu Rădeanu