Prawdopodobnie pod wpływem Clojure częściej używam list nieruchomości jako struktur danych. Emacs przez większość czasu wcina je w ten sposób,
`(:token ,token
:token-quality ,quality) ,
podczas gdy tego właśnie wolałbym
`(:token ,token
:token-quality ,quality) .
Zastanawiam się, czy ktoś już to rozwiązał?
Fuco1/lisp-indent-function
i zrób(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Odpowiedzi:
Można to osiągnąć, zmieniając
lisp-indent-function
tryb for emacs-lisp:Ze
lisp-mode.el
źródła emacsAlternatywny
Jak @wasamasa wspomniano w komentarzu do pytania, @ Fuco1 (na github.com) został zmodyfikowany domyślny
lisp-indent-function
naprawić wcięcia słów kluczowych (począwszy:
).Emacs dostarczył zmienną
lisp-indent-function
dla użytkownika, aby mógł wybrać, jakiej funkcji użyć do wcięcia w trybach lisp.Zamiast przesłonić pierwotną definicję funkcji, możemy stworzyć własną funkcję i przypisać powyższą zmienną do nazwy tej funkcji.
W tym przykładzie
Fuco1/lisp-indent-function
w konfiguracji emacsaemacs-lisp-mode
:Odniesienie
Zmodyfikowaną funkcję wkleja się poniżej w przypadku utraty źródła, do którego odnosi się github.
źródło
lisp-indent-function
.(setq lisp-backquote-indentation nil)
list z powrotem cytowanych (jak w pierwotnym pytaniu).Wprowadzenie do obliczania wcięcia-lisp
Lepszym rozwiązaniem jest zastąpienie funkcji
calculate-lisp-indent
. W skrócie,calculate-lisp-indent
jest funkcją, która zwraca kolumnę, do której należy wciąć linię w punkcie. Ta funkcja informuje,lisp-indent-function
jak bardzo każda linia powinna być wcięta. (zobacz także mój post na reddit, aby uzyskać więcej informacji).Porównanie z innymi odpowiedziami
Zaletą tej odpowiedzi nad korzystaniem ze zmodyfikowanej funkcji Fuco1 jest to, że (1) naprawia ona rdzeń problemu, który polega na tym, że
calculate-lisp-indent
zamiast po prostu wyczyścić po niewłaściwym wcięciu zwróconym przezcalculate-lisp-indent
(2), uogólnia na listy cytowane i cudzysłowione (i to działa niezależnie od tego, czy są cytowane / cytowane wprost, czy za pomocą'
i `). Działa również z dowolnie zagnieżdżonymi cytatami i cudzysłowami.Zaletą tej odpowiedzi w porównaniu
lisp-indent-function
zcommon-lisp-indent-function
funkcją jest to, że nie ma efektu ubocznego zepsucia innych wcięć elisp. Elisp i Common-seplenie są wcięte inaczej.Jak to działa
To warunek (in
calculate-lisp-indent
) decyduje o tym, czy sexp jest wcięty jak funkcja, czy nie. To, co wchodzi w zakres tej klauzuli, jest wcięte jak funkcja. To, co wchodzi w skład klauzuli if, jest wcięte normalnie (pod bieżącym elementem). Aby wciąć listy cytowane jako dane zamiast funkcji, musimy dodać więcej sprawdzania przypadków, w których lista jest cytowana w predykacie warunkowym.Ten kod sprawdza otwarte nawiasy seksu, który jest wcięty. Jeśli jest sexp z wieloma sexp, sprawdza je wszystkie. Zwraca t, jeśli znajdzie seksu lub cytowanego cudzysłowu.
Premia
Jeśli chcesz, aby dowolna lista rozpoczynająca się słowem kluczowym była wcięta jako dane, nawet jeśli nie jest ona cytowana, dodaj ją jako kolejną opcję do predykatu warunkowego. Może to być przydatne w przypadku makr, w których dla wygody nie podano zacisków, takich jak w defhydrze .
Przykłady
Pełny fragment kodu, który opublikowałem poniżej, działa w przypadku, o którym wspomniałeś, i nie tylko. Wypróbuj to!
Bardziej szczegółowe wyjaśnienie tego, jak to działa, znajduje się w moim poście na reddit .
Pełny fragment kodu
Oto pełny fragment kodu.
Uwagi końcowe
Warto zauważyć, że pytanie to byłoby lepiej uogólnione, jak powstrzymać emacsa przed wcięciem cytowanych i niecytowanych list jako funkcji .
źródło
Dla znacznie trudniejszej alternatywy dla odpowiedzi kaushalmodi można zastąpić
lisp-indent-function
to, co zrobił Mark H. Weaver,scheme-indent-function
aby naprawić wyrównanie słów kluczowych w schemacie Guile'a.Właśnie skopiowałem kod z http://netris.org/~mhw/scheme-indent-function.el ; jedyną zmianą jest dodanie nowej
cond
klauzuli. Możesz chcieć pobrać bieżący kodlisp-indent-function
zamiast korzystać z tej funkcji w obecnej postaci.(Szkoda, że funkcje wcięcia nie ujawniają więcej haków, aby uprościć takie drobne zmiany.)
źródło
lisp-indent-function
? Wydaje się też, że nie ma funkcjiemacs-lisp-indent-function
.lisp-indent-function
domyślnie zawiera funkcję wcięcia. Przypisanie tej zmiennej jest identyczne z zastąpieniem domyślnej funkcji wcięcia dla trybu emacs-lisp. (Masz rację, nie ma specjalnegoemacs-lisp-indent-function
, to po prostulisp-indent-function
.)Możesz zastąpić
lisp-indent-function
w przyszłościowy sposób, używając mojej łatki el-patch :To rozwiązuje problem dla mnie; zobacz to w kontekście .
źródło