Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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...

share|improve this question

7 Answers 7

up vote 7 down vote accepted

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)

share|improve this answer
    
Thanks... guess, I'll have to rebind it then –  Mo. Aug 5 '09 at 14:27

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.

share|improve this answer
    
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

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

share|improve this answer

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).

share|improve this answer

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

share|improve this answer

here is a good list of special bash parameter . I found this while searching meaning of $@.

share|improve this answer

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 $_.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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