Załóżmy, że pobrałem tryb główny o nazwie magical-mode
i ma on własną magiczną mapę klawiszy o nazwie magical-mode-map
. Ten tryb zapewnia również przechwycenie, magical-mode-hook
które jest uruchamiane za każdym razem, gdy magical-mode
staje się głównym trybem bufora. Teraz chcę zmodyfikować mój plik init, aby dodać kilka niestandardowych powiązań klawiszy do użycia w tym trybie.
Wygląda na to, że istnieją (przynajmniej) dwa sposoby konfigurowania niestandardowych powiązań klawiszy magical-mode
. Najczęściej widzę to:
(defun my-magical-keys ()
(local-set-key (kbd "C-i") 'previous-line)
(local-set-key (kbd "C-k") 'next-line)
(local-set-key (kbd "C-j") 'backward-char)
(local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)
Ale można to również zrobić w ten sposób:
(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)
Druga metoda wydaje mi się czystsza. Czy są jakieś zalety robienia tego w jedną stronę?
elisp
key-bindings
major-mode
nispio
źródło
źródło
C-n
aC-p
. Przykładem jest po prostu sztuczny kod. Chciałem wymyślić kilka bardzo prostych przykładowych trybów i przykładowych powiązań, właśnie tak, aby same powiązania nie odwracały uwagi od rzeczywistego celu pytania.Odpowiedzi:
Preferowane jest drugie podejście, ponieważ modyfikuje mapę klawiszy trybu tylko raz.
Jeśli zrobisz to za pomocą haka trybu, będzie on wywoływany za każdym razem, gdy tryb ten zostanie włączony w jakimś buforze. Powtórzenie tego zwykle nie przyniesie efektu, ponieważ klucze są ponownie powiązane z tym, do czego są już powiązane. Mapy klawiszy trybu głównego są „lokalne” dla trybu głównego, a nie poszczególnych buforów, które używają tego trybu, więc jeśli zmienisz powiązanie w jednym z tych buforów,
local-set-key
wówczas wpłynie to na wszystkie bufory o tym samym trybie głównym.local-set-key
jest przeznaczony przede wszystkim do użycia jako polecenie. Po ustaleniu, że chcesz, aby niektóre zmiany były trwałe, użyjdefine-key
z mapą klawiszy trybu jako pierwszego argumentu.Jeśli używasz haka do modyfikowania mapy klawiszy w kółko, może to kolidować z zamierzonym użyciem
local-set-key
. Powiedzmy, że użyłeś,M-x local-set-key RET C-i fancy-previous-line RET
ponieważ chcesz wypróbować ten wariantprevious-line
. Jeśli teraz otworzysz nowy bufor, który używa tego samego trybu głównego, wtedy hak uruchomi się ponownie i zastąpi tymczasowe wiązanie we wszystkich buforach korzystających z tego trybu głównego, w tym również w buforze, w którym wcześniej używałeślocal-set-key
.źródło
(eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...))
.Używanie
(define-key my-magical-mode-map …)
jest normalnym sposobem.Kiedy używasz haka i
local-set-key
, klucze są dodawane za każdym razem, gdy wchodzisz w tryb My Magical w jakimś buforze. Jest to dziwne, ponieważlocal-set-key
wpływa na wszystkie bufory, które są w tym samym trybie (bardziej ogólnie, wszystkie bufory używające tej samej mapy klawiszy). Jeśli więc wprowadzisz jakieś zmiany w mapie klawiszy, zostaną one zastąpione za każdym razem, gdy przejdziesz do trybu My Magical w buforze.Druga metoda może być myląca, jeśli dostosujesz mapę klawiszy w różnych miejscach. Haki są wykonywane w odwrotnej kolejności od kolejności, w której zostały dodane, i do pierwszego uruchomienia nie zobaczysz żadnych śladów swoich dostosowań.
źródło
Najwyraźniej nie pytasz o zdefiniowanie mapy klawiszy trybu głównego, ale o kod użytkownika, aby dodać lub zmienić kilka skrótów klawiszowych w istniejącej mapie klawiszy trybu głównego. Mówisz „niestandardowy”, co sugeruje to, ale równie dobrze możemy to wyjaśnić.
Oczywiście, to, co mówisz, że widzisz najczęściej, nie jest tym, co jest ogólnie używane do definiowania mapy klawiszy trybu głównego. Na przykład nie jest to, co można znaleźć w kodzie źródłowym Emacsa. I to nie to, co jest zalecane w instrukcji elisp (węźle
Major Mode Conventions
).Po prostu chciałem to usunąć, aby było jasne dla innych: generalnie nie chcesz używać haka trybu do definiowania mapy trybu głównego.
Na pytanie dotyczące dostosowań klucza użytkownika -
W każdym razie nie jest tak
local-set-key
, że powinieneś używać w trybie haka. Po prostu użyjdefine-key
z mapą klawiszy trybu głównego, dokładnie tak jak w twoim pierwszym przykładzie. @tarsius już to dobrze wyjaśnił.Poza tym odpowiedź brzmi: ogólnie rzecz biorąc , nie ma większego znaczenia, czy klucze są łączone (za
define-key
pomocą mapy trybów) raz na zawsze, czy też używasz haka do wiązania ich za każdym razem, gdy wchodzisz w tryb.Ale może to mieć znaczenie, jeśli zmieni się powiązanie na mapie - na przykład przez załadowanie innego kodu, który je zmienia. W takim przypadku umieszczenie powiązań na haku trybu głównego zapewnia, że po wejściu w tryb powiązania zostaną ustanowione. Oznacza to, że zapewnia ich wykonanie, ale nie gwarantuje, że nic więcej ich nie zmieni później (np. Inna funkcja na tym samym haku, wywołana później). Pamiętaj, że masz niewielką kontrolę nad tym, co się uruchamia i kiedy - chyba że jesteś pewien, że tylko twój własny kod się z tym pogubi.
To jedyna różnica w działaniu, o której mogę myśleć. Abyś zdecydował, kiedy uważasz tę różnicę za zaletę jednego lub drugiego podejścia. FWIW, patrząc na mój własny kod, nie sądzę, żebym kiedykolwiek wiązał klucze na haku trybu.
źródło
Twoje nazewnictwo jest trochę mylące (myślę, że powinieneś usunąć
my
w drugiej części pytania).W każdym razie zakładając, że
my-magical-keys
jest to funkcja dostosowywania przez użytkownikamagical-mode
, widzę jedną oczywistą zaletę. Łatwo jest zdjąć (byremove-hook
) hak za jednym razem.Drugą zaletą jest przeznaczenie funkcji. Mam na myśli, że są wielokrotnego użytku. możesz podłączyć je do innych trybów.
Edytować:
Jak zauważył @tarsius, usunięcie haka nie przywróci oryginalnego zachowania, a zmiana funkcji w tryb mniejszy może być lepsza.
źródło
my-magical-mode
. Jeśli jednak użyciemy-
prefiksu jest mylące, z pewnością mogę edytować pytanie.my-
jest dodawany do funkcji użytkownika.my-
tak, aby nikt nie pomyślał, że pytam, jak skonfigurować tryb rzeczywisty o nazwiemagical-mode
(jeśli istnieje).