Crea i comandi <Esc> e Ctrl in modalità riga di comando


11

Immagina di voler citare la parola qui sotto. Se |è la posizione del cursore, puoi facilmente citare la parola con cw""<Esc>Pdalla modalità Normale.

|below

Voglio ottenere lo stesso comportamento in modalità riga di comando. La mia domanda è come posso dire alla modalità da riga di comando che voglio digitare un <Esc>. Ho provato :norm cw""<Esc>Pe alcune altre varianti, ma ho appena ricevuto ""<Esc>Pinvece di "below".

Ancora collegato a questo, vorrei sapere come posso creare comandi Ctrl di tipo modalità riga di comando. Ad esempio, potrei invece citare la suddetta parola con cw"<C-r>""<Esc>. Ma poi avrei bisogno della riga di comando per digitare <C-r>per me. Come posso fare questo?


1
Proprio come c'è <C-x><C-e>in readline per modificare la riga di comando $EDITOR, hai <C-f>in Vim per aprire la finestra della riga di comando. Vedere :help cmdline-window.
rom

Risposte:


11

<C-v>è quello che stai cercando. Ti permette di inserire caratteri letterali (es. Un letterale Escinvece della stringa "Esc") senza che ti debba sfuggire nulla.

:norm cw""<C-v><Esc>P

viene visualizzato come:

:norm cw""^[P

e farà quello che vuoi (es. cita la parola). Puoi anche usarlo con altri <C-?>mapping. Ad esempio, la tua seconda richiesta:

:norm cw"<C-v><C-r>""

viene visualizzato come:

:norm cw"^R""

E risulterà lo stesso di quanto sopra. Non è necessario includere extra Escalla fine.


10

Questo perché tasti speciali come <Esc>non vengono tradotti in normalcomandi e vengono trattati come se fosse stato premuto <Esc>. Per rimediare a questo, puoi usare un execcomando. Così:

:exec "norm cw\"\"\<Esc>P"

Si noti che è necessario inserire una barra rovesciata prima delle virgolette e il <Esc>, e l'utilizzo di virgolette singole anziché doppie non funzionerà.


Funziona anche con i comandi Ctrl? Come devo scriverli nel comando?
Gonçalo Ribeiro,

Sì, dovrebbe funzionare. Puoi scriverli in questo modo:"\<C-{insert key}>"
EvergreenTree

2

La modalità riga di comando è diversa; non è possibile utilizzare gli stessi comandi di modifica (modalità normale) lì. Puoi trovare un elenco di comandi su :help c_CTRL-V.

Ora c'è la finestra della riga di comando ( :help command-line-window), che può essere inserita q:dalla modalità normale e <C-F>dalla riga di comando. In quella finestra, puoi usare tutti i normali comandi e mappature, in modo che sia l'opzione 1.

L'opzione 2 è mappature speciali per la modalità riga di comando. Come ho detto, non è possibile utilizzare l'approccio via :normalet al. La chiave per definirli è la :help c_CTRL-\_emappatura, che "valuta [s] {expr} e sostituisce [s] l'intera riga di comando con il risultato." Ecco un semplice esempio che funziona correttamente solo alla fine della riga di comando:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>

1
Non penso che l'OP intendesse creare una mappatura per la riga di comando, ma per eseguire una mappatura dalla riga di comando.
EvergreenTree
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.