Niektórzy ludzie mogą myśleć, że jest prostszy w użyciu setq
. Niektórzy ludzie mogą myśleć, że to bardziej zawiłe. W rzeczywistości jest to naiwne w ogólnym przypadku.
Prawdą jest, że w przypadku niektórych opcji użytkownika nie ma to znaczenia. Ale dla innych ma to znaczenie i setq
jest złym podejściem do tych opcji. Zatem ogólna zasada setq
jest niewłaściwa.
Jeśli użyjesz custom-set-variables
lub customize-set-variable
zamiast setq
, lub jeśli korzystasz z Dostosuj interfejs użytkownika (np. M-x customize-option
), To masz pewność, że każdy zamierzony kod inicjujący lub aktualizujący, który jest potrzebny dla wartości opcji, zostanie automatycznie uruchomiony i będzie działał w razie potrzeby. Jeśli użyjesz setq
, nie zostanie to zrobione.
Teraz jest to również przypadek, że większość opcji użytkownika, zwłaszcza wielu z nich napisany dla bibliotek 3rd-party nie skorzystać z defcustom
słów kluczowych :set
i :initialize
i używając setq
nie ma znaczenia dla nich. Ale wiele waniliowych opcji Emacsa używa takich słów kluczowych, a dla tych, które to robią, setq
nie jest właściwe. Więc jeśli chcesz użyć kodu Lisp, a nie Dostosuj interfejs użytkownika, aby ustawić swoje opcje, lepiej użyć custom-set-variables
lub customize-set-variable
zamiast niego setq
. Nigdy nie boli i czasami pomaga (bardzo).
Ale zalecam zrobienie obu tych rzeczy:
W tym celu użyj niestandardowego interfejsu użytkownika zamiast pisać kod Lisp.
Zdefiniuj zmiennącustom-file
, tak aby Dostosuj zapisuje dostosowania do tego pliku, a nie do pliku init ( ~/.emacs
). IOW, trzymaj swój ręcznie napisany kod inicjujący oddzielnie od kodu automatycznego napisanego przez Customize.
:type
zdefvar
- nie sądzę, powinno być ograniczone do możliwości użytkownika. Niestety, wielu programistów jest leniwych w używaniu:type
, a wynik nie jest zbyt pomocny (to nie jest wina Customize).setq
zamiastcustomize-set-variable
dokładnie raz. (To był jeden razauto-revert-interval
, a później zdałem sobie sprawę, że używaniesetq
przed załadowaniemautorevert
było faktycznie znacznie szybsze niż używaniecustomize-set-variable
.)Wolę
setq
ponadcustomize
z kilku powodów:(setq foo (calculate-foo))
). Używam tej mocy przez cały czas w mojej konfiguracji, aby zachować SUSZENIE. Dla mnie sednem używania Emacsa jest programowalność, acustomize
interfejs nie przeszkadza.setq
lepiej nadaje się do kontroli wersji i organizacji kodu. Inicjalizację podzieliłem na dziesiątki plików; gdyby wszystko było w jednym dużymcustom.el
pliku, znacznie trudniej byłoby szybko znaleźć i edytować ustawienia.customize
interfejs wydaje się straszną relikwią z najgorszych interfejsów użytkownika lat 90. Wolę edytować tekst za pomocą Emacsa każdego dnia.@Drew przedstawia kilka dobrych uwag na temat niektórych subtelności za pomocą
:set
i:initialize
. Używam Emacsa od lat i rzadko spotykam takie problemy. Kiedy zrobić, to łatwo zamienić sięsetq
zacustom-set-variable
w szczególnych przypadkach.źródło
customize-set-variable(s)
, i jest to lepsze ze względu na wyzwalacze uruchamiane automatycznie. 2. Możesz użyć różnych poleceń dostosowywania, aby zobaczyć wszystkie swoje ustawione i / lub zapisane zmienne w różnych hierarchiach, dzięki czemu automatycznie organizujesz różne grupy bez konieczności używania osobnych plików w kontroli wersji. 3. Jest znacznie lepiej. Jeśli nie podoba ci się interfejs użytkownika, nadal możesz używać dostosowywania programowo i za pomocą interaktywnych poleceń, które unikają trybu dostosowywania, aby uzyskać wszystkie inne korzyści z używania dostosowywania.Jedną z zalet używania
setq
zamiastcustomize
jest czytelność. Każdą modyfikację można dowolnie przypisać do własnych upodobań, która IMO poprawia czytelność. Można również grupować powiązane dostosowania, co poprawia modułowość. Na koniec argumentowałbym, że nawigacja w buforze elisp jest bardziej „łatwa” niż nawigacja dostosowywania interfejsu użytkownika i widżetów.Z drugiej strony, dostosowywanie pozwala łatwo przywrócić wartości domyślne, które mogą być bezcenne, gdy coś stanie się szalone.
EDYCJA: Odpowiedź Drew stanowi doskonały powód do użycia,
customize-set-variables
który może zapewnić wszystkie zalety, które wskazałem. Jednak interfejs użytkownika Customize nie nadaje się do przenośnych konfiguracji między różnymi platformami tak łatwo, jak robi to surowy elisp. Jeśli potrzebujesz zmiennej zależnej od systemu operacyjnego, w wielu przypadkach będziesz musiał wrócić do elisp. Moje zdanie na temat łatwiejszej nawigacji w buforach elisp nadal jest aktualne.źródło
setq
, po prostu skomentujsetq
linię i zrestartuj emacsa.custom-set-variables
jest „surowym elisp” i używam go codziennie na wielu komputerach. Po prostu skopiuj go z miejsca, w którym dostosowuje go pisze (jeśli sam tego nie napisałeś).Inną alternatywą jest użycie pakietu użytkowego Johna Wiegleya . Zapewnia to programowy sposób konfiguracji pakietów, który ładnie działa z procesem inicjalizacji pakietu emacs 24+. Oto przykład użycia z pliku readme:
Chodzi o to, że pakiet use jest makrem i nie ocenia natychmiast swoich argumentów.
:init
I:config
parametry są oceniane w poszczególnych etapach procesu inicjalizacji, umożliwiając mieć konfigurację każdego pakietu w jednym miejscu, ale mają każda część jest wykonywany w odpowiednim etapie inicjalizacji.Bez czegoś takiego jak
use-package
niektóre pakiety wymagają części kodu inicjalizacyjnego, aby przejść wcześniej,(package-initialize)
a kolejnej części. Jeśli masz wiele takich pakietów, to ich inicjalizacje musiałyby być przeplatane.Kolejną zaletą
use-package
jest to, że może on automatycznie instalować brakujące pakiety przy użyciu package.el, jeśli zabierzesz .emacs na nowy komputer lub jeśli udostępnisz swoją konfigurację innemu użytkownikowi, a cała inicjalizacja może zostać odroczona do momentu, aż pakiet rzeczywiście będzie wymagał załadowania.Istnieją również dodatkowe argumenty słów kluczowych, które pozwalają na większą kontrolę nad procesem inicjalizacji.
Wszystko, co powiedziałem, jedną wielką zaletą dostosowywania jest to, że pokazuje, co należy skonfigurować w danym pakiecie. To jeden z powodów, dla których wciąż używam go do wielu moich pakietów.
źródło
use-package
sama w sobie oferuje zalety konfiguracji modułowej, a także importowania i konfigurowania pakietów w jednym miejscu. Ale tak, w przykładzie użytosetq
. Czy równie dobrze mógł sięcustomize-set-variable
tu posłużyć ? Nie jestem pewny. Czy możemy / powinniśmy zamienić to (lubcustomize-set-value
) nasetq
?:custom
słowa kluczowego.