Cómo pegar texto arrancado en la línea de comando de Vim


Respuestas:


1157

Si. Hit Ctrl- Rentonces ". Si tiene caracteres de control literal en lo que has arrancado, el uso Ctrl- R, Ctrl- O, ".

Aquí hay una explicación de lo que puede hacer con los registros. Lo que puede hacer con los registros es extraordinario, y una vez que sabe cómo usarlos, no puede vivir sin ellos.

Los registros son básicamente ubicaciones de almacenamiento para cadenas. Vim tiene muchos registros que funcionan de diferentes maneras:

  • 0(registro de extracción: cuando se usa yen modo normal, sin especificar un registro, el texto extraído va allí y también al registro predeterminado),
  • 1a 9(desplazamiento de registros de eliminación, cuando utiliza comandos como co d, lo que se ha eliminado va al registro 1, lo que estaba en el registro 1 va al registro 2, etc. ),
  • "(registro predeterminado, también conocido como registro sin nombre. Aquí es donde "entra elCtrl - R, "),
  • aque zpara su propio uso (en mayúsculasA a Zson para anexar a los registros correspondientes).
  • _ (actúa como /dev/null (Unix) o NUL(Windows), puedes escribirle pero se descarta y cuando lees, siempre está vacío),
  • - (pequeño registro de eliminación),
  • /(registro de patrón de búsqueda, actualizada cuando se mira para el texto con /, ?, *o# , por ejemplo, también se puede escribir en él para cambiar dinámicamente el patrón de búsqueda),
  • :(almacena el último comando escrito VimL a través de Qo: , solo lectura),
  • +y *(registros del portapapeles del sistema, puede escribirles para configurar el portapapeles y leer el contenido del portapapeles)

Ver :help registerspara la referencia completa.

Puede, en cualquier momento, usar :registerspara mostrar el contenido de todos los registros. Los sinónimos y las abreviaturas para este comando son :display, :regy :di.

En Insertar o el modo de línea de comandos, Ctrl- Rademás de un nombre de registro, inserta el contenido de este registro. Si desea insertarlos literalmente (sin sangría automática, sin conversión de caracteres de control como 0x08retroceso, etc.), puede usar Ctrl- R, Ctrl- O, nombre de registro. Ver :help i_CTRL-Ry los siguientes párrafos para más referencia.

Pero también puede hacer lo siguiente (y probablemente olvidé muchos usos para los registros).

  • En modo normal, golpea ":p. El último comando que usó en vim se pega en su búfer.
    Descompongamos: "es un comando de modo Normal que le permite seleccionar qué registro se utilizará durante la siguiente operación de extracción, borrado o pegado. Entonces ":selecciona el registro de dos puntos (almacenando el último comando). Entonces pes un comando que ya conoce, pega el contenido del registro.

    cf. :help ",:help quote_:

  • Que está editando un archivo VIML (por ejemplo, su .vimrc) y desea ejecutar un par de líneas consecutivas en este momento: yj:@"Enter.
    Aquí, yjcoloca la línea actual y la siguiente (esto se debe a que j es un movimiento lineal pero está fuera del alcance de esta respuesta) en el registro predeterminado (también conocido como el registro sin nombre). Luego, el :@comando Ex reproduce los comandos Ex almacenados en el registro dado como argumento, y así "es como se refiere al registro sin nombre. También vea la parte superior de esta respuesta, que está relacionada.

    No confunda el "usado aquí (que es un nombre de registro) con el "del ejemplo anterior, que era un comando en modo Normal.

    cf. :help :@y:help quote_quote

  • Inserte el último patrón de búsqueda en su archivo en modo Insertar, o en la línea de comando, con Ctrl- R,/ .

    cf. :help quote_/,help i_CTRL-R

    Corolario: Mantenga su patrón de búsqueda además de añadir una alternativa: / Ctrl- R, / \|alternative.

  • Seleccionó dos palabras en el medio de una línea en modo visual, las jaló con y, están en el registro sin nombre. Ahora que desea abrir una nueva línea justo debajo de donde se encuentre, con esas dos palabras: :pu. Esta es la abreviatura de :put ". El :putcomando, como muchos comandos Ex, funciona solo en línea.

    cf. :help :put

    También podrías haberlo hecho: :call setreg('"', @", 'V')entonces p. La setregfunción establece el registro del cual se da el nombre como primer argumento (como una cadena), lo inicializa con el contenido del segundo argumento (y puede usar registros como variables con el nombre @xdonde xestá el nombre del registro en VimL), y lo convierte en el modo especificado en el tercer argumento, Vpara linewise, nada para characterwise y literal ^Vpara blockwise.

    cf. :help setreg(). Las funciones inversas son getreg()y getregtype().

  • Si ha grabado una macro con qa... q, :echo @ale dirá lo que ha escrito y @avolverá a reproducir la macro (probablemente lo haya sabido, muy útil para evitar tareas repetitivas)

    cf. :help q,help @

    Corolario del ejemplo anterior: si tiene 8goen el portapapeles, @+reproducirá el contenido del portapapeles como una macro y, por lo tanto, irá al octavo byte de su archivo. En realidad, esto funcionará con casi todos los registros. Si su última cadena insertada estaba dden modo Insertar, entonces @.(porque el .registro contiene la última cadena insertada) eliminará una línea. (Documentación de Vim está mal en este sentido, ya que establece que los registros #, %, :y .sólo funciona con p, P, :puty Ctrl- R).

    cf. :help @

    No confunda :@(comando que reproduce comandos Vim desde un registro) y @(comando en modo normal que reproduce comandos en modo normal desde un registro).

    Notable excepción es @:. El registro de comando no contiene los dos puntos iniciales ni el retorno de carro final. Sin embargo, en modo Normal, @:hará lo que espera, interpretando el registro como un comando Ex, no tratando de reproducirlo en modo Normal. Entonces, si su último comando fue :e, el registro contiene epero @:volverá a cargar el archivo, no irá al final de la palabra.

    cf. :help @:

  • Mostrar lo que va a hacer en el modo Normal antes de ejecutarlo: @='dd' Enter. Tan pronto como presiona la =tecla, Vim cambia a la evaluación de expresiones: cuando ingresa una expresión y presiona Enter, Vim la calcula y el resultado actúa como un contenido de registro. Por supuesto, el registro =es de solo lectura y de una sola vez. Cada vez que empiece a usarlo, deberá ingresar una nueva expresión.

    cf. :help quote_=

    Corolario: si está editando un comando y se da cuenta de que debe insertar en su línea de comando alguna línea de su búfer actual: ¡no presione Esc! Uso Ctrl- R =getline(58) Enter. Después de eso, volverá a la edición de la línea de comandos, pero ha insertado el contenido de la 58a línea.

  • Defina un patrón de búsqueda manualmente: :let @/ = 'foo'

    cf. :help :let

    Tenga en cuenta que al hacer eso, no necesita escapar /en el patrón. Sin embargo, debe duplicar todas las comillas simples, por supuesto.

  • Copiar todas las líneas que comienzan con foo, y después todas las líneas que contienen baral portapapeles, la cadena de estos comandos: qaq(restablece el un registro que almacena un macro vacío en su interior), :g/^foo/y A, :g/bar/y A,:let @+ = @a .

    El uso de un nombre de registro de capital hace que el registro funcione en modo agregar

    Mejor, si Qno ha sido reasignado por mswin.vim, inicie el modo Ex con Q, encadene esos "comandos de dos puntos" que en realidad se denominan mejor "comandos Ex", y vuelva al modo Normal escribiendo visual.

    cf. :help :g` :help :y`:help Q

  • -Espacio el doble de su archivo: :g/^/put _. Esto coloca el contenido del registro del agujero negro (vacío al leer, pero escribible, comportándose como /dev/null) linealmente, después de cada línea (¡porque cada línea tiene un comienzo!).

  • Añadir una línea que contiene fooantes de cada línea: :g/^/-put ='foo'. Este es un uso inteligente del registro de expresión. Aquí, -es sinónimo de .-1(cf. :help :range). Como :putcoloca el texto después de la línea, debe decirle explícitamente que actúe sobre el anterior.

  • Copie todo el búfer en el portapapeles del sistema: :%y+ .

    cf. :help :range(para la %parte) y :help :y.

  • Si ha errores en el registro de una macro, puede escribir :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'y editarlo. Esto modificará el contenido de la macro almacenada en el registro a, y se muestra aquí cómo puede usar el registro de expresión para hacer eso.

  • Si lo hiciste dddd, podrías hacerlo uupara deshacer. Con pusted podría obtener la última línea eliminada. Pero en realidad también puede recuperar hasta 9 eliminaciones con los registros a @1través de@9 .

    Aún mejor, si lo haces "1P, entonces .en modo Normal jugará"2P , y así sucesivamente.

    cf. :help .y:help quote_number

  • Si desea insertar la fecha actual en modo Insertar: Ctrl-R=strftime('%y%m%d')Enter .

    cf. :help strftime()

Una vez más, lo que puede ser confuso:

  • :@ es un comando de línea de comandos que interpreta el contenido de un registro como vimscript y lo origina
  • @ en el comando de modo normal que interpreta el contenido de un registro como pulsaciones de teclas en modo normal (excepto cuando usa el :registro, que contiene el último comando reproducido sin los dos puntos iniciales: en este caso, vuelve a escribir el comando como si también volviera a escribir los dos puntos y La clave de retorno final).

  • " en el modo normal comando que le ayuda a seleccionar un registro para tirar, pegar, eliminar, corregir, etc.

  • " también es un nombre de registro válido (el registro predeterminado o sin nombre) y, por lo tanto, se puede pasar como argumento para los comandos que esperan nombres de registro

205
¿No hay una insignia "relación de longitud 100/1 entre respuesta y pregunta?" :)
Benoit

8
Es una gran respuesta, pero son alrededor de 900 palabras menos de 1400. :)

19
Esta respuesta ha cambiado la forma en que uso vim. Gracias Benoit
P. Myer Nore

11
No olvide: reg que enumerará todos los registros junto con su contenido
eugenevd

3
En versiones recientes de vim, las eliminaciones que son más pequeñas que una línea van al "registro de pequeñas eliminaciones" en lugar de ir a los registros numerados. Referencias: Vi y Vim , Vi y Vim , Reddit
Christian Long

48

Para pegar algo que es el portapapeles del sistema, puede usar SHIFT- INS.

Funciona en Windows, pero supongo que también funciona bien en Linux.


77
Sí, también funciona en Linux. Probado bajo GNOME en Vim y GVim.
Teoulas

3
En realidad, esto alimenta el cartón a Vim como entrada de teclado, por lo que si está en modo normal y pega :!rm -rf /<cr>, lo ejecutará. ¡Utilice registros en su lugar!
lericson

44
@lericson ¿No dije en mi respuesta que esto es útil para algo que está en el teclado del sistema? No entiendo el voto negativo. Y para tu ejemplo, ¿en serio? ¿Realmente tienes eso en el portapapeles? ¿Y no crees que escribir shift-inssea ​​más fácil que ctrl-R+*? Esto es, por supuesto, si estás en gvim. Si está en el terminal conectado a otra máquina y desea pegar algo de su portapapeles, ¿sabe algo mejor que shift-ins? porque los registros no funcionan en esa situación. Por favor, piense antes de comentar y hacer otras cosas (como downvoting).
guardado

Creo que es información errónea y he actuado de acuerdo con ese juicio.
lericson

1
No funciona para mi Acabo de agregar '<S-Insert>' a mi línea de comando. Quizás me estoy perdiendo algo. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman

39

"Me gustaría pegar el texto arrancado en la línea de comando de Vim".

Si bien la respuesta más votada es muy completa, prefiero editar el historial de comandos.

En el modo normal, Tipo: q:. Esto le dará una lista de comandos recientes, editables y de búsqueda con comandos vim normales. Comenzará en una línea de comando en blanco en la parte inferior.

Para lo que el artículo pregunta exactamente, pegando una línea arrancada (o cualquier cosa) en una línea de comando, tira el texto y luego: q:p (entrar en el modo de edición del historial de comandos, y luego (p) usar el texto tirado en un nuevo comando línea. Editar a voluntad, enterpara ejecutar.

Para salir del modo de historial de comandos, es todo lo contrario. En modo normal en el historial de comandos, escriba: :q+enter


1
si ya está modificando un comando existente y no presionó 'q:' presione ctrl + f y se abrirá la capacidad de editar el historial de comandos.
Clay

14

Para pegar algo del portapapeles del sistema en la línea de comando de Vim ("modo de comando"), use Ctrl+ Rseguido de +. Para mí, al menos en Ubuntu, Shift+ Insno funciona.

PD: No estoy seguro de por qué Ctrl+ Rseguido por *, que en teoría es lo mismo que Ctrl+ Rseguido por +no parece funcionar siempre. Busqué y descubrí la +versión y parece funcionar siempre, al menos en mi caja.


2
La diferencia entre Ctrl-r + y Ctrl-r * es que el primero es el portapapeles normal, pero en Linux hay un segundo tipo de portapapeles llamado "primario" que representa el texto seleccionado más recientemente (el botón central pegar con el mouse) . Sin embargo
Matias Thayer

13

Vale la pena señalar también que los registros de yank son los mismos que los macro buffer. En otras palabras, puede simplemente escribir todo su comando en su documento (incluido su fragmento pegado), luego "bytirarlo al bregistro y luego ejecutarlo @b.


1

Estaba teniendo un problema similar Quería que el texto seleccionado terminara en un comando, pero no confiara en pegarlo. Aquí está el comando para el que estaba tratando de escribir una asignación:

:call VimuxRunCommand("python")

Los documentos para este complemento solo se muestran usando literales de cadena. Lo siguiente se interrumpirá si intenta seleccionar texto que contiene comillas dobles:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Para evitar esto, solo debe hacer referencia al contenido de la macro usando @:

vnoremap y:call VimuxRunCommand(@")<cr>

Pasa el contenido del registro sin nombre y funciona con mi comilla doble y las cajas de borde multilínea.


Creo que a su último ejemplo le falta un ". Quizás quiso decir VimuxRunCommand (" @ ").
kd8azz

Eso enviaría el @personaje al comando vimux. piense @en escapar de la siguiente cita doble y se trate como un registro en lugar de como un personaje normal. Lo que vnoremaphe definido está activo en modo visual, por lo que tira del texto seleccionado y luego lo pega en el comando vimux, enviándolo a un intérprete en ejecución en un panel adyacente. realmente genial para trabajar en un script y probar pequeñas porciones de él con un par de teclas.
Conrad

1

OS X

Si está utilizando Vim en Mac OS X, desafortunadamente viene con una versión anterior y no cumple con las opciones del portapapeles. Afortunadamente, Homebrew puede resolver fácilmente este problema.

Instalar Vim:

brew install vim --with-lua --with-override-system-vi

Instale la versión GUI de Vim:

brew install macvim --with-lua --with-override-system-vi

Reinicie el terminal para que surta efecto.


Agregue la siguiente línea a ~/.vimrc
set clipboard=unnamed

Ahora puede copiar la línea en Vim con yyy pegarla en todo el sistema.


1

Para el contexto, esta información viene de fábrica, sin complementos, sin comportamiento .vimrc Vim 7.4 en Linux Mint con las opciones predeterminadas.

Siempre puede seleccionar texto con el mouse (o usando Vo vy colocando la selección en el registro "*), y pegarlo en la línea de comando con Shift+ Ctrl+v .

Si escribe Ctrl+ ren la línea de comando, se solicitará un nombre de registro. así que al escribir :CTRL-r*colocará el registro de contenido * en la línea de comando. Pegará cualquier registro, no solo "*. Ver:help c_CTRL-R .

Además, el botón central del mouse se pegará en la línea de comando.

Ver :help->quote-plus para una descripción de cómo X Window trata con la selección. Incluso en un Vim simple y listo para usar (de nuevo, en Vim 7.4 en Linux Mint, de todos modos), cualquier selección realizada con el botón izquierdo del mouse se puede pegar en la línea de comando con el botón central del mouse.

Además, el botón central del mouse también pegará el texto seleccionado en Vim en muchas otras aplicaciones de X Window, incluso las GUI (por ejemplo, Firefox y Thunderbird ) y también es posible pegar texto en la línea de comando donde el texto se seleccionó de otras aplicaciones .

Consulte: ayuda-> selección x11 para obtener información adicional.

tl; dr

Pruebe primero el enfoque: CTRL-r, y luego use Shift+ Ctrl+ vo el botón central del mouse si necesita algo más.

Se admite que puede ser confuso.


0
  1. "[a-z]y: Copie el texto en el registro [az]

  2. Use :!para ir al comando de edición

  3. Ctrl+ R: Sigue la identidad del registro para pegar lo que copias.

Solía ​​CentOS 7.


¿Qué se entiende por "Se utiliza para CentOS 7"? ?
Peter Mortensen

0

Si tiene dos valores agrupados en dos registros diferentes (por ejemplo, registrarse ay registrarse b), simplemente puede establecer una variable cy realizar la operación en ella.

Por ejemplo, :set c = str2float(@a) + str2float(@b)y luego puede pegar el contenido de ccualquier lugar.

Por ejemplo, mientras está en el modo INSERTAR, CTRL + Rescriba =para ingresar en el registro de expresiones y simplemente escriba cdespués del signo igual y presione ENTER. Hecho, ahora deberías tener el total de ayb registros.

¡Todo esto se puede grabar en una macro y repetir!

La str2floatfunción se utiliza si está trabajando con flotantes, si no lo hace, obtendrá enteros en su lugar.

No estoy seguro de si esto es idiomático, pero funcionó para mi caso donde necesitaba agregar 2 números seguidos y repetirlo para 500 líneas más.

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.