Последний параметр последней команды в bash в режиме vi

19

Я был убежден (в переполнении стека) использовать мой любимый bash в режиме vi. До сих пор я достаточно хорошо к этому привык, и мне это нравится.

Однако я действительно упускаю одну особенность: в режиме emacs вы можете ввести последний параметр предыдущей команды, нажав «ESC». (То есть нажмите клавишу escape, а затем.)

Есть ли привязка по умолчанию для вставки последнего параметра в vi-mode? Я не смог найти его и очень скучаю по этой команде ...

Пн.
источник

Ответы:

9

Там нет по умолчанию. Привязка для 'yank-last-arg' (как указано в 'bind -p') исчезает при переключении в режим vi.

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

вернет вам ту же привязку (или выберет что-то еще)

Polsy
источник
1
клон для bindkey "\e." insert-last-word
Zsh
У меня это было годами на zsh, и каждый раз, когда я вынужден использовать bash (например, на сервере на работе), я постоянно забываю, что никогда не понимал, как настроить его на bash. Больше не надо! Это в сочетании с history-search-backwardsнеоценимо для серьезных пользователей командной строки.
Шридхар Сарнобат
11

Есть (vi-yank-arg), по умолчанию сопоставленный с «_». Это должно делать то, что вы хотите (в командном режиме).

Мика Фишер
источник
+1. Я не уверен, почему этот ответ не был принят.
Сатьям
7

Не совсем то же самое, но в любом режиме вы можете ввести !$, и он будет заменен последним словом предыдущей команды. Найти больше таких вещей в руководстве .

legoscia
источник
Достаточно близко, чтобы получить голос, но не совсем то же самое ... Я упускаю возможность отредактировать строку перед ее выполнением. Но все равно большое спасибо!
Пн.
5

~ / .Inputrc файл может настроить ключ-карту (Вы можете создать его с помощью ручной , если он не может быть найден). Добавьте следующую команду в ~ / .inputrc :

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

Мой ~ / .inputrc это:

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

Вы можете найти подробную информацию о readline и bind -pздесь: http://linux.about.com/library/cmd/blcmdl3_readline.htm

И некоторая информация о комбинациях клавиш Vi в bash и в режиме редактирования Readline VI.

Marslo
источник
3

Внутри вашего .bashrc добавьте:

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

Это восстановит поведение по умолчанию не только точки ESC - но также Ctrl-A, Ctrl-E, Ctrl-W и Ctrl-L. Поэтому вы можете наслаждаться обычным bash vi-mode и по-прежнему использовать ярлыки, которые вы знаете и любите. Если вам нужно больше действий, просто отметьте «man bash», чтобы найти название нужного вам действия readline (например, «очистка экрана», «конец строки» и т. Д.).

ttsiodras
источник
0

Вы можете использовать $_для ссылки на последний аргумент предыдущей команды.

Недостатки:

  1. Перед нажатием Enter вы не можете проверить, что вставленная вещь - это та, которую вы намеревались вставить.

  2. Если вы используете PROMPT_COMMAND или ловушку DEBUG (я не уверен, что именно это и вызывает проблему; у меня есть оба в моем .bashrc), чтобы делать причудливые вещи, например помещать команду running в заголовок xterm, это приведет к сбою $_.

Мариус Гедминас
источник