Cómo pegar en una nueva línea con vim?


A menudo tengo que pegar algunas cosas en una nueva línea en vim. Lo que suelo hacer es:

o<Esc>p

Que inserta una nueva línea y me pone en modo de inserción, que sale del modo de inserción, y finalmente pega.

Tres pulsaciones de teclas. No muy eficiente. Mejores ideas?

 100
Author: static_rtti, 2009-08-28

10 answers

Poco después :help p dice:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

Desafortunadamente no es más corto que su solución actual a menos que lo combine con algún mapa de teclado como se sugiere en una respuesta diferente. Por ejemplo, puede asignarlo a cualquier clave (incluso p):

:nmap p :pu<CR>
 51
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-15 16:24:23

Opciones:

1) Use yy para tirar de toda la línea (incluido el carácter de final de línea). p luego pegará la línea en una nueva línea después de la actual y P (Shift-P ) se pegará por encima de la línea actual.

2) Hacer una asignación: entonces es solo una o dos claves:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) La versión de función de la asignación (realmente innecesaria, pero solo para completar):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap
 39
Author: DrAl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-28 12:47:57

Puede pegar un búfer en modo de inserción utilizando <C-R> seguido del nombre del búfer a pegar. El búfer predeterminado es ", por lo que haría

o<C-R>"

Descubrí que uso <C-R>" muy a menudo y lo vinculé a <C-F> en mi vimrc:

inoremap <C-F> <C-R>"
 20
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-10 08:47:18

Esto todavía usa tres pulsaciones de teclas, pero me parece más fácil que Esc:

o<Alt-p>

Dado que estás en modo de inserción después de presionar o, el modificador Alt te permitirá usar un comando como si no lo estuvieras.

 11
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-28 21:34:08

Personalmente he nmapped Enter (CR) así:

nmap <CR> o<Esc>k

...basado en este artículo de Vim Wikia.

De esta manera puedo hacer nuevas líneas directamente desde el modo normal, y combinando esto con querer pegar a una nueva línea a continuación haría:

<CR>jp

También podría omitir k en el nmap anterior, dependiendo de la funcionalidad que prefiera de Enter, por lo que solo sería <CR>p.

También he imapped jj a Esc , que también sería ayudar en este caso. Esc está demasiado lejos de la fila de inicio para lo significativo que es en vim.

No más corto que las otras soluciones, pero creo que se siente menos torpe que algunas de ellas, y tiene otros usos también.

 7
Author: miyalys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 12:06:12

Si está copiando una línea completa y luego pegando una línea completa, use Y para tirar de la línea o líneas, incluido el salto de línea, en primer lugar, y p para pegar. También puede usar V, que es visual line mode, en contraste con plain v para el modo visual.

 3
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-28 12:36:22

Tengo mapeo inoremap jj <ESC>. Por lo tanto, es fácil insertar una nueva línea con ojj y Ojj y luego p.

Así que ojjp pega nueva una nueva línea. tiene un golpe más entonces o<esc>p pero ojjp es fácil para mí.

 2
Author: Natwar Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-10 05:09:45

Encontré una solución elegante para esto. Si está poniendo el registro yank en el portapapeles de su sistema operativo (lo cual es genial de todos modos), con

set clipboard+=unnamed

De lo que puedes hacer o<Ctl-v>.

Además de ser menos trazos, esto mejora tanto en o<Esc>p como en :pu porque conserva la sangría: las otras dos opciones comienzan con el carácter cero en la nueva línea.

La advertencia es que esto puede o no ser dependiente del sistema operativo. Todo lo que sé es que funciona en la versión reciente de OS X, pero el portapapeles es solo una de las muchas maneras de obtener yanqui en el portapapeles del sistema operativo.

 1
Author: enfascination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 17:15:16

Si también desea terminar en modo de inserción, es posible pegar mientras está en modo de inserción utilizando CTRL-R ". https://stackoverflow.com/a/2861909/461834

Todavía tres pulsaciones de tecla, pero no hay escape, y guarda una pulsación de tecla si desea terminar en insertar de todos modos.

 1
Author: jtpereyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 02:13:36

Esta solución solo parece aplicarse cuando el bloque de texto copiado comienza en una nueva línea (a diferencia de agarrar un fragmento de texto en algún lugar dentro de una línea), pero siempre puede comenzar su copia en el último carácter que desea capturar, luego navegue hasta el último carácter al final de la línea antes del inicio de su bloque de copia deseado. Luego, cuando desee pegarlo, coloque el cursor al final de la línea debajo de la cual desea que se pegue su texto y presione p. Si no he jodido el explicación, esto debería proporcionar el efecto que estás buscando.

 0
Author: unbrokenrabbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-20 19:32:08