функция emacs ведет себя по-разному при привязке к ключевой карте

#emacs #elisp

#emacs #elisp

Вопрос:

Новичок в elisp и нуждается в помощи.

У меня есть простая функция, которая выводит docview, когда фрейм разделен на два окна:

 (defun noteview-pagedown ()
  (interactive)
  (with-selected-window (other-window-for-scrolling)
    (doc-view-scroll-up-or-next-page nil)))

(defconst noteview-mode-keys
  '(("C-M-v" . noteview-pagedown)))

; lifted from android-mode.el
(defvar noteview-mode-map (make-sparse-keymap))
(add-hook 'noteview-mode-hook
          (lambda ()
            (dolist (spec noteview-mode-keys)
              (define-key
                noteview-mode-map
                (read-kbd-macro (concat noteview-mode-key-prefix " " (car spec)))
                (cdr spec)))))
  

В левом окне есть текстовый документ с определением этой функции. В правом окне открыт PDF-файл с docview.

Когда я нажимаю C-M-v, она выполняется правильно в первый раз, затем неправильно во второй раз. Кажется, что она попеременно перемещает страницу вниз, а затем страницу вверх, поэтому я никогда не перехожу к следующей странице.

Когда я запускаю эту функцию в интерактивном режиме с помощью M-x noteview-pagedown, она работает.

Любые подсказки о том, почему это не будет работать с макроса клавиатуры, были бы оценены.

Комментарии:

1. Какой результат будет C-h k C-M-v после выполнения приведенного выше кода? Кроме того, noteview-mode-key-prefix где-то определено?

Ответ №1:

Вы определили

noteview-mode-map

, но нет

режим просмотра заметок

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

В любом случае это не должно быть второстепенным режимом, вы, похоже, хотите заставить C-M-v прокручивать другое окно, даже когда оно показывает буфер просмотра документа?

 (defun my-scroll-up (arg)
  (interactive "P")
  (with-selected-window (other-window-for-scrolling)
    (if (eq 'doc-view-mode major-mode)
        (doc-view-scroll-up-or-next-page arg)
      (scroll-up arg))))

(define-key (current-global-map) [remap scroll-up] 'my-scroll-up)
  

Ответ №2:

Я ничего не знаю о doc-view, но я только что сделал C-h f doc-view-scroll-up-or-next-page , и, кажется, там говорится, что для перехода на следующую страницу у вас должно быть значение, отличное от нуля doc-view-continuous . Так ли это? Вот документ:

 Scroll page up ARG lines if possible, else goto next page.
When `doc-view-continuous' is non-nil, scrolling upward
at the bottom edge of the page moves to the next page.
Otherwise, goto next page only on typing SPC (ARG is nil).
  

HTH.