Od czasu do czasu obserwuję nieoczekiwane zachowanie podczas edycji tekstu. Moim pierwszym rozwiązaniem jest zazwyczaj C-h k
sprawdzenie, jakie funkcje wywoływane są przez daną sekwencję klawiszy. Czasami jednak dokumentacja jest sprzeczna z zaobserwowanym zachowaniem. W takich przypadkach zwykle zakładam, że jakiś inny pakiet zaczepił się w tej funkcji lub sekwencji klawiszy i modyfikuje swoje zachowanie.
Jak mogę dowiedzieć się, które funkcje zaczepiają się w mojej sekwencji klawiszy?
Jednym z przykładów, które ostatnio spotkałem, było naciśnięcie "klawisza, a znaki cudzysłowu zostały wstawione na początku i na końcu aktywnego regionu. Podejrzewałem, że nie jest to domyślne zachowanie Emacsa, więc szukałem C-h k "
, jaka funkcja jest faktycznie wywoływana.
describe-key
Dokumentacja powiedział mi, że funkcja self-insert-command
została miano, która jest wbudowana funkcja. Krótko mówiąc, po pewnym czasie prób i błędów udało mi się ustalić, że zachowanie było spowodowane electric-pair-mode
. Czy w przyszłości można szybciej dojść do takiego wniosku, niż wyłączać podejrzane pakiety pojedynczo, aż do znalezienia winowajcy?
electric-pair-mode
został aktywowany tylko w niektórych głównych trybach? Czy nadal zobaczyćself-insert-command
na"
kiedy to zrobićC-h k
, gdyelectric-pair-mode
jest aktywny?electric-pair-mode
działa poprzez zaczepienie siępost-self-insert-hook
, a nie zmianę przypisania klawiszy.C-h k
mówi dokładnie, co dzieje się po naciśnięciu klawisza. Jeśli spojrzysz na dokumentacjęself-insert-command
, wyraźnie widać, żepost-self-insert-hook
jest uruchamiana po zakończeniu polecenia.after-change-functions
tak, jak Jordon wspomina w swojej odpowiedzi? Dokumentacja funkcji prawdopodobnie nie wspomina konkretnie o tym haku, prawda?C-h k
+ standardowe zaczepy == pełne zachowanie (mniej więcej). Oczywiście czasami pozostawia to wiele możliwości, ale wciąż jest o wiele bardziej przejrzysta niż jakikolwiek inny złożony system oprogramowania, o którym wiem.Odpowiedzi:
Nie ma łatwego sposobu, aby dokładnie wiedzieć, co zrobi jedno naciśnięcie klawisza.
Jeśli widzisz dodatkowe zachowanie, zawsze sprawdzaj wspólne haki. Zobacz listę tutaj: http://www.gnu.org/software/emacs/manual/html_node/elisp/Standard-Hooks.html
W większości przypadków najważniejsze to:
Musisz sprawdzić te haczyki i przejrzeć zawarte w nich funkcje, aby zobaczyć, który z nich modyfikuje twoje zachowanie.
Jeśli funkcje w tych zaczepach nie w pełni opisują zaobserwowane zachowanie, sprawdź funkcje, aby uzyskać porady, które pojawią się w ich dokumentacji
describe-function
.Edycja: Napisałem kilka funkcji, które pomagają lepiej opisać hak, niż przeglądanie funkcji jedna po drugiej: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb Można
describe-hook
tam zdefiniować tak jak inne funkcje opisujące. Oto próbka jego wyników:A oto cały kod, na wypadek gdyby istota zniknęła:
źródło
documentation
jest aktualizowana w celu odzwierciedlenia.Być może nie jest to pełna odpowiedź na twoje pytanie, ale pakiet
helm-descbinds
pomaga przeszukać wszystkie zdefiniowane wiązania klawiatury z ascii reprezentacji skrótu. Przy każdym trafieniu wyświetla interaktywną funkcję związaną ze skrótem klawiaturowym, możesz też poprosićhelm-descbinds
o jej opisanie lub wykonanie bezpośrednio z wyników wyszukiwania.Oto opis pakietu ze strony GitHub:
źródło
C-h b
. Moim jedynym życzeniem jest to, że mogę przejść do pozycji na liście, wpisując rzeczywistą sekwencję klawiszy zamiast wpisywaćC
-
c
_
C
-
p