From: Kenichi Handa <handa@m17n.org>
To: Kenichi Handa <handa@m17n.org>
Cc: christopher.ian.moore@gmail.com, emacs-pretest-bug@gnu.org,
romain@orebokech.com, rms@gnu.org, monnier@iro.umontreal.ca
Subject: Re: carriage-return no longer works quite right in shell-mode
Date: Tue, 04 Mar 2008 20:42:32 +0900 [thread overview]
Message-ID: <E1JWVXU-0003M3-7j@etlken.m17n.org> (raw)
In-Reply-To: <E1JV3Su-0008Ul-0O@etlken.m17n.org> (message from Kenichi Handa on Fri, 29 Feb 2008 20:31:48 +0900)
In article <E1JV3Su-0008Ul-0O@etlken.m17n.org>, Kenichi Handa <handa@m17n.org> writes:
> I found two problems are related.
> One is that the default-process-coding-system is now set to
> XXX-unix, but previously it doesn't specify eol-format
> (i.e. auto-detect). comint.el changes the eol-format to
> XXX-dos only if eol-format is not specifed.
> The other is in the new code conversion routine as Stefan
> wrote above.
> I'll fix the latter bug in haste. Could someone figure out
> why default-process-coding-system specifies eol-format now?
I installed a fix for that. You can verify that by starting
the shell mode, and explicitly set the process coding system
for decoding to XXX-dos.
> By the way, I think the way of processing CR in comint is
> not good. For instance, with the follwoing program, you
> can't see the tailing "times" in *shell*.
> #include <stdio.h>
> main() {
> int i;
> printf (" times");
> for (i = 0; i < 10; i++) {
> printf("\r%d", i);
> fflush(stdout);
> sleep(1);
> }
> printf("\n");
> }
> I think it should be modified not to rely on the fact that
> the decoding of CR is suspended until the next byte arrives.
I propose the following change to comint.el. Although I
think the new code improve the handling of CR, I have not
yet committed it because comint-output-filter (the caller of
comint-carriage-motion) does complicated marker and overlay
adjustment, and I'm not that confident that the new code
doesn't make the adjustment breaks. Could someone who is
familiar with comint-output-filter check it?
2008-03-04 Kenichi Handa <handa@ni.aist.go.jp>
* comint.el (comint-exec-1): Don't change the coding-system for
decoding to dos-like EOL.
(comint-carriage-motion): Fully rewrite.
Index: comint.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/comint.el,v
retrieving revision 1.373
diff -c -r1.373 comint.el
*** comint.el 22 Jan 2008 23:53:43 -0000 1.373
--- comint.el 4 Mar 2008 11:41:44 -0000
***************
*** 800,811 ****
(let ((coding-systems (process-coding-system proc)))
(setq decoding (car coding-systems)
encoding (cdr coding-systems)))
- ;; If start-file-process decided to use some coding system for decoding
- ;; data sent from the process and the coding system doesn't
- ;; specify EOL conversion, we had better convert CRLF to LF.
- (if (vectorp (coding-system-eol-type decoding))
- (setq decoding (coding-system-change-eol-conversion decoding 'dos)
- changed t))
;; Even if start-file-process left the coding system for encoding data
;; sent from the process undecided, we had better use the same one
;; as what we use for decoding. But, we should suppress EOL
--- 800,805 ----
***************
*** 1674,1706 ****
Make single carriage returns delete to the beginning of the line.
Make backspaces delete the previous character."
(save-excursion
! ;; First do a quick check to see if there are any applicable
! ;; characters, so we can avoid calling save-match-data and
! ;; save-restriction if not.
(goto-char start)
! (when (< (skip-chars-forward "^\b\r" end) (- end start))
! (save-match-data
! (save-restriction
! (widen)
! (let ((inhibit-field-text-motion t)
! (inhibit-read-only t))
! ;; CR LF -> LF
! ;; Note that this won't work properly when the CR and LF
! ;; are in different output chunks, but this is probably an
! ;; exceedingly rare case (because they are generally
! ;; written as a unit), and to delay interpretation of a
! ;; trailing CR in a chunk would result in odd interactive
! ;; behavior (and this case is probably far more common).
! (while (re-search-forward "\r$" end t)
! (delete-char -1))
! ;; bare CR -> delete preceding line
! (goto-char start)
! (while (search-forward "\r" end t)
! (delete-region (point) (line-beginning-position)))
! ;; BS -> delete preceding character
! (goto-char start)
! (while (search-forward "\b" end t)
! (delete-char -2))))))))
;; The purpose of using this filter for comint processes
;; is to keep comint-last-input-end from moving forward
--- 1668,1723 ----
Make single carriage returns delete to the beginning of the line.
Make backspaces delete the previous character."
(save-excursion
! ;; We used to check the existence of \b and \r at first to avoid
! ;; calling save-match-data and save-restriction. But, such a
! ;; check is not necessary now because we don't use regexp search
! ;; nor save-restriction. Note that the buffer is already widen,
! ;; and calling narrow-to-region and widen are not that heavy.
(goto-char start)
! (let* ((inhibit-field-text-motion t)
! (inhibit-read-only t)
! (lbeg (line-beginning-position))
! delete-end ch)
! ;; If the preceding text is marked as "must-overwrite", record
! ;; it in delete-end.
! (when (and (> start (point-min))
! (get-text-property (1- start) 'comint-must-overwrite))
! (setq delete-end (point-marker))
! (remove-text-properties (1- start) start '(comint-must-overwrite nil)))
! (narrow-to-region lbeg end)
! ;; Handle BS, LF, and CR specially.
! (while (and (skip-chars-forward "^\b\n\r") (not (eobp)))
! (setq ch (following-char))
! (cond ((= ch ?\b) ; CH = BS
! (delete-char 1)
! (if (> (point) lbeg)
! (delete-char -1)))
! ((= ch ?\n)
! (when delete-end ; CH = LF
! (if (< delete-end (point))
! (delete-region lbeg delete-end))
! (set-marker delete-end nil)
! (setq delete-end nil))
! (forward-char 1)
! (setq lbeg (point)))
! (t ; CH = CR
! (delete-char 1)
! (if delete-end
! (when (< delete-end (point))
! (delete-region lbeg delete-end)
! (move-marker delete-end (point)))
! (setq delete-end (point-marker))))))
! (when delete-end
! (if (< delete-end (point))
! ;; As there's a text after the last CR, make the current
! ;; line contain only that text.
! (delete-region lbeg delete-end)
! ;; Remember that the process output ends by CR, and thus we
! ;; must overwrite the contents of the current line next
! ;; time.
! (put-text-property lbeg delete-end 'comint-must-overwrite t))
! (set-marker delete-end nil))
! (widen))))
;; The purpose of using this filter for comint processes
;; is to keep comint-last-input-end from moving forward
next prev parent reply other threads:[~2008-03-04 11:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-05 19:03 carriage-return no longer works quite right in shell-mode Chris Moore
2008-02-11 0:17 ` Richard Stallman
2008-02-11 2:55 ` Stefan Monnier
2008-02-12 12:24 ` Chris Moore
2008-02-29 8:39 ` Romain Francoise
2008-02-29 11:31 ` Kenichi Handa
2008-02-29 15:21 ` Romain Francoise
2008-03-04 11:44 ` Kenichi Handa
2008-03-04 11:42 ` Kenichi Handa [this message]
2008-03-04 15:46 ` Stefan Monnier
2008-03-05 2:00 ` Kenichi Handa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1JWVXU-0003M3-7j@etlken.m17n.org \
--to=handa@m17n.org \
--cc=christopher.ian.moore@gmail.com \
--cc=emacs-pretest-bug@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=rms@gnu.org \
--cc=romain@orebokech.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).