Pregunta

Al usar Vim, a menudo quiero reemplazar un bloque de código con un bloque que acabo de arrancar.

Pero cuando elimino el bloque de código que se va a reemplazar, ese bloque entra en el registro que borra el bloque que acabo de arrancar.Así que tengo el hábito de tirar, luego insertar y luego eliminar lo que no quería, pero con grandes bloques de código esto se vuelve complicado al tratar de mantener separados el bloque insertado y el bloque a eliminar.

Entonces, ¿cuál es la forma más sencilla y rápida de reemplazar texto en Vim?

  • ¿Hay alguna manera de borrar texto sin ponerlo en el registro?
  • ¿Hay alguna manera de decir, por ejemplo?"reemplazar la siguiente palabra" o "reemplazar hasta el siguiente párrafo"
  • ¿O es la mejor manera de utilizar de alguna manera la función de registro múltiple?
¿Fue útil?

Solución

Para eliminar algo sin guardarlo en un registro, puedes utilizar el "registro de agujero negro":

"_d

Por supuesto, también puede utilizar cualquiera de los otros registros que no contengan nada que le interese.

Otros consejos

Sí.Es un poco más complicado que eliminar primero el texto "antiguo", pero:

empiezo con..

line1
line2
line3
line4

old1
old2
old3
old4

I cambio+v seleccione la línea 1, línea 2, 3 y 4, y elimínelas con el d dominio

Luego elimino las antiguas 1 a 4 líneas de la misma manera.

Entonces hazlo

"2p

Eso pegará las penúltimas líneas arrancadas (línea 1-4). "3p hará el antepenúltimo, y así sucesivamente.

Así que termino con

line1
line2
line3
line4

Referencia: Documentación de Vim en registro numerado.

