Con Vim, a menudo quiero reemplazar un bloque de código con un bloque que acabo de quitar.
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 quitar. Así que tengo la costumbre 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 el bloque insertado y el bloque para eliminar por separado.
Entonces, ¿cuál es la forma más ingeniosa y rápida de reemplazar texto en Vim?
- ¿Hay alguna manera de eliminar 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?
vim
replace
vim-registers
Edward Tanguay
fuente
fuente
viwp
(paraw
ord).Respuestas:
Para eliminar algo sin guardarlo en un registro, puede usar el "registro de agujeros negros":
Por supuesto, también puede usar cualquiera de los otros registros que no tienen nada que le interese.
fuente
"<space>_d
. El espacio es necesario para escribir ".dd
en una línea vacía va al agujero negro, de lo contrariodd
es normal)."_x
yy
o '3yy' (o lo que sea), lo que lo coloca en el registro sin nombre, pero también en 0. Luego puede seguir pegándolo"0p
, a pesar de haberlo usadod
después de eso.Sí. Es un poco más complicado que eliminar primero el texto "antiguo", pero:
Empiezo con ...
I shift+ vselecciono la línea 1, la línea 2, 3 y 4, y las elimino con el dcomando
Luego borro las viejas líneas 1-4 de la misma manera.
Entonces hazlo
Eso pegará las penúltimas líneas arrancadas (línea 1-4).
"3p
hará el penúltimo, y así sucesivamente.Así que termino con
Referencia: documentación de Vim en registro numerado
fuente
Documentos VIM: el registro numerado 0 contiene el texto del comando de extracción más reciente, a menos que el comando especifique otro registro con ["x].
Por ejemplo, tiramos "foo" y eliminamos "bar" - ¡el registro 0 todavía contiene "foo"! Por lo tanto, "foo" se puede pegar usando
"0p
fuente
Es útil tener un mapeo fácil que le permite reemplazar la selección actual con búfer.
Por ejemplo, cuando pones esto en tu .vimrc
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 se sustituirá con su registro actual.
Explicación:
fuente
vmap <C-P> "_dP
Vp
reemplaza su línea actual con la arrancada de inmediato.d
que a menudo se usa para eliminar.Puse lo siguiente en mi vimrc:
Ahora lo saco y lo coloco desde el registro del portapapeles, y no tengo que preocuparme por lo que sucede con el registro predeterminado. Un beneficio adicional es que puedo pegar desde otras aplicaciones con una molestia mínima. Estoy perdiendo algo de funcionalidad, lo sé, pero de todos modos no puedo rastrear más de un registro / portapapeles.
fuente
set clipboard=unnamed
oset clipboard=unnamedplus
, lo que cambia el portapapeles predeterminado a*
o+
, respectivamente.Para el ejemplo específico que dio, si entiendo la pregunta, entonces esto podría funcionar:
fuente
Todas las operaciones de extracción y eliminación escriben en el registro sin nombre de forma predeterminada. Sin embargo, el yank más reciente y la eliminación más reciente siempre se almacenan (por separado) en los registros numerados. El registro
0
contiene el tirón más reciente. Los registros1-9
contienen las 9 eliminaciones más recientes (1
siendo las más recientes).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.Usted hace referencia a un registro utilizando comillas dobles, por lo que puede pegar el último texto eliminado de la siguiente manera:
Esta es una excelente referencia:
fuente
Para enfatizar lo que dijo EBGreen :
Si pega mientras selecciona texto, el texto seleccionado se reemplaza con el texto pegado.
Si desea copiar un texto y luego pegarlo en varias ubicaciones, use
"0p
para 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:
Ese comando hace que sea más fácil averiguar qué registro desea al hacer algo como la respuesta de dbr . También verá los registros /,%, #. (Ver también
:help registers
)Y finalmente, revise
cW
ycW
cambie una palabra que incluya y no incluya un espacio final. (El uso del capitalW
incluye puntuación).fuente
Si está utilizando Vim, tendrá el modo visual, que es como seleccionar, pero con los modos de separación es 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:
con la siguiente secuencia:
ggVjyGVkp
terminarás con:Explicado:
gg
: ir a la primera líneaV
: iniciar el modo visual con líneas enterasj
: ir hacia abajo una línea (con la selección iniciada en las líneas anteriores, esto aumenta la selección una línea hacia abajo)y
: tira al búfer predeterminado (las dos líneas seleccionadas, y automáticamente sale del modo visual)G
: ir a la última líneaV
: iniciar el modo visual (igual que antes)k
: sube 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 la misma cosa, por lo que querrá guardar la fuente en un búfer con nombre como
"ay
(a un búfer llamado "a ") y pegar con algo como"ap
(pero si estás programando, probablemente no quieras pegar varias veces sino crear una función y llamarla, ¿verdad? ¿ DERECHO ?).Si solo usa vi, entonces tendrá 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 esta cosa de las marcas invisibles, estoy bastante contaminado con el modo visual.fuente
Para 'reemplazar palabra', intente
cw
en modo normal.Para 'reemplazar párrafo', intente
cap
en modo normal.fuente
c}
en modo normal.Una solución mínimamente invasiva para los perezosos:
Registrarse
0
siempre contiene el último yank (como ya han mencionado Rafael , alex2k8 e idbrii ). Desafortunadamente, seleccionar registrar0
todo el tiempo puede ser bastante molesto, por lo que sería bueno si sep
usa"0
por defecto. Esto se puede lograr poniendo las siguientes líneas en su.vimrc
:La primera línea asigna cada
p
trazo a"0p
. Sin embargo, esto evita elp
acceso a otros registros. Por lo tanto todosp
trazos con un registro seleccionado explícitamente se asignan a la expresión de línea de comandos equivalente dentro del ciclo for. Lo mismo se hace paraP
.De esta forma se conserva el comportamiento estándar, excepto el implícito
p
y losP
trazos, que ahora usan el registro0
por defecto.Sugerencia 1: el comando de corte ahora es en
"0d
lugar de solod
. Pero como soy flojo, esto es demasiado largo para mí;) Por lo tanto, estoy usando la siguiente asignación:La clave líder es
\
predeterminada, por lo que puede cortar fácilmente el texto escribiendo\d
o\D
.Sugerencia 2: El tiempo de espera predeterminado para las asignaciones de teclas múltiples 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:fuente
Bueno, primero haz este comando:
Entonces se dará cuenta de que puede eliminar en un registro específico. De esa manera no alterará lo que está en su registro predeterminado.
fuente
["x]d{motion} Delete text that {motion} moves over [into register x]
- Vim:h d
Mi situación: en el
Normal
modo, cuando elimino caracteres usando lax
pulsación de tecla, esas eliminaciones sobrescriben mi último registro, lo que complica las ediciones donde quiero eliminar caracteres usandox
y pego algo que tengo en mi registro más reciente (por ejemplo, pegar el mismo texto a las dos o más lugares)Intenté la sugerencia en la respuesta aceptada (
"_d
), pero no funcionó.Sin embargo, de la respuesta / comentarios aceptados en /vi/122/performing-certain-operations-without-clearing-register , agregué esto a mi
~/.vimrc
, que funciona (puede que tenga que reiniciar Vim ):Es decir, ahora puedo hacer mis comandos normales de yank (
y
), delete (d
) y paste (p
), y los caracteres que eliminox
ya no rellenan los registros más recientes.fuente
El texto eliminado, mientras está en modo de inserción, no entra en el registro predeterminado.
fuente
Las dos soluciones que uso en los contextos correctos son;
VISUAL
modo Vims y luego pegue el registro.Utilizo esto principalmente por costumbre, ya que solo encontré la segunda solución mucho más tarde, por ejemplo
<ctrl>+<p>
de teclas para reemplazar el registro numerado anterior por el que acaba de pegar.Básicamente, vas a pegar como lo harías, pero cuando te das cuenta de que has sobrescrito el registro predeterminado y pierdes lo que realmente querías pegar, puedes
<C-P>
y pierdes buscar y reemplazar del historial de YankRing.Uno de esos debe tener complementos ...
fuente
Encontré un mapeo muy útil para su propósito:
El texto eliminado se coloca en el "registro de agujeros negros", y el texto extraído permanece.
Fuente: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
fuente
En la versión de Windows (probablemente también en Linux), puede utilizar el búfer de copiar / pegar del sistema utilizando
"*y
(es decir, precediendo su comando de extracción con comillas dobles y asterisco).Luego puede eliminar las líneas reemplazables normalmente y pegar el texto copiado usando
"*p
.fuente
A menudo cometo un error al seguir los comandos para 'tirar' y luego '' _d 'eliminar en un agujero negro y luego' pegar '. Prefiero' tirar ', luego borrar como quiera, luego' "0p 'de el registro 0, que es donde se empuja el último texto copiado.
fuente
Para los usuarios de emacs-evil, la función
(evil-paste-pop)
se puede activar después de pegar, y recorre las entradas anteriores en el ring de eliminación. Suponiendo que lo vincula<C-p>
(predeterminado en Spacemacs), presionaríap
seguido de tantos<C-p>
como sea necesario.fuente
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 puede presionar "+ 1 con la misma tecla Mayús y un movimiento meñique rápido ya que 1 es la clave inmediatamente arriba "en Dvorak (MÁS d está en la otra mano, lo que hace que todo el comando sea rápido como el infierno).
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 el texto, diría que es un uso bastante bueno del registro.
fuente
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 pegan.
Puede usar 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 la selección con el nuevo texto se selecciona nuevamente (gv). Ahora el registro que se utilizó 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 tire el nuevo valor al registro nuevamente.
PD: si necesita una variante más simple que funcione también con la simulación vim intellj idea plugin, puede tomar esta (inconveniente: sobrescribir el registro sin nombre incluso si se dio otro registro para pegar):
vnoremap p pgvy
fuente
Para aquellos que usan JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) con IdeaVim. Puede estar experimentando problemas con la reasignación
nnoremap d "_d
y el uso para eliminar una líneadd
. Posible solución para usted:nnoremap dd "_dd
Hay problemas en youtrack, vote por ellos: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
fuente
La preferencia ocasional de Vim por la complejidad sobre la practicidad carga al usuario con la aplicación de registros para copiar / eliminar acciones: cuando la mayoría de las veces, uno solo quiere pegar lo que se copió y "olvidar" lo que se eliminó.
Sin embargo, en lugar de combatir los complicados registros de vim, haga que sean más convenientes: elija un registro "predeterminado" para almacenar su última eliminación. Por ejemplo, envíe eliminaciones al registro d (dejando ac abierto para uso ad-hoc; d es un buen mnemónico):
Este enfoque evita que las eliminaciones golpeen los yanks PERO no pierde el registro de la eliminación: se puede pegar (volver) lo que se eliminó en lugar de perderlo en un agujero negro (como en la respuesta aceptada). En el ejemplo anterior, esta recuperación se realiza con dos asignaciones de p líderes. Un beneficio de este enfoque es que le brinda la posibilidad de elegir qué pegar: (a) lo que se acaba de quitar, o (b) lo que se acaba de eliminar.
fuente
registrar 0 a 9 son las últimas cosas que tira o corta, etc., y NO incluye cosas eliminadas, etc. Por lo tanto, si tira / corta algo, también está en el registro 0, incluso si dice cosas borradas todo el día después de eso, registre 0 sigue siendo lo último que arrancaste / cortaste.
yiw # va al registro predeterminado y al registro 0
tira de la palabra en la que está el cursor
las cosas eliminadas, etc. irán al registro predeterminado, pero NO registrarán 0
en modo estándar:
"0p # ingrese el contenido del registro 0
en modo de inserción:
ctrl-r 0 # ingrese el contenido del registro 0
También tuve un amigo que siempre tiraba / cortaba para registrarse x lol.
fuente