emacs: Wie kehre ich nach dem Scrollen / Hoch- / Runterblättern zur letzten Position zurück?


14

Gibt es eine schnelle Möglichkeit, den Punkt nach der Ausgabe scroll-upoder scroll-downin Emacs an seine vorherige Position zurückzusetzen (vorausgesetzt, ich habe mich nicht daran erinnert, ihn dem Markierungsring hinzuzufügen)?

Gibt es alternativ eine Möglichkeit (ohne Beeinträchtigung des Markierungsrings), das Bildlaufverhalten so zu ändern, dass durch das Aufwärts- und Abwärtsscrollen (oder umgekehrt) der Punkt an seine ursprüngliche Position zurückgesetzt wird? (Bsp. Bildlauf ausführen, um den Punkt genau um x Zeilen zu verschieben, wobei x die Bildschirmhöhe ist)

Ich bin gerade dabei, mich an Emacs zu gewöhnen, und dies ist eine der häufigsten Situationen, die Flüche provozieren: Ich scrolle herum, um einen anderen Teil meines Codes anzuzeigen, ohne daran zu denken, meine Zeile dem Markierungsring hinzuzufügen, und es ist dann schmerzhaft, es zu versuchen die Codezeile, an der ich gearbeitet habe, zu verschieben. Während ich nach einer technischen Lösung frage, würde mich auch interessieren, wie erfahrene Benutzer dieses Problem vermeiden. Gewöhnen Sie sich einfach daran, eine Marke zu setzen, das Fenster zu teilen, um sich umzusehen, oder ein anderes Muster zu verwenden?

Vielen Dank

Antworten:


13
(setq scroll-preserve-screen-position t)

Wenn Sie mit dieser Einstellung nach oben und unten blättern, kehrt der Cursor zu seiner ursprünglichen Zeile zurück. Es behält auch seine ursprüngliche Spalte in Emacs Version 23 oder neuer bei.

Sie können oder können nicht bevorzugen

(setq scroll-preserve-screen-position 'always)

Dadurch wird beim Scrollen immer die Bildschirmposition des Cursors beibehalten, anstatt die Cursorposition im Puffer beizubehalten, wenn die ursprüngliche Position weiterhin sichtbar ist.


2
Danke auch von mir! Seit (ähm vielen!) Jahren habe ich "<>" eingegeben, bevor ich mich umgesehen habe. Ich habe nur ein Suchziel, zu dem ich zurückkehren kann.
JRobert

Für mich hat dies zur Folge scroll-up-line(was ich mit meinem Scrollrad verwende), dass der Cursor ein Zeichen vorwärts bewegt, wenn er den oberen oder unteren Rand des Bildschirms berührt.
Asmeurer

@asmeurer ich beobachte das nicht. Es muss etwas Seltsames in Ihrer Init-Datei oder einen Fehler in Ihrer Emacs-Version geben.
Gilles 'SO- hör auf böse zu sein'

Ja, das habe ich herausgefunden, nachdem ich das gepostet habe. Ich habe unter emacs.stackexchange.com/questions/12439/… eine neue Frage geöffnet .
Asmeurer

Ich denke das sollte sein (setq scroll-preserve-screen-position 'always). Andernfalls wird C-v M-vder Startpunkt nicht zurückgesetzt. (Die Position des zweiten Punkts ist auf dem ersten Bildschirm sichtbar, sodass der Punkt nicht zurückgesetzt wird.)
Wilfred Hughes

6

Ich habe festgestellt, dass es gut funktioniert goto-last-change.el, wenn Sie an den Ort zurückkehren, an dem Sie zuletzt eine Bearbeitung vorgenommen haben. Ich mag die Bindung:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
Ebenso, ohne dass ein zusätzliches Paket benötigt wird: C-_ C-f C-_(rückgängig machen, verschieben, rückgängig machen).
Gilles 'SO- hör auf böse zu sein'

1
@Gilles Stimmt, aber dann ist Ihr Rückgängig-Stapel um zwei weitere Elemente gewachsen. :)
Trey Jackson

1

Als Antwort auf Ihre Frage, wie ich das von Ihnen beschriebene Problem vermeide (woanders im Code suchen und dann zu dem Punkt zurückkehren, an dem ich gearbeitet habe) ...

Normalerweise teile ich den Bildschirm auf, wenn ich kurz woanders suchen muss. Dann kann ich mit zum Originalbildschirm zurückkehren, mit C-x oabspalten C-x 1und ich bin wieder normal.

Ich benutze auch die Vorwärts- und Rückwärtssuche, um einen bestimmten Punkt von Interesse im Code zu finden. Ich finde, dass dies eine ziemlich effiziente Möglichkeit ist, im Code zu navigieren, wenn ich weiß, wonach ich suche.


0

Wenn ich nur ein paar Zeilen von der Stelle scrolle, an der ich mich gerade befinde, kann ich folgendermaßen durch das Fenster scrollen, ohne den Punkt zu verschieben:

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

Wenn ich zu einem völlig anderen Abschnitt einer Datei übergehe (oder zu einer anderen Datei insgesamt), verwende ich manchmal, breadcrumbobwohl es viele andere Pakete gibt, die ähnliche Dinge tun.

Wenn ich zwei Codebereiche gleichzeitig visuell sehen möchte, teile ich den Rahmen horizontal in zwei Fenster auf und verwerfe das zweite Fenster, wenn ich fertig bin.

Meistens verwende ich jedoch nur zwei Frames, von denen einer mein aktueller Arbeitsframe und der andere mein Referenzframe ist, mit dem ich um die gleichen oder andere Dateien herumspringe.


Wenn Sie nur über oder unter dem aktuellen Punkt sehen möchten, ohne sich dorthin zu bewegen, können Sie mit dem Fahrrad fahren C-l.
Asmeurer
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.