Comment déplacer l'écran sans déplacer le curseur dans Vim?

598

J'ai récemment découvert des raccourcis Ctrl+ Eet Ctrl+ Ypour Vim qui déplacent respectivement l'écran vers le haut et vers le bas avec un pas d'une ligne, sans déplacer le curseur .

Connaissez-vous une commande qui laisse le curseur là où il se trouve mais déplace l'écran de sorte que la ligne qui a le curseur devienne la première ligne? (avoir une commande pour la dernière ligne serait un bon bonus).

Je peux y parvenir en appuyant manuellement sur Ctrl+ E(ou Ctrl+ Y) le nombre approprié de fois, mais avoir une commande qui le fait directement serait bien.

Des idées?

ereOn
la source
Cette question ne devrait-elle pas figurer dans la section Vim?
John

Réponses:

877
  • zz- déplacez la ligne actuelle au milieu de l'écran
    ( attentionzz , si vous avez allumé Caps Lockaccidentellement, vous enregistrerez et quitterez vim!)
  • zt - déplacer la ligne actuelle en haut de l'écran
  • zb - déplacer la ligne actuelle en bas de l'écran
Kevin Vaughan
la source
9
@HappyGreenKidNaps Carte qui majuscule la touche de verrouillage pour contrôler DÈS QUE POSSIBLE!
Aaron
Je suis assez attaché à mon verrouillage des majuscules, en particulier avec de nombreuses macros C, mais vous avez d'autres options. Tout d'abord, recherchez une clé non mappée (recherchez les lettres dans les deux cas; essayez d'ajouter un modificateur ou une ligne de repère, en utilisant un symbole ou une touche de fonction, etc.) et mappez-la à la combinaison `` risquée '' sensible à la casse. Deuxièmement, configurez vimundo à votre guise afin de pouvoir récupérer après un oups. (Hacks non portables entrants :) Troisièmement, faites de même, mais à partir de la configuration de votre clavier utilisateur, par exemple, touche Windows + Z; pour les cartes de séquences, essayez xdotoolou triggerhappy. Enfin, affichez votre état de verrouillage des majuscules (ne peut pas être fait dans Vimscript.) ...
John P
2
L'interrogation de votre état de verrouillage des majuscules est très dépendante de l'environnement. J'ai entendu dire que cela ne pouvait pas être fait dans Vimscript, et à ce stade, je l'ai accepté. Si vous voulez emprunter cette voie, il y a xev -q, cat /proc/bus/input/devicespour trouver le périphérique à interroger et evtestou thd ... --dump /dev/input/event<#>pour vérifier l'état, etc. mais le problème est plus d'oublier qu'il est activé, car si vous le vouliez avant, vous continuerez à l'utiliser, quelle que soit la carte. Risque de casser Vim avant les fichiers / utilisateur / système.
John P
Autres options de script Vim: activez 'confirmer' pour confirmer quitter / quitter / etc .; pour l'écriture, je crois que vous auriez besoin d'une autocommande pour BufWritePre avec confirm(). De plus, au lieu de mapper le verrouillage des majuscules sur ctrl, vous pouvez le mapper sur une clé ou une combinaison comprise mais non mappée par Vim, puis émuler le verrouillage des majuscules exclusivement en mode insertion / remplacement, à la main ou par quelque chose comme github.com/tpope/ vim-capslock . Vous n'en aurez probablement pas besoin en dehors de Vim, mais si vous le faites, écrivez un script xmodmap pour annuler vos modifications, ou voyez si le programme prend en charge ses propres mappages (et prenez des notes.)
John P
3
zt / zz / zb - curseur fixe et déplacer l'écran vers t op / centre (allemand: ' z entrum') / b ottom <---> H / M / L - écran fixe et déplacer le curseur vers H igh / M iddle / L la position
eli
626

Aditionellement:

  • Ctrl- yDéplace l'écran d'une ligne vers le haut
  • Ctrl- eDéplace l'écran d'une ligne vers le bas
  • Ctrl- uDéplace le curseur et l'écran vers le haut ½ page
  • Ctrl- dDéplace le curseur et l'écran vers le bas ½ page
  • Ctrl- bDéplace l'écran d'une page, le curseur jusqu'à la dernière ligne
  • Ctrl- fDéplace l'écran vers le bas d'une page, le curseur sur la première ligne

Ctrl- yet Ctrl- ene modifiez la position du curseur que si elle devait être déplacée hors de l'écran.

Gracieuseté de http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
la source
91
@ulidtko: efter (après en suédois), jadis (signifiant le passé), haut, bas, arrière, avant. (Les mots en arrière et en avant sont plus longs que de haut en bas, donc naturellement ils déplacent l'écran sur une plus longue distance;)
Moberg
12
Je suppose que hier, comme hier, ce serait un meilleur mnémonique cependant ^^
Moberg
Ctrl-u et Ctrl-d déplacent le curseur: " Le curseur est déplacé du même nombre de lignes vers le haut dans le fichier (si possible; lorsque les lignes se terminent et lorsqu'elles atteignent la fin du fichier, il peut y avoir une différence). "
Lex R
Merci @LexR, j'ai mis à jour la réponse pour refléter cette distinction.
Paul Wheeler
1
:help CTRL-EditMnemonic: Extra lines.
Niko Bellic
39

Vim requiert que le curseur soit à tout moment dans l'écran actuel, cependant, vous pouvez marquer la position actuelle pour faire défiler et revenir à l'endroit où vous étiez.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
la source
1
notez que si vous souhaitez uniquement accéder à la ligne marquée d'un signet, vous pouvez utiliser 'g
Matt Briggs
4
"Vim exige que le curseur soit toujours dans l'écran actuel" Les utilisateurs de Vim aiment se vanter que tout est configurable dans vim. Ce n'est pas le cas. Je ne veux pas que mon curseur soit déplacé pendant que je fais défiler le fichier. Dealbreaker for me
Gadelat
8
Je n'ai jamais eu une situation où je voulais que le curseur soit quelque part où vous ne pouviez pas le voir. Bien sûr, le curseur se déplace lorsque vous faites défiler, mais vous pouvez revenir à l'endroit où vous étiez trivialement (afin que vous puissiez voir où vous étiez réellement, pas seulement une sorte de supposition). Double back-tick pour l'un, Ctrl-Opour un autre vraiment génial, et "backtick, period" vous ramène à votre dernière édition.
dash-tom-bang
3
@gedalat, c'est très ennuyeux dans d'autres éditeurs lorsque vous faites défiler, vous ne savez plus où se trouve votre curseur et vous devez utiliser la souris pour cliquer quelque part afin de pouvoir récupérer le curseur. Ou vous pensez que vous êtes "ici", commencez à taper et il revient soudainement à l'endroit où se trouvait le curseur, à quel point vous ne pouvez pas revenir à l'endroit où vous aviez fait défiler, car seules les positions du curseur sont suivies. Faire en sorte que le curseur suive où vous allez est sans doute une bonne chose.
Shahbaz
1
Il est configurable, @gadelat. Il vous suffit de mapper cette réponse (marquer la position avec mg, faire défiler, aller avec 'get vous avez terminé. Vous pouvez maintenant invoquer la touche configurable pour vous déplacer et vous aurez l'impression que le curseur n'a jamais quitté la position actuelle. Voilá!
Dr Beco
18

Voici ma solution dans 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

Pour que le curseur reste au milieu de l'écran et que l'écran se déplace vers le haut ou vers le bas.

Henri
la source
Je pense que cette solution correspond davantage à ce dont le PO avait besoin. Je l'ai appliqué et cela fonctionne comme un charme.
Gustavo Pinsard
9
Que diriez-vous de simplement définir «défilement» à la moitié de la valeur de «lignes»?
rld.
malheureusement, "nnoremap o o <ESC> zza" perd l'indentation automatique, mais cela fonctionne en l'ajoutant et en supprimant un caractère temporaire '.' "nnoremap o o. <ESC> zzxa"
Neil McGill
Merci @rld, le 'scrolloff' est aussi une bonne ou peut-être une meilleure solution. Merci! Voici la référence: vim.wikia.com/wiki/…
Henry
14

Pour laisser le curseur dans la même colonne lorsque vous utilisez Ctrl+ D,Ctrl + F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

vous devez définir l'option suivante:

:set nostartofline
Alexander Rumyantsev
la source
2
Je l'oublie / le confond à chaque fois: zt / zz / zb - curseur fixe et déplacer l'écran vers t op / centre (allemand: ' z entrum') / b ottom <---> H / M / L - écran fixe et déplacer curseur H IGH / M oyen / L la position de
eli
8

Je suis surpris que personne n'utilise l' Scrolloffoption qui maintient le curseur au milieu de la page. Essayez-le avec:

:set so=999

C'est la première méthode recommandée sur le wiki Vim et fonctionne bien.

Jesse Reza Khorasanee
la source
3
Et si vous ne voulez pas le curseur toujours être juste au milieu, vous pouvez le régler à une valeur inférieure. Par exemple, il :set scrolloff=4faudra que le curseur soit toujours à au moins 4 lignes du haut ou du bas de la fenêtre, donc vous aurez toujours au moins un peu de contexte.
Soren Bjornstad
6

J'ai utilisé ces raccourcis dans le passé ( remarque: des touches distinctes, c.-à-d. Appuyez sur z , relâchez, appuyez sur la touche suivante):

z enter -> déplace la ligne actuelle en haut de l'écran

z . -> déplace la ligne actuelle au centre de l'écran

z - -> déplace la ligne actuelle vers le bas

Si ce n'est pas évident:

entersignifie la touche Returnou Enter.

.signifie la touche DOT ou "arrêt complet" ( .).

-signifie la touche HYPHEN ( -)

Pour ce que ça vaut, z.évite le danger de sauvegarder et de fermer Vi en tapant accidentellement ZZsi le verrouillage des majuscules est activé.

Razzle
la source
5

Vous pouvez préfixer vos commandes de déplacement du curseur avec un nombre et cela répétera cette commande autant de fois

10Ctrl+ Efera Ctrl+ E10 fois au lieu d'un.

yunzen
la source
4

zEnter fait exactement ce que cette question demande.

Cela fonctionne là où étrangement zzne fonctionnerait pas (vim 7.4.1689 sur Ubuntu 2016.04 LTS sans .vimrc spécial)

Nicolas Raoul
la source
2

Parfois, il est utile de faire défiler le texte avec les touches Ket J, j'ai donc cette fonction de "mode de défilement" dans mon .vimrc (également lié à zs).

Voir scroll_mode.vim .

Oleg Khalidov
la source
2

ma mnémonique pour faire défiler ...

Ajout d'autres réponses aussi de faire attention à zeet zs, ce qui signifie: l' écran de déplacement vers la gauche / droite du curseur (sans déplacer le curseur)

+-------------------------------+
^                               |
|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                               |
+-------------------------------+

regardez également la position de het let tet bet (avec le clavier qwertz) c-eet c-y(le "y" pointe en quelque sorte vers le bas) sur le clavier pour vous rappeler où l'écran se déplace.

eli
la source
1

J'ai écrit un plugin qui me permet de naviguer dans le fichier sans déplacer la position du curseur. C'est basé sur le pliage des lignes entre votre position et votre position cible, puis sur le pli, ou l'annulez et ne bougez pas du tout.

Il est également facile de basculer rapidement entre le curseur sur la première ligne, la dernière ligne et le curseur au milieu en cliquant simplement sur j, koul lorsque vous êtes en mode du plug - in.

Je suppose que ce serait un bon ajustement ici.

casser
la source
1

Saisissez vim et saisissez:

:help z

zest la commande vim pour redessiner, donc elle redessinera le fichier par rapport à l'endroit où vous positionnez le curseur. Les options dont vous disposez sont les suivantes:

z+- Redessine le fichier avec le curseur en haut de la fenêtre et au premier caractère non vierge de votre ligne.

z-- Redessine le fichier avec le curseur en bas de la fenêtre et au premier caractère non vierge de votre ligne.

z.- Redessine le fichier avec le curseur au centre de la fenêtre et au premier caractère non vierge de votre ligne.

zt- Redessine le fichier avec le curseur en haut de la fenêtre.

zb- Redessine le fichier avec le curseur en bas de la fenêtre.

zz- Redessine le fichier avec le curseur au centre de la fenêtre.

Joe
la source