Wie bewege ich den Bildschirm, ohne den Cursor in Vim zu bewegen?

598

Ich habe kürzlich Ctrl+ Eund Ctrl+ YVerknüpfungen für Vim entdeckt, die den Bildschirm mit einem einzeiligen Schritt nach oben und unten bewegen, ohne den Cursor zu bewegen .

Kennen Sie einen Befehl, der den Cursor dort belässt, wo er sich befindet, aber den Bildschirm so bewegt, dass die Zeile mit dem Cursor zur ersten Zeile wird? (Ein Befehl für die letzte Zeile wäre ein schöner Bonus).

Ich kann dies erreichen, indem ich Ctrl+ E(oder Ctrl+ Y) die richtige Anzahl von Malen manuell drücke , aber einen Befehl zu haben, der dies irgendwie direkt tut, wäre schön.

Irgendwelche Ideen?

ereOn
quelle
Sollte diese Frage nicht in der Vim-Sektion stehen?
John

Antworten:

877
  • zz- Verschieben Sie die aktuelle Zeile in die Mitte des Bildschirms
    ( Vorsichtzz , wenn Sie Caps Lockversehentlich eingeschaltet sind, speichern und beenden Sie vim!)
  • zt - Verschieben Sie die aktuelle Zeile an den oberen Bildschirmrand
  • zb - Verschieben Sie die aktuelle Zeile an den unteren Bildschirmrand
Kevin Vaughan
quelle
9
@HappyGreenKidNaps Ordnen Sie die Feststelltaste zu, um sie so schnell wie möglich zu steuern!
Aaron
Ich bin ziemlich an meine Feststelltaste gebunden, besonders wenn es um viele C-Makros geht, aber Sie haben andere Möglichkeiten. Suchen Sie zunächst einen nicht zugeordneten Schlüssel (überprüfen Sie beide Fälle auf Buchstaben; fügen Sie einen Modifikator oder eine Führungslinie hinzu, verwenden Sie ein Symbol oder eine Funktionstaste usw.) und ordnen Sie ihn der Groß- und Kleinschreibung zu. Zweitens konfigurieren Sie vimundo nach Ihren Wünschen, damit Sie sich von einem Hoppla erholen können. (Nicht tragbare Hacks eingehen :) Drittens machen Sie dasselbe, aber über Ihre Benutzertastaturkonfiguration, z. B. Windows-Taste + Z; Versuchen Sie für Karten zu Sequenzen xdotooloder triggerhappy. Zeigen Sie zum Schluss Ihren Feststelltaste-Status an (in Vimscript nicht möglich).
John P
2
Das Abfragen des Feststelltaste-Status ist sehr umweltabhängig. Ich habe gehört, dass dies in Vimscript nicht möglich ist, und an diesem Punkt habe ich es akzeptiert. Wenn Sie diesen Weg gehen möchten xev -q, müssen cat /proc/bus/input/devicesSie das Gerät finden , um den Status abzufragen und / evtestoder thd ... --dump /dev/input/event<#>zu überprüfen usw. Wenn Sie unbedingt eine systemweite Neuzuordnung vornehmen müssen, tauschen Sie mindestens zwei Sperren wie Kappen <--> num - aus. Das Problem ist jedoch, dass Sie vergessen, dass es aktiviert ist, denn wenn Sie es zuvor wollten, werden Sie es weiterhin verwenden, unabhängig von der Karte. Risiko, Vim vor Dateien / Benutzer / System zu brechen.
John P
Andere Vim-Skriptoptionen: Aktivieren Sie "Bestätigen", um das Beenden / Verlassen / etc zu bestätigen. Ich glaube, Sie würden zum Schreiben einen Autocommand für BufWritePre mit benötigen confirm(). Anstatt die Feststelltaste der Strg-Taste zuzuordnen, können Sie sie auch einem von Vim verstandenen, aber nicht zugeordneten Schlüssel oder einer Kombination zuordnen und dann die Feststelltaste ausschließlich im Einfüge- / Ersetzungsmodus von Hand oder mit etwas wie github.com/tpope/ emulieren. Vim-Capslock . Sie werden es wahrscheinlich nicht außerhalb von Vim benötigen, aber wenn Sie dies tun, schreiben Sie ein xmodmap-Skript, um Ihre Änderungen rückgängig zu machen, oder prüfen Sie, ob das Programm eigene Zuordnungen unterstützt (und machen Sie sich Notizen).
John P
3
zt / zz / zb - fester Cursor und Bildschirm auf t op / center bewegen (deutsch: ' z entrum') / b ottom <---> H / M / L - fester Bildschirm und Cursor auf H igh / M iddle / bewegen L ow Position
eli
626

Zusätzlich:

  • Ctrl- yVerschiebt den Bildschirm um eine Zeile nach oben
  • Ctrl- eVerschiebt den Bildschirm um eine Zeile nach unten
  • Ctrl- uBewegt den Cursor und den Bildschirm um eine halbe Seite nach oben
  • Ctrl- dBewegt den Cursor und den Bildschirm um eine halbe Seite nach unten
  • Ctrl- bBewegt den Bildschirm um eine Seite nach oben, den Cursor auf die letzte Zeile
  • Ctrl- fBewegt den Bildschirm um eine Seite nach unten, den Cursor auf die erste Zeile

