2013-02-16 30 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