Por lo general, me encuentro copiando texto de un punto a otro mientras sobrescribo el texto antiguo donde se pega el nuevo:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
Supongamos que marco visualmente newtext
y lo y
animo. Ahora selecciono wrong1
(que podría ser cualquier cosa, no necesariamente solo una palabra) y p
asigno el aste newtext
. Sin embargo, si ahora hago lo mismo wrong2
, será reemplazado con en wrong1
lugar de newtext
.
Entonces, ¿cómo evito que el texto que está en el búfer se intercambie con el texto que estoy sobrescribiendo actualmente?
Editar 1
Aunque me gustan bastante las sugerencias de registro (creo que comenzaré a usar registros más, ahora que descubrí el :dis
comando), voy con una modificación de la respuesta de jinfield , porque no uso el modo de intercambio.
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
hace el truco perfectamente
Editar 2
Fui demasiado rápido; La solución de romainl es precisamente lo que estaba buscando, sin el truco en Edición 1 .
En realidad, vnoremap p "_dP
es suficiente!
Entonces, cambiando la respuesta aceptada.
fuente
vnoremap p "_dP map
, y he notado que no funciona bien para la última palabra / carácter en una línea. He ido a la vueltavnoremap p "0p
,vnoremap P "0P
yset clipboard=unnamed
(para OSX)vnoremap p "_dP
elimina el espacio en blanco en la pasta. Edit 1 funciona perfectamente.Respuestas:
Tengo estas asignaciones en mi .vimrc:
"_
es el "registro de agujeros negros", de acuerdo con:help "_
:"Al escribir en este registro, no sucede nada. Esto se puede usar para eliminar texto sin afectar los registros normales. Al leer desde este registro, no se devuelve nada. {No en Vi}"
fuente
vnoremap p "_dP map
y noté que no funciona bien para la última palabra / carácter en una línea. He ido a la vueltavnoremap p "0p
,vnoremap P "0P
yset clipboard=unnamed
(para OSX)vnoremap p "_dP
dejar de trabajar para mí en el modo de selección, perovnoremap <leader>p "_dP
funciona<leader>
es un marcador de posición que se supone que debo reemplazar por algo, pero esto solo funciona para mí si lo elimino. ¿Qué significa aquí?:help mapleader
.vnoremap <leader>p
mapeo no funciona correctamente en la última línea del búfer porque tan pronto como elimine esa última línea del búfer, ahoraP
estará en la última línea de un segundo y pegará sobre esa línea, en lugar de abajoAdemás del búfer estándar, puede extraer texto en búferes con nombre y luego colocarlos en esos búferes con nombre. Hay hasta 26 buffers con nombre que puede usar (uno para cada letra). Use comillas dobles y una letra para acceder a un búfer con nombre. Ejemplos:
"dyy
- Yank la línea actual en el búfer d."a7yy
- Yank las siguientes siete líneas en el búfer a."dP
- Ponga el contenido del búfer d antes del cursor."ap
- Ponga el contenido del búfer a después del cursorOtra cosa interesante, si usa una letra mayúscula en lugar de minúsculas, es decir,
"Dyy
la línea actual se agregará al búfer d en lugar de reemplazarlo. Más detalles en el libro de O`Reilly: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htmfuente
"a
todo, pero está bien.Cuando se usa
put
en modo visual, el texto que está reemplazandowrong1
se sobrescribe con el contenido del registro 'sin nombre'.Esto realmente funciona 'poniendo' el registro después de la selección y luego eliminando la selección. El problema es que esta eliminación ahora se almacena en el
unnamed
registro y se usará para la próximaput
acción.La solución, según
:h v_p
, es tirar en un registro con nombre, como"0y
pegar usando"0p
tantas veces como sea necesario. Puede ser útil mapear<leader>y
y<leader>p
usar un registro con nombre, si esto es algo que hace con frecuencia.para más ayuda ver:
fuente
"0
Es importante saber cómo pegar desde el registro, pero a menudo desea reemplazarlo muchas veces. Si lo convierte en una acción repetible, puede usar el.
operador, como aludió garyjohn. Se explica en la wiki de vim :fuente
Cuando tira del texto al registro sin nombre *, también se coloca una copia en el registro 0. Cada vez que reemplaza el texto seleccionado, puede pegar desde el registro 0. Ver
Además, si está reemplazando varias palabras con la misma palabra, simplemente puede pasar al comienzo de la palabra que desea reemplazar y escribir
.
. Eso repetirá la última operación de edición. Ver* Las ubicaciones de almacenamiento en las que tira y coloca se denominan registros. Un búfer es lo que edita, generalmente una copia de un archivo del disco.
fuente
Necesito esto tan a menudo, escribí un complemento para eso: Reemplazar con registro .
Este complemento ofrece un
gr
comando dos en uno que reemplaza el texto cubierto por un {movimiento}, línea (s) completa (s) 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.fuente
Como algo como
vnoremap p "_dP
(también probéx
oc
) tiene problemas con el inicio y el final de la línea, terminé haciendo esto:vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
lo que encontré más simple que los complementos existentes (que tampoco funcionabaset clipboard=unnamedplus
de fábrica). Entonces, lo que hace es:C-U
)+
registro de respaldo (debido a unnamed plus, las alternativas son"
y*
dependiendo de su configuración) parap
fuente
Esto es lo que uso (literalmente copiado de mi .vimrc) para el estilo de Windows Control + X cortar / Control + C copiar / Control + V pegar / Control + S guardar / Control + F buscar / Control + H reemplazar el comportamiento.
La función smartpaste () debe contener lo que busca, es decir, una forma de pegar sobre el texto resaltado sin tirar simultáneamente de lo seleccionado.
fuente
tl; dr - vnoremap p "_c *
Aquí hay una lista de mis asignaciones completas:
"Reparar registro copiar / pegar
nnoremap DD" * dd
nnoremap D "* d
vnoremap D" d
nnoremap d "_d
nnoremap dd" _dd
vnoremap d "_d
nnoremap s" _s
vnoremap s "_s
nnoremap c "_c
vnoremap c" _c
nnoremap x "_x
vnoremap x" _x
vnoremap p "_c
"Pegar en nueva línea
nnoremap, p op
nnoremap, P Op
fuente