Dernier paramètre de la dernière commande dans bash en vi-mode

19

J'ai été convaincu (sur Stack Overflow) d'utiliser ma bien-aimée bash en mode vi. Jusqu'à présent, je m'y suis bien habitué et j'aime ça.

Cependant, je manque vraiment une fonctionnalité: en mode emacs, vous pouvez entrer le dernier paramètre de la commande précédente en appuyant sur "ESC". (Autrement dit, appuyez sur Échap puis sur.)

Existe-t-il une liaison par défaut pour insérer le dernier paramètre en vi-mode? Je n'ai pas pu en trouver et je manque vraiment cette commande ...

Mo.
la source

Réponses:

9

Il n'y a pas de défaut. La liaison pour 'yank-last-arg' (comme indiqué par 'bind -p') disparaît lorsque vous passez en mode vi.

bind '"\e."':yank-last-arg

vous donnera la même reliure (ou choisissez autre chose)

Polsy
la source
1
clone for zshbindkey "\e." insert-last-word
jhvaras
Je l'ai depuis des années sur zsh et chaque fois que je suis obligé d'utiliser bash (par exemple sur un serveur au travail), j'oublie toujours que je n'ai jamais compris comment le configurer sur bash. Pas plus! Ceci en combinaison avec history-search-backwardsest inestimable pour les utilisateurs sérieux de la ligne de commande.
Sridhar Sarnobat
11

Il y a (vi-yank-arg), par défaut mappé sur "_". Cela devrait faire ce que vous voulez (en mode commande).

Mika Fischer
la source
+1. Je ne sais pas pourquoi cette réponse n'a pas été acceptée.
Sathyam
7

Pas exactement la même chose, mais dans les deux modes, vous pouvez taper !$, et il sera remplacé par le dernier mot de la commande précédente. Trouvez plus de ces choses dans le manuel .

legoscia
la source
Assez proche pour obtenir un upvote mais pas exactement le même ... Je manque la possibilité de modifier la ligne avant de l'exécuter. Mais merci beaucoup quand même!
Mo
5

Le fichier ~ / .inputrc peut configurer le key-map (vous pouvez le générer manuellement s'il est introuvable). Ajoutez la commande suivante dans le ~ / .inputrc :

"\e.": yank-last-arg
"\e_": yank-last-arg

Mon ~ / .inputrc est:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

"\e.": yank-last-arg
"\e_": yank-last-arg

Vous pouvez trouver les détails sur readline et bind -pici: http://linux.about.com/library/cmd/blcmdl3_readline.htm

Et quelques informations sur les keyblindings Vi dans bash et Readline VI Editing Mode Cheat Sheet

Marslo
la source
3

Dans votre .bashrc, ajoutez-les:

set -o vi
bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

Ceux-ci restaureront le comportement par défaut non seulement de ESC-dot - mais également de Ctrl-A, Ctrl-E, Ctrl-W et Ctrl-L. Vous pouvez donc profiter du mode vi bash normal et toujours utiliser les raccourcis que vous connaissez et aimez. Si vous avez besoin de plus d'actions, cochez simplement "man bash" pour trouver le nom de l'action readline dont vous avez besoin (comme "clear-screen", "end-of-line", etc.).

ttsiodras
la source
0

Vous pouvez utiliser $_pour faire référence au dernier argument de la commande précédente.

Les inconvénients sont:

  1. Vous ne pouvez pas vérifier avant d'appuyer sur Entrée que la chose insérée est celle que vous vouliez insérer.

  2. Si vous utilisez PROMPT_COMMAND ou un piège DEBUG (je ne sais pas exactement ce qui cause le problème; j'ai les deux dans mon .bashrc) pour faire des trucs fantaisistes comme mettre la commande en cours d'exécution dans le titre xterm, cela clobbera $_.

Marius Gedminas
la source