Jak większość użytkowników Emacsa, dostosowałem tryb, zmieniając zmienne. To, co nigdy nie przyszło mi do głowy, to cała mentalność programistyczna stojąca za możliwością dostosowania tego i tego. Uświadomiłem sobie to, kiedy zacząłem szukać kodu źródłowego eshell. Nie jestem programistą elisp, ale em-ls.el
wydaje się, że używa defcustom
, defgroup
itp. Wydaje się, że jest to cień-cień globalnie zdefiniowanych zmiennych, których używa kod elisp. Tak więc jedno pytanie brzmi: Czy użycie defcustom
innego sposobu wykonywania (globalnych) zmiennych globalnych?
Czy ktoś może mi wskazać, jak właściwie wykorzystać (najpierw zrozumieć) cały pomysł defcustom
, kiedy, a kiedy nie? Może przykład dla początkujących dla początkujących.
customize
udogodnień, a kiedy dostosowywać ręcznie? Czy jesteś zainteresowany pisaniem trybu? Druga to sytuacja, w której możesz rzeczywiście znaleźć coś takiego jakdefcustom
i tym podobne.Odpowiedzi:
System dostosowywania jest wbudowaną funkcją Emacsa zaprojektowaną w celu precyzyjnego rozwiązania opisanego problemu - programowanie może nie być idealnym sposobem dla przeciętnego użytkownika na skonfigurowanie edytora.
Podstawowym punktem wejścia do funkcji dostosowywania jest
M-x customize RET
(lubOptions > Customize Emacs > Top-level Customization Group
z menu). Stamtąd zobaczysz interaktywny system menu do dostosowywania ustawień. Interfejs ten wymusza, aby wszystkie ustawienia były poprawnego typu (liczba, łańcuch, kolor itp.), Unikając głównego źródła błędów napotkanych, gdy użytkownicy programowo konfigurują Emacsa. Jeśli użytkownik zdecyduje się zachować wszelkie zmiany, które wprowadzają za pomocą interfejsu użytkownika, ustawienia są zapisywane w specjalnej sekcji w pliku inicjującym użytkownika (czytaj:).emacs
.defcustom
jest otulony funkcjonalnością Emacsa Lisp niższego poziomu,defvar
która deklaruje zmienną i czyni ją widoczną w interfejsie dostosowywania. Pozwala także programistom na dostarczenie dodatkowych metadanych potrzebnych do wyświetlenia odpowiedniej interaktywnej kontroli - tj. Jaki typ wartości jest przechowywany w tej zmiennej? Dowolny ciąg? Numer? Wybór z ustalonego zestawu opcji? itp.defgroup
jest konstrukcją grupującą te konfigurowalne opcje, dzięki czemu można je uporządkować w ładną hierarchię.Z tej funkcji należy korzystać za każdym razem, gdy kawałek danych powinien być uważany za konfigurowalną opcję dla użytkownika, a nie wewnętrzny szczegół biblioteki.
Oto prosty przykład skopiowany z mojej małej biblioteki:
defgroup
Tworzy nową grupę w interfejsie dostosowywania mocy najwyższego poziomuconvenience
elementu. Potrzebowałem wtedy zmiennej do przechowywania możliwych stanów pól wyboru. Mógłbym użyćdefvar
, ale ponieważ chcę, aby można go było łatwo dostosować, zdecydowałem się użyćdefcustom
.:group
Część oznacza, że należy do uprzednio określonej grupy, do której i:type
oznacza, że jest to sekwencja łańcuchów. Istnieje również wartość domyślna i opis. Istnieją również dodatkowe udogodnienia (nie pokazane tutaj) do przekształcania wartości wprowadzonych przez użytkownika.Jeśli teraz uruchomię
M-x customize RET
i przejdę doConvenience > Checkbox
, zobaczę następujące informacje:Nie jest to najpiękniejszy interfejs na świecie, ale zauważ, że ma interaktywne narzędzia do dostosowywania wartości „stanów pól wyboru” (
checkbox-states
wewnętrznie). Pokazuje bieżące wartości ciągu wraz z przyciskamiINS
(wstaw) iDEL
(usuń) i pozwala nam edytować wartości ciągu w polach edycji. Po zakończeniu możemy zdecydować, czy zastosować nasze zmiany, cofnąć je, czy zastosować i zapisać na przyszłe sesje.źródło
defcustom
) polegają na tym, że automatycznie zajmuje się : (1) sprawdzaniem typu , aby zapobiec przypisywaniu niepoprawnej wartości do zmiennej (pod warunkiem, że autordefcustom
podjął wysiłek, aby zapewnić rozsądny typ sprawdź), (2) inicjalizacja (:initialize
) i zaktualizuj funkcje (uruchomione) (:set
).Tak. Zwłaszcza jeśli chcesz, aby użytkownicy Twojego kodu mogli łatwo zmieniać zmienne poprzez interfejs dostosowywania Mx .
defcustom zapewnia użytkownikom dwie ważne korzyści: dokumentację i bezpieczeństwo typu. Dobrze jest mieć dokumentację. Bezpieczeństwo typu pozwala określić, jakie rodzaje prawidłowych wartości mogą przyjmować zmienne.
Oczywiście defvar jest w porządku, jeśli wszystko, co robisz, to dostosowywanie dla siebie i nie przewidywanie szerszego użycia. Jednak niektórzy powiedzieliby, że trzymanie się defcustom na wskroś jest dobrym nawykiem wpajania.
Strona podręcznika dla defcustom zawiera dalsze wyjaśnienia. Temat dostosowywania w podręczniku zawiera szczegółowe informacje.
Osobiście uważam, że defcustom jest mniej kłopotliwy podczas programowania, ponieważ nie muszę radzić sobie z problemami z przeładowywaniem programów defvar i setq.
źródło