salir - ¿En Vim hay una forma de eliminar sin poner texto en el registro?
vim linux (20)
Usando Vim a menudo quiero reemplazar un bloque de código con un bloque que acabo de tirar.
Pero cuando borro el bloque de código que se va a reemplazar, ese bloque mismo entra en el registro que borra el bloque que acabo de borrar. Así que tengo el hábito de tirar, luego insertar, luego borrar lo que no quería, pero con grandes bloques de código, se complica al intentar mantener separados el bloque insertado y el bloque para eliminar.
Entonces, ¿cuál es la forma más rápida y elegante de reemplazar texto en Vim?
- ¿Hay alguna forma de eliminar texto sin ponerlo en el registro?
- hay una manera de decir, por ejemplo, "reemplazar la siguiente palabra" o "reemplazar hasta el siguiente párrafo"
- ¿O es la mejor manera de usar de alguna manera la función de registro múltiple?
A menudo me equivoco cuando sigo las órdenes de ''y''ank luego'' "_d''elete en un agujero negro y luego ''p''aste. Prefiero'' y''ank, luego borro lo que quiera, luego ''" 0p'' de el registro 0, que es donde se inserta el último texto copiado.
Bueno, primero haz este comando:
:h d
Entonces te darás cuenta de que puedes borrar en un registro específico. De esa manera no alterarás lo que está en tu registro predeterminado.
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].
Por ejemplo, eliminamos "foo" y eliminamos "barra". ¡El registro 0 todavía contiene "foo"! Por lo tanto, "foo" se puede pegar usando "0p
El texto eliminado, mientras está en modo de inserción, no entra en el registro predeterminado.
En la versión de Windows (probablemente también en Linux), puede ingresar al búfer de copiar / pegar del sistema usando "*y
(es decir, antes de su comando de yank con comillas dobles y asterisco).
Luego, puede eliminar las líneas reemplazables normalmente y pegar el texto copiado usando "*p
.
Encontré un mapa muy útil para su propósito:
xnoremap p "_dP
El texto eliminado se coloca en "registro de agujero negro", y el texto de tirón permanece.
Fuente: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
Es útil tener un mapeo fácil que le permite reemplazar la selección actual con el 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''), simplemente puede seleccionar el texto que desea reemplazar y 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
Las dos soluciones que utilizo en los contextos correctos son;
- resalte lo que desea reemplazar utilizando el modo Vims
VISUAL
luego pegue el registro.
Lo uso 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
- YankRing . Con este complemento puede usar el enlace de teclas
<ctrl>+<p>
para reemplazar el registro numerado anterior con el que acaba de pegar.
Básicamente, se trata de pegar como lo haría, pero cuando se da cuenta de que ya ha sobrescrito el registro predeterminado, perderá lo que realmente quería pegar, ¡puede <CP>
encontrar y reemplazar el historial de YankRing!
Uno de esos debe tener complementos ...
Para ''reemplazar palabra'', intente cw
en modo normal.
Para ''reemplazar párrafo'', pruebe la cap
en modo normal.
Para aquellos de ustedes que están interesados principalmente en no sobrescribir el registro sin nombre al reemplazar un texto a través de la selección virtual y pegar.
Podría 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
Pasa la selección primero, luego se selecciona de nuevo la selección con el nuevo texto (gv). Ahora el registro que se usó por última vez en el modo visual (normalmente el registro sin nombre, pero también funciona sin efectos secundarios si utiliza otro registro para pegar). Y luego tirar el nuevo valor al registro de nuevo.
PD: Si necesita una variante más simple que funcione también con la simulación vim de plugin de intellj idea, puede tomar esta (desventaja: sobrescribir el registro sin nombre incluso si se dio otro registro para pegar):
vnoremap p pgvy
Para el ejemplo específico que dio, 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)
Para eliminar algo sin guardarlo en un registro, puede usar el "registro de agujero negro":
"_d
Por supuesto, también puede usar cualquiera de los otros registros que no contengan nada que le interese.
Para enfatizar lo que dijo EBGreen :
Si pega mientras selecciona el texto, el texto seleccionado se reemplaza con el texto pegado.
Si desea copiar texto y luego pegarlo en varias ubicaciones, use "0p
para pegar. El registro numerado 0 contiene el texto del comando yank más reciente.
Además, puede enumerar los contenidos de todos sus registros:
:registers
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, por último, echa un vistazo a cW
y cW
para cambiar una palabra, incluyendo un espacio al final. (El uso de W
mayúscula incluye puntuación.)
Para los usuarios de Dvorak, un método muy conveniente es simplemente eliminar el texto innecesario en el "1 registro en lugar del" _ registro de agujero negro, solo porque puede presionar "+ 1 con la misma pulsación de cambio y un movimiento rosado rápido desde 1 es la tecla inmediatamente arriba "en Dvorak (PLUS d está en la otra mano, lo que hace que todo el comando sea tan rápido como el infierno).
Luego, 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 un texto, diría que es un uso bastante bueno del registro.
Para los usuarios de emacs-evil, la función (evil-paste-pop)
puede activarse después de pegar, y alternar entre las entradas anteriores en el kill-ring. Suponiendo que lo hayas vinculado a <Cp>
(predeterminado en Spacemacs), deberías pulsar p
seguido de tantos <Cp>
como sea necesario.
Pongo 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 le doy un tirón al 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 hacer un seguimiento de más de un registro / portapapeles.
Sí. Es un poco más complicado que eliminar primero el texto "antiguo", pero:
Empiezo con ...
line1
line2
line3
line4
old1
old2
old3
old4
Cambio + v selecciono línea 1, línea 2, 3 y 4, y las elimino con el comando d
Luego borro las viejas 1-4 líneas de la misma manera.
Entonces hazlo
"2p
Eso pegará la segunda última línea tirada (línea 1-4). "3p
hará el tercero desde el último, y así sucesivamente ..
Así que termino con
line1
line2
line3
line4
Referencia: documentación de Vim en el registro numerado.
Si estás usando Vim, tendrás el modo visual, que es como seleccionar, pero con los modos de separación, esa es la base de vi / vim.
Lo que desea hacer es usar el modo visual para seleccionar la fuente, luego jalar, 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 primera línea -
V
: inicia el modo visual con líneas enteras -
j
: bajar una línea (con la selección iniciada en las líneas anteriores, aumenta la selección una línea hacia abajo) -
y
: yank al búfer predeterminado (las dos líneas seleccionadas, y automáticamente sale del modo visual) -
G
: ir a la última línea -
V
: iniciar 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 hacia arriba) -
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 que pone el último bloque en el búfer, por lo que de alguna manera no se desea para los pegados repetidos de la misma cosa, así que querrá guardar la fuente en un búfer nombrado con algo como "ay
(a un búfer llamado "a") y pegue con algo como "ap
(pero luego, si está programando, probablemente no quiera pegar varias veces sino crear una función y llamarla, ¿correcto? ¿ DERECHO ?).
Si solo estás usando vi, entonces tendrás que usar marcas invisibles en lugar del modo visual :he mark
para obtener más información sobre esto, lo siento, pero no soy muy bueno con estas marcas invisibles, estoy bastante contaminado con modo visual
Todas las operaciones de extracción y eliminación se 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 registros 1-9
contienen las 9 eliminaciones más recientes (siendo 1
la más reciente).
En otras palabras, una eliminación sobrescribe el tirón más reciente en el registro sin nombre, pero aún está allí en el registro 0
. El truco de registro de "_dd
( "_dd
) mencionado en las otras respuestas funciona porque evita sobrescribir el registro sin nombre, pero no es necesario.
Hace referencia a un registro utilizando comillas dobles, por lo que puede pegar el texto más reciente y tirado de esta manera:
"0p
Esta es una excelente referencia:
Una solución mínimamente invasiva para los perezosos:
El registro 0
siempre contiene el último yank (como Rafael , alex2k8 e idbrii ya han mencionado). Desafortunadamente, seleccionar el registro 0
todo el tiempo puede ser bastante molesto, por lo que sería bueno si p
usa "0
por defecto. Esto se puede lograr al colocar 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 asigna cada trazo p
a "0p
. Sin embargo, esto evita que p
acceda a otros registros. Por lo tanto, todos los trazos p
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 los trazos p
y P
implícitos, que ahora usan el registro 0
de manera predeterminada.
Sugerencia 1: el comando de corte ahora es "0d
lugar de solo d
. Pero como soy flojo, esto es demasiado largo para mí;) Por lo tanto, estoy usando la siguiente asignación:
noremap <LEADER>d "0d
noremap <LEADER>D "0D
La clave del líder es /
por defecto, por lo que puede cortar texto fácilmente escribiendo /d
o /D
Sugerencia 2: El tiempo de espera predeterminado para las asignaciones de varias teclas es bastante corto. Es posible que desee aumentarla para tener más tiempo al seleccionar un registro. Ver :help timeoutlen
para más detalles, estoy usando:
set timeout timeoutlen=3000 ttimeoutlen=100