Ctrl- yund Ctrl- eändern Sie die Cursorposition nur, wenn sie vom Bildschirm verschoben wird.

Mit freundlicher Genehmigung von http://www.lagmonster.org/docs/vi2.html

Paul Wheeler
quelle
91
@ulidtko: efter (nach auf Schwedisch), yore (was Vergangenheit bedeutet), hoch, runter, zurück, vorwärts. (Die Wörter vor und zurück sind länger als auf und ab, so bewegen sie natürlich den Bildschirm eine größere Strecke;)
Moberg
12
Ich denke gestern, wie gestern wäre eine bessere Gedächtnisstütze ^^
Moberg
Sowohl Strg-u als auch Strg-d bewegen den Cursor: " Der Cursor wird um die gleiche Anzahl von Zeilen in der Datei nach oben bewegt (wenn möglich; wenn Zeilen umbrochen werden und wenn das Ende der Datei erreicht wird, kann es einen Unterschied geben). "
Lex R
Vielen Dank an @LexR, ich habe die Antwort aktualisiert, um diese Unterscheidung widerzuspiegeln.
Paul Wheeler
1
:help CTRL-EsagtMnemonic: Extra lines.
Niko Bellic
39

Für Vim muss sich der Cursor immer auf dem aktuellen Bildschirm befinden. Sie können jedoch die aktuelle Position mit einem Lesezeichen versehen und dann zu Ihrer Position zurückkehren.

