Jak prawidłowo korzystać z defcustom?

15

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.elwydaje się, że używa defcustom, defgroupitp. 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 defcustominnego 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.

147pm
źródło
Czy możesz wyjaśnić, o co pytasz? Czy chcesz wiedzieć, kiedy korzystać z customizeudogodnień, a kiedy dostosowywać ręcznie? Czy jesteś zainteresowany pisaniem trybu? Druga to sytuacja, w której możesz rzeczywiście znaleźć coś takiego jak defcustomi tym podobne.
Dan

Odpowiedzi:

21

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(lub Options > Customize Emacs > Top-level Customization Groupz 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.

defcustomjest otulony funkcjonalnością Emacsa Lisp niższego poziomu, defvarktó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. defgroupjest 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 checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

defgroupTworzy nową grupę w interfejsie dostosowywania mocy najwyższego poziomu convenienceelementu. 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. :groupCzęść oznacza, że należy do uprzednio określonej grupy, do której i :typeoznacza, ż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 RETi przejdę do Convenience > Checkbox, zobaczę następujące informacje:

interfejs dostosowywania

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-stateswewnętrznie). Pokazuje bieżące wartości ciągu wraz z przyciskami INS(wstaw) i DEL(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.

Camdez
źródło
2
Dobry post! Najważniejsze zalety dostosowywania (i defcustom) polegają na tym, że automatycznie zajmuje się : (1) sprawdzaniem typu , aby zapobiec przypisywaniu niepoprawnej wartości do zmiennej (pod warunkiem, że autor defcustompodjął wysiłek, aby zapewnić rozsądny typ sprawdź), (2) inicjalizacja ( :initialize) i zaktualizuj funkcje (uruchomione) ( :set).
Drew
Dzięki! Zaktualizowałem post, aby odzwierciedlić Twoje sugestie.
camdez
8

Czy użycie defcustom jest innym sposobem wykonywania (globalnych) zmiennych globalnych?

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.

Czy ktoś może wskazać mi, jak prawidłowo korzystać z ...

Strona podręcznika dla defcustom zawiera dalsze wyjaśnienia. Temat dostosowywania w podręczniku zawiera szczegółowe informacje.

... kiedy używać, dlaczego, a kiedy nie?

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.

Użytkownik Emacsa
źródło