Różnice między ustawieniem klawiszy trybu głównego za pomocą haka a dodaniem ich do mapy trybów


13

Załóżmy, że pobrałem tryb główny o nazwie magical-modei ma on własną magiczną mapę klawiszy o nazwie magical-mode-map. Ten tryb zapewnia również przechwycenie, magical-mode-hookktóre jest uruchamiane za każdym razem, gdy magical-modestaje 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ę?


Używam tych samych klawiszy do podstawowych poleceń ruchu. Uwaga: jest to bitwa pod górkę i możesz chcieć dowiedzieć się nieco więcej o kluczowych powiązaniach, zanim zaczniesz to robić.
tarsius

@tarsius Rzeczywiście bitwa pod górę. I poszły tą drogą, ale teraz jestem z powrotem do dobrego ol” C-na C-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.
nispio

Odpowiedzi:


15

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-keywówczas wpłynie to na wszystkie bufory o tym samym trybie głównym.

local-set-keyjest przeznaczony przede wszystkim do użycia jako polecenie. Po ustaleniu, że chcesz, aby niektóre zmiany były trwałe, użyj define-keyz 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 RETponieważ chcesz wypróbować ten wariant previous-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.


Podoba mi się ta odpowiedź, ale co, jeśli tryb zostanie załadowany automatycznie?
remvee

2
Można opóźnić ładowanie kodu aż po niektóre biblioteki został załadowany: (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
tarsjusz

4

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-keywpł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ń.


2

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żyj define-keyz 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-keypomocą 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.


Dzięki. Zmodyfikowałem to pytanie, aby, mam nadzieję, wyjaśnić fakt, że nie tworzę trybu głównego, po prostu dodając własne powiązania klawiszy do istniejącego trybu głównego.
nispio

0

Twoje nazewnictwo jest trochę mylące (myślę, że powinieneś usunąć myw drugiej części pytania).

W każdym razie zakładając, że my-magical-keysjest to funkcja dostosowywania przez użytkownika magical-mode, widzę jedną oczywistą zaletę. Łatwo jest zdjąć (by remove-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.


Dostosowuję hipotetyczny tryb główny o nazwie my-magical-mode. Jeśli jednak użycie my-prefiksu jest mylące, z pewnością mogę edytować pytanie.
nispio

Tak, byłoby lepiej, zwykle (przynajmniej jak widzę na wolności) my-jest dodawany do funkcji użytkownika.
kindahero,

1
Zgoda. Właśnie zastosowałem my-tak, aby nikt nie pomyślał, że pytam, jak skonfigurować tryb rzeczywisty o nazwie magical-mode(jeśli istnieje).
nispio

1
Nie, zdjęcie haka nie przywróci starych powiązań. Przynajmniej dopóki Emacs nie zostanie zrestartowany, a potem nie widzę potrzeby komentowania tylko jednej linii zamiast czterech jako tak dużej poprawy.
tarsius

2
Jeśli chodzi o drugą zaletę, o której wspominasz: tutaj byłoby lepiej utworzyć tryb podrzędny, który można następnie włączyć dla różnych głównych trybów i / lub tylko niektórych buforów korzystających z określonego trybu głównego.
tarsius
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.