我工作的一个Emacs轻微的模式,我想它仅适用时的主要模式是有一定的模式(即js-mode
)。换句话说,当我激活我的超级模式时,我希望它定义的键映射在所有JS缓冲区中可用(如它是全局的),但不会影响非js缓冲区。几乎全球Emacs的辅助模式
我知道这可能通过钩子,但我想避免这种解决方案。理想情况下,我的次要模式只有通过M-x需要时才会激活(并且在激活时它应该在所有JS缓冲区中生效)。可能?浮现在脑海
我工作的一个Emacs轻微的模式,我想它仅适用时的主要模式是有一定的模式(即js-mode
)。换句话说,当我激活我的超级模式时,我希望它定义的键映射在所有JS缓冲区中可用(如它是全局的),但不会影响非js缓冲区。几乎全球Emacs的辅助模式
我知道这可能通过钩子,但我想避免这种解决方案。理想情况下,我的次要模式只有通过M-x需要时才会激活(并且在激活时它应该在所有JS缓冲区中生效)。可能?浮现在脑海
一种解决方案是定义一个实现实际功能的缓冲区局部轻微的模式,但不是直接由用户,它的名字由内部前缀前缀调用,以防止意外触发:
(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“超级”nil“相当于':init-value nil:lighter”Super“:keymap nil' – mtalexan 2015-07-09 22:10:42
听起来像是你应该定义你自己的'js'模式,而不是。查看'define-derived-mode'。 – tripleee 2013-02-16 10:52:00
通过全局模式做这件事有什么问题?你定义了全球化的小模式,然后检查每个特定的缓冲区是否在'开启'功能中的'js-mode'。 – Dmitry 2013-02-17 02:23:40