开发时如何更新次要模式定义?


13

我开始编码次要模式以提供一些键绑定。我最初的尝试有一个错字:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

我原本打算使用该b密钥,但立即意识到我应该使用"b"而不是[b]。所以我重新定义了次要模式:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

但是,这没有用。这使我开始通过各种各种绑定键的方式(即(kbd ...),[...]等)来追逐野鹅。最终,我意识到仅仅重新评估(define-minor-mode ...)表单并没有改变任何东西,我陷入了原始的,损坏的键映射中。然后,我尝试通过直接更改键盘映射(define-key borked-mode-map ...),但仍然无法加载正确的键盘映射。最后,我重新启动了Emacs,并正确加载了次要模式。

我的问题是:如何在开发次要模式定义时对其进行更新?有什么方法可以刷新损坏的定义,还是必须重新启动emacs才能清除损坏的位?

Answers:


11

第一次评估define-minor-mode它时,它将borked-mode-map使用您指定的键绑定定义一个变量。但是,一旦定义了该符号,重新评估您define-minor-mode就不会更改它。

您可以使用删除各种borked-mode-xxx符号unintern,然后重新评估代码。尝试:

(unintern 'borked-mode-map)

您可能对扩展define-minor-mode宏以了解其实际作用感兴趣。将点放在最后并致电M-x pp-macroexpand-last-sexp。这将打开一个显示扩展宏的新缓冲区。在这里,您将看到defvar用于设置模式变量的调用。如果您阅读了该帮助,defvar则会看到只有在定义的符号为空的情况下才使用初始值-一旦存在该符号,后续defvar调用就不会更改其值。


13

我认为我能给您的最佳答案是远离的“内联键绑定功能” define-minor-mode。用

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

代替。然后,您可以C-M-x用来重新评估这些定义。


1
defvarC-M-x:)您将不需要defparameter或单独评估setf
wvxvw

正如@wvxvw指出的那样,这实际上无法解决问题。您的示例代码的作用与define-minor-mode宏相同:调用defvar以定义地图。再次评估defvar无效。
glucas

7
@wvxvw如果使用C-M-xeval-defun)重新评估,defvar则变量将更新。这是一种特殊情况eval-defun;如果您致电eval-buffereval-region则现有值不会更改。
吉尔斯(Gilles)'所以

啊-好像很关键。
glucas 2015年

1
请注意,C-M-xdefvar表单上仅更新mode-map变量本身。您还必须C-M-xdefine-minor-mode表单上将更改的地图“安装”到次要模式。我试图通过扩展宏来找出原因,但这超出了我的范围。
泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.