mg  # This book marks the current position as g (this can be any letter)
<scroll around>
`g  # return to g
GWW
quelle
1
Beachten Sie, dass Sie 'g
Matt Briggs
4
"Für Vim muss sich der Cursor immer auf dem aktuellen Bildschirm befinden" Vim-Benutzer rühmen sich gerne, dass in vim alles konfigurierbar ist. Dieser ist nicht. Ich möchte nicht, dass mein Cursor bewegt wird, während ich durch die Datei scrolle. Dealbreaker für mich
Gadelat
8
Ich hatte noch nie eine Situation, in der ich wollte, dass sich der Cursor an einem Ort befindet, den man nicht sehen kann. Sicher, der Cursor bewegt sich beim Scrollen, aber Sie können dorthin zurückkehren, wo Sie sich trivial befanden (damit Sie sehen können, wo Sie sich tatsächlich befanden, und nicht nur raten). Doppelter Back-Tick für einen, Ctrl-Ofür einen anderen wirklich großartigen, und "Backtick, Punkt" bringt Sie zurück zu dem Punkt, an dem Sie zuletzt bearbeitet haben.
Dash-Tom-Bang
3
@gedalat, es ist in anderen Editoren sehr ärgerlich, wenn Sie wegblättern, nicht mehr wissen, wo sich Ihr Cursor befindet, und mit der Maus irgendwo klicken müssen, damit Sie den Cursor zurückbekommen. Oder Sie denken, Sie sind "hier", beginnen zu tippen und es springt plötzlich zurück zu der Stelle, an der sich der Cursor befand. An diesem Punkt können Sie nicht mehr dorthin zurückspringen, wo Sie gescrollt haben, da nur die Cursorpositionen verfolgt werden. Es ist wohl eine gute Sache, wenn der Cursor folgt, wohin Sie gehen.
Shahbaz
1
Es ist konfigurierbar, @gadelat. Sie müssen nur genau diese Antwort zuordnen (Position markieren mit mg, scrollen, gehen mit markieren 'gund fertig. Jetzt können Sie die konfigurierbare Taste aufrufen, um herumzugehen, und es fühlt sich an, als hätte der Cursor die aktuelle Position nie verlassen. Voilá!
Dr. Beco
18

Hier ist meine Lösung in 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

Damit der Cursor in der Mitte des Bildschirms bleibt und sich der Bildschirm nach oben oder unten bewegt.

Henry
quelle
Ich denke, diese Lösung ist mehr das, was das OP brauchte. Ich habe es angewendet und es funktioniert wie ein Zauber.
Gustavo Pinsard
9
Wie wäre es, wenn Sie "scrolloff" auf die Hälfte des Werts von "lines" setzen?
rld.
Leider verliert "nnoremap o o <ESC> zza" den Autoindent, aber dies umgeht dies, indem ein temporäres Zeichen 'hinzugefügt und entfernt wird.' "nnoremap o o. <ESC> zzxa"
Neil McGill
Vielen Dank an @rld, der 'Scrolloff' ist auch eine gute oder vielleicht bessere Lösung. Vielen Dank! Hier ist die Referenz: vim.wikia.com/wiki/…
Henry
14

Um die Cursor in der gleichen Spalte zu lassen , wenn Sie verwenden Ctrl+ D, Ctrl+ F, Ctrl+ B, Ctrl+ U, G, H, M, L,gg

Sie sollten die folgende Option definieren:

:set nostartofline
Alexander Rumyantsev
quelle
2
Ich vergesse / verwirre es jedes Mal: ​​zt / zz / zb - fester Cursor und bewege den Bildschirm nach t op / center (deutsch: ' z entrum') / b ottom <---> H / M / L - fester Bildschirm und bewege mich Cursor auf H igh / M iddle / L ow Position
eli
8

Ich bin überrascht, dass niemand die ScrolloffOption verwendet, mit der der Cursor in der Mitte der Seite bleibt. Probieren Sie es aus mit:

:set so=999

Es ist die erste empfohlene Methode im Vim-Wiki und funktioniert gut.

Jesse Reza Khorasanee
quelle
3
Und wenn Sie nicht möchten, dass sich der Cursor immer genau in der Mitte befindet, können Sie ihn auf einen kleineren Wert setzen. Zum Beispiel muss :set scrolloff=4der Cursor immer mindestens 4 Zeilen vom oberen oder unteren Rand des Fensters entfernt sein, damit Sie immer mindestens ein wenig Kontext haben.
Soren Bjornstad
6

Ich habe diese Verknüpfungen in der Vergangenheit verwendet ( Hinweis: separate Tastenanschläge, dh tippen Sie auf z , lassen Sie los, tippen Sie auf die nachfolgende Taste):

z enter -> verschiebt die aktuelle Zeile an den oberen Bildschirmrand

z . -> verschiebt die aktuelle Zeile in die Mitte des Bildschirms

z - -> verschiebt die aktuelle Zeile nach unten

Wenn es nicht offensichtlich ist:

enterbedeutet die Returnoder EnterTaste.

.bedeutet die DOT- oder "Punkt" -Taste ( .).

-bedeutet die HYPHEN-Taste ( -)

Vermeidet für das, was es wert ist, z.die Gefahr des Speicherns und Schließens von Vi durch versehentliches Tippen, ZZwenn die Feststelltaste aktiviert ist.

Blenden
quelle
5

Sie können Ihren Cursorbewegungsbefehlen eine Zahl voranstellen, die diesen Befehl so oft wiederholt

10Ctrl+ Emacht Ctrl+ E10 mal statt eins.

Yunzen
quelle
4

zEnter macht genau das, was diese Frage verlangt.

Es funktioniert dort, wo es seltsamerweise zznicht funktionieren würde (vim 7.4.1689 unter Ubuntu 2016.04 LTS ohne spezielle .vimrc)

Nicolas Raoul
quelle
2

Manchmal ist es nützlich, den Text mit den Tasten Kund zu scrollen J, daher habe ich diese Funktion "Bildlaufmodus" in meiner .vimrc (auch gebunden an zs).

Siehe scroll_mode.vim .

Oleg Khalidov
quelle
2

meine Mnemonik zum Scrollen ...

Wenn Sie zu anderen Antworten hinzufügen, achten Sie auch auf zeund zs, was bedeutet: Bewegen Sie den Bildschirm nach links / rechts vom Cursor (ohne den Cursor zu bewegen).

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

Schauen Sie sich auch die Position von hund lund tund bund (mit QWERTZ-Tastatur) c-eund c-y(auch das "y" zeigt irgendwie nach unten) auf der Tastatur an, um sich zu merken, wo sich der Bildschirm bewegt.

eli
quelle
1

Ich habe ein Plugin geschrieben , mit dem ich durch die Datei navigieren kann, ohne die Cursorposition zu bewegen. Es basiert darauf, die Linien zwischen Ihrer Position und Ihrer Zielposition zu falten und dann über die Falte zu springen oder sie abzubrechen und sich überhaupt nicht zu bewegen.

Es ist auch einfach, schnell zwischen dem Cursor in der ersten Zeile, der letzten Zeile und dem Cursor in der Mitte zu wechseln j, indem Sie einfach darauf klicken koder lsich im Modus des Plugins befinden.

Ich denke, es würde hier gut passen.

einrasten
quelle
1

Geben Sie vim ein und geben Sie Folgendes ein:

:help z

zist der vim-Befehl für das Neuzeichnen, sodass die Datei relativ zu der Position neu gezeichnet wird, an der Sie den Cursor positionieren. Sie haben folgende Möglichkeiten:

z+- Zeichnet die Datei mit dem Cursor oben im Fenster und dem ersten nicht leeren Zeichen Ihrer Zeile neu.

z-- Zeichnet die Datei mit dem Cursor am unteren Rand des Fensters und dem ersten nicht leeren Zeichen Ihrer Zeile neu.

z.- Zeichnet die Datei mit dem Cursor in der Mitte des Fensters und dem ersten nicht leeren Zeichen Ihrer Zeile neu.

zt- Zeichnet die Datei mit dem Cursor oben im Fenster neu.

zb- Zeichnet die Datei mit dem Cursor am unteren Rand des Fensters neu.

zz- Zeichnet die Datei mit dem Cursor in der Mitte des Fensters neu.

Joe
quelle