2012-02-21 10 views
40

El comando p se pega debajo del cursor y P se pega sobre el cursor. ¿Cuál es el comando para pegar en la línea donde está el cursor?¿Cómo pegar en la línea donde está el cursor?

+0

Relacionados: [¿Cómo pegar antes del cursor después de seleccionar un bloque vertical?] (Http://stackoverflow.com/q/4073731/55075) – kenorb

Respuesta

29

Todo esto depende del tipo de datos en el registro que está pegando. Si los datos están orientados a la línea (por ejemplo, con yy), se pegarán como una línea completa encima o debajo del cursor. Si los datos están orientados a caracteres (tirados con, por ejemplo, yw), se pegarán en la posición anterior del cursor en la línea actual.

Consulte :help linewise-register para obtener más información sobre la interacción entre el tipo de registro y el comando poner.

+0

Copiar una palabra está bien. Pero estoy hablando solo de líneas. Eso significa que una línea no puede ser copiada y pegada al final de otra línea en Vim. ¿No es así? – Kitcha

+5

@Kitcha - Obtenga más información acerca de la copia en línea y en caracteres. Puede copiar una línea de la manera que desee si la retiró de una manera característica, por ejemplo, '0y $' en lugar de la línea 'yy'. 'p' o' P' se pegarán en la línea actual o en una línea diferente dependiendo de si el tirón fue característico (se pega en la línea actual) o en línea (se pega en la línea arriba o abajo). –

+5

Si te encuentras comúnmente queriendo "lanzar" 'p' /' P', es posible que desees echar un vistazo a UnconditionalPaste de Ingo Karkat. http://www.vim.org/scripts/script.php?script_id=3355 –

0

No estoy seguro de que haya una. He intentado encontrar documentación y corrió a través de los tres documentos siguientes:

Desafortunadamente, los tres sólo se tienen los dos comandos que usted lista. En particular, el tercer enlace establece que The commands to paste are p and P...

+0

Tiene razón. Pensé que hay algo que no sé. – Kitcha

+0

No, mira esta respuesta: http://stackoverflow.com/a/9383985/11621 –

11

El Editar menú en gvim enumera los siguientes:

  • Pega = "+gP

  • Put Antes = [p

  • Ponga Después = ]p

Si se está utilizando vim en Windows, puede hacer lo siguiente para obtener Ctrl +C y Ctrl + V para que funcionen como se esperaba:

source $VIMRUNTIME/mswin.vim 
behave mswin 
8

Si desea mantener la línea actual tal como está, puede pegar encima o debajo de la línea.

Si desea sobrescribir la línea actual, primero deberá eliminarla, lo que significa que la siguiente línea toma su lugar, y luego pegar sobre la nueva línea actual.

Hay más de una manera de hacerlo:

  • "_ddP

    1. "_dd borra toda la línea actual en el "registro de agujero negro", la siguiente línea es ahora la corriente línea.

    2. P pone el contenido del registro sin nombre encima de la línea actual.

  • Vp

    1. V te pone en LINEA VISUAL modo y selecciona visualmente toda la línea actual

    2. p sustituye a la selección con el contenido del registro anónimo

  • S<C-r>"

    1. S elimina el contenido de la línea actual y te pone en INSERT modo

    2. <C-r>" pone el contenido del registro anónimo

La t Las últimas opciones tienen un efecto secundario interesante: el contenido de la línea anterior se coloca en el registro sin nombre, lo que hace imposible hacer múltiples pasadas con el mismo contenido.

Por suerte, se puede evitar esta situación:

  • El "registro de agujero negro", mencionado en la primera solución funciona, así ... como un agujero negro. Lo que sea que pongas en él desaparece para siempre, así que puedes seguir usando p y P con cierto grado de confianza de que el registro sin nombre sigue siendo el mismo de pegar para pegar.

  • Vim le da acceso a 26 registros alfabéticos que puede usar para guardar macros o ... pegar cosas repetidamente.

    Tomando la segunda solución como punto de partida, comienza tirando de una línea completa en el registro "a con "ayy y luego hace V"ap en otra línea.

Pero todo lo anterior asume que el texto que desea pegar es una línea real. Vim hace la diferencia entre "sabio de línea" y "sabio de personaje": no te permitirá pegar una línea en un contexto de carácter o al revés.

Al juntar una línea entera con yy se mantiene la línea en cuanto a la sabiduría del personaje y no se podrá p entre dos caracteres en la misma línea. Para eso debes asegurarte de que lo que tiras no sea interpretado en línea por Vim. Por ejemplo, supongamos que usted está en el primer carácter de la primera línea y quiere pegar ipsum dolor y ponerlo en su lugar normal entre lorem y sit:

ipsum dolor 
lorem sit amet 

Debe escribir "ayee para poner su texto pegado en el registro "a, coloque el cursor donde sea necesario y escriba "aP.

+0

'" * 'no es el registro sin nombre.' "" 'Es el registro sin nombre. Consulte': h quotequote'. Imagino que ha cambiado ''portapapeles'' para incluir' sin nombre'. –

+0

Sí, tiene razón en ambos cuenta. He modificado mi respuesta. – romainl

1

Puede usar D para borrar de la posición actual del cursor al final de la línea, y la p a la nueva posición del cursor.

Para cortar y pegar una línea completa use^D y p.

1

Necesitaba "castrar" el contenido del registro en un cierto modo (caracter/linewise/blockwise) tan seguido, escribí el UnconditionalPaste plugin para ello. Proporciona gcp, glp, etc. alternativas a los comandos de pegado integrados que fuerzan cierto modo (y por ahora varias variaciones más sobre este tema, como pegar con unidas por comas o caracteres consultados).

Con él, puede usar gcp/gcP para pegar después/antes de la posición del cursor, independientemente de cómo haya extraído el texto.

2

Para pegar en el modo de inserción, simplemente presione Control + R. Luego ingrese el registro, p. Shift + +.

Para pegar en modo comando, pulsa P, sin embargo, usted tiene que asegurarse de que su línea no tiene un carácter de nueva línea (por ejemplo, un tirón por 0v$hy), de lo contrario va a aparecer sobre el cursor.

Lo mismo para el modo visual, ver: How to paste a line in a vertical selection block? en Vim SE

0

(Sé que este hilo es de edad, acaba de salir de esto y espero que esto puede ayudar a alguien)

Inspirado por @ de GBM comentario anterior sobre el borrado el avance de línea, he añadido a mis estos mapeos:

nnoremap <leader>p :let @"=substitute(@", '\n\+$', '', '')<CR>p

inoremap <leader>p <esc>:let @"=substitute(@", '\n\+$', '', '')<CR>pa

Esto es útil cuando tengo un archivo con algunos SQL (línea por línea) y tengo que ingresar al código.

0
  1. divide la línea en 2 dondequiera que usted desee insertar

  2. pegar el tramo entre ellos

  3. fusionar las 3 líneas con j como se describe aquí (Delete newline in Vim)

funciona, pero es tedioso, y tenía que pensar en eso, búsquelo => vi y emacs son software de basura

Cuestiones relacionadas