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.