¿Cómo mover la pantalla sin mover el cursor en Vim?

598

Recientemente descubrí los accesos directos Ctrl+ Ey Ctrl+ Ypara Vim que respectivamente mueven la pantalla hacia arriba y hacia abajo con un paso de una línea, sin mover el cursor .

¿Conoces algún comando que deje el cursor donde está pero mueve la pantalla para que la línea que tiene el cursor se convierta en la primera línea? (tener un comando para la última línea sería una buena ventaja).

Puedo lograr esto presionando manualmente Ctrl+ E(o Ctrl+ Y) la cantidad adecuada de veces, pero tener un comando que de alguna manera lo haga directamente sería bueno.

¿Algunas ideas?

ereOn
fuente
¿No debería esta pregunta estar en la sección de Vim?
John

Respuestas:

877
  • zz- mueva la línea actual a la mitad de la pantalla
    Cuidado conzz , si tiene Caps Lockaccidentalmente, guardará y saldrá vim!)
  • zt - mover la línea actual a la parte superior de la pantalla
  • zb - mover la línea actual a la parte inferior de la pantalla
Kevin Vaughan
fuente
99
@HappyGreenKidNaps Mapa que bloquea la tecla de bloqueo para controlar lo antes posible!
Aaron
Estoy bastante apegado a mi bloqueo de mayúsculas, especialmente al tratar con muchas macros C, pero tiene otras opciones. Primero, busque una tecla no asignada (verifique si hay letras en ambos casos; intente agregar un modificador o un líder, usando un símbolo o una tecla de función, etc.) y asígnela a la combinación 'riesgosa' sensible a mayúsculas y minúsculas. En segundo lugar, configure vimundo a su gusto para que pueda recuperarse de un ups. (Hacks no portátiles entrantes :) En tercer lugar, haga lo mismo pero desde la configuración del teclado del usuario, por ejemplo, tecla de Windows + Z; para mapas a secuencias, intente xdotoolo triggerhappy. Finalmente, muestre el estado de bloqueo de mayúsculas (no se puede hacer en Vimscript) ...
John P
2
Consultar el estado de bloqueo de mayúsculas depende mucho del entorno. He oído que no se puede hacer en Vimscript, y en este punto lo he aceptado. Si desea ir por ese camino, no hay xev -q, cat /proc/bus/input/devicespara encontrar el dispositivo de consulta y evtesto thd ... --dump /dev/input/event<#>para comprobar el estado, etc. Si es absolutamente necesario hacer una reasignación de todo el sistema, al menos dos cerraduras de intercambio como gorras <-> num - pero el problema es más olvidar que está activado, porque si lo deseabas antes, seguirás usándolo, en cualquier mapa. Riesgo de romper Vim antes de archivos / usuario / sistema.
John P
Otras opciones de script de Vim: active 'confirmar' para confirmar salir / salir / etc .; para escribir, creo que necesitarías un autocomando para BufWritePre con confirm(). Además, en lugar de asignar el bloqueo de mayúsculas a Ctrl, puede asignarlo a una tecla o combinación entendida pero no asignada por Vim, y luego emular el bloqueo de mayúsculas exclusivamente en el modo de inserción / reemplazo, a mano o por algo como github.com/tpope/ vim-capslock . Probablemente no lo necesite fuera de Vim, pero si lo hace, escriba una secuencia de comandos xmodmap para revertir sus cambios, o vea si el programa admite asignaciones propias (y tome notas).
John P
3
zt / zz / zb - cursor fijo y mover la pantalla a t op / center (alemán: ' z entrum') / b ottom <---> H / M / L - pantalla fija y mover el cursor a H igh / M inactivo / L ow posición
eli
626

Adicionalmente:

  • Ctrl- yMueve la pantalla una línea hacia arriba
  • Ctrl- eMueve la pantalla una línea hacia abajo
  • Ctrl- uMueve el cursor y la pantalla hacia arriba ½ página
  • Ctrl- dMueve el cursor y la pantalla hacia abajo ½ página
  • Ctrl- bMueve la pantalla una página hacia arriba, el cursor a la última línea
  • Ctrl- fMueve la pantalla una página hacia abajo, el cursor a la primera línea

