Пусть Emacs переместит курсор за пределы экрана

23

Этот вопрос первоначально задавался по адресу /programming/15895313/let-emacs-move-the-cursor-off-screen , но все ответы, которые я получил более или менее, гласили: «Это невозможно» что с emacs я просто не принимаю.

Можно ли позволить Emacs переместить курсор за пределы экрана, как работает большинство текстовых редакторов с графическим интерфейсом? Это одна из самых больших вещей, которые меня беспокоят, когда я использую Emacs поверх любого графического редактора. Когда я прокручиваю вниз, курсор «выдвигается» вверху буфера.

Ранее я думал, что это абсолютно невозможно, потому что это встроено в архитектуру Emacs, но потом я увидел несколько курсоров, которые делают именно это для вторичных курсоров (при условии, что функции прокрутки не действуют на вторичные курсоры). Возможно ли использовать несколько курсоров, чтобы основной курсор находился в каком-то скрытом буфере, а эффективный курсор - это то, чем я на самом деле редактирую? Или, может быть, какой-то другой хитрый трюк? Или, может быть, мой Googling подвел меня, и это действительно уже возможно без какой-либо магии?

Я использую терминал Emacs, поэтому он должен работать там.

asmeurer
источник
Помните, что все, что делает пакет с несколькими курсорами, это добавление фальшивых курсоров, на которые не распространяются ограничения реального. Я надеюсь, что будет ответ, основанный на предложениях вашего предыдущего вопроса.
васамаса
Я предполагаю, что эта проблема связана с использованием полос прокрутки, верно?
Ниспио
1
Итак, какие команды прокрутки вы используете, чтобы ожидать, что вы не возьмете с собой курсор? По моему опыту, курсор следует за вами во всех редакторах при использовании PgUp / PgDn или клавиш со стрелками.
Ниспио
4
@nispio, возможно, прокручивая колесо мыши?
ffevotte
2
Page up и Page down (Cv и Mv) не перемещают курсор в emacs, если курсор не перемещается за пределы экрана. Прокрутка отличается от перемещения (курсор).
asmeurer

Ответы:

11

Существует новый пакет , доступный на GNU ELPA называется , scroll-restoreчто попытки решить эту проблему. Есть несколько вариантов поведения на выбор, но способ, которым я настроил его для себя (см. Ниже), заставляет курсор становиться невидимым во время команд прокрутки, а затем, когда я снова набираю текст, возвращаюсь в исходное положение.

До сих пор я сталкивался с несколькими ошибками, но пакет, по-видимому, по большей части работает как рекламируется. Вы можете проверить это, установив его с

M-x package-install RET scroll-restore RET

После установки пакета вы можете включить второстепенный режим с помощью

M-x scroll-restore-mode

Лично я связываю его с Scroll Lockключом, потому что он кажется невероятно кстати! Это то, что я добавляю в мой файл инициализации:

(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
источник
1
Если вы связали ключ с ним, я полагаю, что вы хотите отключить его иногда. Раздражает ли этот режим нормальное редактирование?
Т. Веррон
1
@ T.Verron В данный момент это выглядит довольно глючно, и один из режимов неудачи - «заманить» курсор в область и не дать ему уйти. Единственный способ освободить курсор - отключить режим. После того, как все ошибки устранены, я не возражаю против их использования постоянно.
Ниспио
2
Как это должно работать? Я не могу заставить его что-либо делать.
asmeurer
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.

nispio
источник
Честно говоря, я думаю, что основная причина, по которой люди хотят, чтобы курсор мог перемещаться за пределы экрана, заключается в том, что они привыкли к редакторам, которые не имеют надлежащей истории позиций курсора. Вы также можете сделать это так 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))
AhLeung
источник