¿Cómo uso los registros vim?

926

Solo sé que una instancia que usa registros es a través de la CtrlR*cual pego texto desde un portapapeles.

¿Cuáles son otros usos de los registros? ¿Cómo usarlos?

Todo lo que sabe sobre los registros VI (centrémonos en vi 7.2): comparta con nosotros.

vehomzzz
fuente
22
Me di una respuesta larga que hay en el uso de los registros
Benoit

Respuestas:

1186

Los registros en Vim le permiten ejecutar acciones o comandos en el texto almacenado en ellos. Para acceder a un registro, escriba "aantes de un comando, donde aestá el nombre de un registro. Si desea copiar la línea actual en el registro k, puede escribir

"kyy

O puede agregar a un registro utilizando una letra mayúscula

"Kyy

Luego puede moverse por el documento y pegarlo en otro lugar usando

"kp

Para pegar desde el portapapeles del sistema en Linux

"+p

Para pegar desde el portapapeles del sistema en Windows (o desde el portapapeles "resaltar el mouse" en Linux)

"*p

Para acceder a todos los registros definidos actualmente, escriba

:reg
FModa3
fuente
165
Y "+es un registro especial que se refiere al portapapeles del sistema.
Aaron McDaid
17
En Windows, se puede acceder al Portapapeles con "*; entonces el comando para copiar hasta el final del archivo se convierte "*yG.
Aditya MP
44
En X (Linux, posiblemente también OS-X), *es el portapapeles "resaltado del mouse" y +es el portapapeles Ctrl-XCV.
dotancohen
20
¿Hay alguna manera de agregar al registro del portapapeles (ya que no hay capital +)?
naitsirhc
8
@dotancohen Técnicamente se llama selección PRIMARIA, pero supongo que "resaltar el mouse" es más fácil para las personas :)
kyrias
783

Estaba contento cuando descubrí el 0registro. Si tira de texto sin asignarlo a un registro en particular, se asignará al 0registro y se guardará en el "registro predeterminado . La diferencia entre los registros 0y "es que 0solo se rellena con texto arrancado, mientras que el registro predeterminado también se rellena con texto eliminado mediante los comandos d/ D/ x/ X/ c/ C/ s/ S.

Esto me resulta útil cuando quiero copiar texto, eliminar algo y reemplazarlo con el texto copiado. Los siguientes pasos ilustran un ejemplo:

  • Yank el texto con el que desea copiar y[motion]: este texto se guarda "y se 0registra
  • Elimine el texto con el que desea reemplazar d[motion]: este texto se guarda en el "registro
  • Pegue el texto arrancado con "0p

donde "es el comando para usar un registro para el siguiente comando.

En el paso final, si tuviera que pegar desde el registro predeterminado (con p), usaría el texto que acababa de eliminar (probablemente no lo que pretendía).

Tenga en cuenta que po Ppega desde el registro predeterminado. El equivalente a largo plazo sería ""p(o ""P) y "0contiene el último tirón, "1la última eliminación o cambio.

Para más información ver :help registers.

