¿Cómo duplicar una línea completa en Vim en Eclipse?

1624

¿Cómo duplico una línea completa en Vim de manera similar a Ctrl+ Den IntelliJ IDEA / Resharper o Ctrl+ Alt+ / en Eclipse ?

sumek
fuente
49
¿La gente ya no ejecuta vimtutor? Esto es probablemente dentro de los primeros cinco minutos de aprender a usar Vim.
dash-tom-bang
131
¿Te gustaría duplicar esta línea? Yes Parrendamiento. :)
Stavr00
3
FWIW He realizado vimtutor una docena de veces en los últimos 2 meses y este concepto no está cubierto. Indica cómo hacer "dd" y "v - navegar - y" seguido de "p". No indica cómo copiar una sola línea sin eliminarla como se solicita aquí.
danielson317

Respuestas:

2768

yyo Ypara copiar la línea (nemotécnica: Y ANK )
o
dda d ELETE de la línea (copias Vim lo que ha eliminado en un portapapeles como "registro", como un corte de operación)

entonces

ppara p astar el texto copiado o eliminado después de la línea actual
o
Ppara p aste el texto copiado o eliminado antes de la línea actual

Mark Biek
fuente
129129
Un excelente punto. Sin embargo, por alguna razón, encuentro que golpear dos veces es más rápido para mí que SHIFT-y
Mark Biek,
25
@camflan Creo que la Y debería ser "copiar desde el cursor hasta el final"
Dzung Nguyen
42
y 2yy se pueden usar para copiar 2 líneas (y para cualquier otra n)
Amir Ali Akbari
55
@nXqd: Sí, un gran porcentaje de usuarios se asigna Ya y$. (De acuerdo con Dy C; (pero no es compatible con Vi (a nadie le importa))) Eso incluso se propone en :help Y.
Aaron Thoma
11
Para copiar dos líneas, es incluso más rápido para ir solo yjo yk, sobre todo porque no doble en un personaje. Además, ykes una versión hacia atrás que 2yyno puede hacer, y puede poner el número de líneas para llegar hacia atrás y9jo y2k, etc. La única diferencia es que su cuenta debe ser n-1para un total de nlíneas, pero su cabeza puede aprender eso de todas formas.
zelk
406

Modo normal: ver otras respuestas.

El ex camino:

  • :t. duplicará la línea,
  • :t 7 lo copiará después de la línea 7,
  • :,+t0copiará la línea actual y la siguiente al comienzo del archivo ( ,+es un sinónimo del rango .,.+1),
  • :1,t$copiará líneas desde el principio hasta la posición del cursor hasta el final ( 1,es sinónimo del rango 1,.).

Si necesita moverse en lugar de copiar, use en :mlugar de :t.

Esto puede ser realmente poderoso si lo combina con :go :v:

  • :v/foo/m$ moverá todas las líneas que no coincidan con el patrón "foo" al final del archivo.
  • :+,$g/^\s*class\s\+\i\+/t.copiará todas las líneas posteriores del formulario class xxxjusto después del cursor.

Referencia: :help range, :help :t, :help :g, :help :my:help :v

Benoit
fuente
1
Cuando presiona :en modo visual, se transforma a '<,'>modo que preselecciona el rango de línea que abarca la selección visual. Entonces, en modo visual, :t0copiará las líneas al principio.
Benoit
1
Para el registro: cuando escribe dos puntos (:) ingresa al modo de línea de comandos donde puede ingresar comandos Ex. vimdoc.sourceforge.net/htmldoc/cmdline.html Los comandos Ex pueden ser realmente potentes y concisos. Las soluciones yyp son comandos de "Modo normal". Si desea copiar / mover / eliminar una línea lejana o un rango de líneas, un comando Ex puede ser mucho más rápido.
Niels Bom
77
No se ha votado negativamente debido a un problema con la respuesta como tal (aunque no funcionaría para mi situación, no tengo idea del número de línea que quiero duplicar) sino porque REALMENTE no debería ser la respuesta superior / aceptada para esto pregunta comúnmente buscada.
mjaggard
99
@mjaggard: las respuestas aceptadas siempre están en la parte superior, independientemente de su puntaje. Sí, agregué esa respuesta como complemento, y parece que se adapta bien al OP.
Benoit
77
:t.es la respuesta exacta a la pregunta
Burak Erdem
294

YPo Ypo yyp.

Linulina
fuente
YSin embargo, generalmente se reasigna a y$(tirar (copiar) hasta el final de la línea (desde la posición actual del cursor, no al principio de la línea)). Con esta línea en .vimrc::nnoremap Y y$
Aaron Thoma
1
No te olvides de pobre viejoyyP
icc97
253

copiar y pegar en vim

¡No hay nada más simple que esto! Desde el modo normal:

yy

luego vaya a la línea en la que desea pegar y

p
Adán
fuente
34
¿Qué usaste para hacer el gif?
Zoltán
44
@ Zoltán puedes usar LiceCap, que es de tamaño pequeño
onmyway133
53

yy

tirará de la línea actual sin eliminarla

dd

borrará la línea actual

p

será putuna línea tomada por cualquiera de los métodos anteriores

pjz
fuente
3
Este llegó primero pero se acepta su duplicado: stackoverflow.com/a/73357/1438029
Geoffrey Hale
44

