Як Emacs `shell-mode` знає, щоб запросити судо?


17

У shell-modeкоманді на зразок sudo CMDвідкривається підказка в області ехо, що говорить:

[sudo] password for root: 

Звідки це знати, щоб це зробити? AFAIK, така поведінка не може вийти з простого запуску, sudoяк зазвичай, тому що readвбудований не створює такого підказу.

Відповіді:


22

Це робиться за допомогою технологічного фільтра.

За замовчуванням 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можете завантажити некомпільований код, а потім повторити весь процес, щоб отримати більш детальний зворотній шлях.


Чудова порада налагодження!
клемера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.