vim: ¿cómo puedo hacer una 'palabra de cambio' usando el búfer de pegado actual?


86

Tengo algo de texto en mi búfer de pegado, por ejemplo, hice una yw(palabra de arrastre) y ahora tengo 'foo' en mi búfer.

Ahora voy a la palabra 'barra' y quiero reemplazarla con mi búfer de pegado.

Para reemplazar el texto manualmente, podría hacerlo cwy luego escribir la nueva palabra.

¿Cómo puedo hacer una 'palabra de cambio' pero usar el contenido de mi búfer de pegado en lugar de escribir manualmente la palabra de reemplazo?

La mejor opción que tengo en este momento es ir al principio de la palabra que quiero reemplazar y hacer dw(eliminar palabra), luego ir al otro lugar y hacer la yw(palabra de arrastre), luego volver al área de reemplazo y hacer p(pegar) que es un poco torpe, especialmente si no están en la misma pantalla.

Respuestas:


120

Opción 1

Puede usar registros para hacerlo y hacer una combinación de teclas para el proceso.

Yankea la palabra con la que quieres reemplazar yw.

La palabra arrancada está en el 0registro que puede ver emitiendo :registers.

Vaya a la palabra que desea reemplazar y haga cw. Do Ctrl+ rseguido de 0para pegar el 0registro.

El mapa para eso se vería así (suponiendo Ctrl+ jcomo nuestro combo de teclas):

:map <C-j> cw<C-r>0<ESC>

Opción 2 (más simple)

Con su palabra arrancada, pase el cursor sobre la palabra que desea reemplazar y hacer viwp. Que es visual seleccionar palabra interna y pegar.

Cortesía de @tlo en los comentarios: también podrías hacerlo vep. Un char más corto. Lo malo tiene que colocar el cursor al comienzo de la palabra y (como con el mío) cambia el búfer.

Comentario (de Michael):

Esto es bueno. Nota adicional: el segundo método es más fácil pero, como es, solo funciona para UNA sustitución porque después de cada sustitución, el búfer se cambia al campo que fue reemplazado (texto anterior). El primer método es un poco más difícil de usar, PERO tiene la ventaja de que el búfer 0 permanece 'tal cual', por lo que puede usar ese método para hacer más de 1 reemplazo del mismo texto.


14
Opción 3 (aún más simple): con su palabra arrancada, pase el cursor sobre el primer carácter de la palabra que desea reemplazar y hacer vep.
tlo

Me gusta la opción 3 cuando solo hay 1 palabra para cambiar. Si hay más de una misma palabra para cambiar, la Opción 1 me permite usar. operador para repetirlo ..
typelogic

3
ve"0pfuncionaría para permitirle repetir su cambio
JKillian

Si va a asignarlo a algo, probablemente sea mejor usarlo: map <C-j> ciw<C-r>0<ESC>para que no importe de qué parte de la palabra presione ^j.
Paul Parker

Cualquiera que quiera saber por qué CTRL-R hace su magia: :help insertluego busque CTRL-R /CTRL-R. Para saber cómo ve"0pfunciona, mira:help registers
Paul Parker

12

ywpara tirar de su palabra, luego mueva el cursor a la palabra que desea reemplazar y use "_dwpara eliminarla, enviando el texto al registro nulo (para que no sobrescriba el contenido del "registro, donde el texto arrancado / cortado va por defecto ), y luego simplemente pegue con p.

Puede usar el siguiente mapeo para facilitar un poco las cosas:

nnoremap <leader>d "_d

... así que en modo normal, puede usar \dwpara eliminar una palabra, sin afectar el "registro.


3

Para hacer esto a la manera VIM, intencionalmente usas el registro, eliminar y otros registros.

Registrarse "0es el registro de extracción. Todo lo que tire se colocará aquí, pero las eliminaciones nunca tocarán registrarse "0.

Entonces, en tu ejemplo, acabas de decir una palabra. Para reemplazar una palabra con lo que acaba de extraer, aproveche las eliminaciones que nunca toquen el registro de extracción. Así que vaya a la palabra objetivo, elimínela con dw, luego péguela desde su registro de extracción con "0p, o mejor aún, cwentonces ^R0(que es repetible).

Un cierre opuesto al registro de extracción es el registro de pequeñas eliminaciones "-. Aquí se coloca cualquier pequeña eliminación o cambio de eliminación, pero los tirones nunca se tocan "-. Una eliminación cuenta como pequeña si es menor que una línea completa.

Registros "1: "9son los registros del historial de borrados. Con "1que contiene la última deleción o cambio grande de eliminación, y "9que contiene el más antiguo deleción o cambio grande de eliminación. Sólo eliminaciones que no son pequeñas, es decir, las eliminaciones de una línea o más, son empujados hacia "1- "9.

Para cualquier operación que cambie un registro, también se coloca una copia en el registro predeterminado, es decir, sin nombre "". Este es el registro utilizado cuando no se nombra explícitamente un registro.

