Pozwól Emacsowi przesunąć kursor poza ekran

23

To pytanie zostało pierwotnie zadane na /programming/15895313/let-emacs-move-the-cursor-off-screen , ale wszystkie odpowiedzi, które otrzymałem, brzmiały mniej więcej: „nie da się tego zrobić” , którego z emacsem po prostu nie akceptuję.

Czy można pozwolić Emacsowi na przesunięcie kursora poza ekran, tak jak działa większość edytorów tekstowych GUI? Jest to jedna z największych rzeczy, które niepokoją mnie, gdy używam Emacsa w dowolnym edytorze GUI. Kiedy przewijam w dół, kursor jest „przesuwany do przodu” u góry bufora.

Wcześniej myślałem, że jest to całkowicie niemożliwe, ponieważ jest to wbudowane w architekturę Emacsa, ale potem zobaczyłem wiele kursorów, co robi dokładnie to w przypadku wtórnych kursorów (zakładając, że zapobiegniesz działaniu funkcji przewijania na drugorzędnych kursory). Czy jest możliwe użycie wielu kursorów, aby mieć główny kursor w jakimś ukrytym buforze, a efektywny kursor jest tym, co faktycznie edytuję? A może jakaś inna sprytna sztuczka? A może mój Googling mnie zawiódł i to naprawdę jest już możliwe bez żadnej magii?

Korzystam z terminalu emacs, więc powinien tam działać.

asmeurer
źródło
Należy pamiętać, że pakiet wielu kursorów polega na dodawaniu fałszywych kursorów, które nie podlegają ograniczeniom prawdziwego. Mam nadzieję, że odpowiedź będzie oparta na sugestiach z poprzedniego pytania.
wasamasa
Zakładam, że ten problem dotyczy używania pasków przewijania, prawda?
nispio
1
Więc jakich poleceń przewijania używasz, których nie spodziewałbyś się, że przyniosą ze sobą kursor? Z mojego doświadczenia wynika, że ​​kursor podąża za tobą we wszystkich edytorach, gdy używasz PgUp / PgDn lub klawiszy strzałek.
nispio
4
@nispio może przewijanie za pomocą kółka myszy?
ffevotte
2
Strona w górę i Strona w dół (Cv i Mv) nie poruszają kursorem w emacsie, chyba że kursor zejdzie z ekranu. Przewijanie różni się od poruszania się (kursor).
asmeurer

Odpowiedzi:

11

Dostępny jest nowy pakiet o nazwie GNU ELPA,scroll-restore który próbuje rozwiązać ten problem. Istnieje kilka różnych zachowań do wyboru, ale sposób, w jaki je skonfigurowałem (patrz poniżej) powoduje, że kursor staje się niewidoczny podczas przewijania poleceń, a następnie przeskakuje z powrotem do pierwotnego położenia, gdy znów zaczynam pisać.

Do tej pory napotkałem kilka błędów, ale pakiet wydaje się działać w większości w reklamie. Możesz to przetestować, instalując go za pomocą

M-x package-install RET scroll-restore RET

Po zainstalowaniu pakietu możesz włączyć tryb pomocniczy za pomocą

M-x scroll-restore-mode

Osobiście wiążę go z Scroll Lockkluczem, ponieważ wydaje się tak niewiarygodnie apropos! Oto, co dodaję do mojego pliku init:

(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
źródło
1
Jeśli przypisałeś do niego klucz, przypuszczam, że czasami chcesz go wyłączyć. Czy ten tryb jest denerwujący przy normalnej edycji?
T. Verron
1
@ T.Verron W tej chwili wydaje się dość wadliwy, a jednym z jego trybów awaryjnych jest „uwięzienie” kursora w obszarze i nie pozwolenie mu odejść. Jedynym sposobem, który znalazłem, aby ponownie zwolnić kursor, jest wyłączenie trybu. Gdy wszystkie błędy zostaną rozwiązane, nie miałbym nic przeciwko ciągłemu ich używaniu.
nispio
2
Jak to ma działać? Nie mogę tego zmusić do zrobienia czegokolwiek.
asmeurer
5

Metodą, której zawsze używam, jest ustawienie znaku, do którego chcę wrócić, a następnie, kiedy skończę czytać bufor, zaznaczam go za pomocą C-u C-SPC. Nawet kiedy zapominam ustawić znak przed wędrówką, okazuje się, że wyskakiwanie tego znaku zwykle zbliża mnie do miejsca, skąd pochodzę. Wynika to częściowo z faktu, że niektóre polecenia (jak isearchna przykład) ustawiają znak, nawet nie zdając sobie z tego sprawy. W trakcie edytowania nieumyślnie zostawiasz mały ślad bułki tartej.

Z dokumentacji:

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').

I prawie nigdy nie męczyć się z ustawiania zakładek lub rejestrach, ale prawie zawsze mogę znaleźć drogę z powrotem skąd jestem szybko stosując albo C-u C-SPCalbo pop-global-mark.

nispio
źródło
Szczerze mówiąc, myślę, że głównym powodem, dla którego ludzie chcą, aby kursor mógł się poruszać poza ekranem, jest to, że są przyzwyczajeni do edytorów, którzy nie mają właściwej historii pozycji kursora. Możesz to zrobić tak, aby scroll-upi scroll-downautomatycznie ustawić znak, aby na C-u C-SPCpewno zabrał cię z powrotem, skąd przyszedłeś.
Radon Rosborough,
0

Poniższy kod jest wystarczająco dobry, żebym mógł cofnąć się po przewinięciu kółka myszy:

(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
źródło