nelstrom
fuente
17
po Ppega desde el registro predeterminado. El equivalente a largo plazo sería ""p(o ""P).
nelstrom el
186
Por cierto, de la misma manera "0 contiene el último tirón", 1 contiene el último borrado o cambio.
FireAphis
66
"es el comando para usar un registro para el siguiente comando. Entonces ""pusaría el "registro para el comando pegar y "0pusaría el 0registro.
Ramon Marco L. Navarro
55
0psignificaría ir al primer carácter de la línea actual y pegar desde el contenido del registro predeterminado ( "). "psería un comando incompleto ya que necesita especificar para qué comando usar el registro p.
Ramon Marco L. Navarro
15
De la misma manera "1 contiene la última eliminación", 2 contiene la segunda última eliminación, "3 contiene la tercera última, etc. hasta" 9
James
331

¡Una de mis partes favoritas sobre los registros es usarlos como macros!

Digamos que está tratando con un archivo de valores delimitados por tabulaciones como tal:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Ahora decide que necesita agregar un signo de porcentaje al final del campo% Dev (a partir de la segunda línea). Haremos una macro simple en el mregistro (seleccionado arbitrariamente) de la siguiente manera:

  1. Presione:: qmPara comenzar a grabar macro en el mregistro.

  2. EE: Ir al final de la 3ra columna.

  3. a: Modo de inserción para agregar al final de esta columna.

  4. %: Escriba el signo de porcentaje que queremos agregar.

  5. <ESC>: Regrese al modo de comando.

  6. j0: Ir al comienzo de la siguiente línea.

  7. q: Detener la grabación de macro

Ahora podemos simplemente escribir @mpara ejecutar esta macro en la línea actual. ¡Además, podemos escribir @@para repetir, o 100@mpara hacer esto 100 veces! La vida se ve bastante bien.

En este punto, debería decir: " PERO ESPERE, ¿QUÉ MALO TIENE QUE VER ESTO CON LOS REGISTROS ?"

Excelente punto Vamos a investigar qué hay en el contenido del mregistro escribiendo "mp. Entonces obtenemos lo siguiente:

EEa%<ESC>j0

Al principio, parece que accidentalmente abriste un archivo binario en el bloc de notas, pero a segunda vista, ¡ es la secuencia exacta de caracteres en nuestra macro!

Eres una persona curiosa, así que hagamos algo interesante y editemos esta línea de texto para insertar una !antigua en lugar de aburrida %.

EEa!<ESC>j0

Luego tiremos esto al nregistro escribiendo B"nyE. Entonces, solo por diversión, ejecutemos la nmacro en una línea de nuestros datos usando @n...

OMG, AGREGÓ A !

Esencialmente, ejecutar una macro es como presionar la secuencia exacta de teclas en el registro de esa macro. Si ese no es un buen truco de registro, me comeré mi sombrero.

Francisco
fuente
65
Esto es totalmente clave. No he notado hasta ahora que los registros son los mismos que los macro buffers. Esto significa que puede almacenar todas sus macros en texto, extraerlas y ejecutarlas. Bastante genial y un poco raro. Muy vim.
naught101
1
Es una nota editorial menor, pero ese candado con negrita ... Podría haberse solucionado. Es bastante desagradable en este momento.
ashrasmun
1
Puede usar en +lugar de j0ir al primer carácter no en blanco en la línea siguiente.
Gokul
100

Otros registros útiles:

"*o "+- el contenido del portapapeles del sistema

"/ - último comando de búsqueda

": - último comando.

Tenga en cuenta que con las macros vim, puede editarlas, ya que son solo una lista de las pulsaciones de teclas utilizadas al grabar la macro. Por lo tanto, puede escribir en un archivo de texto la macro (usando "appara escribir la macro a ) y editarlos, y cargarlos en un registro con "ay$. Buena forma de almacenar macros útiles.

Anthony Roy
fuente
66
El vim predeterminado en OSX no incluye la integración "*. Puede instalar una versión de homebrew-alt que sí lo haga. Consulte con vim --version- -clipboardsignifica que no la tiene, +clipboardsignifica que sí.
Xavier Shay
15
En X11, "*y "+son aún más "+geniales : pega el último texto copiado con ctrl+c(copiar búfer), o cualquier acceso directo que use (o right-click>copy). "*pega el último texto resaltado con el mouse (búfer de selección). Entonces, si copia algo ctrl+cy luego resalta algo más con el mouse, puede elegir cuál pegar. Esto no funciona en Windows, donde estos dos registros son sinónimos.
nada101
1
¡Te bendigo, he estado buscando "*y "+durante años! Pensé que solo gvim tenía acceso a los portapapeles del sistema, ¡pero aparentemente vim regular también!
Tarrasch
@Tarrasch Si usa la consola vim en lugar de gvim, descubrirá muchas más cosas. Yo creo que. ¡Visite #vim en freenode también!
trusktr
1
Cómo habilitar si uno tiene -xterm_clipboardencendido vim --version. ¿Algún paquete simple para instalar? (debian / apt-get). Gracias.
Dr Beco
77

El registro del agujero negro _ es el /dev/nullde los registros.

Lo uso en mi vimrc para permitir eliminar caracteres individuales sin actualizar el registro predeterminado:

noremap x "_x

y para pegar en modo visual sin actualizar el registro predeterminado:

vnoremap p "_dP
mrucci
fuente
El segundo mapeo también es muy útil. Consulte aquí para obtener una explicación: marcorucci.com/blog/#visualModePaste
mrucci
21
el mapeo se xvuelve menos conveniente para transponer caracteres.
guardado el
Al pulsar x no borra la última cosa que haya un tirón, que se encontrará en el registro 0. Pulse xa par de veces, luego "0p para pegar las cosas que tiró.
trusktr
2
Para ampliar el comentario anterior de skeept: con esta xasignación ya no puede hacer el xp"comando" para cambiar la corriente con el siguiente carácter. Muy útil para corregir errores tipográficos. También tenemos Xpque cambiar la corriente con el carácter anterior.
Daniel Andersson
56

Si alguna vez desea pegar el contenido del registro en un comando ex-mode, presione <C-r><registerletter>.

¿Por qué usarías esto? Quería hacer una búsqueda y reemplazar una cadena larga, así que la seleccioné en modo visual, comencé a escribir la expresión de búsqueda / reemplazo :%s/[PASTE YANKED PHRASE]//gy seguí mi día.

Si solo desea pegar una sola palabra en modo ex, puede asegurarse de que el cursor esté sobre ella antes de ingresar al modo ex, y luego presione <C-r><C-w>cuando esté en modo ex para pegar la palabra.

agscala
fuente
66
Pegar texto en la :línea de comando es lo mejor que aprendí hoy
Shahbaz
1
También puede usar <CR> <registerletter> en modo de inserción
Floegipoky
1
Me gusta escribir buscar / reemplazar expresiones regulares primero con solo /[write out your regex]<cr>y luego reemplazar solo s/<C-R>//replacement/. De esta forma, obtiene el beneficio de la retroalimentación en vivo sobre su expresión regular antes de ejecutar el reemplazo.
GabeIsman
44

Creo que el registro secreto del gurú es la expresión = registro. Se puede usar para mapeos creativos.

:inoremap  \d The current date <c-r>=system("date")<cr>

Puede usarlo junto con su sistema como se indica anteriormente u obtener respuestas de funciones VimL personalizadas, etc.

o simplemente cosas ad hoc como

<c-r>=35+7<cr>
michael
fuente
3
Echa un vistazo a Derek Wyatt [video sobre el uso del registro de expresiones] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim
1
El enlace de @JeromyAnglim ahora está aquí: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus
39

Un truco genial es usar "1ppara pegar la última eliminación / cambio (, y luego usar .repetidamente para pegar las eliminaciones posteriores. En otras palabras, "1p...es básicamente equivalente a "1p"2p"3p"4p.

Puede usar esto para revertir un puñado de líneas: dddddddddd"1p....

nada101
fuente
Ajá, esto es fantástico. Sin embargo, lo que realmente quiero es el mismo comportamiento para los
yanks
18

Desde la página de ayuda de vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>
Brian
fuente
17
  • q5 graba ediciones en el registro 5 (el siguiente q detiene la grabación)
  • : reg muestra todos los registros y cualquier contenido en ellos
  • @ 5 ejecutar registro 5 macro (ediciones grabadas)
fpmurphy
fuente
15
No me gusta la tecla @ para iniciar macros (tres pulsaciones de teclas). Así que he asignado F2 para iniciar la macro almacenada en el registro q: nmap <F2> @q uso el registro q, porque luego para guardar una macro para que F2 se reproduzca, simplemente presiono qq. Macro rápido guardar y reproducir.
Andrej Panjkov
16

Utilizo el registro predeterminado para grep para texto en mi ventana vim sin tener que alcanzar el mouse.

  1. tirar de texto
  2. :!grep "<CTRL-R>0"<CR>
Matt Mendell
fuente
12

Use registros en comandos con @. P.ej:

echo @a
echo @0
echo @+

Póngalos al mando:

let @a = 'abc'

Ahora "appegará abc.

Ciro Santilli
fuente
8

Una gran fuente de confusión es el registro predeterminado ". Es importante saber cómo funciona. Es mucho mejor si el registro predeterminado se evita la mayoría de las veces. La explicación de la documentación de Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Por lo tanto, el registro predeterminado es en realidad un puntero al último registro utilizado. Cuando elimina o tira algo, este registro apuntará a otros registros. Puede probar eso comprobando los registros. Siempre hay otro registro que es exactamente el mismo que el registro predeterminado: el registro de extracción ( "0), el primer registro de eliminación ( "1), el registro de eliminación pequeño ( "-) o cualquier otro registro que se utilizó para eliminar o eliminar.

La única excepción es el registro de agujeros negros. Vim doc dice:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Por lo general, usted es mucho mejor usando directamente: "0, "-y "1-"9registros por defecto o registros con nombre.

Catalin Ciurea
fuente
8

Un registro que se pasa por alto es el '.' registro de puntos que contiene el último texto insertado sin importar cómo se insertó, por ejemplo, ct] (cambiar hasta]). Entonces te das cuenta de que necesitas insertarlo en otro lugar pero no puedes usar el método de repetición de puntos.

 :reg .
 :%s/fred/<C-R>./
revs zzapper
fuente
7

Mi registro favorito es el ':'registro. Ejecutar @:en modo Normal me permite repetir el comando ex ejecutado anteriormente.

siu
fuente