Нехай Emacs переміщує курсор по екрану


23

Спочатку це запитання було задано на /programming/15895313/let-emacs-move-the-cursor-off-screen , але всі відповіді, які я отримав більш-менш, сказали: "це неможливо зробити" , що з emacs я просто не приймаю.

Чи можна дозволити Emacs перемістити курсор поза екраном, як працює більшість текстових редакторів GUI? Це одна з найбільших речей, яка мене турбує, коли я використовую Emacs над будь-яким редактором GUI. Коли я прокручую вниз, курсор "висувається вперед" у верхній частині буфера.

Раніше я думав, що це абсолютно неможливо, тому що це жорстко провідна архітектура Emacs, але потім я побачив кілька курсорів, що робить саме це для вторинних курсорів (якщо припустити, що ви запобігаєте функція прокрутки діяти на вторинну курсори). Чи можливо використовувати декілька курсорів, щоб мати основний курсор у якомусь прихованому буфері, а ефективним курсором є те, що я насправді редагую? А може, якийсь інший розумний трюк? Чи, може, мій Googling не вдався до мене, і це справді вже можливо без магії?

Я використовую термінал emacs, тому він повинен працювати там.


Майте на увазі, що всі пакети з декількома курсорами - це додавання підроблених курсорів, які не підпадають під обмеження реального. Я сподіваюся, що буде відповідь на основі пропозицій вашого попереднього запитання.
wasamasa

Я припускаю, що ця проблема специфічна для використання смуг прокрутки, правда?
nispio

1
Отже, які команди прокрутки ви використовуєте, що ви могли б розраховувати не принести курсор із собою? На мій досвід, курсор слідкує за вами у всіх редакторах під час використання PgUp / PgDn або клавіш зі стрілками.
nispio

4
@nispio, можливо, прокрутка колесом миші?
ffevotte

2
Сторінка вгору та Сторінка вниз (Cv та Mv) не переміщують курсор у emacs, якщо курсор не зміститься з екрана. Прокрутка відрізняється від переміщення (курсор).
asmeurer

Відповіді:


11

Існує новий пакет , доступний на GNU ELPA називається , scroll-restoreщо спроби вирішити цю проблему. Можна вибрати кілька способів поведінки, але те, як я налаштував це для себе (див. Нижче), змушує курсор стати невидимим під час прокрутки команд, а потім перескочити назад на початкове місце, коли я знову почну вводити текст.

Поки що я зіткнувся з декількома помилками, але пакет, здається, працює з рекламою здебільшого. Ви можете перевірити його, встановивши його

M-x package-install RET scroll-restore RET

Після встановлення пакета ви можете ввімкнути другорядний режим за допомогою

M-x scroll-restore-mode

Особисто я прив’язую його до Scroll Lockключа, тому що це виглядає так неймовірно близько! Це те, що я додаю до свого файлу 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)

1
Якщо ви прив’язали до нього ключ, я вважаю, що ви хочете його іноді відключити. Чи дратує цей режим нормальне редагування?
Т. Веррон

1
@ T.Verron Наразі це здається досить баггі, і один з його способів відмови - це "захопити" курсор у зоні і не дати йому вийти. Єдиний спосіб я знову звільнив курсор - відключити режим. Як тільки всі помилки відпрацьовані, я б не проти використовувати це постійно.
nispio

2
Як це має працювати? Я, здається, не можу змусити щось робити.
асмеурер

5

Метод, який я завжди використовую, - це встановити позначку, куди я хочу відскочити назад, і тоді, коли я закінчую перегляд буфера, я клацаю позначку, використовуючи C-u C-SPC. Навіть коли я забуваю встановити позначку перед тим, як поневірятися, я виявляю, що вискакуючий знак, як правило, розташовує мене досить близько від того, звідки я родом. Частково це пов'язано з тим, що деякі команди (наприклад, isearchнаприклад) встановлюють позначку, навіть не усвідомлюючи цього. Тож у процесі редагування ви ненавмисно залишили трохи слідів панірувальних сухарів.

З документації:

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

Я майже ніколи не переймаюся налаштуванням закладок чи реєстрів, але майже завжди можу знайти свій шлях назад, звідки я швидко прийшов, використовуючи C-u C-SPCабо pop-global-mark.


Чесно кажучи, я вважаю, що головна причина, за якою люди хочуть, щоб курсор міг переходити за межі екрана, - це те, що вони звикли до редакторів, які не мають належної історії позицій курсору. Ви також можете зробити так, щоб scroll-upі scroll-downавтоматично встановили позначку, так що C-u C-SPCце обов'язково поверне вас туди, звідки ви прийшли.
Радон Росборо

0

Наступний код досить хороший для мене, щоб відскочити назад після прокрутки колеса миші:

(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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.