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)
.
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. –
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
@Lindydancer całkowicie się zgadzam, ale to było tylko dla celów demonstracyjnych. W każdym razie, zmieniono na osobną funkcję. –