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

144

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

o<Esc>p

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

Tres pulsaciones de teclas. No muy eficiente ¿Alguna idea mejor?

static_rtti
fuente
8
3 pulsaciones de teclas no es eficiente?
gtd
6060
1 o 2 sería mejor :) ¿Por qué usar vim si no fuera por la máxima eficiencia?
static_rtti
2
También da como resultado una nueva línea adicional si el contenido copiado termina en una nueva línea.
Jonathan W.
1
@gtd Un editor normal funciona con <Enter> <CV>. Dos pulsaciones de teclas.
user4052054
1
@ user4052054 no, eso no hace lo mismo, o / O funciona donde sea que esté en la línea, en un editor normal primero debe llegar al principio o al final de la línea. Además, si está copiando una línea completa, entonces todo se convierte en una pulsación de tecla para insertar una línea, que es una propuesta mucho más común en la codificación.
GMT

Respuestas:

71

Poco después :help pdice:

:[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).

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

:nmap p :pu<CR>
Bombe
fuente
2
Lo sé y lo uso, pero no es lo que pregunto, porque a veces lo que estás copiando simplemente no tiene LF. Si hubiera un comando "pegar en una nueva línea", funcionaría independientemente del contenido que está a punto de pegar, por lo que no tendría que pensarlo.
static_rtti
55
Bien, :pu[t]colocará el texto en una nueva línea después de la línea actual, :pu[t]!colocará el texto en una nueva línea antes de la línea actual. Editaré mi respuesta en consecuencia. (Hurra por :help p.)
Bombe
2
No es realmente mejor que mi solución actual, pero creo que es la mejor respuesta a mi pregunta.
static_rtti
44
Si bien la misma cantidad de pulsaciones de teclas, creo que esto se siente más eficiente. o <Esc> p se siente torpe, mientras que esto no.
Mark Story
2
Puede asignar el comando a cualquier tecla, incluida la propia p: :nmap p :pu<CR>póngala en su archivo .vimrc y listo :)
Capi Etheriel
55

Opciones:

1) Use yypara tirar de la línea completa (incluido el carácter de final de línea). pluego pegará la línea en una nueva línea después de la actual y P( Shift- P) pegará sobre la línea actual.

2) Haz un mapeo: entonces solo son una o dos claves:

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

3) La versión funcional 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
DrAl
fuente
2
Bueno, supongo que haré un mapeo. Solo esperaba que pudiera haber una solución estándar: - / ¡Gracias por su respuesta!
static_rtti
2
@AI: El uso de ', p' (',' se asigna como mi <Leader>) es la mejor solución en mi opinión. Incluso proporcionó una función fácil de usar. :) ¡Excelente!
Alguien todavía te usa MS-DOS
30

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

o<C-R>"

Descubrí que lo uso con <C-R>"mucha frecuencia y lo <C-F>vinculé a mi vimrc:

inoremap <C-F> <C-R>"
soulmerge
fuente
2
Esto es genial porque mantiene la sangría correcta si la línea copiada no fue sangrada.
CornSmith
24

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

o<Alt-p>

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

Mella
fuente
2
Muy práctico cuando intentas el tirón que cortas dentro de la línea con "d $" en una nueva línea
Serhat Cevikel
Lo sentimos, pero esto no mantiene la sangría, sino que se pega al comienzo de la línea.
Michael Goldshteyn
¿Alguien puede elaborar este método para mac (sin alt)?
Li haonan
@Lihaonan Su pregunta es de hace 8 meses, espero que ya haya visto stackoverflow.com/q/7501092/5407634
m_mlvx
12

Usando este complemento: https://github.com/tpope/vim-unimpaired

]ppastas en la línea de abajo

[ppastas en la línea de arriba

ventajas:

  • funciona en todo el texto arrancado (palabra, línea, carácter, etc.)
  • sangra el texto pegado para que coincida con la sangría del texto que lo rodea
  • 2 pulsaciones de teclas en lugar de 3 y pulsaciones mucho "más fáciles"
  • rápido
crogers
fuente
1
Mi favorito también Vale la pena mencionar que necesitas tpope/vim-unimpairedque esto funcione 😉.
alextes
1
Ah, lo instalé hace tanto tiempo que lo olvidé. ¡Gracias por el recordatorio!
crogers
9

Personalmente, he mapeado Enter (CR) de esta manera:

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 en una nueva línea a continuación, haría:

<CR>jp

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

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

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

miyalys
fuente
5

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

Peter
fuente
3
El problema es que a veces simplemente no quieres copiar una línea completa ... Me gustaría una solución que funcione si he copiado diez líneas o dos palabras.
static_rtti
3

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

así que ojjppegue una nueva línea nueva. tiene un golpe más, o<esc>ppero ojjpes fácil para mí.

Natwar Singh
fuente
2

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

set clipboard+=unnamed

de lo que puede hacer o<Ctl-v>.

Además de tener menos trazos, esto mejora en ambos o<Esc>py :puporque conserva la sangría: las otras dos opciones comienzan en el carácter cero en la nueva línea.

La advertencia es que esto puede o no depender del sistema operativo. Todo lo que sé es que funciona en una versión reciente de OS X, pero el portapapeles es solo una de las muchas formas de obtener un tirón en el portapapeles del sistema operativo.

enfascination
fuente
1

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

Todavía hay tres pulsaciones de teclas, pero no hay escape, y guarda una pulsación de tecla si desea finalizar la inserción de todos modos.

jtpereyda
fuente
1

Utilizo la siguiente asignación en mi configuración de Neovim:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Una pequeña explicación:

  • m`: establece una marca en la posición actual del cursor.
  • o<Esc>p: cree una nueva línea a continuación y pegue el texto en esta línea
  • O<Esc>P: cree una nueva línea arriba y pegue el texto en esta línea
  • ``: coloca el cursor en la posición original

Consulte :h markpara obtener más información sobre las marcas en Vim.

jdhao
fuente
1

Si desea permanecer en el modo de inserción, puede hacer o ctrl+o p

  • o - Insertar modo e ir a la nueva línea
  • ctrl+o - ejecuta un solo comando como en modo normal
  • p - pegar

Son tres pulsaciones de teclas, pero usted permanece en modo de inserción y también o ctrl+oes bastante rápido, así que personalmente lo trato como 2.5 pulsaciones de teclas.

Reconocer
fuente
0

Esta solución solo parece aplicarse cuando el bloque de texto copiado comienza en una nueva línea (en lugar de tomar 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 tomar, luego navegar hasta el último carácter al final de la línea antes del inicio del bloque de copia deseado. Luego, cuando desee pegarlo, coloque el cursor al final de la línea debajo de la cual desea pegar el texto y presione p. Si no he estropeado la explicación, esto debería proporcionar el efecto que estás buscando.

conejo roto
fuente