Haga que el modo de línea de comandos escriba <Esc> y los comandos Ctrl

11

Imagina que quieres citar la palabra a continuación. Si |es la posición del cursor, puede citar fácilmente la palabra cw""<Esc>Pdesde el modo Normal.

|below

Quiero lograr el mismo comportamiento en el modo de línea de comandos. Mi pregunta es cómo puedo decirle al modo de línea de comandos que quiero escribir un <Esc>. Intenté :norm cw""<Esc>Py algunas otras variaciones, pero acabo de obtener en ""<Esc>Plugar de "below".

Aún relacionado con esto, me gustaría saber cómo puedo hacer que el modo de línea de comandos escriba comandos Ctrl. Por ejemplo, podría citar la palabra mencionada con cw"<C-r>""<Esc>. Pero entonces necesitaría la línea de comandos para escribir <C-r>por mí. ¿Cómo puedo hacer esto?

Gonçalo Ribeiro
fuente
1
Al igual que hay <C-x><C-e>en readline para editar la línea de comandos $EDITOR, tiene <C-f>en Vim para abrir la ventana de línea de comandos. Ver :help cmdline-window.
romainl

Respuestas:

11

<C-v>es lo que buscas. Le permite ingresar caracteres literales (p. Ej., Un literal en Esclugar de la cadena "Esc") sin requerir que se escape nada.

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

se muestra como:

:norm cw""^[P

y hará lo que quiera (es decir, cite la palabra). También puede usar esto con otras <C-?>asignaciones. Por ejemplo, su segunda solicitud:

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

se muestra como:

:norm cw"^R""

Y dará como resultado lo mismo que el anterior. No es necesario incluir el extra Escal final.

Zach Ingbretsen
fuente
10

Esto se debe a que las teclas especiales como <Esc>no se traducen en normalcomandos y se tratan como si las hubiera presionado <Esc>. Para remediar esto, puede usar un execcomando. Al igual que:

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

Tenga en cuenta que debe colocar una barra diagonal inversa antes de las comillas y el <Esc>, y el uso de comillas simples en lugar de comillas dobles no funcionará.

Árbol de hoja perenne
fuente
¿Esto también funciona para los comandos Ctrl? ¿Cómo debo escribirlos en el comando?
Gonçalo Ribeiro
Sí, debería funcionar. Puede escribirlos así:"\<C-{insert key}>"
EvergreenTree
2

El modo de línea de comandos es diferente; no puede usar los mismos comandos de edición (modo normal) allí. Puede encontrar una lista de comandos en :help c_CTRL-V.

Ahora, está la ventana de línea de comandos ( :help command-line-window), que se puede ingresar q:desde el modo normal y <C-F>desde el modo de línea de comandos. En esa ventana, puede usar todos los comandos y asignaciones normales, por lo que sería la opción 1.

La opción 2 es mapeos especiales para el modo de línea de comandos. Como dije, no puede usar el enfoque a través de :normalet al. La clave para definirlos es la :help c_CTRL-\_easignación, que "evalúa [s] {expr} y reemplaza [s] toda la línea de comando con el resultado". Aquí hay un ejemplo simple que solo funciona correctamente al final de la línea de comandos:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>
Ingo Karkat
fuente
1
No creo que el OP signifique crear una asignación para la línea de comando, sino ejecutar una asignación desde la línea de comando.
EvergreenTree