Último parámetro del último comando en bash en modo vi

19

Me he convencido (en Stack Overflow) de usar mi amado bash en modo vi. Hasta ahora me acostumbré bastante bien y me gusta.

Sin embargo, realmente echo de menos una característica: en el modo emacs, puede ingresar el último parámetro del comando anterior presionando "ESC". (Es decir, presione escape seguido de.)

¿Existe un enlace predeterminado para insertar el último parámetro en modo vi? No pude encontrar uno y realmente extraño este comando ...

Mes.
fuente

Respuestas:

9

No hay defecto. El enlace para 'yank-last-arg' (como aparece en 'bind -p') desaparece cuando cambia al modo vi.

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

te devolverá el mismo enlace (o elegirás otra cosa)

Polsy
fuente
1
clone for zshbindkey "\e." insert-last-word
jhvaras
Lo he tenido durante años en zsh y cada vez que me veo obligado a usar bash (por ejemplo, en un servidor en el trabajo) Me olvido de que nunca descubrí cómo configurarlo en bash. ¡No más! Esto en combinación con history-search-backwardses invaluable para los usuarios serios de la línea de comandos.
Sridhar Sarnobat
11

Hay (vi-yank-arg), por defecto asignado a "_". Eso debería hacer lo que quieras (en modo comando).

Mika Fischer
fuente
+1. No estoy seguro de por qué esta respuesta no fue aceptada.
Sathyam
7

No es exactamente lo mismo, pero en cualquier modo puede escribir !$, y será reemplazado por la última palabra del comando anterior. Encuentra más cosas de este tipo en el manual .

legoscia
fuente
Lo suficientemente cerca como para obtener un voto positivo, pero no exactamente lo mismo ... Echo de menos la posibilidad de editar la línea antes de ejecutarla. Pero muchas gracias de todos modos!
Lun.
5

El archivo ~ / .inputrc puede configurar el mapa de teclas (puede generarlo manualmente si no se puede encontrar). Agregue el siguiente comando en ~ / .inputrc :

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

Mi ~ / .inputrc es:

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

Puede encontrar los detalles sobre readline y bind -paquí: http://linux.about.com/library/cmd/blcmdl3_readline.htm

Y algo de información acerca de las combinaciones de teclas Vi en bash y Readline VI Cheat Mode Cheat Sheet

Marslo
fuente
3

Dentro de su .bashrc, agregue estos:

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

Esto restaurará el comportamiento predeterminado no solo de ESC-dot, sino también de Ctrl-A, Ctrl-E, Ctrl-W y Ctrl-L. Por lo tanto, puede disfrutar del modo vi bash normal y seguir utilizando los accesos directos que conoce y ama. Si necesita más acciones, simplemente marque "man bash" para encontrar el nombre de la acción readline que necesita (como "pantalla clara", "fin de línea", etc.).

ttsiodras
fuente
0

Puede usar $_para referirse al último argumento del comando anterior.

Las desventajas son:

  1. No puede verificar antes de presionar Enter que la cosa insertada es la que pretendía insertar.

  2. Si usa PROMPT_COMMAND o una trampa DEBUG (no estoy seguro de qué causa exactamente el problema; tengo ambas en mi .bashrc) para hacer cosas sofisticadas como poner el comando en ejecución en el título de xterm, se bloqueará $_.

Marius Gedminas
fuente