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?

Sí. Presiona CtrlR y luego " . Si tienes caracteres de control literales en lo que has tirado, usa CtrlR , CtrlO , " .

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 (yank register: cuando usa y en modo normal, sin especificar un registro, el texto arrancado 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 aparece " CtrlR , " ),
  • a a la z para su propio uso (las mayúsculas A a la 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 registro de eliminación),
  • / (registro de patrón de búsqueda, actualizado cuando busca texto con / , ? , * o # por ejemplo; también puede escribir en él para cambiar dinámicamente el patrón de búsqueda),
  • : (almacena el último comando escrito de 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.

Puede, en cualquier momento, usar :registers para visualizar los contenidos de todos los registros. Los sinónimos y las abreviaturas para este comando son :display :reg y :di .

En el modo Insertar o Línea de comando, CtrlR más 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 0x08 para retroceder, etc.), puede usar CtrlR , CtrlO , 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 el modo normal, presiona " : p . El último comando que usaste en vim se pega en tu búfer.
    Vamos a descomponer: " es un comando de modo Normal que le permite seleccionar qué registro se va a usar durante la próxima operación de extracción, eliminación o pegado. Por lo tanto, " : selecciona el registro de dos puntos (almacenando el último comando). Entonces p es un comando que ya conoce, pega los contenidos del registro.

    cf. :help " , :help quote_:

  • Está editando un archivo VimL (por ejemplo su .vimrc ) y le gustaría ejecutar un par de líneas consecutivas en este momento: y j : @ " Enter " .
    Aquí yy yanks la línea actual y siguiente (esto es porque j es un movimiento lineal, pero esto está fuera del scope 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 " es cómo se refiere al registro sin nombre. También vea la parte superior de esta respuesta, que está relacionada.

    No confunda " usado 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 CtrlR , / .

    cf. :help quote_/ , help i_CTRL-R

    Corolario: conserve su patrón de búsqueda pero agregue una alternativa: / CtrlR , / \|alternative .

  • Has seleccionado dos palabras en el medio de una línea en modo visual, las has quitado 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 " . El comando :put , como muchos comandos Ex, funciona solo en línea.

    cf. :help :put

    También podría haberlo hecho:: :call setreg('"', @", 'V') luego p . La función setreg 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 donde x es el nombre del registro en VimL), y lo convierte en el modo especificado en el tercer argumento, V para linewise, nada para characterwise y literal ^V para blockwise.

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

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

    cf. :help q , help @

    Corolario del ejemplo anterior: si tiene 8go en el portapapeles, @+ 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 estaba dd en modo Insertar, entonces @. will (porque el registro . contiene la última cadena insertada) borre una línea. (La documentación de Vim es incorrecta en este sentido, ya que establece que los registros # , % : y . Solo funcionarán con p , P ,: :put y CtrlR ).

    cf. :help @

    No confunda :@ (comando que reproduce comandos de Vim desde un registro) y @ (comando de modo normal que reproduce comandos de 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 el modo Normal, @: hará lo que esperas, interpretando el registro como un comando Ex, sin tratar de reproducirlo en modo Normal. Entonces, si su último comando fue :e , el registro contiene e pero @: volverá a cargar el archivo, no irá al final de la palabra.

    cf. :help @:

  • Muestre lo que hará en el modo Normal antes de ejecutarlo: @='dd' Enter . Tan pronto como presiona la tecla = , Vim cambia a evaluación de expresión: cuando ingresa una expresión y presiona Enter , Vim la computa 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ás editando un comando, y te das cuenta de que deberías insertar en tu línea de comando alguna línea de tu búfer actual: ¡no presiones Esc ! Use CtrlR =getline(58) Enter . 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.

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

  • Copie todas las líneas que comienzan con foo y luego todas las líneas que contienen bar al portapapeles, encadenan estos comandos: qaq (restablece un registro que almacena una macro vacía dentro de él) qaq :g/^foo/y A qaq :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 , mswin.vim esos “comandos de dos puntos” que en realidad son mejor denominados “comandos Ex”, y regrese al modo Normal escribiendo visual .

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

  • Doble espacio en el archivo :g/^/put _ . Esto coloca 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 (ver :help :range ). Dado que :put pone el texto detrás de la línea, tienes que 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 grabado mal una macro, puede escribir :let @a=' CtrlR =replace(@a,"'","''",'g') Enter ' y edítelo. 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 hizo dddd , puede hacer uu para deshacer. Con p puede obtener la última línea eliminada. Pero en realidad también puedes recuperar hasta 9 eliminaciones con los registros @1 a @9 .

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

    cf. :help . y :help quote_number

  • Si desea insertar la fecha actual en el modo Insertar: CtrlR =strftime('%y%m%d') Ingrese .

    cf. :help strftime()

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

  • :@ es un comando de línea de comandos que interpreta los contenidos de un registro como vimscript y lo fonts
  • @ en modo normal, comando que interpreta el contenido de un registro como teclas de modo normal (excepto cuando se usa : registro, que contiene el último comando reproducido sin los dos puntos iniciales: en este caso, reproduce el comando como si también se reescribiera el dos puntos y la tecla de retorno final).

  • " en modo normal comando que le ayuda a seleccionar un registro para tirón, 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

Para pegar algo que es el portapapeles del sistema, puede usar SHIFTINS .

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

“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, escriba: 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 qué es exactamente lo que el artículo pregunta, pegar una línea tirada (o tirar cualquier cosa) en una línea de comando, tire de su texto y luego: q:p (ingrese al modo de edición del historial de comandos, y luego (p) use el texto extraído en una nueva línea de comando. Editar a voluntad, ingrese para ejecutar.

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

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 para arrastrarlo al registro b y luego ejecutarlo con @b .

Para pegar algo del portapapeles del sistema en la línea de comandos de vim (“modo de comando”), use Ctrl + R seguido de + . Para mí, al menos en Ubuntu, Shift + Ins no funciona.

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

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(""") 

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

 vnoremap y:call VimuxRunCommand(@") 

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

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 pegarla en todo el sistema.

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. "[az]y copia texto a [az] registro;

  2. uso :! ir a editar comando;

  3. CTRL+R sigue la identidad del registro para pegar lo que copias.

Solía ​​a CentOS7.

    Intereting Posts