Lassen Sie Emacs den Cursor vom Bildschirm entfernen

23

Diese Frage wurde ursprünglich unter /programming/15895313/let-emacs-move-the-cursor-off-screen gestellt , aber alle Antworten, die ich erhielt, sagten mehr oder weniger "es geht nicht" , was ich mit emacs einfach nicht akzeptiere.

Ist es möglich, Emacs den Cursor außerhalb des Bildschirms bewegen zu lassen, wie es die meisten GUI-Texteditoren tun? Dies ist eines der größten Dinge, die mich stören, wenn ich Emacs über einen GUI-Editor verwende. Wenn ich nach unten scrolle, wird der Cursor am oberen Rand des Puffers "nach vorne geschoben".

Ich hatte vorher gedacht, dass dies völlig unmöglich ist, da dies fest mit der Architektur von Emacs verbunden ist, aber dann sah ich mehrere Cursor, die genau dies für die sekundären Cursor tun (vorausgesetzt, Sie verhindern, dass die Bildlauffunktionen auf die sekundäre wirken Cursor). Ist es vielleicht möglich, mehrere Cursor zu verwenden, um den Hauptcursor in einem versteckten Puffer zu haben, und der effektive Cursor ist das, womit ich ihn tatsächlich bearbeite? Oder vielleicht einen anderen cleveren Trick? Oder hat mich mein Googeln im Stich gelassen und das geht wirklich schon ohne Magie?

Ich benutze das Terminal Emacs, so sollte es dort funktionieren.

Asmeurer
quelle
Denken Sie daran, dass das Paket mit mehreren Cursorn nur gefälschte Cursorn hinzufügt, die nicht den Beschränkungen des echten unterliegen. Ich hoffe, es wird eine Antwort geben, die auf den Vorschlägen Ihrer vorherigen Frage basiert.
Wasamasa
Ich gehe davon aus, dass dieses Problem nur bei der Verwendung von Bildlaufleisten auftritt.
Nispio
1
Also, welche Scroll-Befehle verwenden Sie, von denen Sie erwarten würden, dass Sie den Cursor nicht mitnehmen? Nach meiner Erfahrung folgt Ihnen der Cursor in allen Editoren, wenn Sie PgUp / PgDn oder die Pfeiltasten verwenden.
Nispio
4
@nispio vielleicht mit dem Mausrad scrollen?
ffevotte
2
Bild auf und Bild ab (Cv und Mv) bewegen den Cursor in Emacs nur, wenn der Cursor vom Bildschirm entfernt wird. Das Scrollen unterscheidet sich vom Bewegen (des Cursors).
Asmeurer

Antworten:

11

Es gibt ein neues Paket auf GNU ELPA genannt , scroll-restoredass Versuche , dieses Problem zu beheben. Es gibt eine Handvoll verschiedener Verhaltensweisen zur Auswahl, aber die Art und Weise, wie ich sie für mich konfiguriert habe (siehe unten), lässt den Cursor während der Bildlaufbefehle unsichtbar werden und springt dann zu seiner ursprünglichen Position zurück, wenn ich wieder mit der Eingabe beginne.

Bisher bin ich auf einige Fehler gestoßen, aber das Paket scheint größtenteils so zu funktionieren, wie es angekündigt wurde. Sie können es testen, indem Sie es mit installieren

M-x package-install RET scroll-restore RET

Nach der Installation des Pakets können Sie den Nebenmodus mit aktivieren

M-x scroll-restore-mode

Persönlich Scroll Lockbinde ich es an den Schlüssel, weil es so unglaublich aussieht! Folgendes füge ich meiner Init-Datei hinzu:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)
Nispio
quelle
1
Wenn Sie einen Schlüssel daran gebunden haben, möchten Sie ihn wahrscheinlich manchmal deaktivieren. Ist dieser Modus für die normale Bearbeitung ärgerlich?
T. Verron
1
@ T.Verron Im Moment scheint es ziemlich fehlerhaft zu sein, und einer der Fehlermodi besteht darin, den Cursor in einem Bereich "einzufangen" und ihn nicht verlassen zu lassen. Die einzige Möglichkeit, meinen Cursor wieder freizugeben, besteht darin, den Modus zu deaktivieren. Sobald alle Fehler behoben sind, hätte ich nichts dagegen, sie die ganze Zeit zu verwenden.
Nispio
2
Wie soll das gehen? Ich kann anscheinend nichts damit anfangen.
Asmeurer
5

Die Methode, die ich immer verwende, besteht darin, die Marke zu setzen, zu der ich zurückspringen möchte. Wenn ich mit dem Durchsuchen des Puffers fertig bin, platziere ich die Marke mit C-u C-SPC. Selbst wenn ich vergesse, die Marke zu setzen, bevor ich losfahre, stelle ich fest, dass das Aufspringen der Marke mich normalerweise in die Nähe meines Ursprungs bringt. Dies liegt zum Teil daran, dass einige Befehle (wie isearchzum Beispiel) die Marke setzen, ohne dass Sie es merken. Während Ihrer Bearbeitung haben Sie also versehentlich eine kleine Spur von Paniermehl hinterlassen.

Aus der Dokumentation:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

Ich mache mir fast nie die Mühe, Lesezeichen oder Register zu setzen, aber ich finde fast immer zurück, woher ich komme, indem ich entweder C-u C-SPCoder benutze pop-global-mark.

Nispio
quelle
Ehrlich gesagt denke ich, der Hauptgrund, warum die Leute wollen, dass der Cursor außerhalb des Bildschirms bewegt werden kann, ist, dass sie an Editoren gewöhnt sind, die keine ordnungsgemäße Historie der Cursorpositionen haben. Sie könnten es auch so machen scroll-upund scroll-downdie Markierung automatisch setzen, so dass Sie C-u C-SPCsicher wieder dorthin gelangen, wo Sie herkommen.
Radon Rosborough
0

Der folgende Code ist gut genug, um nach dem Scrollen mit dem Mausrad zurückzuspringen:

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
AhLeung
quelle