【问题标题】:reload minor mode after every change within emacs在 emacs 中每次更改后重新加载次要模式
【发布时间】:2014-03-05 20:21:49
【问题描述】:

如何重新加载次要模式的定义,以便在 emacs 中对其进行每次更改后都可以加载它。这将大大改善开发次要模式的工作流程。

例如,在下面的次要模式中,匿名函数中存在错误,使用键 Cx Xe 重新加载次要模式的定义,然后在缓冲区中禁用和启用次要模式不会使用新定义。

(define-minor-mode bb-sample-mode
  "Minor mode for sample projects"
  :init-value nil
  :lighter "bb-sample"
  :keymap
  '(([f1] . '(lambda()
          (interactive)
          (message "laksdjflskj")))))

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    简单:

    (define-key bb-sample-mode-map [f1]
      (lambda() (interactive) (message "foo")))
    

    您甚至不必禁用/启用。这样就可以了。

    更新

    好的,这样它肯定可以工作:

    (defvar bb-sample-mode-map (make-sparse-keymap))
    
    (define-minor-mode bb-sample-mode
      "Minor mode for sample projects"
      :init-value nil
      :lighter "bb-sample"
      :keymap bb-sample-mode-map)
    

    【讨论】:

    • 抛出错误调试器进入--Lisp 错误: (void-variable bb-sample-mode-map) (define-key bb-sample-mode-map [f1] (lambda nil (interactive) ( message "foo"))) eval((define-key bb-sample-mode-map [f1] (lambda nil (interactive) (message "foo"))) nil) eval-last-sexp-1(nil) eval -last-sexp(nil) 交互式调用(eval-last-sexp nil nil)
    • bb-sample-mode-map 在您定义次要模式时被定义。
    • 我先这样做了(键“C-x C-e”)。错误仍然相同。 define-minor-mode 看起来像这样 :---- (define-minor-mode bb-sample-mode "Minor mode for sample projects" :init-value nil :lighter "bb-sample")
    • 如果您使用问题中的次要模式定义,它将起作用。
    • 你激活到次要模式了吗?
    【解决方案2】:

    一般情况下最好不要使用:keymap 参数,在这种情况下它确实会对您有所帮助:

    (defvar bb-sample-mode-map
      (let ((map (make-sparse-keymap)))
        (define-key map [f1] (lambda () ...))
        map))
    
    (define-minor-mode bb-sample-mode
      "Minor mode for sample projects."
      :lighter "bb-sample")
    

    然后C-M-x 将在您进入第一个表达式时重新定义键盘映射(因为C-M-x 专门处理“defvar”)。 您可能还想为您的命令命名:

    (defun bb-sample-foo ()
      (interactive)
      (message "laksdjflskj"))
    
    (defvar bb-sample-mode-map
      (let ((map (make-sparse-keymap)))
        (define-key map [f1] 'bb-sample-foo)
        map))
    

    所以你可以在函数内C-M-x,这将立即生效。

    【讨论】:

    • 抛出错误调试器进入--Lisp 错误: (wrong-number-of-arguments define-key 2) (define-key [f1] (lambda nil (message "yyyy"))) (let ((map (make-sparse-keymap))) (define-key [f1] (lambda nil (message "yyyy"))) map) (defvar bb-sample-mode-map (let ((map (make-sparse -keymap))) (define-key [f1] (lambda nil (message "yyyy"))) map)) eval((defvar bb-sample-mode-map (let ((map (make-sparse-keymap)) ) (define-key [f1] (lambda nil (message "yyyy"))) map)) nil) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last- sexp nil nil)
    • 那是因为我忘记了一个论点。固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2016-09-15
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多