summaryrefslogtreecommitdiff
path: root/lisp/kermit.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/kermit.el')
-rw-r--r--lisp/kermit.el86
1 files changed, 66 insertions, 20 deletions
diff --git a/lisp/kermit.el b/lisp/kermit.el
index a66165b9671..2c7ef76c59a 100644
--- a/lisp/kermit.el
+++ b/lisp/kermit.el
@@ -66,6 +66,19 @@
;; option to force kermit to be local, to use stdin and stdout for interactive
;; speech, and to forget about cbreak mode.
+;; 2) The "clean-filter" can be a troublesome item. The main problem arises if
+;; you are running a program under shell-mode which is doing periodic output,
+;; and you then try to switch to another buffer. I came across this while
+;; running kermit file transfers - kermit prints a dot each time a packet is
+;; received. Since emacs is interrupted each time a dot is printed, it becomes
+;; impossible to edit the other buffer. If you hit a key while the filter code
+;; is running, that character will wind up in the *shell* buffer instead of the
+;; current one! So you need to be careful to turn the filter off before
+;; leaving the buffer if a program is still running. In fact, you can't even
+;; use "M-x clean-shell-off" to do this, because you won't be able to type
+;; "clean-shell-off" in the minibuffer!! So you need to have this command
+;; bound to a keystroke.
+
;; Please let me know if any bugs turn up.
;; Feb 1988, Jeff Norden - jeff@colgate.csnet
@@ -90,49 +103,82 @@
;; extra bindings for folks suffering form ^S/^Q braindamage:
(define-key shell-mode-map "\C-c\\" 'kermit-esc)
-(defun kermit-send-input-cr ()
- "Like \\[comint-send-input] but end the line with carriage-return."
+(defun shell-send-input-cr ()
+ "Like \\[shell-send-input] but end the line with carriage-return."
(interactive)
- (comint-send-input "\r"))
+ (end-of-line)
+ (if (eobp)
+ (progn
+ (move-marker last-input-start
+ (process-mark (get-buffer-process (current-buffer))))
+ (insert ?\n)
+ (move-marker last-input-end (point)))
+ (beginning-of-line)
+ (re-search-forward shell-prompt-pattern nil t)
+ (let ((copy (buffer-substring (point)
+ (progn (forward-line 1) (point)))))
+ (goto-char (point-max))
+ (move-marker last-input-start (point))
+ (insert copy)
+ (move-marker last-input-end (point))))
+ (condition-case ()
+ (save-excursion
+ (goto-char last-input-start)
+ (shell-set-directory))
+ (error (funcall shell-set-directory-error-hook)))
+ (let ((process (get-buffer-process (current-buffer))))
+ (process-send-region process last-input-start (- last-input-end 1))
+ (process-send-string process "\r")
+ (set-marker (process-mark process) (point))))
;; This is backwards of what makes sense, but ...
-(define-key shell-mode-map "\n" 'kermit-send-input-cr)
+(define-key shell-mode-map "\n" 'shell-send-input-cr)
(defun kermit-default-cr ()
"Make RETURN end the line with carriage-return and LFD end it with a newline.
This is useful for talking to other systems on which carriage-return
is the normal way to end a line."
(interactive)
- (define-key shell-mode-map "\r" 'kermit-send-input-cr)
- (define-key shell-mode-map "\n" 'comint-send-input))
+ (define-key shell-mode-map "\r" 'shell-send-input-cr)
+ (define-key shell-mode-map "\n" 'shell-send-input))
(defun kermit-default-nl ()
"Make RETURN end the line with a newline char. This is the default state.
In this state, use LFD to send a line and end it with a carriage-return."
(interactive)
- (define-key shell-mode-map "\n" 'kermit-send-input-cr)
- (define-key shell-mode-map "\r" 'comint-send-input))
-
-(defun kermit-clean-filter (proc str)
- "Strip ^M and ^@ characters from process output."
- (save-excursion
- (let ((beg (process-mark proc)))
- (set-buffer (process-buffer proc))
- (goto-char beg)
- (insert-before-markers str)
- (while (re-search-backware "[\r\C-a]+" beg t)
- (replace-match "")))))
+ (define-key shell-mode-map "\n" 'shell-send-input-cr)
+ (define-key shell-mode-map "\r" 'shell-send-input))
+
+;; This filter works, but I don't especially recommend it.
+(defun kermit-clean-filter (process string)
+ "A process filter which deletes all ^M's and ^@'s from the output."
+ (set-buffer (process-buffer process))
+ (let
+ ((firstpos (string-match "[^\C-@\r]+" string))
+ (buffermark (process-mark process))
+ (oldpt (point))
+ (newstring '"")
+ goback)
+ (while firstpos
+ (setq newstring
+ (concat newstring (substring string firstpos (match-end 0))))
+ (setq firstpos (string-match "[^\C-@\r]+" string (match-end 0))))
+ (goto-char (marker-position buffermark))
+ (setq goback (< oldpt (point)))
+ (insert newstring)
+ (set-marker buffermark (point))
+ (if goback (goto-char oldpt))))
(defun kermit-clean-on ()
"Delete all null characters and ^M's from the kermit output.
Note that another (perhaps better) way to do this is to use the
-command \"kermit | tr -d '\\015'\"."
+command `kermit | tr -d '\\015''."
(interactive)
(set-process-filter (get-buffer-process (current-buffer))
'kermit-clean-filter))
(defun kermit-clean-off ()
- "Cancel a previous kermit-clean-shell-on command."
+ "Cancel a previous kermit-clean-shell-on command"
(interactive)
(set-process-filter (get-buffer-process (current-buffer)) nil))