Saya telah menemukan masalah bahwa wilayah dinonaktifkan (dalam mode tanda-transien). Fungsi deactivate-mark
dipanggil dan saya ingin mencari tahu dari mana (dan mengapa) itu dipanggil.
Saya mencoba M-x debug-on-entry RET deactivate-mark
dan berhenti tetapi saya tidak menemukan cara untuk mengetahui penelepon. Seluruh stacktrace yang ditampilkan adalah:
Debugger entered--entering a function:
* deactivate-mark()
Saya mencoba M-x edebug-eval-defun
tetapi Edebug tidak menunjukkan penelepon juga.
Bagaimana saya mengetahui mengapa (dari mana) deactivate-mark
disebut? Saya mencari fungsi backtrace atau stacktrace.
EDIT:
Sebuah advice-add
trik:
(defun message-show-backtrace ()
(message "%s" (backtrace-frame 10)))
(advice-add deactivate-mark :before #'message-show-backtrace)
menghasilkan nil
dalam *Messages*
.
Edit: info lebih lanjut tentang deactivate-mark
: http://emacshorrors.com/posts/deactivate-mark.html
emacs -Q
, nyalakan debugM-x debug-on-entry deactivate-mark
, aktifkan tandaC-<SPC>
, ketikkan karakter.deactiveate-mark
dan dalam fungsi saran Anda gunakanbacktrace-frames
untuk mendapatkan tampilan dari seluruh tumpukan panggilan jika edebug tidak menunjukkan apa yang Anda harapkan.advice-add
danbacktrace-frame
. Itu tidak membantu.self-insert-command
dan "self-insert-command adalah fungsi built-in interaktif dalam 'kode sumber C'." Ini, bersama dengan perilaku lain yang dicatat sejauh ini, menunjukkan bahwa seseorang harus melakukan debuggdb
.Jawaban:
Dari
command_loop_1
dalamkeyboard.c
.Itu tampaknya menjadi satu-satunya tempat di mana
Qdeactivate_mark
disebut semuasrc/*.c
. Jadi tebakan saya adalah apa yang Anda temui.Catatan, saya bukan ahli Emacs C. Saya menjulurkan sekitar dengan
gdb --args src/emacs -Q
setelah membaca Bagaimana mengkompilasi emacs dengan simbol-simbol debug? .sumber