Czasami moje globalne skróty klawiszowe są zastępowane przez tryb główny. Prostym przykładem jest następujące ustawienie w moim pliku init
(global-set-key (kbd "C-j") 'newline-and-indent)
Ale irytujące jest to ukrywanie klawiszy w głównym trybie „Lisp Interaction”, który jest domyślnym trybem bufora scratch.
Kiedy znajduję się w sytuacji, w której główny tryb (lub mniejszy tryb) ukrywa moje globalne przypisanie klawiszy, jak mogę je odzyskać?
Uwaga: Moje pytanie nie jest „Jak mogę związać C-j
się newline-and-indent
«? Trybie»in” Lisp Interaction Interesuje mnie znacznie bardziej ogólna odpowiedź na temat tego, jak radzić sobie z mapami klawiszy, które kolidują lub z kluczami użytkownika, które są ukryte przez jakiś tryb główny / podrzędny.
key-bindings
major-mode
keymap
minor-mode
nispio
źródło
źródło
Odpowiedzi:
Istnieje również podejście „skrótowe” do tego samego rozwiązania, jeśli nie chcesz definiować własnego trybu podrzędnego (o którym mówię w mojej pierwszej odpowiedzi).
Możesz zainstalować
use-package
pakiet dostępny w Melpa i użyćbind-key*
lubbind-keys*
makra, które jest częściąbind-key
pakietu, który jest dostarczanyuse-package
.Z dokumentacji
bind-key.el
:źródło
emulation-mode-map-alists
do wymuszenia pierwszeństwa).(bind-key* "C-M-&" 'override-global-mode)
do swojego init, a zwykle możesz szybko usunąć wiązania, jeśli zajdzie taka potrzeba. Ponieważoverride-global-mode
nie jest to „globalny” tryb podrzędny, nadal musisz go dezaktywować dla poszczególnych buforów. Jeśli więc często zdarza się dezaktywować globalne klawisze zastępowania, to rozwiązanie nie jest wygodne.Możesz zdefiniować własny tryb podrzędny i jego mapę kluczy i zastąpić wszystkie pozostałe tryby (podrzędne + główne). Właśnie dlatego zdecydowałem się napisać własny tryb pomniejszy.
Kroki, aby powiązania klawiszy zastąpiły wszystkie powiązania:
(define-key my-mode-map (kbd "C-j") #'newline-and-indent)
Podobnie inne przypisania klawiszy ustawione w trybie podrzędnym zastąpią te w innych trybach.
Gorąco polecam przeczytanie posta na blogu autorstwa Christophera Wellonsa na temat pisania pomniejszego trybu. Ten blog oraz irytacja związana z ustawieniem wielu powiązań klawiszy
nil
w wielu głównych i mniejszych trybach zainspirowały mnie do napisania własnego trybu pomocniczego.Najlepszą częścią korzystania z tego podejścia jest to, że jeśli chcesz sprawdzić, co robią przypisania klawiszy w domyślnej konfiguracji emacsa, po prostu wyłączasz tryb pomocniczy; następnie włącz go ponownie i odzyskaj niestandardowe powiązania klawiszy.
źródło
Aby powiązanie globalne zastąpiło powiązanie w trybie głównym, wystarczy ustawić powiązanie
nil
w trybie głównym:Nie jest możliwe, aby globalne wiązanie miało pierwszeństwo przed wszystkimi trybami w ogóle (w przeciwnym razie nie byłoby sensu mieć głównych trybów), ale możesz włamać się do niego, tworząc własny mniejszy tryb z najważniejszymi powiązaniami. Wtedy miałbyś przynajmniej pierwszeństwo przed większością trybów (choć niekoniecznie wszystkich).
źródło
(define-key foo-mode (kbd "C-j") nil)
plik .emacs i oczekiwać, że zadziała?foo-mode-map
(mój przykład w odpowiedzi był zły), ale tak, to wyłączy przypisanie klawiszy w trybie głównym, więc zamiast tego zostanie użyte globalne przypisanie (chyba, że używa innego trybu podrzędnego, który go używa).foo-mode
zostanie wywołana mapa klawiszyfoo-mode-map
?Możesz użyć tych makr:
EDYCJA :
Sprawdź przykład poniżej:
Jeśli mapa klawiszy X zastępuje globalne powiązanie Y, piszesz:
(expose-bindings X '("Y"))
A wtedy zastąpienie zostanie „cofnięte”.
źródło
other map
, w ten sposób odsłaniając powiązanie mapy globalnej przezother map
. Drugi pozwala po prostu zastosować ten pierwszy do listy powiązań.expose-bindings
najpierw wykonuję , a następnie globalnie wiążę te klucze z poleceniami, które chcę? Może mógłbyś pokazać przykład tego, co mógłbym umieścić w moim pliku init, aby to zadziałało.