Emacs: Есть ли лучшее поведение PgDn/PgUp с cua-mode?

Мне бы хотелось, чтобы клавиши PgUp и PgDn просто перемещали содержимое показанного файла вверх или вниз, но курсор (точка в Emacs Lingo) должен оставаться там, где он есть (на экране). К сожалению, поведение Emacs по умолчанию отличается. Поведение по умолчанию сложно описать, но если вы нажмете PgDn, а затем PgUp, вы не окажетесь там, где были раньше (!).

Это не новая проблема, и в EmacsWiki есть хорошее решение, называемое sfp-page-up и sfp-page-down.

(defun sfp-page-up ()
  (interactive)
  (setq this-command 'previous-line)
  (previous-line
   (- (window-text-height)
      next-screen-context-lines)))

Однако существует одна проблема в сочетании с cua -mode, который обеспечивает (среди прочего) выбор смещения (нажатие клавиши Shift и клавиши перемещения курсора, например или PgDn, начинают выделять выделенную область):

cua-mode не распознает переопределенные ключи PgUp/PgDn, т.е. они не запускают выбор. Обходной путь - сначала нажать клавишу или ↓, а затем продолжить с помощью PgUp/PgDn.

Как я могу сделать cua-mode играть хорошо с sfp-page-up/down?

2 ответа

Решение

Я нашел другую половину решения в потоке, если я установил home ключ (...), то shift + home не выделяет текст в режиме cua на gnu.emacs.help:

Для участия в смене выбора cua-mode, функция (в моем случае sfp-page-xxx) должен иметь свойство символа CUA установлен в move:

(put 'sfp-page-up 'CUA 'move)

(Для первой половины решения см . Ответ JSON).

Итак, вот мое полное решение:

(defun sfp-page-down (&optional arg)
  (interactive "^P")
  (setq this-command 'next-line)
  (next-line
   (- (window-text-height)
      next-screen-context-lines)))
(put 'sfp-page-down 'isearch-scroll t)
(put 'sfp-page-down 'CUA 'move)

(defun sfp-page-up (&optional arg)
  (interactive "^P")
  (setq this-command 'previous-line)
  (previous-line
   (- (window-text-height)
      next-screen-context-lines)))
(put 'sfp-page-up 'isearch-scroll t)
(put 'sfp-page-up 'CUA 'move)

Если вы добавите ^ для начала (interactive "...") spec (внутри двойных кавычек) функций, они будут поддерживать выбор смещения в Emacs 23.1 и более поздних версиях.

Другие вопросы по тегам