* carriage-return no longer works quite right in shell-mode
@ 2008-02-05 19:03 Chris Moore
2008-02-11 0:17 ` Richard Stallman
0 siblings, 1 reply; 11+ messages in thread
From: Chris Moore @ 2008-02-05 19:03 UTC (permalink / raw)
To: emacs-pretest-bug
I recently updated Emacs from the CVS trunk and one of the programs I
run inside a shell-mode buffer has stopped formatting its output
correctly.
It uses carriage return characters to re-write the same line over and
over, and leaves the cursor at the beginning of the line. Here's a
simplified example that no longer works in Emacs:
#include <stdio.h>
main() {
int i;
for (i = 0; i < 10; i++) {
printf(" count: %d\r", i);
fflush(stdout);
sleep(1);
}
printf("\n");
}
Instead of re-writing the same part of the buffer over and over, I see:
count: 0 count: 1 count: 2
in the buffer - the carriage return isn't returning the carriage like
it used to.
I notice that apt-get does still work - that leaves the cursor at the
end of the line, which I guess is the important difference.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
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
0 siblings, 1 reply; 11+ messages in thread
From: Richard Stallman @ 2008-02-11 0:17 UTC (permalink / raw)
To: emacs-pretest-bug, handa; +Cc: Chris Moore
Would someone please investigate this, DTRT, then ack? I'd guess it
was broken by unicode-2 merge.
Message-ID: <a9691ee20802051103s575665bh105b77b6f6088443@mail.gmail.com>
Date: Tue, 5 Feb 2008 20:03:58 +0100
From: "Chris Moore" <christopher.ian.moore@gmail.com>
To: emacs-pretest-bug@gnu.org
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Disposition: inline
Cc:
Subject: carriage-return no longer works quite right in shell-mode
I recently updated Emacs from the CVS trunk and one of the programs I
run inside a shell-mode buffer has stopped formatting its output
correctly.
It uses carriage return characters to re-write the same line over and
over, and leaves the cursor at the beginning of the line. Here's a
simplified example that no longer works in Emacs:
#include <stdio.h>
main() {
int i;
for (i = 0; i < 10; i++) {
printf(" count: %d\r", i);
fflush(stdout);
sleep(1);
}
printf("\n");
}
Instead of re-writing the same part of the buffer over and over, I see:
count: 0 count: 1 count: 2
in the buffer - the carriage return isn't returning the carriage like
it used to.
I notice that apt-get does still work - that leaves the cursor at the
end of the line, which I guess is the important difference.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
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
0 siblings, 2 replies; 11+ messages in thread
From: Stefan Monnier @ 2008-02-11 2:55 UTC (permalink / raw)
To: rms; +Cc: emacs-pretest-bug, Chris Moore, handa
> I recently updated Emacs from the CVS trunk and one of the programs
> I run inside a shell-mode buffer has stopped formatting its
> output correctly.
How old was your previous Emacs?
> It uses carriage return characters to re-write the same line over and
> over, and leaves the cursor at the beginning of the line. Here's a
> simplified example that no longer works in Emacs:
> #include <stdio.h>
> main() {
> int i;
> for (i = 0; i < 10; i++) {
> printf(" count: %d\r", i);
> fflush(stdout);
> sleep(1);
> }
> printf("\n");
> }
> Instead of re-writing the same part of the buffer over and over, I see:
> count: 0 count: 1 count: 2
> in the buffer - the carriage return isn't returning the carriage like
> it used to.
Hmm... I see that indeed.
> I notice that apt-get does still work - that leaves the cursor at the
> end of the line, which I guess is the important difference.
Yes. Funnily enough, in Emacs-22 the two behave identically because
when your program sends "count: N\r", Emacs passes the "count: N" to the
`shell' package, but keeps the \r for later because it needs to first
see if the following char is a \n or not in order to know whether to
drop the \r or not. I.e. the details of decoding DOS-style EOLs caused
Emacs to turn one form into the other.
So it indeed, looks like a problem introduced by the unicode merge: for
some reason, the unicode code just sends the \r eagerly before it can
tell whether the next char is a \n.
I'll keep it in my todo list, but it may take me a little while to get
back to it, so if someone wants to do it before, he's welcome,
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
2008-02-11 2:55 ` Stefan Monnier
@ 2008-02-12 12:24 ` Chris Moore
2008-02-29 8:39 ` Romain Francoise
1 sibling, 0 replies; 11+ messages in thread
From: Chris Moore @ 2008-02-12 12:24 UTC (permalink / raw)
To: Stefan Monnier; +Cc: emacs-pretest-bug, rms, handa
On Feb 11, 2008 3:55 AM, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> > I recently updated Emacs from the CVS trunk and one of the programs
> > I run inside a shell-mode buffer has stopped formatting its
> > output correctly.
>
> How old was your previous Emacs?
I update from the CVS trunk about once per week, so it was around a week old.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
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
1 sibling, 1 reply; 11+ messages in thread
From: Romain Francoise @ 2008-02-29 8:39 UTC (permalink / raw)
To: handa; +Cc: emacs-pretest-bug, Chris Moore, rms, Stefan Monnier
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> So it indeed, looks like a problem introduced by the unicode merge: for
> some reason, the unicode code just sends the \r eagerly before it can
> tell whether the next char is a \n.
> I'll keep it in my todo list, but it may take me a little while to get
> back to it, so if someone wants to do it before, he's welcome,
This bug is very annoying...
Handa-san, perhaps you have an idea about what broke this, and where
someone could start investigating?
Thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
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:42 ` Kenichi Handa
0 siblings, 2 replies; 11+ messages in thread
From: Kenichi Handa @ 2008-02-29 11:31 UTC (permalink / raw)
To: Romain Francoise; +Cc: emacs-pretest-bug, christopher.ian.moore, rms, monnier
In article <87wsoow3zx.fsf@elegiac.orebokech.com>, Romain Francoise <romain@orebokech.com> writes:
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
> > So it indeed, looks like a problem introduced by the unicode merge: for
> > some reason, the unicode code just sends the \r eagerly before it can
> > tell whether the next char is a \n.
> > I'll keep it in my todo list, but it may take me a little while to get
> > back to it, so if someone wants to do it before, he's welcome,
> This bug is very annoying...
> Handa-san, perhaps you have an idea about what broke this, and where
> someone could start investigating?
Sorry for not responding on this thread.
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?
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.
---
Kenichi Handa
handa@ni.aist.go.jp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
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
1 sibling, 1 reply; 11+ messages in thread
From: Romain Francoise @ 2008-02-29 15:21 UTC (permalink / raw)
To: Kenichi Handa; +Cc: emacs-pretest-bug, christopher.ian.moore, rms, monnier
Kenichi Handa <handa@m17n.org> writes:
> Could someone figure out why default-process-coding-system
> specifies eol-format now?
Could it be a side effect of this change? (The ChangeLog entry is
from the trunk, the change itself is from the Unicode branch.)
2008-02-01 Kenichi Handa <handa@m17n.org>
* coding.c (coding_inherit_eol_type): If PARENT is nil, inherit from
system_eol_type.
(syms_of_coding): Initialize system_eol_type.
* process.c (Fset_process_coding_system): Inherit system's eol
format if necessary.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
2008-02-29 11:31 ` Kenichi Handa
2008-02-29 15:21 ` Romain Francoise
@ 2008-03-04 11:42 ` Kenichi Handa
2008-03-04 15:46 ` Stefan Monnier
1 sibling, 1 reply; 11+ messages in thread
From: Kenichi Handa @ 2008-03-04 11:42 UTC (permalink / raw)
To: Kenichi Handa
Cc: christopher.ian.moore, emacs-pretest-bug, romain, rms, monnier
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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
2008-02-29 15:21 ` Romain Francoise
@ 2008-03-04 11:44 ` Kenichi Handa
0 siblings, 0 replies; 11+ messages in thread
From: Kenichi Handa @ 2008-03-04 11:44 UTC (permalink / raw)
To: Romain Francoise; +Cc: emacs-pretest-bug, christopher.ian.moore, rms, monnier
In article <87hcfrwzyw.fsf@elegiac.orebokech.com>, Romain Francoise <romain@orebokech.com> writes:
> Kenichi Handa <handa@m17n.org> writes:
> > Could someone figure out why default-process-coding-system
> > specifies eol-format now?
> Could it be a side effect of this change? (The ChangeLog entry is
> from the trunk, the change itself is from the Unicode branch.)
> 2008-02-01 Kenichi Handa <handa@m17n.org>
> * coding.c (coding_inherit_eol_type): If PARENT is nil, inherit from
> system_eol_type.
> (syms_of_coding): Initialize system_eol_type.
> * process.c (Fset_process_coding_system): Inherit system's eol
> format if necessary.
But, Fset_process_coding_system makes only the coding system
for ENCODING inheirt the system EOL type.
---
Kenichi Handa
handa@ni.aist.go.jp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
2008-03-04 11:42 ` Kenichi Handa
@ 2008-03-04 15:46 ` Stefan Monnier
2008-03-05 2:00 ` Kenichi Handa
0 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier @ 2008-03-04 15:46 UTC (permalink / raw)
To: Kenichi Handa; +Cc: christopher.ian.moore, emacs-pretest-bug, romain, rms
> 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?
Thanks for looking into it.
I think you may as well commit it.
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: carriage-return no longer works quite right in shell-mode
2008-03-04 15:46 ` Stefan Monnier
@ 2008-03-05 2:00 ` Kenichi Handa
0 siblings, 0 replies; 11+ messages in thread
From: Kenichi Handa @ 2008-03-05 2:00 UTC (permalink / raw)
To: Stefan Monnier; +Cc: christopher.ian.moore, emacs-pretest-bug, romain, rms
In article <jwvve42biia.fsf-monnier+emacs@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca> writes:
> > 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?
> Thanks for looking into it.
> I think you may as well commit it.
Ok, done.
---
Kenichi Handa
handa@ni.aist.go.jp
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-03-05 2:00 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2008-03-04 15:46 ` Stefan Monnier
2008-03-05 2:00 ` Kenichi Handa
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).