Hacer esto:

Primero, yycopiar la línea actual y luego ppegar.

Eric Z Beard
fuente
20
No escribas el espacio.
Niels Bom
1
Sí, si el cursor está al final de la línea y escribe el espacio como se muestra, duplicará la línea que tiró 2 líneas debajo de la línea que tiró.
44

Si quieres otra forma:

"ayy: Esto almacenará la línea en el búfer a.

"ap: Esto pondrá el contenido del búfer aen el cursor.

Hay muchas variaciones en esto.

"a5yy: Esto almacenará las 5 líneas en el búfer a.

Consulte " Archivos de ayuda de Vim para más diversión.

Kwondri
fuente
Gracias, usé esto como un enlace: map <Leader> d "ayy" ap
frbl
39

yyp - recuérdalo con "yippee!"

Múltiples líneas con un número en el medio:

y7yp

theschmitzer
fuente
17
7yy es equivalente a y7y y probablemente sea más fácil de recordar cómo hacerlo.
graywh
10
y7yp (o 7yyp) rara vez es útil; el cursor permanece en la primera línea copiada para que p pegue las líneas copiadas entre la primera y la segunda línea de la fuente. Para duplicar un bloque de líneas, use 7yyP
Nefrubyr
@Nefrubyr o :.,.+7 copy .+7: P
DarkWiiPlayer
23

yyp - pegar después

yyP - pegar antes

yemu
fuente
66
Como la línea se está duplicando, el resultado final del contenido es el mismo.
Acumenus
44
@ABB Sin embargo, hay una diferencia en miniatura aquí: en qué línea caerá el cursor.
Mikk
12

Me gusta: Shift+ v(para seleccionar la línea completa de inmediato y permitirle seleccionar otras líneas si lo desea), y, p

Xavier Guihot
fuente
11

También puede probar <Cx> <Cl>, que repetirá la última línea desde el modo de inserción y le traerá una ventana de finalización con todas las líneas. Funciona casi como <Cp>


fuente
Esto es muy útil, pero para evitar tener que presionar muchas teclas, lo he asignado a solo CTRL-L, este es mi mapa: inoremap ^ L ^ X ^ L
Jorge Gajon
11

Otra opción sería ir con:

nmap <C-d> mzyyp`z

le da la ventaja de preservar la posición del cursor.

Torre
fuente
10

Para alguien que no conoce vi, algunas respuestas anteriores pueden confundirlo con frases como "pegar ... después / antes de la línea actual ".
En realidad es "pegar ... después / antes del cursor ".

yyo Ypara copiar la línea
o
ddpara eliminar la línea

entonces

ppara pegar el texto copiado o eliminado después del cursor
o
Ppara pegar el texto copiado o eliminado antes del cursor


Para obtener más enlaces de teclas, puede visitar este sitio: vi Lista completa de enlaces de teclas

Miguel
fuente
3

1 gotcha: cuando usas "p" para poner la línea, la pone después de la línea en la que está el cursor, así que si quieres agregar la línea después de la línea que estás tirando, no muevas el cursor hacia abajo una línea antes de poner la nueva línea.

cori
fuente
44
o use P mayúscula - ponga antes
Ghoti
3

El valor predeterminado es yyp, pero he estado usando este nuevo enlace durante un año más o menos y me encanta:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv

Chris Penner
fuente
3

Sé que llego tarde a la fiesta, pero lo que sea; Tengo esto en mi .vimrc:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

el :copycomando simplemente copia la línea seleccionada o el rango (siempre líneas enteras) debajo del número de línea dado como argumento.

En modo normal, lo que hace es copy . copiar esta línea justo debajo de esta línea .

Y en modo visual se convierte en una '<,'> copy '> copia desde el inicio de la selección hasta el final de la selección hasta la línea debajo del final de la selección .

DarkWiiPlayer
fuente
1
↑↑ mejor respuesta aquí!
2

Para aquellos que comienzan a aprender vi, aquí hay una buena introducción a vi al enumerar los comandos vi lado a lado con el movimiento típico del cursor del editor de la GUI de Windows y las teclas de acceso directo. Enumera todos los comandos básicos, incluidos yy(copiar línea) y p(pegar después) o P(pegar antes).

vi (Vim) para usuarios de Windows

ap-osd
fuente
1

Si desea duplicar una línea y pegarla inmediatamente debajo del me gusta actual, al igual que en Sublime Ctrl+ Shift+ D, puede agregar esto a su .vimrcarchivo.

nmap <S-C-d> <Esc>Yp

O, para el modo Insertar:

imap <S-C-d> <Esc>Ypa

jedi
fuente
Sin embargo, esto deja el modo de inserción, y solo agregar ial final para volver a ingresarlo se rompe undo, por lo que la solución para duplicar líneas en el modo de inserción no es tan trivial como parece.
DarkWiiPlayer
Esto funciona perfectamente bien para mí: imap <S-C-d> <Esc>Ypi modo de inserción y nmap <S-C-d> <Esc>Ypen modo normal
jedi
0

Me gusta usar este mapeo:

:nnoremap yp Yp

porque hace que sea consistente usarlo junto con el YPcomando nativo .

yolenoyer
fuente