绑定到keymap时,emacs函数的行为会有所不同

时间:2011-11-11 23:28:17

标签: 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)))))

左窗口有一个定义了此功能的文本doc。右侧窗口有一个pdf,docview打开。

当我按下C-M-v时,第一次正确运行,第二次不正确。它似乎是一个页面向下然后是一个页面向上交替,所以我永远不会进入下一页。

当我使用M-x noteview-pagedown以交互方式运行此功能时,它可以正常工作。

任何关于为什么这不能通过键盘宏工作的提示将不胜感激。

2 个答案:

答案 0 :(得分:1)

你已经定义了一个

  

noteview模式映射

,但没有

  

noteview模式

。我不相信这个悬垂的地图可以做任何事情,除非你已经定义了其他的小模式。

这在任何情况下都不应该是次要模式,你似乎想让C-M-v滚动其他窗口,即使它显示了一个doc-view缓冲区?

(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)

答案 1 :(得分:0)

我对doc-view一无所知,但我只是做了C-h f doc-view-scroll-up-or-next-page,而且似乎要说为了让它移动到下一页,你必须有非零doc-view-continuous。是这样的吗?这是doc:

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。