summaryrefslogtreecommitdiff
path: root/lisp/shell.el
diff options
context:
space:
mode:
authorLute Kamstra <lute@gnu.org>2003-06-05 12:02:09 +0000
committerLute Kamstra <lute@gnu.org>2003-06-05 12:02:09 +0000
commit3811bec8ed4390cac6f77aa27f05a15a94fa6495 (patch)
tree1293dee881949e79571f7308624afc521e47651a /lisp/shell.el
parent32be9b22885d6a731340fe18b9db49e0137785b9 (diff)
downloademacs-3811bec8ed4390cac6f77aa27f05a15a94fa6495.tar.gz
(shell-mode): Put `shell-filter-ctrl-a-ctrl-b' on
`comint-output-filter-functions' when bash is used as the inferior shell. (shell-filter-ctrl-a-ctrl-b): New function.
Diffstat (limited to 'lisp/shell.el')
-rw-r--r--lisp/shell.el24
1 files changed, 23 insertions, 1 deletions
diff --git a/lisp/shell.el b/lisp/shell.el
index 77ad7f2808c..154c4ff46eb 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -454,9 +454,31 @@ buffer."
(setq shell-dirstack-query
(cond ((string-equal shell "sh") "pwd")
((string-equal shell "ksh") "echo $PWD ~-")
- (t "dirs"))))
+ (t "dirs")))
+ ;; Bypass a bug in certain versions of bash.
+ (when (string-equal shell "bash")
+ (add-hook 'comint-output-filter-functions
+ 'shell-filter-ctrl-a-ctrl-b nil t)))
(comint-read-input-ring t)))
+(defun shell-filter-ctrl-a-ctrl-b (string)
+ "Remove `^A' and `^B' characters from comint output.
+
+Bash uses these characters as internal quoting characters in its
+prompt. Due to a bug in some bash versions (including 2.03,
+2.04, and 2.05b), they may erroneously show up when bash is
+started with the `--noediting' option and Select Graphic
+Rendition (SGR) control sequences (formerly known as ANSI escape
+sequences) are used to color the prompt.
+
+This function can be put on `comint-output-filter-functions'.
+The argument STRING is ignored."
+ (let ((pmark (process-mark (get-buffer-process (current-buffer)))))
+ (save-excursion
+ (goto-char (or comint-last-output-start (point-min)))
+ (while (re-search-forward "[\C-a\C-b]" pmark t)
+ (replace-match "")))))
+
(defun shell-write-history-on-exit (process event)
"Called when the shell process is stopped.