El registro "_es el registro del agujero negro, y siempre está vacío. Si lo elimina, no se cambiará nada en ningún registro, ni siquiera el ""registro predeterminado , ni el registro del agujero negro en sí. El texto eliminado ha desaparecido por completo, aparte de su historial de deshacer. Tirar hacia, o pegar desde el registro de agujeros negros no hace esencialmente nada.

El registro de agujeros negros le "_permite hacer cosas como primero una pequeña eliminación, luego varias otras eliminaciones "_sin cambiar su pequeño registro de eliminaciones "-, luego pegue su primera pequeña eliminación.

Otros registros son el último registro insertado "., los registros de nombre de archivo "%y "#, el registro de comando, el registro de ":búsqueda "/y el registro de expresión "=.

Puede obtener una lista de todos estos registros y sus contenidos mediante el comando :register. Ese comando es muy útil para experimentar y aprender qué termina dónde.


2

Necesito esto tan a menudo, escribí un complemento para simplificar y permitir la velocidad máxima: Reemplazar con registro .

Este complemento ofrece un grcomando dos en uno que reemplaza el texto cubierto por un {movimiento} / objeto de texto, líneas completas o la selección actual con el contenido de un registro; el texto antiguo se elimina en el registro de agujeros negros, es decir, se ha ido. Maneja de manera transparente muchos casos de esquina y permite una repetición rápida a través del .comando estándar . Si no te gusta, su página tiene enlaces a alternativas.


2

Para repetir el pegado, use el comando de cambio.

cw ^R0ESC (^ R = Control + R; 0 para el registro 0)

reemplazará la palabra con los contenidos del reg. 0 y vamos a repetirlo con.

Esto es genial para cgn(VIM 7.4) para reemplazar los patrones de búsqueda:

  • Primera búsqueda con /o*
  • cgn ^R0ESC
  • .repetir en el próximo partido o nsaltar

1

Como todavía no está incluido, generalmente reemplaza cadenas con :%s/.../.../y también puede hacerlo con la palabra debajo del cursor.

  1. Ingresa la primera parte del comando, lo que está buscando: :s/find/
  2. Luego, hace clic <ctrl-r>y elige con el cursor la palabra con la que desea reemplazarla.
  3. Luego hace clic en <ctrl-w>("palabra" pequeña) o <ctrl-a>(palabra "grande") para pegar la palabra debajo del cursor en la línea de comando
  4. Entonces terminas el comando.

Vea el enlace sobre cómo usar el cursor en la línea de comando .


1

Usualmente uso esto: ywpara tirar foo, luego eliminar barcon dw, y como paso final, poner foodel registro 0que contiene el texto arrancado usando "0p. Repita la colocación con punto ( .) según sea necesario.

Además, en lugar de ywy dw, puede usar yiwy diw(observe el extra i, significa adentro ). Con eso, puede tirar o eliminar palabras de cualquier ubicación dentro de ellas, no solo al comienzo de la palabra.


0

Utilizo este complemento para expandir la región de selección: https://github.com/terryma/vim-expand-region

Entonces, mi combinación para cambiar una palabra será: vvpen cualquier lugar de una palabra.

También tengo un truco para guardar contenido de registro sin nombre después de pegar para poder repetir esto.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(mi portapapeles es de selección automática)


0

Estoy usando la asignación de teclas a continuación para reemplazar la palabra actual con la palabra copiada.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwcopiar una palabra Navega a una palabra. ,rrreemplazar la palabra
La clave del líder es el mapa ,.


,rwTendría más sentido, y en QWERTY es probablemente un smidgen más fácil y rápido de usar. En DVORAK, elegí ,rc, que aunque no tiene mucho sentido, es más fácil y rápido que todos ellos. En DVORAK, ,rwes un espectáculo de terror;)
Paul Parker

0

Primero, navegue hasta el comienzo de la palabra que desea tirar. Si está en el medio de la palabra, simplemente bvuelva al comienzo. Luego haz yepara tirar de la palabra completa, sin espacios finales ( yank a end). Finalmente, vaya a la palabra que desea reemplazar, tal vez haciendo walgunas veces, y haga una veppara ingresar val modo de selección actual, seleccione al final ede la palabra y panote el contenido que se tiró por última vez.

(Si alguien quiere saber por qué simplemente no comenté la respuesta aceptada, por la pequeña modificación del uso en yelugar de hacerlo yw, es porque mi reputación en esta pila todavía es demasiado baja).


0
  1. usa ywpara tirar del mundo, ve al mundo que quieres cambiar.
  2. use vpara seleccionar el mundo, veo vwdependiendo de su situación.
  3. ingrese ppara pegar el mundo que copió para reemplazar el bloque seleccionado

0

Agregando a las otras mejores respuestas. Un poco demasiado obvio, pero podría simplemente pegar antes de eliminar. 'yw' luego vaya la palabra que desea reemplazar, 'pldw' (pegue, mueva un carácter a la derecha, elimine la palabra.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.