Después de copiar una selección visual al teclado, regrese a la ubicación original

18

Mi cursor está en el medio de un párrafo cuando decido que de repente necesito copiar ese párrafo:

comienzo

Entonces escribo vippara seleccionar el párrafo visualmente:

seleccionado

Ahora presiono cmd+Cpara copiar al portapapeles (esto puede variar en su sistema, pero no debería ser relevante para la pregunta central de mi publicación), lo que deja mi cursor al comienzo del párrafo:

final

en lugar de la posición deseada, que es donde estaba cuando comencé.

Tenga en cuenta que el mismo problema se produce al extraer la selección de forma no visual con yip.

Me gustaría que el comportamiento predeterminado sea "volver a la posición original del cursor" después de realizar acciones de selección / copia como esta. ¿Existe una configuración que lo haga posible?

Jonás
fuente
11
Sí, también me parece molesto. Solo tiendo a usar marcas para ese propósito: mm "+yap `m(Tenga en cuenta que se "+yajusta al portapapeles de su sistema)
fruglemonkey
3
Me resulta muy útil tener el cursor colocado al principio o al final de la zona arrancada. Después de todo, ¿qué puedo hacer ahora, con el texto arrancado y el cursor dentro? No tiene mucho sentido hacer un poner / pegar ahora. Pero, si quiero hacer eso más tarde, significa que también podría tirar más tarde ... tal vez lo que necesita ahora es solo una marca.
VanLaser

Respuestas:

14

Una posible solución es usar saltos:

Antes de tirar o seleccionar visualmente, puede establecer un nuevo salto al que podrá acceder después de que su cursor se haya movido. Para ello utiliza m`.

Luego, después de que su cursor se haya movido debido al uso de tirones ctrlopara volver a la lista de saltos. También puede ver la lista de los saltos disponibles con :jumpsy navegar esta lista con ctrloyctrli

Para resumir su flujo de trabajo sería:

  • m`
  • yip
  • ctrlo

Como usar m` establece una marca, puede saltar a ella en ``lugar de ctrlo.

Puedes leer :h mark-motionsy :h :jumpspara más información.

statox
fuente
Me gusta esto. ¿Hay alguna forma de hacer que la comilla simple se comporte como un backtick en general, al saltar? la comilla simple es más fácil de escribir, y generalmente quiero saltar a la posición correcta de la columna, así como a la línea correcta ...
Jonah
1
@ Jonás, creo <leader>'que ser `, lo que funciona bastante bien para mí. (Yo uso <space>como mi líder.)
Numeri dice Reinstate Monica
@Jonah: Como Numeri dijo que un mapeo puede ser una buena solución, de lo contrario, si quieres deshacerte del backtick, puedes echarle un vistazo :h 'langmap'. No digo que sea la solución ideal, pero tal vez podría ser interesante para usted.
statox
@Johah, realmente cambio la comilla simple y la marca de regreso usando noremap ' ` noremap ` '... Esto está en mi vimrc y funciona muy bien
Niko Bellic
10

Puede evitar mover el cursor con:

:'{,'}y

Ver :help range, :help mark-motionsy :help :y.

romainl
fuente
1
Es bueno saberlo, pero ¿es eso lo que realmente haces? Parece que escribir las 8 teclas, con dos corchetes, hace que esto sea más difícil que las soluciones de marca
Jonah
Eso es lo que haría si estuviera en tu posición. Pero no tengo ningún problema con el comportamiento que describe, así que en realidad no hago eso.
romainl
2
@ Jonás Todavía tienes la opción de crear un mapeo. Algo así :nmap <key> :'{,'}y<CR>debería hacer el trabajo.
statox
10

Mi cursor está en el medio de un párrafo.

Si acaba de editarlo, la solución más simple es escribir lo g ;que colocará el cursor en la última posición de edición.

Y si no ha editado el párrafo, puede hacer una simple operación de reemplazo con el mismo carácter en el que está (por ejemplo, está encendido h, escribe rh) para activar un "evento" de edición sin editar nada.

Al.G.
fuente
2
+1: siempre usé '., pero puede ser muy útil navegar entre los últimos cambios con g;y g,.
mMontu
2
¿Existe alguna versión g;que también lo lleve a la posición correcta de la columna?
Jonás
@ Jonás ese es el comportamiento por defecto. ¿No te funciona? Siempre me lleva a la posición correcta de columna y línea.
Al.G.
4

El complemento vim-easyclip tiene una configuración para esto:

g:EasyClipPreserveCursorPositionAfterYank- Por defecto 0 (es decir, deshabilitado). El comportamiento predeterminado de Vim es colocar el cursor al comienzo del texto extraído, lo que es coherente con otros movimientos. Sin embargo, si prefiere que la posición del cursor permanezca sin cambios al realizar los tirones, habilite esta opción.

Es un poco demasiado para mí instalar un complemento completo solo para esta pequeña característica, por lo que prefiero usar marcas según mi comentario.

fruglemonkey
fuente
0

Ampliando la respuesta de Al.G., podemos ir a la ubicación requerida sin editar. Solución es gi. Llegaremos a la misma posición donde estábamos en el último modo de inserción antes.

  • Estás en el medio del párrafo.
  • cambiar al modo de inserción.
  • cambia al modo normal.
  • presione vip.
  • presione gi.
  • cambia al modo normal. ( ginos dejará para insertar el modo)

Si queremos ir al inicio o al final del texto resaltado.

 :help v_o 

Cuando tira del texto resaltado, también volverá al modo normal y puede o no conservar la posición original del cursor.

  1. Si comienza a resaltar desde la posición del cursor superior a la inferior (desde el número de columna de línea inferior al número de columna de línea superior), mantendrá la posición original del cursor al presionar y
  2. El cursor permanecerá en la posición actual si el resaltado comienza desde la posición del cursor inferior a la superior.

Volviendo a la ubicación original después de tirar:
gv para obtener el resaltado anterior.

Ahora puede cambiar entre la ubicación original y la actual en modo visual con la tecla
oo O.

El número de línea y columna de la línea de estado ayudará a conocer la posición exacta del cursor.
Documentación:

:help visual-change
vusan
fuente
Esto no funciona vipcuando el cursor comienza en el medio de un párrafo.
Antony
Oh, no lo noté, por ahora editaré mi respuesta en lugar de eliminarla.
vusan
@Antony Ahora también funciona para vipverificar mi edición.
vusan