Câu trả lời:
Điều này được thực hiện thông qua một bộ lọc quy trình.
Theo mặc định comint-output-filter-functions
bao gồm comint-watch-for-password-prompt
, đó là chức năng lọc xử lý việc này.
Nếu nó thấy văn bản khớp comint-password-prompt-regexp
thì nó gọi send-invisible
để nhắc người dùng nhập mật khẩu.
Để biết thêm thông tin về cách hoạt động của các bộ lọc quy trình, hãy tham khảo C-hig (elisp)Filter Functions
Chỉnh sửa: Để theo dõi, cũng lưu ý rằng bạn có thể M-x toggle-debug-on-quit
và sau đó tại loại dấu nhắc sudo C-gđể có một backtrace sẽ hiển thị những gì đang diễn ra. ví dụ:
Debugger entered--Lisp error: (quit)
read-string("[sudo] password for <username>: " nil t nil)
read-passwd("[sudo] password for <username>: ")
send-invisible("[sudo] password for <username>: ")
comint-watch-for-password-prompt("[sudo] password for <username>: ")
run-hook-with-args(comint-watch-for-password-prompt "[sudo] password for <username>: ")
comint-output-filter(#<process shell> "[sudo] password for <username>: ")
Đầu ra là tối thiểu trên tài khoản của mã biên dịch byte được đánh giá, do đó chi tiết comint-output-filter-functions
bị mất, nhưng bạn vẫn có thể thấy ngay tình huống chung. Bạn cũng có thể M-x load-library
RET comint.el
RETtải mã chưa được biên dịch và sau đó lặp lại toàn bộ quá trình để có được một backtrace chi tiết hơn.