¿Cómo inserto un salto de línea donde está el cursor sin ingresar al modo de inserción en Vim?

88

¿Es posible insertar un salto de línea donde el cursor está en Vim sin ingresar al modo de inserción? Aquí hay un ejemplo ( [x]significa que el cursor está encendido x):

if (some_condition) {[ ]return; }

De vez en cuando, es posible que desee ingresar más código. Entonces presionaría ipara entrar en el modo de inserción, presionaría Enterpara insertar el salto de línea y luego eliminar el espacio extra. A continuación, entraría en modo normal y colocaría el cursor antes de la llave de cierre y luego haría lo mismo para ponerlo en su propia línea.

He estado haciendo esto por un tiempo, pero seguramente hay una mejor manera de hacerlo.

Mark A. Nicolosi
fuente
¿Quieres insertar algo sin entrar en el modo INSERTAR?
Jeremy Cantrell
26
@ jeremy-cantrell Sí, al igual que "J" se une a la siguiente línea e inserta un espacio en blanco sin entrar en el modo INSERT.
awendt

Respuestas:

107

Para el ejemplo que ha dado, podría usar rEnterpara reemplazar un solo carácter (el espacio) con Enter. Luego, fspace.para avanzar al siguiente espacio y repetir el último comando.

Dependiendo de su configuración de sangría automática, lo anterior puede o no sangrar correctamente la declaración de devolución. De lo contrario, utilice sEnterTabEscen su lugar para reemplazar el espacio con una nueva línea, sangrar la línea y salir del modo de inserción. Tendría que reemplazar el segundo espacio con un comando diferente para no poder usar '.' en este caso.

Greg Hewgill
fuente
1
Creo que esta es la solución más sencilla. Gracias Greg.
Mark A. Nicolosi
4
'f [espacio]' debería ser equivalente a 'W' (es decir, pasar al siguiente espacio blanco)
Nathan Fellman
4
'W' mueve un carácter demasiado lejos, se mueve al siguiente carácter después del siguiente espacio en blanco.
Greg Hewgill
1
También puede usar >>y <<para ayudar a sangrar si no desea pasar al modo de inserción con s.
Conner
12

A continuación, se explica cómo crear una macro que inserte una nueva línea en el cursor cada vez que presione 'g' mientras no está en el modo de inserción:

Desde dentro de vim, escriba:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Dónde:

  • [Ctrl + V] significa mantener presionada la tecla Ctrl y presionar 'v'
  • [Enter] significa presionar la tecla Enter
  • [Esc] significa presionar la tecla Esc

Verá lo siguiente en la parte inferior de la ventana de vim hasta que presione la tecla Enter final:

:map g i^M^[

Explicación:

[Ctrl + V] significa "citar el siguiente carácter"; le permite incrustar la nueva línea y los caracteres de escape en el comando.

Entonces estás mapeando la tecla 'g' a la secuencia:

i [Enter] [Escape]

Esto es vim para insertar una nueva línea antes del cursor, luego salir del modo de inserción .

Ajustes:

  • Puede reemplazar la 'g' con cualquier carácter que aún no esté vinculado a un comando que use.
  • Añadir más para el comando, por ejemplo f}i^M^[O - Esto f ind el } y i nsert otra nueva línea, a continuación, salir del modo de inserción y O lápiz una línea vacía para que ingrese más código.
  • Puede agregar el comando a su archivo .vimrc o .exrc para que sea permanente. Simplemente omita los dos puntos desde el principio, por lo que el comando comienza con "mapa"

¡Disfrutar!

Adam Liss
fuente
Respondió la pregunta mal redactada en el tema, en lugar de la del mensaje. Lo que quiere saber es cómo deshacerse fácilmente del espacio en blanco que estaba en el punto donde se rompió la línea pero que ya no sirve para nada.
Aristóteles Pagaltzis
Gracias. Se actualizó la sección "Ajustes" para lograr lo que (creo) solicitó el autor. Cuando lo probé, vi eliminó automáticamente los espacios adicionales por mí; use 'x' para borrarlos si el suyo no lo hace. ¿Y por qué los comandos vi parecen ruido de línea de módem? :-)
Adam Liss
11

Un mapeo simple para romper la línea en el cursor presionando Ctrl + Enter:

:nmap <c-cr> i<cr><Esc>

esencialmente ingresa al modo 'insertar', inserta un salto de línea y vuelve al modo normal.

colóquelo en su archivo .vimrc para uso futuro.

Yariv
fuente
5

Si normalmente expande un bloque de una línea a tres líneas, pruebe con la sustitución. Cambie el soporte de apertura por soporte / retorno y el soporte de cierre por soporte / retorno.

El comando para sustituir corchete / retorno por corchete se ve así:

