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

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

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

Ответы

Ответ 1

Существует новый пакет, доступный на 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)

Это прямая копия ответа, размещенного здесь: https://emacs.stackexchange.com/a/2273/93

Ответ 2

Строго говоря, вы не можете переместить курсор на экране, потому что базовый код C не позволит вам это сделать.

Это говорит о том, что я подозреваю, что ваша проблема может быть исправлена. В принципе, есть два аспекта:

  • вам не нравится, как выглядят вещи, когда "курсор продвигается вперед". Вы можете обойти это (временно), делая курсор невидимым.
  • вы хотите "вернуться назад" к позиции предварительного прокрутки, как только вы выдаете команду без прокрутки. Там, вероятно, есть какой-то пакет, который сделает это за вас, но вы можете сделать это сами с хакетом pre-command-hook.

Кстати, я бы приветствовал исправления в Emacs, которые предоставляют некоторые из этих функций. Я ненавижу поведение "auto jump-back" других редакторов, но было бы неплохо записать положение "прокрутки", а затем предложить способ вернуться к нему.

Ответ 3

Судя по контексту и описанию вашей проблемы, похоже, что вы хотите просматривать буфер, сохраняя место редактирования. Для этой цели есть как минимум два трюка: отметки/регистры и разделение в двух окнах.

fooobar.com/info/283487/... описывает регистры Emacs, которые действуют как отметки Vim. Вы можете проверить свое место в файле с помощью клавиши C-x r SPC a (a, являющейся буквой по вашему выбору), и вы всегда можете вернуться с помощью C-x r j a.

Некоторая автоматизация достигается внешним script (goto-last-change.el), описанным здесь: https://superuser.com/a/184402/49046.

В качестве альтернативы, разделить окно на два с помощью C-x 2. В недавно разбитых окнах отображаются одинаковое местоположение, и вы можете использовать другой, чтобы исследовать. C-x 0 закрывает окно, когда вы закончите.