Me gustaría pegar el texto arrancado en la línea de comando de Vim. ¿Es posible?
vim
copy-paste
dan
fuente
fuente
Respuestas:
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 usay
en modo normal, sin especificar un registro, el texto extraído va allí y también al registro predeterminado),1
a9
(desplazamiento de registros de eliminación, cuando utiliza comandos comoc
od
, 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, "),a
quez
para su propio uso (en mayúsculasA
aZ
son para anexar a los registros correspondientes)._
(actúa como/dev/null
(Unix) oNUL
(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 deQ
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 mostrar el contenido de todos los registros. Los sinónimos y las abreviaturas para este comando son:display
,:reg
y: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
0x08
retroceso, etc.), puede usar Ctrl- R, Ctrl- O, nombre de registro. Ver:help i_CTRL-R
y 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:put
comando, como muchos comandos Ex, funciona solo en línea.cf.
:help :put
También podrías haberlo hecho:
:call setreg('"', @", 'V')
entoncesp
. Lasetreg
funció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@x
dondex
está 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 songetreg()
ygetregtype()
.Si ha grabado una macro con
qa
...q
,:echo @a
le dirá lo que ha escrito y@a
volverá a reproducir la macro (probablemente lo haya sabido, 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, por lo tanto, irá al octavo byte de su archivo. En realidad, esto funcionará con casi todos los registros. Si su última cadena insertada estabadd
en 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 conp
,P
,:put
y 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 contienee
pero@:
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 contienenbar
al 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
Q
no ha sido reasignado pormswin.vim
, inicie el modo Ex conQ
, encadene esos "comandos de dos puntos" que en realidad se denominan mejor "comandos Ex", y vuelva al modo Normal escribiendovisual
.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
foo
antes 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:put
coloca 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 registroa
, y se muestra aquí cómo puede usar el registro de expresión para hacer eso.Si lo hiciste
dddd
, podrías hacerlouu
para deshacer. Conp
usted podría obtener la última línea eliminada. Pero en realidad también puede recuperar hasta 9 eliminaciones con los registros a@1
travé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 registrofuente
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.
fuente
:!rm -rf /<cr>
, lo ejecutará. ¡Utilice registros en su lugar!shift-ins
sea más fácil quectrl-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 queshift-ins
? porque los registros no funcionan en esa situación. Por favor, piense antes de comentar y hacer otras cosas (como downvoting)."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
+enterfuente
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.
fuente
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
"by
tirarlo alb
registro y luego ejecutarlo@b
.fuente
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:
Los documentos para este complemento solo se muestran usando literales de cadena. Lo siguiente se interrumpirá si intenta seleccionar texto que contiene comillas dobles:
Para evitar esto, solo debe hacer referencia al contenido de la macro usando
@
:Pasa el contenido del registro sin nombre y funciona con mi comilla doble y las cajas de borde multilínea.
fuente
@
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 quevnoremap
he 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.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
yy
y pegarla en todo el sistema.fuente
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.
fuente
"[a-z]y
: Copie el texto en el registro [az]Use
:!
para ir al comando de ediciónCtrl+ R: Sigue la identidad del registro para pegar lo que copias.
Solía CentOS 7.
fuente
Si tiene dos valores agrupados en dos registros diferentes (por ejemplo, registrarse
a
y registrarseb
), simplemente puede establecer una variablec
y realizar la operación en ella.Por ejemplo,
:set c = str2float(@a) + str2float(@b)
y luego puede pegar el contenido dec
cualquier lugar.Por ejemplo, mientras está en el modo INSERTAR,
CTRL + R
escriba=
para ingresar en el registro de expresiones y simplemente escribac
después del signo igual y presione ENTER. Hecho, ahora deberías tener el total dea
yb
registros.¡Todo esto se puede grabar en una macro y repetir!
La
str2float
funció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.
fuente