372 |
"Special hook run before input is sent to the process. |
"Special hook run before input is sent to the process. |
373 |
These functions get one argument, a string containing the text to send.") |
These functions get one argument, a string containing the text to send.") |
374 |
|
|
375 |
(defvar comint-output-filter-functions '(comint-postoutput-scroll-to-bottom) |
(defvar comint-output-filter-functions '(comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) |
376 |
"Functions to call after output is inserted into the buffer. |
"Functions to call after output is inserted into the buffer. |
377 |
One possible function is `comint-postoutput-scroll-to-bottom'. |
One possible function is `comint-postoutput-scroll-to-bottom'. |
378 |
These functions get one argument, a string containing the text as originally |
These functions get one argument, a string containing the text as originally |
1901 |
|
|
1902 |
;; These three functions are for entering text you don't want echoed or |
;; These three functions are for entering text you don't want echoed or |
1903 |
;; saved -- typically passwords to ftp, telnet, or somesuch. |
;; saved -- typically passwords to ftp, telnet, or somesuch. |
1904 |
;; Just enter m-x send-invisible and type in your line, or add |
;; Just enter m-x send-invisible and type in your line. |
|
;; `comint-watch-for-password-prompt' to `comint-output-filter-functions'. |
|
|
|
|
|
(defun comint-read-noecho (prompt &optional stars) |
|
|
"Read a single line of text from user without echoing, and return it. |
|
|
Prompt with argument PROMPT, a string. Optional argument STARS causes |
|
|
input to be echoed with '*' characters on the prompt line. Input ends with |
|
|
RET, LFD, or ESC. DEL or C-h rubs out. C-u kills line. C-g aborts (if |
|
|
`inhibit-quit' is set because e.g. this function was called from a process |
|
|
filter and C-g is pressed, this function returns nil rather than a string). |
|
|
|
|
|
Note that the keystrokes comprising the text can still be recovered |
|
|
\(temporarily) with \\[view-lossage]. Some people find this worrisome (see, |
|
|
however, `clear-this-command-keys'). |
|
|
Once the caller uses the password, it can erase the password |
|
|
by doing (clear-string STRING)." |
|
|
(let ((ans "") |
|
|
(newans nil) |
|
|
(c 0) |
|
|
(echo-keystrokes 0) |
|
|
(cursor-in-echo-area t) |
|
|
(message-log-max nil) |
|
|
(done nil)) |
|
|
(while (not done) |
|
|
(if stars |
|
|
(message "%s%s" prompt (make-string (length ans) ?*)) |
|
|
(message "%s" prompt)) |
|
|
;; Use this instead of `read-char' to avoid "Non-character input-event". |
|
|
(setq c (read-char-exclusive)) |
|
|
(cond ((= c ?\C-g) |
|
|
;; This function may get called from a process filter, where |
|
|
;; inhibit-quit is set. In later versions of emacs read-char |
|
|
;; may clear quit-flag itself and return C-g. That would make |
|
|
;; it impossible to quit this loop in a simple way, so |
|
|
;; re-enable it here (for backward-compatibility the check for |
|
|
;; quit-flag below would still be necessary, so this seems |
|
|
;; like the simplest way to do things). |
|
|
(setq quit-flag t |
|
|
done t)) |
|
|
((or (= c ?\r) (= c ?\n) (= c ?\e)) |
|
|
(setq done t)) |
|
|
((= c ?\C-u) |
|
|
(clear-string ans) |
|
|
(setq ans "")) |
|
|
((and (/= c ?\b) (/= c ?\177)) |
|
|
(setq newans (concat ans (char-to-string c))) |
|
|
(clear-string ans) |
|
|
(setq ans newans)) |
|
|
((> (length ans) 0) |
|
|
(aset ans (1- (length ans)) 0) |
|
|
(setq ans (substring ans 0 -1))))) |
|
|
(if quit-flag |
|
|
;; Emulate a true quit, except that we have to return a value. |
|
|
(prog1 |
|
|
(setq quit-flag nil) |
|
|
(message "Quit") |
|
|
(beep t)) |
|
|
(message "") |
|
|
ans))) |
|
1905 |
|
|
1906 |
(defun send-invisible (&optional prompt) |
(defun send-invisible (&optional prompt) |
1907 |
"Read a string without echoing. |
"Read a string without echoing. |
1912 |
(interactive "P") ; Defeat snooping via C-x ESC ESC |
(interactive "P") ; Defeat snooping via C-x ESC ESC |
1913 |
(let ((proc (get-buffer-process (current-buffer)))) |
(let ((proc (get-buffer-process (current-buffer)))) |
1914 |
(if proc |
(if proc |
1915 |
(let ((str (comint-read-noecho (or prompt "Non-echoed text: ") t))) |
(let ((str (read-passwd (or prompt "Non-echoed text: ")))) |
1916 |
(if (stringp str) |
(if (stringp str) |
1917 |
(progn |
(progn |
1918 |
(comint-snapshot-last-prompt) |
(comint-snapshot-last-prompt) |