Pregunta Cómo pegar texto extraído en la línea de comandos de Vim?


Me gustaría pegar texto extraído en la línea de comandos de Vim. ¿Es posible?


523
2017-10-22 13:08


origen


Respuestas:


Sí. Golpear Ctrl-R entonces ". Si tiene caracteres de control literales en lo que ha tirado, use Ctrl-R, Ctrl-O, ".

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

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

  • 0 (tirón de registro: cuando usa y en modo normal, sin especificar un registro, el texto arrastrado va allí y también al registro predeterminado),
  • 1 a 9 (desplazando registros de eliminación, cuando usa comandos como c o 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 " viene en Ctrl-R, "),
  • a a z para su propio uso (en mayúscula) A a Z son para agregar a los registros correspondientes).
  • _ (actúa como /dev/null (Unix) o NUL (Windows), puede escribir en él, pero se descarta y cuando lo lee, siempre está vacío),
  • - (pequeño eliminar registro),
  • / (registro de patrón de búsqueda, actualizado cuando busca texto con /, ?, * o # por ejemplo; también puede escribir para cambiar dinámicamente el patrón de búsqueda),
  • : (almacena el último comando escrito por VimL a través de Q o :, solo lectura),
  • + y * (registros del portapapeles del sistema, puede escribirles para configurar el portapapeles y leer el contenido del portapapeles)

Ver :help registers para la referencia completa.

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

En modo Insertar o Línea de comando, Ctrl-R más un nombre de registro, inserta el contenido de este registro. Si desea insertarlos literalmente (sin autodetección, sin conversión de caracteres de control como 0x08 para retroceder, etc.), puede usar Ctrl-R, Ctrl-O, nombre de registro Ver :help i_CTRL-R y siguientes párrafos para más referencia.

Pero también puedes hacer lo siguiente (y probablemente haya olvidado muchos usos para los registros).

  • En modo normal, golpea ":pag. El último comando que usaste en vim está pegado en tu búfer.
    Vamos a descomponer: " es un comando de modo normal que le permite seleccionar qué registro se utilizará durante la próxima operación de extracción, eliminación o pegado. Asi que ": selecciona el registro de dos puntos (almacenando el último comando). Entonces pag es un comando que ya sabes, pega los contenidos del registro.

    cf. :help ", :help quote_:

  • Está editando un archivo VimL (por ejemplo, su .vimrc) y me gustaría ejecutar un par de líneas consecutivas en este momento: yj:@"Entrar.
    Aquí, yj tira la línea actual y la línea siguiente (esto es porque j es un movimiento lineal, pero esto está fuera del alcance de esta respuesta) en el registro predeterminado (también conocido como el registro sin nombre). Entonces el :@El comando Ex reproduce comandos Ex almacenados en el registro dado como argumento, y " es cómo se refiere al registro sin nombre. También vea la parte superior de esta respuesta, que está relacionada.

    No confundir " utilizado aquí (que es un nombre de registro) con el " del ejemplo anterior, que era un comando de 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: conserve su patrón de búsqueda pero agregue una alternativa: /  Ctrl-R, /  \|alternative.

  • Has seleccionado dos palabras en el medio de una línea en modo visual, las tiró con y, están en el registro sin nombre. Ahora quiere abrir una nueva línea justo debajo de donde se encuentra, con esas dos palabras: :pu. Esto es una abreviatura de :put ". los :put comando, al igual que muchos comandos Ex, funciona solo en línea.

    cf. :help :put

    También podrías haber hecho: :call setreg('"', @", 'V') entonces p. los setreg función establece el registro cuyo nombre se da como primer argumento (como una cadena), lo inicializa con el contenido del segundo argumento (y puede usar registros como variables con el nombre @x dónde x es el nombre del registro en VimL), y lo convierte en el modo especificado en el tercer argumento, V para linewise, nada para caracteres y literal ^V por cuadra.

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

  • Si ha grabado una macro con qa...q, entonces :echo @a le dirá lo que ha escrito, y @a reproducirá la macro (probablemente usted la conoció, muy útil para evitar tareas repetitivas)

    cf. :help q, help @

    Corolario del ejemplo anterior: si tienes 8go en el portapapeles, entonces @+ reproducirá el contenido del portapapeles como una macro, y así irá al octavo byte de su archivo. En realidad, esto funcionará con casi todos los registros. Si su última cadena insertada fue dd en modo Insertar, luego @. voluntad (porque el . registro contiene la última cadena insertada) eliminar una línea. (La documentación de Vim es incorrecta a este respecto, ya que establece que los registros #, %, : y . solo funcionará con p, P, :put y Ctrl-R)

    cf. :help @

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

    La excepción notable es @:. El registro de comando no contiene los dos puntos iniciales ni contiene el retorno de carro final. Sin embargo, en modo Normal, @: hará lo que esperas, interpretando el registro como un comando Ex, sin tratar de jugarlo en modo Normal. Entonces, si tu último comando fue :e, el registro contiene e pero @: volverá a cargar el archivo, no irá al final de la palabra.

    cf. :help @:

  • Muestra lo que harás en modo Normal antes de ejecutarlo: @='dd'  Entrar. Tan pronto como llegue al = clave, Vim cambia a evaluación de expresión: cuando ingresa una expresión y pulsa Entrar, Vim lo 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, tendrá que ingresar una nueva expresión.

    cf. :help quote_=

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

  • Definir 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, es necesario duplicar todas las comillas simples, por supuesto.

  • Copie todas las líneas que comiencen por foo, y luego todas las líneas que contienen bar al portapapeles, encadena estos comandos: qaq (restablece el un registrar almacenando una macro vacía dentro de ella), :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 el modo de agregar

    Mejor, si Q no ha sido reasignado por mswin.vim, inicie el modo Ex con Q, encadenar esos "comandos de dos puntos" que en realidad son mejor denominados "comandos Ex", y volver al modo Normal tecleando visual.

    cf. :help :g, :help :y, :help Q

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

  • Agregue una línea que contenga foo antes de cada línea: :g/^/-put ='foo'. Este es un uso inteligente del registro de expresiones. Aquí, - es un sinónimo de .-1 (cf. :help :range) Ya que :put pone el texto detrás de la línea, tienes que decirle explícitamente que actúe sobre la anterior.

  • Copie todo el buffer al portapapeles del sistema: :%y+.

    cf. :help :range (Para el % parte) y :help :y.

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

  • Si lo hiciste dddd, podrías hacer uu para deshacer Con p podrías obtener la última línea eliminada. Pero en realidad también puedes recuperar hasta 9 eliminaciones con los registros @1 mediante @9.

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

    cf. :help . y :help quote_number

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

    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 modo normal, comando que interpreta los contenidos de un registro como teclas de modo normal (excepto cuando usa : register, que contiene el último comando ejecutado sin los dos puntos iniciales: en este caso, reproduce el comando como si también volviera a escribir los dos puntos y la tecla de retorno final).

  • "  en el modo de comando normal que te 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 un argumento para los comandos que esperan nombres de registro

1016
2018-06-20 15:40



Para pegar algo que es el portapapeles del sistema, simplemente puede usar CAMBIO - EN S.

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


42
2017-07-26 14:30



"Me gustaría pegar texto extraído en la línea de comandos de Vim".

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

En modo normal, escribe: q:. Esto le dará una lista de comandos recientes, editable y que se puede buscar con los comandos vim normales. Comenzarás con una línea de comando en blanco en la parte inferior.

Para saber exactamente qué es lo que pide el artículo, pegar una línea arrancada (o tirar de cualquier cosa) en una línea de comando, jale su texto y luego: q:p (ingrese en el modo de edición del historial de comandos, y luego (p) use el texto extraído en una nueva línea de comando. Edite a voluntad, entrar ejecutar.

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


33
2018-04-11 06:39



También vale la pena señalar que los registros yank son los mismos que los macro buffers. En otras palabras, puede simplemente escribir todo el comando en su documento (incluido el fragmento pegado), luego "by jalarlo a la b registrarse, y luego ejecutarlo con @b.


13
2018-04-01 04:47



Para pegar algo del portapapeles del sistema en la línea de comandos de vim ("modo de comando"), use Ctrl+R seguido por +. Para mí, al menos en Ubuntu, Cambio+En s no está trabajando.

PD: No estoy seguro por qué Ctrl+R seguido por *, que es teóricamente lo mismo que Ctrl+R seguido por + no parece funcionar siempre. Busqué y descubrí el + versión y parece funcionar siempre, al menos en mi caja.


11
2017-07-28 04:12



Estaba teniendo un problema similar. Quería que el texto seleccionado terminara en un comando, pero no confío 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 con literales de cadena. Lo siguiente se interrumpirá si intentas seleccionar texto que contenga comillas dobles:

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

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

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

Pasa el contenido del registro sin nombre en y trabaja con mi edgecit de comillas dobles y multilínea.


1
2017-08-16 08:03



OSX

Si está utilizando vim en MAC OSX, desafortunadamente viene con versión antigua 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

instalar gui verion de vim:

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

reinicie la terminal para que tenga efecto.


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

ahora puedes copiar la línea en vim con yy y pegarlo en todo el sistema.


1
2018-03-30 18:28



esta pregunta es bastante antigua, pero como se ha visto tantas veces, parece ser popular; lo pondré aquí para la posteridad. para el contexto, esta información proviene de la versión 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 usar V o v y colocar la selección en el registro "*), y pegarlo en la línea de comando con SHIFT-CTL-v.

escribir CTL-r en la línea de comando provocará que se solicite un nombre de registro. entonces escribiendo: CTL-r * colocará el registro de contenido * en la línea de comando. pegará cualquier registro, no solo "*. see: help c_CTRL-R.

Además, el botón central del mouse se pegará en la línea de comando. ver: ayuda-> quote-plus para una descripción de cómo x11 se ocupa de la selección. incluso en un vim simple y out-the-box (de nuevo, en vim 7.4 en linux mint, de todos modos), cualquier selección hecha 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 x11, incluso en las gui (por ejemplo, firefox, thunderbird) y pegar texto en la línea de comando también es posible donde el texto fue seleccionado de otras aplicaciones.

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

tl; dr

Pruebe primero el enfoque CTL-r, luego use SHIFT-CTL-v o el botón central del mouse si necesita algo más.

se admite que puede ser confuso.


1