【问题标题】:Almost-global Emacs minor mode几乎全局的 Emacs 次要模式
【发布时间】:2013-02-16 09:57:42
【问题描述】:

我正在使用 Emacs 次要模式,并且我希望它仅在主要模式是特定模式(即js-mode)时应用。换句话说,当我激活 my-super-mode 时,我希望它定义的键映射在所有 JS 缓冲区中都可用(就像它是全局的一样),但不影响非 js 缓冲区。

我知道可以通过钩子实现,但我想避免这种解决方案。理想情况下,我的次要模式仅在需要时通过 M-x 激活(激活后它应该在所有 JS 缓冲区中都有效)。可能吗?

【问题讨论】:

  • 听起来您应该定义自己的js 模式。查看define-derived-mode
  • 通过全局模式这样做有什么问题?你define-globalized-minor-mode,然后在turn-on函数中检查每个特定缓冲区是否在js-mode中。

标签: emacs minor-mode


【解决方案1】:

想到的一个解决方案是定义实现实际功能但不由用户直接调用的缓冲区本地次要模式,其名称以内部前缀为前缀以防止意外触发:

(define-minor-mode my--mode
  "Mode implementing blah, invoke it with M-x my-super-mode."
  nil " Super" nil
  ;; mode definition goes here, including keymaps, etc.
  )

用户调用的公共模式是全局的。当打开或关闭时,它会自动在所有现有和未来的 JS 缓冲区中切换内部模式:

(defun my--mode-set-maybe ()
  (my--mode (if my-super-mode 1 0)))

(define-minor-mode my-super-mode
  "Super mode, only in effect in JS buffers."
  nil "" nil
  :global t
  (dolist (buf (buffer-list))
    (with-current-buffer buf
      (my--mode-set-maybe))))

(add-hook 'js-mode-hook 'my--mode-set-maybe)

【讨论】:

  • 因为我要查,nil " Super" nil相当于:init-value nil :lighter " Super" :keymap nil
猜你喜欢
  • 2017-06-15
  • 2013-04-09
  • 2011-06-30
  • 2023-03-06
  • 2014-08-13
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多