Was ist der beste Weg, um in Vim reibungslos zu scrollen?

77

Die wichtigsten Bildlaufbefehle in Vim sind:

  1. Ctrl- Bund Ctrl- Fsowie PageUpund PageDownblättert durch die vollständige Seite
  2. Ctrl- Uund Ctrl- Dstandardmäßig eine halbe Seite scrollen
  3. Ctrl- Yund Ctrl- Eeine Zeile scrollen

Ich verliere jedes Mal den visuellen Kontext für die beiden ersteren, daher habe ich die schlechte Angewohnheit entwickelt, die letzteren ( Ctrl- Yund Ctrl- E) wiederholt zu treffen .

Was sind die am wenigsten zu beanstandenden Problemumgehungen / Plugins, da es derzeit keine Erstanbieterunterstützung für reibungsloses Scrollen gibt?

Ich verwende sowohl Vim als auch GVim je nach Aufgabe und bin glücklich, sie separat anzupassen, wenn es keinen wirklich guten Hack gibt, der für beide funktioniert. Das Mausrad funktioniert gut in GVim, aber ich suche nach tastaturbasierten Lösungen.

Andrew Wagner
quelle
[Strg + U] hat nicht funktioniert, [Strg + U] funktioniert, welche Version von vi (m) haben Sie verwendet?
AjayKumarBasuthkar

Antworten:

38

Update : Ich habe diesen Code, der gemäß den Richtlinien unter etwas überarbeitet wurde, jetzt :help write-pluginin ein Github-Repo verschoben .

Verwenden der Tastatur

Folgendes habe ich in meinem .vimrc:

function SmoothScroll(up)
    if a:up
        let scrollaction="^Y"
    else
        let scrollaction="^E"
    endif
    exec "normal " . scrollaction
    redraw
    let counter=1
    while counter<&scroll
        let counter+=1
        sleep 10m
        redraw
        exec "normal " . scrollaction
    endwhile
endfunction

nnoremap <C-U> :call SmoothScroll(1)<Enter>
nnoremap <C-D> :call SmoothScroll(0)<Enter>
inoremap <C-U> <Esc>:call SmoothScroll(1)<Enter>i
inoremap <C-D> <Esc>:call SmoothScroll(0)<Enter>i

Eigenschaften:

  • Scrollen Sie auf der Basis der Vim- scrollOption.
  • Anpassbare Bildlaufgeschwindigkeit (Zeitargument des sleepBefehls anpassen ; ich verwende zehn Millisekunden). Hinweis : Genau wie beim Verlangsamen der Bildrate in einem Video wird beim ruckeligen Scrollen das ruckartige Scrollen ruckartig und nicht das sanfte Scrollen ausgeführt. Aber was auch immer für Sie am besten funktioniert.
  • Funktioniert im Normal- oder Einfügemodus.

Hinweis : Denken Sie beim Kopieren und Einfügen daran, dass das ^Zeichen ein Steuerzeichen angibt. Kopieren-Einfügen führt zu ungültigen Ergebnissen und diese müssen manuell eingegeben werden!

  • ^Y- CTRL- Vdann CTRL-Y
  • ^E- CTRL- Vdann CTRL-E

Die Syntax <C-U>und <Enter>style werden jedoch buchstäblich als diese Zeichen eingegeben. Der Befehl map konvertiert sie intelligent in Steuerzeichen.

Verwenden der Maus

In der Frage wird erwähnt, dass das Scrollen mit der Maus in GVim gut funktioniert, aber eine Tastaturlösung erwünscht ist. Dies bedeutet für mich, dass der Fragesteller möglicherweise an einer Mauslösung interessiert ist, wenn diese im regulären Terminal Vim funktioniert.

Wenn ich die Mausunterstützung einschalte, kann ich problemlos durch das Mausrad scrollen. Außerdem ist für mich das reibungslose Scrollen am wichtigsten, wenn ich mich umschaue (dh im normalen Modus), nicht wenn ich bearbeite (im Einfügemodus) und wenn ich nicht aktiv bearbeite, müssen meine Hände auf dem bleiben Die Tastatur wird jederzeit entfernt, sodass dies gut funktioniert.

Auf der Grundlage dieser Frage scheint es jedoch, dass einige Leute mehr manuelle Einstellungen vornehmen müssen, als nur die Maus einzuschalten (ich benutze nur set mouse=n):


Mein .vimrchat die folgenden Zeilen

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>

