Wystąpił problem polegający na tym, że region jest dezaktywowany (w trybie znaku przejściowego). Funkcja deactivate-mark
jest wywoływana i chciałbym dowiedzieć się, skąd (i dlaczego) jest ona wywoływana.
Próbowałem M-x debug-on-entry RET deactivate-mark
i przestało, ale nie znalazłem sposobu, aby dowiedzieć się, kto dzwoni. Cały wyświetlany stacktrace to:
Debugger entered--entering a function:
* deactivate-mark()
Próbowałem, M-x edebug-eval-defun
ale Edebug też nie pokazuje dzwoniącego.
Jak dowiedzieć się, dlaczego (skąd) deactivate-mark
jest wywoływany? Szukam funkcjonalności śledzenia wstecznego lub stosu.
EDYTOWAĆ:
advice-add
Trick:
(defun message-show-backtrace ()
(message "%s" (backtrace-frame 10)))
(advice-add deactivate-mark :before #'message-show-backtrace)
produkuje nil
w *Messages*
.
Edycja: więcej informacji na temat deactivate-mark
: http://emacshorrors.com/posts/deactivate-mark.html
emacs -Q
, włącz debugowanieM-x debug-on-entry deactivate-mark
, aktywuj znakC-<SPC>
, wpisz postać.deactiveate-mark
korzystając z funkcji porad,backtrace-frames
aby uzyskać widok całego stosu wywołań, jeśli edebug nie pokazuje tego, czego oczekujesz.advice-add
ibacktrace-frame
. To nie pomogło.self-insert-command
i „self-insert-command to interaktywna wbudowana funkcja w„ kodzie źródłowym C ”.” To, wraz z innymi zaobserwowanymi do tej pory zachowaniami, sugeruje, że trzeba będzie debugowaćgdb
.Odpowiedzi:
Od
command_loop_1
wkeyboard.c
.Wydaje się, że jest to jedyne miejsce, w którym
Qdeactivate_mark
jest się nazywanymsrc/*.c
. Domyślam się, że na to właśnie wpadłeś.Uwaga: nie jestem ekspertem od Emacsa C. Rozglądałem się
gdb --args src/emacs -Q
po przeczytaniu Jak skompilować emacsa za pomocą symboli debugowania? .źródło