Wie scrolle ich Zeile für Zeile in GNU Emacs?


85

Um es einfach auszudrücken, ich versuche, in Emacs wie in Vim und den meisten anderen Editoren zu scrollen. wenn ich zum Beispiel bin, zwei Linien von unten / oben, und ich drücke nach unten / oben ( Ctrl- p, n, , ) ist es nur eine Zeile nach oben oder nach unten geht, nicht die Hälfte Bildschirm.


5
Ich bin überzeugt, dass dies niemals behoben werden wird. Es war ein Mangel in den letzten 90ern und es ist immer noch hier im Jahr 2010 gebrochen.
Steve Kuo

12
@Steve Kuo: Beenden Sie das Bashing - dies funktioniert wie geplant , kann jedoch mit einer einfachen Einstellung geändert (oder "behoben") werden.
Teddy

17
@ Teddy und was ist diese "einfache Einstellung"?
Steve Kuo

1
@ Teddy ja, was ist das?
Roller

@Rook: Eigentlich würde ich empfehlen, z.häufiger in vim zu verwenden, um das Emacs-Gefühl zu bekommen ;-) Es mag ungewöhnlich sein, aber es ist tatsächlich nützlicher, als IMHO Zeile für Zeile zu scrollen.
U. Windl

Antworten:


50

Sehen Sie einige der Vorschläge auf dem EmacsWIki:

(setq scroll-step 1
      scrollkonservativ 10000)

3
Habe es tatsächlich gesehen - beide Antworten, deine und die von Jrockway, aber im Wiki werden beide nicht empfohlen. Leider sind die Gründe dafür nicht klar erklärt. Deshalb habe ich die Frage gestellt, in der Hoffnung, dass jemand eine Methode gefunden hat, die fehlerfrei funktioniert.
Turm

1
Ich kann nicht verstehen, warum dies nicht empfohlen wird. Ich habe eine ähnliche Konfiguration verwendet und es hat ziemlich gut funktioniert. Weitere Informationen finden Sie in diesem Dokument zum Scrollen (beachten Sie den letzten Satz): * Die Anzahl der Zeilen, um die versucht werden soll, ein Fenster zu scrollen, wenn der Punkt nach außen verschoben wird. Wenn dies nicht dazu führt, dass der Punkt wieder auf den Frame zurückgesetzt wird, wird der Punkt stattdessen zentriert. Wenn dies Null ist, wird der Punkt immer zentriert, nachdem er sich vom Rahmen entfernt hat. Wenn das Scrollen immer eine Zeile sein soll, sollten Sie "
scrollkonservativ

Ja, wenn ich mich ein bisschen mehr umsehe, sehe ich nicht viel mehr, um diesen Warnhinweis im Wiki zu belegen. Beispielsweise scheint ein Bildlaufschritt in mehreren .emacs-Dateien über eine Google-Suche recht häufig zu sein. Vielleicht bezieht sich der Wiki-Autor auf eine alte Version von Emacs?
Ars

Hatte nie Probleme mit scroll-conservatively. Die Warnungen davor sind etwas seltsam - wenn es Probleme verursacht, ist es einfach genug, die Zeile von Ihrer init.el zu entfernen!
dbr

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/... so mit Emacs <23,1 und großen Dateien, ist es manchmal die Cursor in die Mitte springen könnte, die wie das größte Problem scheint nicht
dbr

49

Wenn Sie den Bildschirm genau positionieren möchten, können Sie Strg-L verwenden.

  • Standardmäßig wird die aktuelle Zeile in der Mitte des Bildschirms positioniert.

  • ESC 0 Strg-L positioniert die aktuelle Zeile oben.


13
Verstehen Sie das nicht falsch, aber was hat das mit dem zeilenweisen Scrollen zu tun? (dh die Frage)
Rook

8
Es ist sinnvoll, einen alternativen Workflow anzubieten, der (nach Meinung des Autors) mit dem vorliegenden Tool natürlicher ist. Sie sollten ihm jedoch einen entsprechenden Haftungsausschluss voranstellen und erklären, warum dieser Ansatz "besser" ist, wenn dies überhaupt möglich ist.
dmckee --- Ex-Moderator Kätzchen

1
@dmckee - Ich habe vim ... ähm, eine lange Zeit verwendet. Sehr gut damit. Da ich jedoch etwas mit Lisp mache, habe ich mich gezwungen, mich zumindest wieder mit Emacs auseinanderzusetzen, und diese "alternative" Art sich zu bewegen ist im Moment einfach zu viel für mich. Lesen Sie das Tutorial, wissen Sie es ... aber es ist einfach zu komisch, imho. Nicht natürlich.
Turm