Documentos VIM: El registro numerado 0 contiene el texto del comando yank más reciente, a menos que el comando especifique otro registro con ["x].

P.ej.Tiramos "foo" y eliminamos "bar". ¡El registro 0 todavía contiene "foo"!Por lo tanto, "foo" se puede pegar usando "0p

Es útil tener un mapeo sencillo que le permita reemplazar la selección actual con un búfer.

Por ejemplo, cuando pones esto en tu .vimrc

vmap r "_dP       // it's a capital 'p' on the end

luego, después de copiar algo en el registro (es decir,con 'y'), puede seleccionar el texto que desea reemplazar y simplemente presionar 'r' en su teclado.La selección será sustituida por su registro actual.

Explicación:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

Puse lo siguiente en mi vimrc:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

Ahora arranco y coloco desde el registro del portapapeles, y no tengo que preocuparme por lo que suceda con el registro predeterminado.Un beneficio adicional es que puedo pegar desde otras aplicaciones con la mínima molestia.Estoy perdiendo algunas funciones, lo sé, pero de todos modos no puedo realizar un seguimiento de más de un registro/portapapeles.

Para el ejemplo específico que diste, si entiendo la pregunta, esto podría funcionar:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

Todas las operaciones de extracción y eliminación se escriben en el registro sin nombre de forma predeterminada.Sin embargo, el tirón y la eliminación más recientes siempre se almacenan (por separado) en los registros numerados.El registro 0 tiene el tirón más reciente.los registros 1-9 mantenga las 9 eliminaciones más recientes (con 1 siendo el más reciente).

En otras palabras, una eliminación sobrescribe el tirón más reciente en el registro sin nombre, pero todavía está allí en el 0 registro. El truco del registro de agujeros negros ("_dd) mencionado en las otras respuestas funciona porque evita sobrescribir el registro sin nombre, pero no es necesario.

Se hace referencia a un registro utilizando comillas dobles, por lo que se puede pegar el texto extraído más recientemente de esta manera:

"0p

Esta es una excelente referencia:

Para enfatizar lo que EBGreen dijo:

Si pega mientras selecciona texto, el texto seleccionado se reemplazado con el texto pegado.

Si desea copiar algún texto y luego pegarlo en varias ubicaciones, use "0p pegar.El registro numerado 0 contiene el texto del comando de extracción más reciente.


Además, puede enumerar el contenido de todos sus registros:

:registers

Ese comando hace que sea más fácil determinar qué registro desea al hacer algo como la respuesta de dbr.También verá los registros /,%,#.(Ver también :help registers)


Y finalmente, echa un vistazo cW y cW para cambiar una palabra incluyendo y sin incluir un espacio final.(Usando capital W incluye puntuación.)

Si estás usando Vim entonces tendrás el modo visual, que es como seleccionar, pero con los modos de separación que son la base de vi/vim.

Lo que desea hacer es usar el modo visual para seleccionar la fuente, luego tirar, luego usar el modo visual nuevamente para seleccionar el alcance del destino y luego pegar en el texto desde el búfer predeterminado.

Ejemplo:

En un archivo de texto con:

1| qwer
2| asdf
3| zxcv
4| poiu

con la siguiente secuencia: ggVjyGVkp terminarás con:

1| qwer
2| asdf
3| qewr
4| asdf

Explicado:

  • gg:ir a la primera línea
  • V:iniciar el modo visual con líneas enteras
  • j:bajar una línea (con la selección iniciada en las líneas anteriores, la selección aumenta una línea hacia abajo)
  • y:tire del búfer predeterminado (las dos líneas seleccionadas y saldrá automáticamente del modo visual)
  • G:ir a la última línea
  • V:iniciar el modo visual (igual que antes)
  • k:subir una línea (como antes, con el modo visual habilitado, esto aumenta la selección una línea)
  • p:pegar (con la selección en las dos últimas líneas, reemplazará esas líneas con lo que haya en el búfer, las 2 primeras líneas en este caso)

Esto tiene el pequeño inconveniente de que coloca el último bloque en el búfer, por lo que de alguna manera no es deseable para pegados repetidos de lo mismo, por lo que querrás guardar la fuente en un búfer con nombre con algo como "ay (a un buffer llamado "a") y pegar con algo como "ap (pero entonces, si estás programando, probablemente no quieras pegar varias veces sino crear una función y llamarla, ¿verdad? BIEN?).

Si solo estás usando vi, entonces tendrás que usar marcas invisibles en lugar del modo visual. :he mark Para más información sobre esto, lo siento, pero no soy muy bueno con esto de las marcas invisibles, estoy bastante contaminado con el modo visual.

Para 'reemplazar palabra', intente cw en modo normal.

Para 'reemplazar párrafo', intente cap en modo normal.

Una solución mínimamente invasiva para los perezosos:

Registro 0 siempre contiene el último tirón (como rafael, alex2k8 y idbrii ya he mencionado).Desafortunadamente seleccionando registrarse 0 todo el tiempo puede ser bastante molesto, así que sería bueno si p usos "0 por defecto.Esto se puede lograr poniendo las siguientes líneas en su .vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

La primera línea mapea cada p golpe a "0p.Sin embargo, esto impide p de acceder a otros registros.Por lo tanto todos p los trazos con un registro seleccionado explícitamente se asignan a la expresión de línea de comando equivalente dentro del bucle for.Lo mismo se hace para P.

De esta manera se conserva el comportamiento estándar, excepto por el implícito p y P trazos, que ahora usan registro 0 por defecto.

Pista 1: El comando de corte ahora es "0d en lugar de solo d.Pero como soy vago, esto es demasiado largo para mí;) Por lo tanto, estoy usando el siguiente mapeo:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

La clave del líder es \ de forma predeterminada, por lo que puedes cortar texto fácilmente escribiendo \d o \D.

Pista 2: El tiempo de espera predeterminado para asignaciones de múltiples teclas es bastante corto.Es posible que desee aumentarlo para tener más tiempo al seleccionar un registro.Ver :help timeoutlen para más detalles, estoy usando:

set timeout timeoutlen=3000 ttimeoutlen=100

Bueno, primero haz este comando:

:h d

Entonces te darás cuenta de que puedes eliminar en un registro específico.De esa manera no alterará lo que está en su registro predeterminado.

El texto eliminado, mientras está en modo de inserción, no entra en el registro predeterminado.

Las dos soluciones que utilizo en los contextos correctos son;

  • resalte lo que desea reemplazar usando Vims VISUAL modo luego pegue el registro.

Utilizo esto principalmente por costumbre ya que solo encontré la segunda solución mucho más tarde, por ejemplo

yiw   " yank the whole word
viwp  " replace any word with the default register
  • Anillo yanqui.Con este complemento puedes usar la combinación de teclas. <ctrl>+<p> para reemplazar el registro numerado anterior con el que acaba de pegar.

Básicamente, pega como lo haría, pero cuando se da cuenta de que desde entonces ha sobrescrito el registro predeterminado, perdiendo lo que realmente quería pegar, puede <C-P> para buscar y reemplazar en el historial de YankRing.

Uno de esos debe tener complementos...

Encontré un mapeo muy útil para tu propósito:

xnoremap p "_dP

El texto eliminado se coloca en el "registro de agujero negro" y el texto eliminado permanece.

Fuente: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

En la versión de Windows (probablemente también en Linux), puede acceder al búfer de copiar/pegar del sistema usando "*y (es decir.antes del comando de extracción con comillas dobles y un asterisco).

Luego puede eliminar las líneas reemplazables normalmente y pegar el texto copiado usando "*p.

A menudo cometo un error al seguir los comandos de 'y'ank, luego '"_d'elete en un agujero negro y luego 'pega'.Prefiero 'y'ank, luego eliminar como quiera, luego '"0p' del registro 0, que es donde se envía el último texto copiado.

Mi situación:en Normal modo, cuando elimino caracteres usando el x Al presionar una tecla, esas eliminaciones sobrescriben mi último registro, lo que complica las ediciones en las que quiero eliminar caracteres usando x y pego algo que tengo en mi registro más reciente (p. ej.pegar el mismo texto en dos o más lugares).

Probé la sugerencia en la respuesta aceptada ("_d), Pero no funcionó.

Sin embargo, a partir de la respuesta/comentarios aceptados en https://vi.stackexchange.com/questions/122/performing-certain-operations- without-clearing-register, agregué esto a mi ~/.vimrc, que funciona (es posible que tengas que reiniciar Vim):

nnoremap x "_x

Es decir, ahora puedo realizar mi tirón normal (y), borrar (d), y pegue (p) comandos - y caracteres que elimino usando x ya no completan los registros más recientes.

Para los usuarios de Dvorak, un método muy conveniente es simplemente eliminar el texto innecesario en el registro "1 en lugar del registro "_ agujero negro, aunque solo sea porque puedes presionar " + 1 con la misma pulsación de mayúsculas y un movimiento rápido con el meñique ya que 1 es la clave inmediatamente arriba " en Dvorak (MÁS d está en el otro lado, lo que hace que todo el comando sea increíblemente rápido).

Entonces, por supuesto, el registro "1 podría usarse para otras cosas debido a su conveniencia, pero a menos que tenga un propósito más común que reemplazar texto, diría que es un uso bastante bueno del registro.

Para aquellos de ustedes que están interesados ​​principalmente en no sobrescribir el registro sin nombre cuando reemplazan un texto mediante selección virtual y pegado.

Podrías utilizar la siguiente solución, que es fácil y funciona mejor para mí:

xnoremap <expr> p 'pgv"'.v:register.'y'

Es de las respuestas (y comentarios) aquí:Cómo pegar sin sobrescribir el registro

Primero pasa la selección, luego se vuelve a seleccionar la selección con el nuevo texto (gv).Ahora el registro que se usó por última vez en modo visual (normalmente el registro sin nombre, pero también funciona sin efectos secundarios si usa otro registro para pegar).Y luego vuelva a colocar el nuevo valor en el registro.

PD:Si necesita una variante más simple que funcione también con el complemento vim-simulation de intellj idea, puede elegir esta (desventaja:sobrescribir el registro sin nombre incluso si se proporcionó otro registro para pegar):

vnoremap p pgvy

Para usuarios malvados de emacs, la función (evil-paste-pop) se puede activar después de pegar y recorre entradas anteriores en el anillo de eliminación.Suponiendo que lo hayas vinculado a <C-p> (predeterminado en Spacemacs), presionarías p seguido por tantos <C-p> según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top