Ultimo parametro dell'ultimo comando in bash in modalità vi


19

Sono stato convinto (oltre a Stack Overflow) di usare la mia amata bash in modalità vi. Finora mi sono abituato abbastanza bene e mi piace.

Tuttavia mi manca davvero una caratteristica: in modalità emacs, puoi inserire l'ultimo parametro del comando precedente premendo "ESC". (Cioè, premere Esc seguito da.)

Esiste un'associazione predefinita per inserire l'ultimo parametro in modalità vi? Non sono riuscito a trovarne uno e mi manca davvero questo comando ...

Risposte:


9

Non esiste alcun valore predefinito. L'associazione per 'yank-last-arg' (come elencato da 'bind -p') scompare quando si passa alla modalità vi.

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

ti restituirà lo stesso legame (o scegli qualcos'altro)


1
clone per zshbindkey "\e." insert-last-word
jhvaras il

L'ho avuto per anni su zsh e ogni volta che sono costretto a usare bash (ad esempio su un server al lavoro) continuo a dimenticare che non ho mai capito come configurarlo su bash. Non piu! Questo in combinazione con history-search-backwardsè prezioso per gli utenti seri della riga di comando.
Sridhar Sarnobat,

11

C'è (vi-yank-arg), per impostazione predefinita mappato su "_". Questo dovrebbe fare quello che vuoi (in modalità comando).


+1. Non sono sicuro del perché questa risposta non sia stata accettata.
Sathyam,

7

Non esattamente lo stesso, ma in entrambe le modalità è possibile digitare !$e verrà sostituito dall'ultima parola del comando precedente. Trova più cose del genere nel manuale .


Abbastanza vicino da ottenere un voto, ma non esattamente lo stesso ... Mi manca la possibilità di modificare la linea prima di eseguirla. Ma grazie mille comunque!
Mo.

5

Il file ~ / .inputrc può configurare la mappa-chiave (puoi generarla manualmente se non può essere trovata). Aggiungi il seguente comando in ~ / .inputrc :

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

Il mio ~ / .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

Puoi trovare i dettagli su readline e bind -pqui: http://linux.about.com/library/cmd/blcmdl3_readline.htm

E alcune informazioni sulle combinazioni di tasti Vi in bash e nel Cheat Sheet di Editing Readline VI


3

Nel tuo .bashrc, aggiungi questi:

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

Ciò ripristinerà il comportamento predefinito non solo di ESC-punto - ma anche Ctrl-A, Ctrl-E, Ctrl-W e Ctrl-L. Puoi quindi goderti la normale modalità vi bash e usare ancora le scorciatoie che conosci e ami. Se hai bisogno di più azioni, seleziona "man bash" per trovare il nome dell'azione readline di cui hai bisogno (come "clear-screen", "end-of-line", ecc.).


0

È possibile utilizzare $_per fare riferimento all'ultimo argomento del comando precedente.

Gli svantaggi sono:

  1. Non è possibile verificare prima di premere Invio che l'elemento inserito è l'elemento che si desidera inserire.

  2. Se usi PROMPT_COMMAND o una trap DEBUG (non sono sicuro che, esattamente, causi il problema; ho entrambi nel mio .bashrc) per fare cose fantasiose come mettere il comando in esecuzione nel titolo xterm, si bloccherà $_.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.