2011-09-13 8 views

Odpowiedz

4

W buforze Emacsa może znajdować się tylko jeden tryb główny (chyba że używasz something like MMM or MuMaMo). W twoim przypadku jeden główny tryb to magit-log-edit-mode, którego nazwa składa się z trzech słów ("Magit Log Edit"). można po prostu dodać do niego cokolwiek hak lubisz:

(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

Doskonale, dzięki! Jako styczna, myliłem się z głównymi trybami - każdy z nich wyskakuje osobne "menu kontekstowe" po kliknięciu. Tak czy inaczej twoje rozwiązanie działa idealnie. –

+1

Zdecydowanie zaleciłbym, aby nie dodawać wyrażenia 'lambda' do haków. Jednym z powodów jest to, że naprawdę trudno jest zobaczyć, co zawiera hak przy badaniu jego treści. Innym powodem jest to, że podczas modyfikowania haka, zarówno nowa, jak i starsza wersja są obecne (chyba że starannie usuniesz starą wersję), co może prowadzić do ciekawych efektów. – Lindydancer

+0

@Lindydancer całkowicie się zgadzam, ale to było tylko dla celów demonstracyjnych. W każdym razie, zmieniono na osobną funkcję. –

1

Ogólnie można zdefiniować własną funkcję, powiedzmy my-common-hook i dodać go do wszystkich głównych trybach, na przykład:

(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

W odpowiedzieć na pytanie podanej oryginalnej, jeśli masz jedną funkcję dodawania do wielu zmiennych hakowych, można zrobić to tak:

(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)) 

Nie jest to najlepszy przykład, być może, ale mam tak Metoda podobna do niektórych typowych zachowań, które chcę włączyć w trybach programowania, których lista jest o wiele większa.

4

Tryby Emacs mają "tryby podstawowe", czyli tryby bade. Na przykład python-mode rozszerza się o prog-mode, który rozszerza się o fundamental-mode. Wszystkie tryby rozszerzają się o fundamental-mode. Tak więc, aby podłączyć python-mode i c-mode, ale nie text-mode, można podłączyć prog-mode.

1

Widzę to teraz, ale oto, co zrobiłem. Końcowy wynik jest taki, że chcę wykonać następujące czynności: (hook-up-modes my-lisps 'standard-lisp-environment).

Aby to zrobić, zdefiniuję następujące defvar s.

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

chcę mieć LISP append -mode-hak do lisps używam więc mam następujący:

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

tak, że ("clojure" "LISP") => ("Clojure -mode-hook "" Hash-mode-hook ").

Teraz możemy łatwo mieć to musimy ich symbole Reader, które łatwo uzyskać z

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

I wreszcie mamy podobna forma podana wyżej:

(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)) 

wszystkich tych działa na typie, który ma dla nich sens, listę łańcuchów, listę symboli "w trybie blah-hook" itd. Teraz potrzebujemy przyjemnej funkcji, z którą możemy pracować.

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

Teraz powinno to być dość czytelne: Tworzymy nasze tryby ze spacjami listą ciągów i zastosować do niego haka.Ponadto, ponieważ zdefiniowałem standardowe środowisko-lisp, wszystkie moje seplenienie zachowują się podobnie i mogę je łatwo usunąć później, jeśli zechcę. Wtedy kod, który faktycznie działa, jest super prostą frazą: (hook-up-modes my-lisps 'standard-lisp-environment).

+0

Rozpoczęcie z ciągiem zamiast listy jest dość dziwne. Lista symboli byłaby bardziej typowym punktem wyjścia. Możesz użyć 'nazwy-symbolu', aby uzyskać łańcuch równoważny z konkatenacją podczas przetwarzania. – phils

Powiązane problemy