Ctrl- yy Ctrl-e solo cambian la posición del cursor si se movería fuera de la pantalla.

Cortesía de http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
fuente
9191
@ulidtko: efter (después en sueco), antaño (que significa el pasado), arriba, abajo, atrás, adelante. (Las palabras hacia atrás y hacia adelante son más largas que arriba y abajo, por lo que, naturalmente, mueven la pantalla una distancia más larga)
Moberg
12
Supongo que ayer, ya que ayer sería una mejor mnemotecnia ^^
Moberg
Tanto Ctrl-u como Ctrl-d mueven el cursor: " El cursor se mueve el mismo número de líneas hacia arriba en el archivo (si es posible; cuando las líneas se ajustan y al tocar el final del archivo puede haber una diferencia) "
Lex R
Gracias @LexR, he actualizado la respuesta para reflejar esa distinción.
Paul Wheeler
1
:help CTRL-EdiceMnemonic: Extra lines.
Niko Bellic
39

Vim requiere que el cursor esté en la pantalla actual en todo momento, sin embargo, puede marcar la posición actual desplazarse y luego regresar a donde estaba.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
fuente
1
tenga en cuenta que si solo le importa ir a la línea marcada, puede usar 'g
Matt Briggs el
44
"Vim requiere que el cursor esté en la pantalla actual en todo momento" A los usuarios de Vim les gusta alardear de que todo es configurable en vim. Este no lo es. No quiero que mi cursor se mueva mientras me desplazo por el archivo. Breakbreaker para mí
gadelat
8
Nunca tuve una situación en la que quisiera que el cursor estuviera en un lugar donde no pudieras verlo. Claro, el cursor se mueve cuando te desplazas, pero puedes volver a donde estabas trivialmente (para que puedas ver dónde estabas realmente, no solo una especie de adivinanza). Doble retroceso para uno, Ctrl-Opara otro realmente genial, y "retroceso, punto" lo regresa a donde estaba editando por última vez.
dash-tom-bang
3
@gedalat, es muy molesto en otros editores cuando te desplazas, ya no sabes dónde está tu cursor y tienes que usar el mouse para hacer clic en algún lugar para que puedas recuperar el cursor. O cree que está "aquí", comience a escribir y de repente salta de nuevo a donde estaba el cursor, en ese punto no puede volver al lugar donde se había desplazado, porque solo se rastrean las posiciones del cursor. Hacer que el cursor siga a donde vas es posiblemente una buena cosa.
Shahbaz
1
Es configurable, @gadelat. Solo necesita mapear esta misma respuesta (marque la posición con mg, desplácese, goto marque con 'gy ya está. Ahora puede invocar la tecla configurable para dar la vuelta y sentirá que el cursor nunca abandonó la posición actual. ¡Voilá!
Dr. Beco
18

Aquí está mi solución en vimrc:

"keep cursor in the middle all the time :)
nnoremap k kzz
nnoremap j jzz
nnoremap p pzz
nnoremap P Pzz
nnoremap G Gzz
nnoremap x xzz
inoremap <ESC> <ESC>zz
nnoremap <ENTER> <ENTER>zz
inoremap <ENTER> <ENTER><ESC>zzi
nnoremap o o<ESC>zza
nnoremap O O<ESC>zza
nnoremap a a<ESC>zza

Para que el cursor permanezca en el medio de la pantalla y la pantalla se mueva hacia arriba o hacia abajo.

Enrique
fuente
Creo que esta solución es más de lo que el OP necesitaba. Lo apliqué y funciona de maravilla.
Gustavo Pinsard
99
¿Qué tal simplemente establecer 'scrolloff' a la mitad del valor de 'lines'?
rld.
desafortunadamente "nnoremap o o <ESC> zza" pierde el autoindent, pero esto se soluciona al agregar y eliminar un carácter temporal '.' "nnoremap o o. <ESC> zzxa"
Neil McGill
Gracias @rld, el 'desplazamiento' también es una buena o tal vez una mejor solución. ¡Gracias! Aquí está la referencia: vim.wikia.com/wiki/…
Henry
14

Para dejar el cursor en la misma columna cuando se utiliza Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

debe definir la siguiente opción:

:set nostartofline
Alexander Rumyantsev
fuente
2
Lo olvido / confundo cada vez: zt / zz / zb - cursor fijo y mover la pantalla a t op / center (alemán: ' z entrum') / b ottom <---> H / M / L - pantalla fija y mover cursor a la posición H igh / M iddle / L ow
eli
8

Me sorprende que nadie esté usando la Scrolloffopción que mantiene el cursor en el medio de la página. Pruébalo con:

:set so=999

Es el primer método recomendado en el wiki de Vim y funciona bien.

Jesse Reza Khorasanee
fuente
3
Y si usted no desea que el cursor siempre que sea justo en el medio, se puede establecer a un valor menor. Por ejemplo, :set scrolloff=4requerirá que el cursor esté siempre al menos a 4 líneas de distancia de la parte superior o inferior de la ventana, por lo que siempre tendrá al menos un poco de contexto.
Soren Bjornstad
6

He usado estos atajos en el pasado ( nota: pulsaciones de teclas separadas, es decir, toque z , suelte, toque la tecla siguiente):

z enter -> mueve la línea actual a la parte superior de la pantalla

z . -> mueve la línea actual al centro de la pantalla

z - -> mueve la línea actual al fondo

Si no es obvio:

entersignifica la tecla Returno Enter.

.significa la tecla DOT o "punto final" ( .).

-significa la tecla HYPHEN ( -)

Por lo que vale, z.evita el peligro de guardar y cerrar Vi al escribir accidentalmente ZZsi el bloqueo de mayúsculas está activado.

Borrachera
fuente
5

Puede prefijar sus comandos de movimiento del cursor con un número y eso repetirá ese comando muchas veces

10Ctrl+ Ehará Ctrl+ E10 veces en lugar de uno.

Yunzen
fuente
4

zEnter hace exactamente lo que pide esta pregunta.

Funciona donde extrañamente zzno funcionaría (vim 7.4.1689 en Ubuntu 2016.04 LTS sin .vimrc especial)

Nicolas Raoul
fuente
2

A veces es útil desplazar el texto con las teclas Ky J, por lo que tengo esta función de "modo de desplazamiento" en mi .vimrc (también vinculada azs ).

Ver scroll_mode.vim .

Oleg Khalidov
fuente
2

mi mnemotécnica para desplazarse ...

Agregar a otras respuestas también presta atención a , zey zssignifica: mover la pantalla a la izquierda / derecha del cursor (sin mover el cursor)

+-------------------------------+
^                               |
|c-e (keep cursor)              |
|H(igh)             zt (top)    |
|                   ^           |
|           ze      |      zs   |
|M(iddle)  zh/zH <--zz--> zl/zL |
|                   |           |
|                   v           |
|L(ow)              zb (bottom) |
|c-y (keep cursor)              |
v                               |
+-------------------------------+

También mire la posición de hy ly ty by (con el teclado qwertz) c-ey c-y(también la "y" de alguna manera apunta a la parte inferior) en el teclado para recordar dónde se mueve la pantalla.

eli
fuente
1

Escribí un complemento que me permite navegar por el archivo sin mover la posición del cursor. Se basa en doblar las líneas entre su posición y su posición de destino y luego saltar sobre el doblez, o abortarlo y no moverse en absoluto.

Es también fácil de rápido cambio entre el cursor en la primera línea, la última línea y el cursor en el medio con sólo hacer clic j, kol cuando se está en el modo de plugin.

Supongo que sería un buen ajuste aquí.

chasquido
fuente
1

Ingrese vim y escriba:

:help z

zes el comando vim para redibujar, por lo que redibujará el archivo en relación con la posición del cursor. Las opciones que tiene son las siguientes:

z+- Redibuja el archivo con el cursor en la parte superior de la ventana y en el primer carácter no en blanco de su línea.

z-- Redibuja el archivo con el cursor en la parte inferior de la ventana y al primer carácter no en blanco de su línea.

z.- Redibuja el archivo con el cursor en el centro de la ventana y al primer carácter no en blanco de su línea.

zt- Redibuja el archivo con el cursor en la parte superior de la ventana.

zb- Redibuja el archivo con el cursor en la parte inferior de la ventana.

zz- Redibuja el archivo con el cursor en el centro de la ventana.

Joe
fuente