Keith Pinson
quelle
Dies funktioniert hervorragend ... und hängt nicht wie die andere Antwort von der Geschwindigkeit der Maschine ab. Prost!
Steve Vermeulen
1
Warnung: Ich habe festgestellt, dass Sie <kbd> Strg </ kbd> - <kbd> D </ kbd> usw. nicht drücken sollten, bis der vorherige Bildlauf abgeschlossen ist oder das Verhalten seltsam ist. Ich bin noch nie auf dieses Problem gestoßen, daher weiß ich nicht, ob ich es gerade nicht bemerkt habe oder ob es spezifisch für die Vim-Konfiguration auf dem aktuellen Computer ist, den ich verwende. Wenn jemand weiß, wie man mit Multithreading in Vim umgeht (!!), können Sie sich
Keith Pinson
Eine mögliche Verbesserung, die mir hier einfiel, wäre, das gleiche reibungslose Scrollen auf die Befehle zz, z-, z <cr> anzuwenden
Steve Vermeulen
Das ist eine gute Idee. Sie könnten sie auf die gleiche Weise neu zuordnen, nehme ich an.
Keith Pinson
3
Ein kleiner Kommentar zu 'Denken Sie daran, dass das Zeichen ^ ein Steuerzeichen angibt': Sie können 'let scrollaction = "^ Y"' durch 'let scrollaction = "\ <Cy>"' ersetzen, sodass Sie <Cv> nicht verwenden müssen <Cy>, um die Tastenkombination zu erstellen UND das Kopieren und Einfügen zu ermöglichen :)
Gospes
11

In vims tips.txt gibt es einen einfachen Remap-Hack:

Smooth scrolling                    *scroll-smooth*

If you like the scrolling to go a bit smoother, you can use these mappings:

    :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
    :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>
Andrew Wagner
quelle
1
Warum ist dies der Verwendung der Optionseinstellung 'scroll' vorzuziehen (z. B.: Set scroll = 15)? Die Bildlaufoption scheint vorzuziehen, da Sie sogar einen Au-Befehl erstellen können, der ihn automatisch ändert, wenn sich die Fensterhöhe ändert. (Ich denke, Sie könnten so etwas auch mit dieser Mapping-Methode machen, aber die Scroll-Option vereinfacht die Dinge.)
Herbert Sitz
1
Das automatische Einstellen der Bildlaufvariablen ist eine der Optionen, die ich ebenfalls in Betracht gezogen habe. Wie Sie bereits erwähnt haben, muss es der Fenstergröße entsprechen. Die Bildlaufvariable ist standardmäßig auf die Hälfte der Fensterhöhe eingestellt, scheint jedoch keine Möglichkeit zu bieten, diesen Bruch zu ändern. Sie können es nur in Bezug auf die Anzahl der Zeilen ändern. Möglicherweise müssen Sie auch einen kleineren Wert für das Scrollen festlegen, als wenn Sie auch eine Art sanftes Scrollen hätten, da Ihre Augen keine Zwischen-Scroll-Zustände haben, um die Persistenz des Sehens zu verbessern.
Andrew Wagner
1
Zur Verdeutlichung scrollen cd und cu um die Option 'scroll'. Die Standardeinstellung ist 1/2 der Fensterhöhe, Sie können sie jedoch beliebig einstellen. Wenn Sie einen neuen Wert von der Fensterhöhe abhängig machen möchten, verwenden Sie die Funktion 'winheight ("%")', die die Anzahl der Zeilen im Fenster zurückgibt. So würde beispielsweise der Befehl ': set scroll = winheight ("%") / 3' dazu führen, dass cu und cd 1/3 der Fensterhöhe scrollen.
Herbert Sitz
1
@Drew Wagner Dieses Mapping sollte aus Gründen der noremap <expr> <C-u> repeat("\<C-y>", 20)Lesbarkeit neu geschrieben werden.
ZyX
9
Oder einfach:map <C-U> 20<C-Y>
anishsane
7

Ein aktuelles Plugin

Ich habe hier etwas Ähnliches gepostet , aber im Grunde gibt es ein großartiges Plugin, das wir jetzt zum Scrollen verwenden können, Terryma / Vim-Smooth-Scroll . Es bietet ein sehr schönes und flüssiges Scrollen.


Die Installation ist ganz einfach:

1Ich benutze Vundle, also habe ich dies einfach in .vimrc.bundles angehängt :

Bundle terryma/vim-smooth-scroll

In der neuesten Version von Vundle, die heute, am 29. April 2016, verfügbar ist, können Sie dies in Ihre .vimrc einfügen :

Plugin 'terryma/vim-smooth-scroll'

2Wie im Dokument angegeben, können Sie drei Argumente einrichten: Entfernung , Dauer und Geschwindigkeit .

