2010-09-27 8 views
41

¿Existe una manera simple (es decir, sin escribir un guión o una secuencia elaborada de mapa de teclas) de agrupar un grupo de líneas y dejar el cursor donde sea que se haya ejecutado el yancho, en lugar de al comienzo del bloque?¿Marcar una región en VIM sin que el cursor se mueva a la parte superior del bloque?

De acuerdo con la ayuda de VIM: "Tenga en cuenta que después de un comando de arrastre de caracteres, Vim deja el cursor sobre el primer carácter que está más cerca del inicio del búfer". Line-wise parece comportarse de manera similar.

Esto es un poco molesto para mí ya que tiendo a seleccionar una región grande de arriba a abajo, Yank, y luego pegar cerca o debajo de la parte inferior de la región seleccionada. Hoy estoy marcando (m-x) justo antes de Yank y luego retrocediendo, pero sospecho que puede haber una secuencia de Yank diferente que haga lo que necesito.

He buscado SO y la web varias veces. Hay tanto material de "atajos de VIM" para navegar, pero aún no he encontrado una solución para este.

Gracias de antemano.

+0

¿Puedes dar un ejemplo de un comando yank que cambia la posición del cursor? –

+1

Estoy en la línea 1 y presiono V para iniciar el modo Visual Line. Baje 10 líneas y presiono y para tirar de la región. Después de ese comando, volví a la línea 1. Tal vez la "cosa" que moví durante la selección no es técnicamente el cursor, sin embargo, es donde me gustaría terminar cuando el tirón finalice. (Entonces, tal vez la pregunta debería haber sido "¿Cómo muevo el cursor después de ...") – LVB

Respuesta

47

No del todo responder a su pregunta, pero tal vez '] resolvería su problema?

'] `]   To the last character of the previously changed or 
       yanked text. {not in Vi} 
+3

+1 Aprendo algo nuevo todos los días. –

+0

Buen consejo y definitivamente mejor que lo que he estado haciendo. – LVB

+4

Lo que lleva a: 'vmap y y \'] ' –

26

Si está utilizando bloques visuales (v), luego de tirar del bloque puede usar gv para volver a seleccionar el mismo bloque (que también mueve la posición del cursor a donde estaba antes de tirar). Si luego presiona Esc, el bloque no se selecciona sin mover el cursor.

También puede ser de interés el comando ctrl-o en el modo de bloque visual, que salta entre el inicio y el final del bloque seleccionado.

+3

Oooh, @Greh Hewgill, muchas gracias, muchas gracias. Traté de encontrar la solución por tanto tiempo, y muchas veces he visto sugerencias como zigdon: truco con '']', pero no funciona correctamente: si me muevo de abajo hacia arriba, mi cursor se moverá de regreso a la base Pero ahora, después de leer tu publicación, definí el mapeo ': vmap y ygv ', y funciona como un amuleto. Gracias de nuevo. –

+0

¡Creo que esta respuesta debería tomar muchos más votos positivos! –

+0

Descubrí que este mapeo causa flasheo, especialmente en los grandes yanks. Para evitar esto, puede hacer esto: ': establecer lazyredraw' –

1

:y3 habrá un tirón tres líneas enteras de la línea de corriente actual, si usted sabe exactamente cuántos línea de dar un tirón, este comando es muy útil. :help :yank para más detalles.

:%y seleccionará todo el búfer sin mover el cursor, como ggvG$y, sin el flash de resaltado de selección y modificación del registro "*.

utilizo este mapa modo de inserción:

function! SelectAll() 
    %y* 
endfun 
imap <expr> <F3> SelectAll() 

ps: si lo prefiere <C-V> para pegar (fuera de vim), utilice %y+

cheque https://stackoverflow.com/a/1620030/2247746

0

no estoy seguro de si es seguro YankRing ha cambiado desde que se publicó la solución vmap ygv<Esc>, pero eso no persistió después de agregarlo a mi .vimrc. YankRing en realidad lo sobrescribió.

Aquí está mi solución en .vimrc.

function! YRRunAfterMaps() 
    vmap y ygv<Esc> 
endfunction 
2

Si un tirón en el modo visual, también se podría utilizar '> o `> para ir a la última línea/carácter de la selección visual solo tirón. En este contexto, esto es esencialmente lo mismo que '] y `] que aparentemente no es compatible, p. en VsVim.

Cuestiones relacionadas