Cómo insertar una nueva línea sin salir del modo normal


24

Me pregunto si puedo insertar una nueva línea sin salir del modo normal. Por ejemplo, tengo dos líneas:

this is line one
this is line two

Y el cursor está en la línea uno. Ahora quiero una nueva línea entre la línea uno y la línea dos, así:

this is line one

this is line two

Sé que cuando estoy en modo normal, simplemente puedo presionar o. Pero esto entraría en modo de inserción.

¿Cómo puedo insertar una nueva línea como y permanecer en modo normal?


Respuestas:


10

Yo uso un mapeo para eso:

" Quickly insert an empty new line without entering insert mode
    nnoremap <Leader>o o<Esc>
    nnoremap <Leader>O O<Esc>

De esta forma, puede insertar una línea debajo del cursor con <Leader>oy una en la línea anterior con <Leader>O.

Nota: Se podría argumentar que requiere tantas pulsaciones de teclas como, o<Esc>pero esperamos que haya elegido a su líder para facilitar este tipo de mapeo. Además, no estoy seguro de que haya una forma integrada de hacer esto.


8

Una solución que no pasa por el modo de inserción, no mueve el cursor y le permite usar un contador para agregar varias líneas a la vez ( 3\oetc.):

nnoremap <silent> <leader>o :<C-u>call append(line("."),   repeat([""], v:count1))<CR>
nnoremap <silent> <leader>O :<C-u>call append(line(".")-1, repeat([""], v:count1))<CR>

5

Yo personalmente recomiendo usar el plugin intacto de Tim Pope . Proporciona muchas asignaciones, pero las que buscará son [<space>y ]<space>que crean líneas en blanco encima y debajo de la línea actual, respectivamente. Unimpaired también proporciona buenas asignaciones para moverse a través de la lista de soluciones rápidas, la lista de búfer, la alternancia de opciones y muchos otros. Mira :h unimpairedpara más.

Si no desea utilizar un complemento no dañado, pero al igual que las asignaciones a continuación, encontrará algunas asignaciones rápidas para colocar en su ~/.vimrcarchivo:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>

5

Si no desea agregar asignaciones, puede tirar de yyuna línea vacía y luego pegarla pdebajo del cursor y Pencima del cursor.


Esta es probablemente la mejor respuesta sin mapeo.
Willem van Ketwich

O guárdelo en el oregistro con "oyyy péguelo desde allí cuando sea necesario con "op.
mike23

4

Mi mapeo usa Shift-Enter. Se diferencia de los demás en que el cursor se devuelve a la misma línea y columna utilizando la marca o.

" Insert new line above without going into insert mode
" (uses mark o to return to the previous cursor column)
nnoremap <S-Enter> moO<Esc>`o

55
Tenga en cuenta que la asignación <S-Enter>no funciona en emuladores de terminal (solo funciona en gVim). Por lo tanto, deberá elegir una combinación de teclas diferente para
asignarla

2

Esta respuesta de Maxim Kim cambió la vida:

noremap <silent> <space> :exe "normal i".nr2char(getchar())<CR>

y mi riff sobre eso:

noremap <silent> <s-space> :exe "normal a".nr2char(getchar())<CR>

Pon esas líneas en tu vimrc. A continuación, ir al principio de la segunda línea del archivo y de golpe Space, Entero ir hasta el final de la primera línea y de golpe Shift+Space, Enter. Cualquiera agregará la línea vacía entre la primera y la segunda línea, y lo dejará en modo normal.

También puede usarlos para cualquier otra tecla individual: presione Spaceo Shift+Spacesiga la tecla que desee y la insertará o agregará, respectivamente.


2

Estas asignaciones harán exactamente lo que está buscando.

nnoremap <c-n> @="m`o\eg``"<cr>
nnoremap <c-p> @="m`O\eg``"<cr>   

Estos insertan n número de líneas nuevas antes o después del cursor; manteniendo el cursor exactamente donde está, sin cambiar la lista de salto.

Otra solución es crear un acceso directo que llene el registro sin nombre con una nueva línea. Luego puede usar los comandos put, p o P para insertar nuevas líneas. Por ejemplo:

nnoremap "<cr> :let @@="\n"<cr>

1

Mi mapeo para esto

 " Create Blank Newlines and stay in Normal mode
nnoremap <silent> zj o<Esc>k
nnoremap <silent> zk O<Esc>j

Diferente de statox ya que esto mantiene el cursor en la misma ubicación.


que <silent>significa
Alex

Evita hacer eco de cualquier cosa en la línea de estado. Estoy bastante seguro de que no hace nada en este caso específico, estaba allí donde lo copié originalmente, hace mucho tiempo. Ver :h map-silent.
Kevin

-1

Mi solución personal pega un carácter de nueva línea en el registro de expresión y lo pega después de la línea actual, luego vuelve a la posición original:

nnoremap K m`"="\n"<CR>p``
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.