2013-02-16 127 views
2

我工作的一个Emacs轻微的模式,我想它仅适用时的主要模式是有一定的模式(即js-mode)。换句话说,当我激活我的超级模式时,我希望它定义的键映射在所有JS缓冲区中可用(如它是全局的),但不会影响非js缓冲区。几乎全球Emacs的辅助模式

我知道这可能通过钩子,但我想避免这种解决方案。理想情况下,我的次要模式只有通过M-x需要时才会激活(并且在激活时它应该在所有JS缓冲区中生效)。可能?浮现在脑海

+1

听起来像是你应该定义你自己的'js'模式,而不是。查看'define-derived-mode'。 – tripleee 2013-02-16 10:52:00

+0

通过全局模式做这件事有什么问题?你定义了全球化的小模式,然后检查每个特定的缓冲区是否在'开启'功能中的'js-mode'。 – Dmitry 2013-02-17 02:23:40

回答

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) 
+0

因为我不得不查看它,所以'nil“超级”nil“相当于':init-value nil:lighter”Super“:keymap nil' – mtalexan 2015-07-09 22:10:42