:s/{/{\r/

Como desea usar esto con frecuencia, puede asignar la secuencia completa a una pulsación de tecla no utilizada como esta:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Donde vea ^ M en la secuencia, escriba [Ctrl-V] , luego presione enter .

Ahora, con el cursor en cualquier lugar de la línea de muestra, presione la tecla asignada y se agregarán los retornos de carro.

Consulte los :help map-which-keysconsejos sobre cómo seleccionar las pulsaciones de teclas no utilizadas para asignar.

oso perezoso
fuente
Por cierto: gno está mapeado porque se usa como clave de 'espacio de nombres' para muchas asignaciones de vim que constan de dos pulsaciones de teclas (ver :h g). Entonces, este mapeo es en realidad un no-go.
Hotschke
¿Existe un buen comando que informe que gya está en uso como clave de 'espacio de nombres'?
slothbear
No en particular. Como dije, :help ges una forma de ver una lista de gasignaciones predeterminadas + algo. z, [ ]son otras claves de 'espacio de nombres', ver p :help index. ej . Puede invocar :verbose map gpara ver todas las asignaciones definidas actuales que comienzan con g. Los recursos web útiles son viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (diapositivas: speakerdeck.com/nelstrom/follow-my -líder )
Hotschke
3

Suponiendo que está de acuerdo con mapear Ka otra cosa (elija una clave diferente de su agrado), y usar un marcador 'como marcador temporal está bien, ¿por qué no hacer esto?

:nmap K m'a<CR><Esc>`'

ahora presionando K en modo normal sobre el carácter después del cual desea que ocurra el salto de línea, se dividirá la línea y dejará el cursor donde estaba.

Mondaugen
fuente
1

Vim eliminará automáticamente cualquier espacio en blanco a la derecha del cursor si divide una línea en dos mientras autoindent(o cualquier otra ayuda de sangría) está habilitado.

Si no desea utilizar cualquiera de estos ajustes, utilice sen lugar de icon el fin de s ubstitute su nuevo texto para el espacio en blanco en lugar de sólo la inserción. (Si hay varios espacios en blanco, coloque el cursor en el extremo izquierdo y utilice cwen su lugar).

Aristóteles Pagaltzis
fuente
1

Básicamente, cuando divide una línea, simplemente desea insertar un retorno de carro, o en el caso de que esté en un espacio, reemplácelo con un retorno de carro. Bueno, ¿por qué conformarse con uno u otro? Aquí está mi mapeo para K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Utilizo el operador ternario para condensar las dos acciones en un mapa de teclas. Desglosarlo <expr>significa que la salida del mapa de teclas puede ser dinámica y, en este caso, depende de la condición, getline('.')[col('.')-1]==' 'que es la forma larga de preguntar a vim si el carácter debajo del cursor es un espacio. Finalmente, el operador ternario familiar ? :reemplaza el espacio con linebreak ( r<CR>) o inserta uno nuevo ( i<CR><Esc>)

Ahora tienes un hermoso mapa de teclas hermanas para el Jcomando.

Ctrl
fuente
Esto es bastante hábil. No estoy seguro de si alguna vez usé K intencionalmente, pero esto podría hacer que valga la pena deshacerse de él o reasignarlo en otro lugar.
dragon788
0

Configure esta asignación de teclas en su vimrc

:map <C-m> i<CR><Esc>h

Luego presione Ctrl + m si desea usarlo en su vim.

Kiddo
fuente
0

En mi humilde opinión, el mapeo incorporado gsno es un mapeo útil (poner vim en reposo), uno podría usar esto para dividir:

nmap gs i<CR><ESC>
Hotschke
fuente
0

En Vrapper , puede usar gql, que dividirá una línea sin ingresar al modo de inserción, pero es posible que no siempre mantenga la sangría.

Janac Meena
fuente
0

De hecho, necesita las siguientes operaciones combinadas:

  1. Presione vpara ingresar al modo visual
  2. Seleccione la línea que desea dividir
  3. Presione :para ingresar al modo de comando
  4. s/\s/\r/g
  5. Hecho
Nathan
fuente
0

Si tiene la entrada:

aaa bbb ccc ddd

y quiero dar salida

aaa
bbb
ccc
ddd

Puedes usar el comando

f r<ENTER>;.;.
Yarden Akin
fuente
0

Descubrí que esta es la implementación más fiel de lo que esperaría que hiciera el comportamiento opuesto J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Hace la nueva línea simplista en el cursor, se ocupa de cualquier espacio en blanco final en la línea anterior si hay alguno presente y luego devuelve el cursor a la posición correcta.

i <cr> <esc> - esta es una de las soluciones más comunes sugeridas, no elimina los caracteres que no son espacios en blanco debajo del cursor, pero también lo deja con espacios en blanco finales

^mw - Ir al inicio de una nueva línea y crear una marca debajo w

gk - sube una línea

:silent! s/\v +$//<cr> - regex reemplaza cualquier espacio en blanco al final de la línea

:noh<cr> - Borre cualquier búsqueda resaltando que la expresión regular podría haberse activado

`w - devolver la marca debajo w

Básicamente combina lo mejor de ambos r<esc><cr>yi<cr><esc>

Nota: Tengo este vínculo al Sque potencialmente sobrescribe una clave útil, pero es un sinónimo de ccy, dado que no lo uso con tanta frecuencia como las divisiones, estoy de acuerdo con sobrescribirlo.

JaredMcAteer
fuente
0

o ESC El comando lo hará por ti.

logbasex
fuente
-1

Este mapeo romperá cualquier función unifilar que tenga. Simplemente coloque el cursor en la línea y presione 'g' en modo normal:

:map g ^f{malr<CR>`a%hr<CR>`a

Esto supone que tiene un espacio después de la riostra de apertura y un espacio antes de la riostra de cierre. Vea si eso funciona para usted.

Lucas Omán
fuente