1
@ Idigas: Sicher. Das ist fair und Sie müssen den Rat von starblue nicht befolgen. Aber ich denke, diese Art von Antwort kann hilfreich sein, wenn sie von vornherein erfolgt und eine überzeugende Erklärung enthält.
dmckee --- Ex-Moderator Kätzchen

1
Ja, das erledigt den Job mit ein paar Tastenanschlägen. (Ich habe nur gegoogelt, wie man Zeile für Zeile blättert, weil dies eine nützliche Möglichkeit war, nach "wie man den Code dahin bringt, wo ich will" zu suchen.) Danke!
Ennael

41

Ich bin ein bisschen zu spät zur Party, aber wenn es Ihnen nichts ausmacht, ein Paket zu installieren, ist Smooth-Scrolling ( Github , auch in MELPA verfügbar ) möglicherweise das, wonach Sie suchen - es funktioniert auf jeden Fall für mich.

Sobald Sie es installiert haben, können Sie Folgendes in Ihre init.el einfügen:

(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)

Die letzte Zeile ist optional. Es beginnt eher in der Nähe des Bildschirmrandes als an diesem zu scrollen , sodass Sie immer einen kleinen Kontext um den Punkt haben. Nach Geschmack einstellen.


7
Ich habe geweint, als ich das gelesen habe. Ich bin mir ziemlich sicher, dass dies die Antwort auf die Frage ist.
Eric Brown

3
Ja, als Vim-Benutzer, der Emacs ausprobiert, ist dies genau das, wonach ich gesucht habe.
Juanjux

Ich habe sowohl diese Lösung als auch die Scroll-Step-Lösung verwendet. Die Kombination ist faszinierend, wenn ich von unten in die 6. Zeile gehe und sie nach unten drücke, um eine Zeile und dieselbe von oben zu scrollen.
Emad Elsaid

Leider schlägt das reibungslose Scrollen jetzt ziemlich oft fehl, wenn Sie beispielsweise im Vorkommensmodus oder bei der Suche durch Ihre Datei springen: Beide können den Punkt vom Bildschirm entfernen, und Sie müssen CL drücken, damit Ihr Ergebnis angezeigt wird.
Erik Knowles

28

Meine Lösung besteht nicht darin, Emacs Standard-Bildlauf zu ändern, sondern einen Tastenfolgebefehl aus einem Makro zu erstellen. Auf diese Weise haben Sie eine bequeme Möglichkeit, eine Zeile nach der anderen zu scrollen, wenn Sie möchten. Nicht ideal, aber super einfach. Es kommt einfach vor, dass M- (↓) und M- (↑) verfügbar sind, also habe ich das verwendet.

So habe ich es gemacht. Zunächst müssen Sie ein Makro für einzeilige Bildlauf nach oben und unten aufzeichnen.

Makro starten

C-x ( 

Scrollen Sie einen nach unten

C-u 1 C-v

Makro stoppen

C-x )

Verwenden Sie zum Scrollen einen

C-u 1 M-v

Als nächstes müssen Sie das Makro benennen.

M-x name-last-kbd-macro

Geben Sie ihm einen Namen, wenn Sie dazu aufgefordert werden:

down-one-line

Verwenden Sie dann einfach Folgendes, um eine Tastenfolge an diesen Befehlsnamen zu binden:

M-x global-set-key

Verwenden Sie nach Aufforderung Folgendes:

M-(down arrow)

Dann werden Sie gefragt, welchen Befehl Sie binden möchten, und Sie sollten ihm den Namen geben, den Sie zuvor erfunden haben, z. B. in einer Zeile.

Hier habe ich diese Informationen erhalten. Unten und an anderer Stelle finden Sie auch Anweisungen zum Hinzufügen Ihres Makros zur .emacs-Datei.

Hier zur Erklärung der Makrodefinition

Hier erfahren Sie, wie Sie das Scrollen steuern


23

Ich verwende diese .emacsseit 2000 in meiner Datei.

(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward)) 

Auf diese Weise kann ich das Standardverhalten von Emacs beibehalten und eine Zeile nach der anderen scrollen, je nachdem, was ich tue.

Das funktionierte bis mindestens GNU Emacs 22. Ich Emacs kürzlich aktualisiert 24 und entdeckt , dass View-scroll-line-forwardund View-scroll-line-backwardsind nicht mehr verfügbar. Nach einiger Jagd entdeckte ich, dass Scroll-Up-Line und Scroll-Down-Line funktionieren. Wenn Sie also Emacs 24 verwenden, können Sie dies verwenden.

