2011-09-13 8 views

답변

4

Emacs 버퍼에는 단 하나의 메이저 모드 만있을 수 있습니다 (something like MMM or MuMaMo을 사용하지 않는 한). 귀하의 경우 하나의 주요 모드가 magit-log-edit-mode이며, 그 이름은 세 단어로 구성됩니다 ("Magit Log Edit"). 당신은 당신이 원하는대로 훅에 추가 할 수 있습니다, 당신이 당신의 자신의 함수를 정의 할 수 있습니다, 일반적으로

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill) 
+0

완벽한, 감사합니다! 접선으로, 주요 모드에 대해 혼란스러워했습니다. 각 모드는 클릭시 별도의 "상황에 맞는 메뉴"를 표시합니다. 어느 쪽이든, 당신의 솔루션은 완벽하게 작동합니다. –

+1

후크에'lambda'-expression을 추가하는 것에 대해 강력히 조언합니다. 한 가지 이유는 내용을 연구 할 때 훅에 포함 된 내용을보기가 정말 어렵다는 것입니다. 또 다른 이유는 훅을 수정할 때 새로운 버전과 이전 버전이 모두 존재하기 때문입니다 (이전 버전을 신중하게 제거하지 않는 한). 이로 인해 흥미로운 결과가 발생할 수 있습니다. – Lindydancer

+0

@ Lindydancer 전적으로 동의합니다. 그러나 이것은 데모 용일뿐입니다. 어쨌든 기능을 분리하기 위해 변경되었습니다. –

1

my-common-hook 말을 예를 들어, 모든 주요 모드에 추가 :

(defun my-common-hook() 
    ... do stuff ... 
    ) 
(add-hook 'one-mode-hook 'my-common-hook) 
(add-hook 'another-mode-hook 'my-common-hook) 
(add-hook 'a-third-mode-hook 'my-common-hook) 
7

에서

(defun my-add-to-multiple-hooks (function hooks) 
    (mapc (lambda (hook) 
      (add-hook hook function)) 
     hooks)) 

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(my-add-to-multiple-hooks 
'my-turn-on-auto-fill 
'(text-mode-hook 
    magit-log-edit-mode-hook 
    change-log-mode-hook)) 

을 안 최고의 예를 들어, 아마도,하지만 난 그렇게 가지고 : 당신이 수많은 후크 변수에 추가 할 하나의 함수가있는 경우,이처럼 할 수있는, 원래의 진술 질문에 답변 프로그래밍 모드에서 사용할 수있는 몇 가지 공통적 인 동작에 대해 비슷한 기능을 제공합니다.

4

이맥스 모드에는 "기본 모드"즉 바드 모드가 있습니다. 예를 들어 python-modeprog-mode을 확장하며 그 자체는 fundamental-mode입니다. 모든 모드는 fundamental-mode까지 확장됩니다. 따라서 python-modec-mode을 연결하고 text-mode을 연결하지 않으려면 prog-mode을 연결할 수 있습니다.

1

그냥 지금보고 있지만 여기에 내가 한 것입니다. 최종 결과는 다음과 같이하고 싶습니다. (hook-up-modes my-lisps 'standard-lisp-environment).

이렇게하려면 다음을 정의하십시오. defvar.

(defun append-suffix (suffix phrases) 
    "take SUFFIX and append it to each of the PHRASES." 
    (mapcar #'(lambda (phrase) (concat phrase suffix)) phrases)) 

그래서 ("Clojure의" "LISP") => ("Clojure의 :

(defvar my-lisps "clojure lisp emacs-lisp cider-repl") 
(defun standard-lisp-environment() 
    (paredit-mode 1) 
    (rainbow-delimiters-mode 1) 
    (eldoc-mode 1)) 

나는 그래서 난 다음 한 내가 사용하는 lisps에 혀짤배기 APPEND의 -mode 훅을 갖고 싶어 -mode-hook ""lisp-mode-hook "). 이 모든

(defun multiple-mode-add-hook (modes hook) 
    "Given a list of x-mode-hook symbols in MODE, add the HOOK to them." 
    (mapc (lambda (mode) (add-hook mode hook)) modes)) 

:

지금 우리는 쉽게이있을 수 있다는 것을, 우리는 우리가 쉽게

(defun symbols-from-strings (strings) 
    "Given a list of strings, get their symbol values" 
    (mapcar #'intern strings)) 

에서 얻을 그리고 마지막으로 우리는 유사한 형태가 이상 게시 한 자신의 독자 기호가 필요 문자열 목록, 기호 목록, blah-mode-hook 등의 목록에서 작동합니다. 이제는 우리가 작업 할 수있는 멋진 사용자 지향 기능이 필요합니다. 우리는 문자열의 공백으로 구분 된 목록에서 우리의 모드를 작성하고 후크를 적용

(defun hook-up-modes (strings hook) 
    (let ((modes (symbols-from-strings 
       (append-suffix "-mode-hook" (split-string strings))))) 
    (multiple-mode-add-hook modes hook))) 

지금 이것은 꽤 읽을 수 있어야한다.또한, 표준 리스프 환경을 정의 했으므로, 모든 lisp는 비슷하게 동작합니다. 그리고 내가 좋아하는 경우 나중에 쉽게 훅을 제거 할 수 있습니다. 실제로 실제로 작동하는 코드는 슈퍼 간단한 구 (hook-up-modes my-lisps 'standard-lisp-environment)입니다.

+0

목록 대신 문자열로 시작하는 것은 꽤 이상합니다. 상징의 목록은 좀 더 평범한 출발점이 될 것입니다. 'symbol-name'을 사용하면 처리 할 때와 결합 할 문자열을 얻을 수 있습니다. – phils

관련 문제