2013-02-16 7 views
2

저는 이맥스 부 모드로 작업 중이며, 주 모드가 특정 모드 (예 : js-mode) 인 경우에만 적용하고 싶습니다. 즉, my-super-mode를 활성화 할 때 모든 JS 버퍼에서 사용할 수 있도록 정의 된 keymap을 사용하고 싶습니다 (전역과 같음). 그러나 non-js 버퍼에는 영향을 미치지 않습니다.거의 전역적인 이맥스 부 모드

후크를 통해 가능하다는 것을 알고 있지만이 해결책을 피하고 싶습니다. 이상적으로 마이너 모드는 M-x를 통해 필요할 때만 활성화됩니다 (활성화 된 경우 모든 JS 버퍼에서 유효해야 함). 가능한? 마음에 오는

+1

대신 자신의 'js'모드를 정의해야하는 것처럼 들립니다. 'define-derived-mode'를 확인하십시오. – tripleee

+0

글로벌 모드를 통해이 작업을 수행 할 때의 문제점은 무엇입니까? 'define-globalized-minor-mode'를 정의한 다음,'turn-on' 함수에서 각 특정 버퍼가'js-mode'에 있는지 확인하십시오. – Dmitry

답변

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"Super "nil"은': init-value nil : lighter "와 같습니다 :"Super ": keymap nil' – mtalexan