19

I have been convinced (over at Stack Overflow) to use my beloved bash in vi mode. So far I got used to it quite well and I like it.

However I really do miss one feature: In emacs-mode, you can enter the last parameter of the previous command by pressing "ESC ." (That is, press escape followed by the .)

Is there a default binding to insert the last parameter in vi-mode? I wasn't able to find one and I really miss this command...

9

There's no default. The binding for 'yank-last-arg' (as listed by 'bind -p') disappears when you switch to vi mode.

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

will give you that same binding back (or pick something else)

  • 1
    clone for zsh bindkey "\e." insert-last-word – jhvaras Jul 23 '15 at 12:53
  • I've had it for years on zsh and every time I'm forced to use bash (e.g. on a server at work) I keep forgetting I never figured out how to set it up on bash. No more! This in combination with history-search-backwards is invaluable for serious command line users. – Sridhar Sarnobat Sep 12 '17 at 21:11
11

There's (vi-yank-arg), by default mapped to "_". That should do what you want (in command mode).

  • +1. I am not sure why this answer was not accepted. – Sathyam Mar 7 '17 at 15:05
7

Not exactly the same, but in either mode you can type !$, and it will be replaced by the last word of the previous command. Find more such things in the manual.

  • Close enough to get an upvote but not exactly the same... I miss the possibility to edit the line before executing it. But thanks alot anyway! – Mo. Aug 5 '09 at 14:17
5

The ~/.inputrc file can configure the key-map (You can generate it by manual if it cannot be found). Add the following command into the ~/.inputrc:

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

My ~/.inputrc is:

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

You can find the details about readline and bind -p here: http://linux.about.com/library/cmd/blcmdl3_readline.htm

And some information about Vi keyblindings in bash and Readline VI Editing Mode Cheat Sheet

3

Inside your .bashrc, add these:

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

These will restore the default behaviour of not only ESC-dot - but also Ctrl-A, Ctrl-E, Ctrl-W and Ctrl-L. You can therefore enjoy the normal bash vi-mode and still use the shortcuts you know and love. If you need more actions, just check "man bash" to find the name of the readline action you need (like "clear-screen", "end-of-line", etc).

0

You can use $_ to refer to the last argument of the previous command.

The disadvantages are:

  1. You can't verify before pressing Enter that the thing inserted is the thing you intended to insert.

  2. If you use PROMPT_COMMAND or a DEBUG trap (I'm not sure which, exactly, causes the problem; I have both in my .bashrc) to do fancy stuff like put the running command into the xterm title, it will clobber $_.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.