Último parâmetro do último comando no bash no modo vi

19

Fui convencido (no Stack Overflow) a usar meu amado bash no modo vi. Até agora, eu me acostumei muito bem e gostei.

No entanto, eu realmente sinto falta de um recurso: no modo emacs, você pode inserir o último parâmetro do comando anterior pressionando "ESC". (Ou seja, pressione escape seguido pelo.)

Existe uma ligação padrão para inserir o último parâmetro no modo vi? Não consegui encontrar um e sinto muita falta desse comando ...

Mo.
fonte

Respostas:

9

Não há padrão. A ligação para 'yank-last-arg' (conforme listada por 'bind -p') desaparece quando você alterna para o modo vi.

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

lhe dará a mesma ligação de volta (ou escolher outra coisa)

Polsy
fonte
1
clone para zshbindkey "\e." insert-last-word
jhvaras
Eu tenho isso há anos no zsh e toda vez que sou forçado a usar o bash (por exemplo, em um servidor no trabalho), continuo esquecendo que nunca descobri como configurá-lo no bash. Não mais! Isso, em combinação com, history-search-backwardsé inestimável para usuários sérios da linha de comando.
Sridhar Sarnobat 12/09
11

Há (vi-yank-arg), por padrão, mapeado para "_". Isso deve fazer o que você deseja (no modo de comando).

Mika Fischer
fonte
+1. Não sei por que essa resposta não foi aceita.
Sathyam
7

Não é exatamente o mesmo, mas em qualquer um dos modos você pode digitar !$e será substituído pela última palavra do comando anterior. Encontre mais coisas no manual .

legoscia
fonte
Perto o suficiente para obter um voto positivo, mas não exatamente o mesmo ... Perdi a possibilidade de editar a linha antes de executá-la. Mas muito obrigado mesmo assim!
Mo.
5

O arquivo ~ / .inputrc pode configurar o mapa de chaves (você pode gerá-lo manualmente, se não for encontrado). Adicione o seguinte comando ao ~ / .inputrc :

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

Meu ~ / .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

Você pode encontrar os detalhes sobre o readline e bind -paqui: http://linux.about.com/library/cmd/blcmdl3_readline.htm

E algumas informações sobre os atalhos de teclado do Vi no bash e no Readline VI Editing Cheat Sheet

Marslo
fonte
3

Dentro do seu .bashrc, adicione estes:

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

Isso restaurará o comportamento padrão não apenas do ponto ESC, mas também das teclas Ctrl-A, Ctrl-E, Ctrl-W e Ctrl-L. Portanto, você pode aproveitar o modo viático do bash normal e ainda usar os atalhos que conhece e adora. Se você precisar de mais ações, basta marcar "man bash" para encontrar o nome da ação de linha de leitura necessária (como "tela limpa", "fim de linha" etc.).

ttsiodras
fonte
0

Você pode usar $_para se referir ao último argumento do comando anterior.

As desvantagens são:

  1. Não é possível verificar antes de pressionar Enter que a coisa inserida é a que você pretendia inserir.

  2. Se você usar PROMPT_COMMAND ou uma interceptação DEBUG (não tenho certeza qual, exatamente, causa o problema; eu tenho ambos no meu .bashrc) para fazer coisas sofisticadas, como colocar o comando em execução no título do xterm, ele ficará bloqueado $_.

Marius Gedminas
fonte