Ich verwende dies in meiner .vimrc- Datei:

noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>
Mick
quelle
1
Leider bewegt dieses Plugin auch den Cursor anstelle dessen, was ich wollte: einfach den Bildschirm wie die Befehle <C-E>und scrollen <C-Y>.
Silviubogan
4

Ich stelle die Tastaturwiederholung auf sehr schnell ein, etwa 120 Zeichen / Sekunde, und die Verzögerung ist gering. Dann ordne ich 4j zu und 4k navigiere mit j und k im Quellcode auf und ab, wodurch der Cursor schön schnell schnell und ziemlich sanft auf und ab bewegt wird. Aber hier ist der gute Teil, und dies funktioniert unter Linux, nicht unter Windows. Seit einigen Jahren funktioniert die Tastatureingabe von X11 so, dass beim Drücken und Halten von j offensichtlich j Zeichen ausgegeben werden. Wenn Sie dann j gedrückt halten und dann auch die Strg-Taste drücken, gibt X11 cj-Zeichen aus, ohne dass Sie die j-Taste erneut drücken müssen. Wenn Sie dann die Strg-Taste loslassen und weiterhin j drücken, setzt X11 das Setzen von j erneut fort. Mit j bewegt sich der Cursor also schön und sanft nach unten, und Sie können regelmäßig die Strg-Taste drücken, ohne j loszulassen, um ihm einen Schub zu geben.

Außerdem mache ich das, was Devin macht, und setze den Scrolloffset auf 5.

Zuletzt tausche ich Strg und Feststelltaste. Die Standardposition der Strg-Taste ist vollständig verzögert (keine Straftat beabsichtigt). Sie müssen Ihre linke Hand drehen. Ich benutze fast nie Feststelltaste, also tausche ich sie. Dann kann mein linker rosa Finger die Strg-Taste ohne Yoga-Bewegungen erreichen.

Diese Dinge haben jahrelang für mich funktioniert. Ich benutze nur vim, niemals gvim.

Mike
quelle
3
+1 für die Klage über die Position des Steuerschlüssels. IMO ist die MacBook-Befehlstaste nicht viel besser.
Triptychon
3

Dies ist kein reibungsloses Scrollen, aber so gehe ich damit um, dass beim Springen von Seiten kein Kontext verloren geht.

setze so = 7

'scrolloff' 'so' number (Standard 0) global
{not in Vi}
Minimale Anzahl von Bildschirmzeilen, die über und unter dem Cursor bleiben sollen. Dadurch wird ein Kontext sichtbar, in dem Sie arbeiten. Wenn Sie einen sehr großen Wert (999) festlegen, befindet sich die Cursorzeile immer in der Mitte des Fensters (außer am Anfang oder Ende der Datei oder wenn lange Zeilen umbrochen werden). Zum horizontalen Scrollen siehe 'Seitencrolloff'. HINWEIS: Diese Option wird auf 0 gesetzt, wenn 'kompatibel' eingestellt ist.

DevinDawson
quelle
3

Das Plugin cskeeters / vim-Smooth-Scroll unterstützt das reibungslose Scrollen und erfordert keine Konfiguration. Es unterstützt mit smooth scrolling zu unterstützen zt, zzund zb. Es ist eine Abzweigung von Terrymas Plugin . Einige der Open-Pull-Anforderungen wurden angewendet.

Chad Skeeters
quelle
1
N <CR-E>
N <CR-Y>

... wobei 'N' die Anzahl der einzelnen Zeilen ist, die Sie scrollen möchten.

Im wahrsten Sinne des Wortes nicht glatt, aber Sie behalten die Tastatur.

fde-capu
quelle
0

Ich habe gerade dieses Plugin „beschleunigte-glatt-Scroll“ ( „Vim - Plugin für eine beschleunigte glatte Spirale (Mapping genannt <C-D>/<C-U>, <C-F>/<C-B>)“) , die zum Beispiel durch Vundle verwendet werden kann , indem Sie diese Zeile in Ihrer .vimrc setzen:

Plugin 'yonchu/accelerated-smooth-scroll'

Starten Sie dann Vim neu und führen Sie den :PluginInstallBefehl aus. Starten Sie Vim erneut und verwenden Sie die Befehle <C-D>( Ctrl+D) und <C-O>( Ctrl+O) normal.

Leider bewegt dieses Plugin auch den Cursor anstelle dessen, was ich wollte: einfach den Bildschirm wie die Befehle <C-E>und scrollen <C-Y>.

silviubogan
quelle
0

Dies kombiniert viele dieser Antworten, und das ist, was ich benutze.

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
Jason Eveleth
quelle