Это делается через фильтр процесса.
По умолчанию comint-output-filter-functions
включает comint-watch-for-password-prompt
, что является функцией фильтра, которая обрабатывает это.
Если он видит совпадение текста, comint-password-prompt-regexp
он звонит, send-invisible
чтобы запросить у пользователя пароль.
Для получения дополнительной информации о том, как работают фильтры процессов, обратитесь к C-hig (elisp)Filter Functions
Редактировать: В качестве продолжения, обратите внимание также, что вы можете, M-x toggle-debug-on-quit
а затем введите приглашение sudo, C-gчтобы получить обратный след, который будет показывать, что происходит. например:
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>: ")
Вывод минимален из-за оцениваемого байтово-скомпилированного кода, поэтому детали comint-output-filter-functions
теряются, но вы все равно можете сразу увидеть общую ситуацию. Вы также M-x load-library
RET comint.el
RETможете загрузить не скомпилированный код, а затем повторить весь процесс, чтобы получить более детальную обратную трассировку.