(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line)) 

Ich habe Emacs 23 meistens übersprungen. Wenn dies also die Version ist, die Sie verwenden, können Sie mit beiden oben genannten experimentieren.

Hinweis: scroll-up-lineScrollt tatsächlich eine Zeile nach unten , da der Puffer um eine Zeile nach oben verschoben wird.


Danke, das funktioniert ... aber ich traf eine andere Frage , die ich über hier gefragt haben: stackoverflow.com/questions/19256551/...
scorpiodawg

13

Ich binde meine Pfeiltasten neu, um Bildlaufvorgänge auszuführen.

(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))

(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))

2
Das ist nicht genau das, wonach ich gesucht habe. Ich möchte nicht, dass der Bildschirm gescrollt wird (da die Bildlaufsperre aktiviert sein soll), sondern dass sich der Bildschirm "bewegt" ... oh, ... wie macht der Editor das? :)
Rook

13

Einfache machen das:

(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))

dann bewegt sich der Meta-Cursor nach oben und der Meta-Cursor nach unten nach unten.

QED. Nicht sicher, was alle oben genannten Leute rauchten!


Oder, wie ich gerade gepostet habe, können Sie Scroll-Up-Line und Scroll-Down-Line verwenden.
Rajesh J Advani

5

Ich habe Folgendes in meiner .emacs-Datei, um ein nettes Scrollverhalten nach oben und nach unten zu ermöglichen. Ich benutze dies auch für das Mausrad.

(defun scroll-down-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-up-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)

Ich habe es gerade versucht, aber es ist nicht das Verhalten, nach dem ich gesucht habe. Es ermöglicht Ihnen, zur letzten Zeile auf dem Bildschirm zu gelangen, aber wenn Sie nach unten klicken, wird der Bildschirm immer noch um mehrere Zeilen nach oben gerissen ... Sie wissen nicht, wie Sie es besser erklären sollen.
Turm

Ich mag die Idee, das Mausrad abzubilden. Aber würde das integrierte View-Scroll-Line-Forward und View-Scroll-Line-Backward (oder das neuere Scroll-Up-Line und Scroll-Down-Line) nicht funktionieren, anstatt Ihre eigenen Funktionen zu definieren?
Rajesh J Advani

2

Damit das "vim" scrollen kann, legen Sie dies in Ihrer .emacs-Datei ab:

(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)

@ Matt tut es für mich
jjpikoov

2

Da kann es ärgerlich sein, das zu benutzen M-up, M-downweil es den org-Modus stört, der diese Befehle überlastet. Um dieses Problem zu vermeiden, verwende ich persönlich die Befehle, die M-page-up M-page-down" kombinieren ". Hier habe ich den Bildlauf nach oben und unten auf 1 Zeile definiert.

;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines)
                                                  (forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines)
                                                  (forward-line number-of-lines))))

;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines))))

1

M-x customize-variable scroll-conservatively

Stellen Sie es auf 1 ein.

Das wollen Sie aber nicht wirklich.


5
Habe es tatsächlich gesehen - beide Antworten, deine und die von ars, aber im Wiki werden beide nicht empfohlen. Leider sind die Gründe dafür nicht klar erklärt. Deshalb habe ich die Frage gestellt, in der Hoffnung, dass jemand eine Methode gefunden hat, die fehlerfrei funktioniert.
Turm

3
wäre praktisch, wenn Sie uns noobs erklären könnten, warum dies keine gute Idee ist.
Daniel

Der einzige Grund, warum ich mir vorstellen kann, warum dies keine gute Idee ist, ist, dass das Scrollen langsam wird: Sie müssen immer um jeweils eine Zeile scrollen, anstatt die Standardeinstellung für den halben Bildschirm. (Ich denke?)
ShreevatsaR

1

Wenn Sie nach einer schnellen Möglichkeit suchen, einen scrollähnlichen Effekt zu erstellen, geben Sie ihn ein C-nund C-lnacheinander, wodurch der Cursor nach unten bewegt und dann zentriert wird.


0

Wenn Sie Emacs in .xsession starten, funktioniert es in meinem Fall nicht, wenn Sie scrollkonservativ auf 100+ setzen, und scrollen Sie nicht in Schritt 1. Wenn Sie Emacs jedoch nach X starten, funktioniert dies.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.