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 и более поздних версиях.