Zalety ustawiania zmiennych za pomocą setq zamiast custom.el?


69

Widzę, że wiele osób (autorów rozszerzeń i inni) podaje przykłady konfiguracji z setq:

(setq foo 'bar)

Parametry te są często definiowane za pomocą defcustom, dzięki czemu można je dostosowywać poprzez custom.el.

Zazwyczaj używam ich custom.eldo ustawiania. Czy skorzystanie z niej byłoby korzystne, setqczy te dwie metody są w przybliżeniu równoważne?

Odpowiedzi:


85

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 setqjest złym podejściem do tych opcji. Zatem ogólna zasada setqjest niewłaściwa.

Jeśli użyjesz custom-set-variableslub customize-set-variablezamiast 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 defcustomsłów kluczowych :seti :initializei używając setqnie ma znaczenia dla nich. Ale wiele waniliowych opcji Emacsa używa takich słów kluczowych, a dla tych, które to robią, setqnie 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-variableslub customize-set-variablezamiast 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.


5
Myślę, że warto wspomnieć, że nawet przy parametrach: set i: initialize setq nadal działa, jeśli zostanie odczytany przed załadowaniem pakietu.
Malabarba

2
@Willyfrog Możesz go zagłosować!
Zane Shelby

17
nie jestem tego pewien Drew. Całość dostosowywania jest raczej złożona. Bez tego system emacs jest znacznie prostszy. Dostosuj to warstwa, która nie bardzo dobrze łączy się z elisp. Po pierwsze, porządkuje wszystkie zmienne alfabetyczne. Ponadto wiele dostosowań nie dotyczy zmiennych (np. Haczyków, kluczy), więc nie można używać dostosowywania. Tak czy inaczej, masz do czynienia z ręcznym kodem elisp.
Xah Lee,

4
@XahLee. Jestem pewien. ;-) Ale tak, Dostosuj to, co to jest. Nie jest to najlepsza rzecz dla klawiszy, haczyków, słów kluczowych z blokadą czcionek, tabel wyświetlanych itp. Ale to, co robi (opcje i twarze), robi całkiem nieźle. Nie chodzi o to, że interfejs użytkownika jest wspaniały, ale pomocna jest obsługa wyzwalaczy, sprawdzanie typu itp. I jeszcze chcą programiści mogli (opcjonalnie) używać rzeczy jak :typez defvar- 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).
Drew

1
Punkt danych: W mojej 3300 liniach kodu inicjującego Emacsa opracowanych przez większą część roku zostałem ugryziony przez użycie setqzamiast customize-set-variabledokładnie raz. (To był jeden raz auto-revert-interval, a później zdałem sobie sprawę, że używanie setq przed załadowaniem autorevertbyło faktycznie znacznie szybsze niż używanie customize-set-variable.)
Radon Rosborough

37

Wolę setqponad customizez kilku powodów:

  1. Przede wszystkim umożliwia programowe ustawianie zmiennych (jak 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ść, a customizeinterfejs nie przeszkadza.
  2. setqlepiej nadaje się do kontroli wersji i organizacji kodu. Inicjalizację podzieliłem na dziesiątki plików; gdyby wszystko było w jednym dużym custom.elpliku, znacznie trudniej byłoby szybko znaleźć i edytować ustawienia.
  3. Jest to subiektywne, ale dla mnie cały customizeinterfejs 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ą :seti :initialize. Używam Emacsa od lat i rzadko spotykam takie problemy. Kiedy zrobić, to łatwo zamienić się setqza custom-set-variablew szczególnych przypadkach.


10
1. Możesz ustawić programowalne zmienne za pomocą 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.
Nick McCurdy,

23

Jedną z zalet używania setqzamiast customizejest 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-variablesktó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.


Możesz także przywrócić wartość domyślną za pomocą setq, po prostu skomentuj setqlinię i zrestartuj emacsa.
T. Verron

3
Tak, ale dostosowywanie może przywrócić bez uciążliwych ponownych uruchomień. Bardzo przydatny do wypróbowania nowych ustawień.
Vamsi

2
Jeśli chodzi o adnotacje, interfejs dostosowywania pozwala dodawać komentarze do każdej zmienianej zmiennej.
Andrew Swann,

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ś).
Croad Langshan,

Interfejs <kbd> Mx customize- * </kbd> ma pole „komentarz”, które umożliwia przechowywanie komentarza wraz ze zmienną.
kdb

-1

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:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Chodzi o to, że pakiet use jest makrem i nie ocenia natychmiast swoich argumentów. :initI :configparametry 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-packageniektó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-packagejest 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.


2
To tak naprawdę nie odpowiada na pytanie. W samej odpowiedzi używasz setq bez wyjaśnienia dlaczego.
J David Smith

3
Myślę, że use-packagesama w sobie oferuje zalety konfiguracji modułowej, a także importowania i konfigurowania pakietów w jednym miejscu. Ale tak, w przykładzie użyto setq. Czy równie dobrze mógł się customize-set-variabletu posłużyć ? Nie jestem pewny. Czy możemy / powinniśmy zamienić to (lub customize-set-value) na setq?
Mike

4
Zmień przykład, aby używał :customsłowa kluczowego.
Toon Claes,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.