unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
@ 2022-07-21 18:49 Andrey Listopadov
  2022-07-21 19:45 ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Andrey Listopadov @ 2022-07-21 18:49 UTC (permalink / raw)
  To: 56683

I'm using emacs with `truncate-lines` set to `t` in my init.el.  After
the merge of #56393 I've rebuilt Emacs, and started testing the fix.
I've noticed, that when lines are truncated, opening dictionary.json
from the #45898 and pressing C-e doesn't move you to the end of the
line, but stops somewhere inside it.  E.g. with the default window width
of Emacs -Q, I can see the following portion of the line

←, "hu": ["index"]}, "examples": [["en C la indicoj aperas inter ortajkrampoj, →

Arrows shown in the fringe indicate that there are more to the line on
the right side.

As a side question, does these optimizations work with truncated lines?
As far as I can tell Emacs is not as responsive as when the lines are
wrapped, but I don't know how to measure this precisely.

In GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.30, cairo version 1.17.4)
 of 2022-07-21 built on toolbox
Repository revision: 4a4fcf628e1e4c8db47cd62fa5617b662fa8b5d6
Repository branch: master
System Description: Fedora Linux 36 (Workstation Edition)

Configured using:
 'configure --without-compress-install --with-native-compilation
 --with-pgtk --with-mailutils --prefix=/home/alist/.local'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS XIM
GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(comp comp-cstr warnings rx cl-seq cl-macs gv cl-extra bytecomp
byte-compile cconv help-mode pp shadow sort mail-extr emacsbug message
mailcap yank-media puny dired dired-loaddefs rfc822 mml mml-sec
password-cache epa derived epg rfc6068 epg-config gnus-util
text-property-search time-date subr-x mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs cl-lib
sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils rmc
iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win term/common-win
pgtk-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list
replace newcomment text-mode lisp-mode prog-mode register page tab-bar
menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse
jit-lock font-lock syntax font-core term/tty-colors frame minibuffer
nadvice seq simple cl-generic indonesian philippine cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop
case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads dbusbind
inotify dynamic-setting system-font-setting font-render-setting cairo
gtk pgtk lcms2 multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 82646 9587)
 (symbols 48 7091 6)
 (strings 32 19214 1773)
 (string-bytes 1 656752)
 (vectors 16 15347)
 (vector-slots 8 284088 17444)
 (floats 8 173 66)
 (intervals 56 698 7)
 (buffers 992 13))

--
Andrey Listopadov





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 18:49 bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated Andrey Listopadov
@ 2022-07-21 19:45 ` Gregory Heytings
  2022-07-21 19:57   ` Eli Zaretskii
                     ` (2 more replies)
  0 siblings, 3 replies; 35+ messages in thread
From: Gregory Heytings @ 2022-07-21 19:45 UTC (permalink / raw)
  To: Andrey Listopadov; +Cc: 56683

[-- Attachment #1: Type: text/plain, Size: 1115 bytes --]


>
> I'm using emacs with `truncate-lines` set to `t` in my init.el.  After 
> the merge of #56393 I've rebuilt Emacs, and started testing the fix. 
> I've noticed, that when lines are truncated, opening dictionary.json 
> from the #45898 and pressing C-e doesn't move you to the end of the 
> line, but stops somewhere inside it.  E.g. with the default window width 
> of Emacs -Q, I can see the following portion of the line
>
> ←, "hu": ["index"]}, "examples": [["en C la indicoj aperas interortajkrampoj, →
>
> Arrows shown in the fringe indicate that there are more to the line on 
> the right side.
>

You would have seen the same bug before the merge, so it's entirely 
unrelated to the merge.  It is present at least in Emacs 24, 25, 26, 27 
and 28.

>
> As a side question, does these optimizations work with truncated lines? 
> As far as I can tell Emacs is not as responsive as when the lines are 
> wrapped, but I don't know how to measure this precisely.
>

They do work with truncated lines, but I suspect that truncated lines 
require specific fixes to work efficiently.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 19:45 ` Gregory Heytings
@ 2022-07-21 19:57   ` Eli Zaretskii
  2022-07-21 20:15     ` Gregory Heytings
  2022-07-21 20:31   ` Andrey Listopadov
  2022-07-22  6:30   ` Eli Zaretskii
  2 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-21 19:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: andreyorst, 56683

> Cc: 56683@debbugs.gnu.org
> Date: Thu, 21 Jul 2022 19:45:19 +0000
> From: Gregory Heytings <gregory@heytings.org>
> 
> > I'm using emacs with `truncate-lines` set to `t` in my init.el.  After 
> > the merge of #56393 I've rebuilt Emacs, and started testing the fix. 
> > I've noticed, that when lines are truncated, opening dictionary.json 
> > from the #45898 and pressing C-e doesn't move you to the end of the 
> > line, but stops somewhere inside it.  E.g. with the default window width 
> > of Emacs -Q, I can see the following portion of the line
> >
> > ←, "hu": ["index"]}, "examples": [["en C la indicoj aperas interortajkrampoj, →
> >
> > Arrows shown in the fringe indicate that there are more to the line on 
> > the right side.
> >
> 
> You would have seen the same bug before the merge, so it's entirely 
> unrelated to the merge.  It is present at least in Emacs 24, 25, 26, 27 
> and 28.

Is this related to the below (from xdisp.c)?

  #define DISP_INFINITY 10000000

Maybe we should make "infinity" somewhat larger?  dictionary.json has
a single line that is 18922365 characters long, so it's "more than
infinity".





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 19:57   ` Eli Zaretskii
@ 2022-07-21 20:15     ` Gregory Heytings
  2022-07-22  6:13       ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-21 20:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683

[-- Attachment #1: Type: text/plain, Size: 626 bytes --]


>
> Is this related to the below (from xdisp.c)?
>
> #define DISP_INFINITY 10000000
>
> Maybe we should make "infinity" somewhat larger?  dictionary.json has a 
> single line that is 18922365 characters long, so it's "more than 
> infinity".
>

It is indeed, setting DISP_INFINITY to 1000000000 "fixes" that bug. 
But... how infinite is infinite?  (A near-philosophical question 😉) 
With a somewhat larger file (that one is only 20 MB) we'd have to increase 
it again.  If that's a hard-coded limit, I guess it's a sign that we 
should advise against using toggle-truncate-lines in buffer with long 
lines.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 19:45 ` Gregory Heytings
  2022-07-21 19:57   ` Eli Zaretskii
@ 2022-07-21 20:31   ` Andrey Listopadov
  2022-07-21 20:52     ` Gregory Heytings
  2022-07-22  6:30   ` Eli Zaretskii
  2 siblings, 1 reply; 35+ messages in thread
From: Andrey Listopadov @ 2022-07-21 20:31 UTC (permalink / raw)
  To: 56683


Gregory Heytings <gregory@heytings.org> writes:

> You would have seen the same bug before the merge, so it's entirely
> unrelated to the merge.  It is present at least in Emacs 24, 25, 26,
> 27 and 28.

Oh, well.  Then it seems that I've simply never noticed this before,
perhaps because Emacs couldn't handle such long lines.  Feel free to
close this then, if this is intended/known.

> They do work with truncated lines, but I suspect that truncated lines
> require specific fixes to work efficiently.

Thanks!  I've asked because It's important to me that Emacs is
responsive if I open a log file with really long lines. Truncated lines
make such logs much easier to read, as I can compare lines above and
below the very long one, without scrolling.

--
Andrey Listopadov





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 20:31   ` Andrey Listopadov
@ 2022-07-21 20:52     ` Gregory Heytings
  2022-07-22  5:03       ` Andrey Listopadov
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-21 20:52 UTC (permalink / raw)
  To: Andrey Listopadov; +Cc: 56683


Thanks for your comments.

>> They do work with truncated lines, but I suspect that truncated lines 
>> require specific fixes to work efficiently.
>
> Thanks!  I've asked because It's important to me that Emacs is 
> responsive if I open a log file with really long lines. Truncated lines 
> make such logs much easier to read, as I can compare lines above and 
> below the very long one, without scrolling.
>

How long is a "really long line" in a log file?  Do you think 1000 or 
10000 characters is a reasonable upper limit for your use case?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 20:52     ` Gregory Heytings
@ 2022-07-22  5:03       ` Andrey Listopadov
  2022-07-22  6:34         ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Andrey Listopadov @ 2022-07-22  5:03 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56683


> How long is a "really long line" in a log file?  Do you think 1000 or
> 10000 characters is a reasonable upper limit for your use case?

It depends, occasionally there are lines with JSONs maybe one third of
the size of the mentioned dictionary.json.  But these are rare cases,
most of the time the longest lines are about 3000 characters wide, I
guess I have to measure it next time.  So probably a smaller amount than
10000 to enable optimizations is welcome.

One particularly interesting situation is when there are logs which span
such long lines on every line, e.g.:

   1 log-line-with-1800-chars→
   2 log-line-with-3000-chars→
   3 log-line-with-2000-chars→
   4 log-line-with-1500-chars→
     ...
1830 log-line-with-1500-chars

In this case, if I wasn't using truncation I would see only the first
line of the log, wrapped around and taking all screen space, but since
lines are truncated, I have ~70 very long lines displayed on screen.

I've taken dictionary.json, and used C-u 70 M-x duplicate-line, and it
does seem to perform well (or at least Emacs doesn't hang completely),
but there are some occasional slowdowns (Probably because of
show-paren-mode).

--
Andrey Listopadov





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 20:15     ` Gregory Heytings
@ 2022-07-22  6:13       ` Eli Zaretskii
  2022-07-22  6:51         ` Gerd Möllmann
  2022-07-22  6:53         ` Gerd Möllmann
  0 siblings, 2 replies; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22  6:13 UTC (permalink / raw)
  To: Gregory Heytings, Gerd Möllmann; +Cc: andreyorst, 56683

> Date: Thu, 21 Jul 2022 20:15:55 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: andreyorst@gmail.com, 56683@debbugs.gnu.org
> 
> > Is this related to the below (from xdisp.c)?
> >
> > #define DISP_INFINITY 10000000
> >
> > Maybe we should make "infinity" somewhat larger?  dictionary.json has a 
> > single line that is 18922365 characters long, so it's "more than 
> > infinity".
> 
> It is indeed, setting DISP_INFINITY to 1000000000 "fixes" that bug. 
> But... how infinite is infinite?  (A near-philosophical question 😉) 
> With a somewhat larger file (that one is only 20 MB) we'd have to increase 
> it again.  If that's a hard-coded limit, I guess it's a sign that we 
> should advise against using toggle-truncate-lines in buffer with long 
> lines.

We could enlarge the value to INT_MAX, or even make the X-coordinate
members of the iterator structure have the type ptrdiff_t and then
DISP_INFINITY could be PTRDIFF_MAX (which would be undesirable in
general for performance reasons).  But that would not solve the
problem completely, because the value is in pixels.  So with the
largest possible line length, which is EMACS_INT_MAX characters long,
we'd need at least 7 or 8 times that for the X-coordinate values, and
we don't have that even in 64-bit builds.

If we want to advise against truncate-lines in such buffers, perhaps
toggle-truncate-lines should ask for confirmation in such cases, and
the documentation should mention the limitation.

Gerd, any ideas or comments?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-21 19:45 ` Gregory Heytings
  2022-07-21 19:57   ` Eli Zaretskii
  2022-07-21 20:31   ` Andrey Listopadov
@ 2022-07-22  6:30   ` Eli Zaretskii
  2022-07-22  7:28     ` Gerd Möllmann
  2 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22  6:30 UTC (permalink / raw)
  To: Gregory Heytings, Gerd Möllmann; +Cc: andreyorst, 56683

> Cc: 56683@debbugs.gnu.org
> Date: Thu, 21 Jul 2022 19:45:19 +0000
> From: Gregory Heytings <gregory@heytings.org>
> 
> > As a side question, does these optimizations work with truncated lines? 
> > As far as I can tell Emacs is not as responsive as when the lines are 
> > wrapped, but I don't know how to measure this precisely.
> 
> They do work with truncated lines, but I suspect that truncated lines 
> require specific fixes to work efficiently.

I think we should take look at this fragment from hscroll_window_tree:

	      /* Move iterator to pt starting at cursor_row->start in
		 a line with infinite width.  */
	      init_to_row_start (&it, w, cursor_row);
	      if (hscl)
		it.first_visible_x = window_hscroll_limited (w, it.f)
				     * FRAME_COLUMN_WIDTH (it.f);
	      it.last_visible_x = DISP_INFINITY;
	      move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);
	      /* If the line ends in an overlay string with a newline,
		 we might infloop, because displaying the window will
		 want to put the cursor after the overlay, i.e. at X
		 coordinate of zero on the next screen line.  So we
		 use the buffer position prior to the overlay string
		 instead.  */
	      if (it.method == GET_FROM_STRING && pt > 1)
		{
		  init_to_row_start (&it, w, cursor_row);
		  if (hscl)
		    it.first_visible_x = (window_hscroll_limited (w, it.f)
					  * FRAME_COLUMN_WIDTH (it.f));
		  move_it_in_display_line_to (&it, pt - 1, -1, MOVE_TO_POS);
		}

Specifically, init_to_row_start can potentially start from a very far
away buffer position, especially in buffers with a single long line,
and AFAICT the subroutines called by init_to_row_start aren't
restricted to the "narrowing" for long lines, so they go to BOB in
this case.  The problem here is that this code handles automatic
hscrolling, so any changes to it need to be careful not to destroy the
use case of moving point horizontally to a position that is beyond the
right or left window edge (which is what auto-hscroll is for).

Alternatively, maybe automatic hscrolling should be disabled in such
buffers (or we should advise that), and then we should have convenient
commands to hscroll manually so as to bring point into the view.
(Maybe we even have such commands already, I don't know.)





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  5:03       ` Andrey Listopadov
@ 2022-07-22  6:34         ` Gregory Heytings
  0 siblings, 0 replies; 35+ messages in thread
From: Gregory Heytings @ 2022-07-22  6:34 UTC (permalink / raw)
  To: Andrey Listopadov; +Cc: 56683

[-- Attachment #1: Type: text/plain, Size: 1688 bytes --]


Thanks again for your comments.

>
> It depends, occasionally there are lines with JSONs maybe one third of 
> the size of the mentioned dictionary.json.  But these are rare cases, 
> most of the time the longest lines are about 3000 characters wide, I 
> guess I have to measure it next time.  So probably a smaller amount than 
> 10000 to enable optimizations is welcome.
>

FTR, in buffers with lines that are "only" 3000 characters wide, long line 
optimizations are not turned on by default (see long-line-threshold, which 
is set to 10000 by default), such buffers should behave "well enough" 
without them.

>
> One particularly interesting situation is when there are logs which span 
> such long lines on every line, e.g.:
>
>   1 log-line-with-1800-chars→
>   2 log-line-with-3000-chars→
>   3 log-line-with-2000-chars→
>   4 log-line-with-1500-chars→
>     ...
> 1830 log-line-with-1500-chars
>
> In this case, if I wasn't using truncation I would see only the first 
> line of the log, wrapped around and taking all screen space, but since 
> lines are truncated, I have ~70 very long lines displayed on screen.
>

I understand.  It's an interesting use case.

>
> I've taken dictionary.json, and used C-u 70 M-x duplicate-line, and it 
> does seem to perform well (or at least Emacs doesn't hang completely), 
> but there are some occasional slowdowns (Probably because of 
> show-paren-mode).
>

At the moment I think it would be better to advise against using truncated 
lines for such pathological files.  As Eli just said, it would probably be 
rather complex to remove the hard-coded limit in the Emacs display engine.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  6:13       ` Eli Zaretskii
@ 2022-07-22  6:51         ` Gerd Möllmann
  2022-07-22  7:28           ` Eli Zaretskii
  2022-07-22  6:53         ` Gerd Möllmann
  1 sibling, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22  6:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, Gregory Heytings

Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Thu, 21 Jul 2022 20:15:55 +0000
>> From: Gregory Heytings <gregory@heytings.org>
>> cc: andreyorst@gmail.com, 56683@debbugs.gnu.org
>> 
>> > Is this related to the below (from xdisp.c)?
>> >
>> > #define DISP_INFINITY 10000000
>> >
>> > Maybe we should make "infinity" somewhat larger?  dictionary.json has a 
>> > single line that is 18922365 characters long, so it's "more than 
>> > infinity".
>> 
>> It is indeed, setting DISP_INFINITY to 1000000000 "fixes" that bug. 
>> But... how infinite is infinite?  (A near-philosophical question 😉)

Don't think too much about it, it didn't do good to Georg Cantor.  BTW,
Omega would be a really cool name for that INFINITY; the smallest
position beyond all finite x.

>> With a somewhat larger file (that one is only 20 MB) we'd have to increase 
>> it again.  If that's a hard-coded limit, I guess it's a sign that we 
>> should advise against using toggle-truncate-lines in buffer with long 
>> lines.
>
> We could enlarge the value to INT_MAX, or even make the X-coordinate
> members of the iterator structure have the type ptrdiff_t and then
> DISP_INFINITY could be PTRDIFF_MAX (which would be undesirable in
> general for performance reasons).  But that would not solve the
> problem completely, because the value is in pixels.  So with the
> largest possible line length, which is EMACS_INT_MAX characters long,
> we'd need at least 7 or 8 times that for the X-coordinate values, and
> we don't have that even in 64-bit builds.
>
> If we want to advise against truncate-lines in such buffers, perhaps
> toggle-truncate-lines should ask for confirmation in such cases, and
> the documentation should mention the limitation.
>
> Gerd, any ideas or comments?

I had to look around a bit, because I didn't remember that constant.  It
seems to have been introduced for horizontal scroll bars, I think.

If we really want infinity, how about setting last_visible_x to -1 in
that case.  But that requires checking/changing some places where
the iterator pisition is tested against last_visible_x.

I think that's okay.  WDYT?

Your "ticks" check kicks in should be burn to much time because of the
infinite last x, right?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  6:13       ` Eli Zaretskii
  2022-07-22  6:51         ` Gerd Möllmann
@ 2022-07-22  6:53         ` Gerd Möllmann
  2022-07-22  7:31           ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22  6:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, Gregory Heytings

Eli Zaretskii <eliz@gnu.org> writes:

> Gerd, any ideas or comments?

Forgot one thing:  There seem to be a place in dispextern.h where
last_visible_x is set to the number 1000000.  That's odd.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  6:30   ` Eli Zaretskii
@ 2022-07-22  7:28     ` Gerd Möllmann
  0 siblings, 0 replies; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22  7:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, Gregory Heytings

Eli Zaretskii <eliz@gnu.org> writes:

> I think we should take look at this fragment from hscroll_window_tree:
>
> 	      /* Move iterator to pt starting at cursor_row->start in
> 		 a line with infinite width.  */
> 	      init_to_row_start (&it, w, cursor_row);
> 	      if (hscl)
> 		it.first_visible_x = window_hscroll_limited (w, it.f)
> 				     * FRAME_COLUMN_WIDTH (it.f);
> 	      it.last_visible_x = DISP_INFINITY;
> 	      move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);
> 	      /* If the line ends in an overlay string with a newline,
> 		 we might infloop, because displaying the window will
> 		 want to put the cursor after the overlay, i.e. at X
> 		 coordinate of zero on the next screen line.  So we
> 		 use the buffer position prior to the overlay string
> 		 instead.  */
> 	      if (it.method == GET_FROM_STRING && pt > 1)
> 		{
> 		  init_to_row_start (&it, w, cursor_row);
> 		  if (hscl)
> 		    it.first_visible_x = (window_hscroll_limited (w, it.f)
> 					  * FRAME_COLUMN_WIDTH (it.f));
> 		  move_it_in_display_line_to (&it, pt - 1, -1, MOVE_TO_POS);
> 		}
>
> Specifically, init_to_row_start can potentially start from a very far
> away buffer position, especially in buffers with a single long line,

I'm not sure. Cursor_row comes from here:

	  if (w->cursor.vpos < bottom_row - w->desired_matrix->rows)
	    cursor_row = MATRIX_ROW (w->desired_matrix, w->cursor.vpos);
	  else
	    cursor_row = bottom_row - 1;

	  if (!cursor_row->enabled_p)
	    {
	      bottom_row = MATRIX_BOTTOM_TEXT_ROW (w->current_matrix, w);
	      if (w->cursor.vpos < bottom_row - w->current_matrix->rows)
		cursor_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos);
	      else
		cursor_row = bottom_row - 1;
	    }

In my own words, either cursor_row has just been produced in the
desired_matrix, or it has been produced previously, and is now part of
the current matrix.

Doesn't that mean it was already subject to the iterator narrowing?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  6:51         ` Gerd Möllmann
@ 2022-07-22  7:28           ` Eli Zaretskii
  2022-07-22  7:52             ` Gerd Möllmann
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22  7:28 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: Gregory Heytings <gregory@heytings.org>,  andreyorst@gmail.com,
>   56683@debbugs.gnu.org
> Date: Fri, 22 Jul 2022 08:51:56 +0200
> 
> If we really want infinity, how about setting last_visible_x to -1 in
> that case.  But that requires checking/changing some places where
> the iterator pisition is tested against last_visible_x.

I don't really see how this could help in general, because the
current_x member (what you call the "iterator position") will still
overflow at some point, and we can no longer do any layout decisions
for the X coordinate after that.

Or what am I missing?

> Your "ticks" check kicks in should be burn to much time because of the
> infinite last x, right?

Sorry, I don't think I understand what you are asking here.  Please
elaborate or rephrase.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  6:53         ` Gerd Möllmann
@ 2022-07-22  7:31           ` Eli Zaretskii
  2022-07-22  7:53             ` Gerd Möllmann
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22  7:31 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: Gregory Heytings <gregory@heytings.org>,  andreyorst@gmail.com,
>   56683@debbugs.gnu.org
> Date: Fri, 22 Jul 2022 08:53:33 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Gerd, any ideas or comments?
> 
> Forgot one thing:  There seem to be a place in dispextern.h where
> last_visible_x is set to the number 1000000.  That's odd.

That's a different kind of "infinity" ;-)





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  7:28           ` Eli Zaretskii
@ 2022-07-22  7:52             ` Gerd Möllmann
  2022-07-22 11:54               ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22  7:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, gregory

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Gerd Möllmann <gerd.moellmann@gmail.com>
>> If we really want infinity, how about setting last_visible_x to -1 in
>> that case.  But that requires checking/changing some places where
>> the iterator pisition is tested against last_visible_x.
>
> I don't really see how this could help in general, because the
> current_x member (what you call the "iterator position") will still
> overflow at some point, and we can no longer do any layout decisions
> for the X coordinate after that.
>
> Or what am I missing?

You were asking for a good value of DISP_OMEGA, that's at least what I
understood.  My answer is -1, plus code changes.

That current_x can overflow is something completely different, IMO.  But
now I'm cautious enough to ask what do you mean?  Overflowing which
bound?  I read this as integer overflow, integer = the data type.

>
>> Your "ticks" check kicks in should be burn to much time because of the
>> infinite last x, right?
>
> Sorry, I don't think I understand what you are asking here.  Please
> elaborate or rephrase.

The thing you implemented in set_iterator_to_next we talked about.

  if (max_redisplay_ticks > 0)
    update_redisplay_ticks (1, it->w);

I don't remember the offical name ATM.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  7:31           ` Eli Zaretskii
@ 2022-07-22  7:53             ` Gerd Möllmann
  2022-07-22 11:01               ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22  7:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, gregory

Eli Zaretskii <eliz@gnu.org> writes:

>> Forgot one thing:  There seem to be a place in dispextern.h where
>> last_visible_x is set to the number 1000000.  That's odd.
>
> That's a different kind of "infinity" ;-)

Aleph1 :-O.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  7:53             ` Gerd Möllmann
@ 2022-07-22 11:01               ` Eli Zaretskii
  0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22 11:01 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: andreyorst@gmail.com,  56683@debbugs.gnu.org,  gregory@heytings.org
> Date: Fri, 22 Jul 2022 09:53:33 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Forgot one thing:  There seem to be a place in dispextern.h where
> >> last_visible_x is set to the number 1000000.  That's odd.
> >
> > That's a different kind of "infinity" ;-)
> 
> Aleph1 :-O.

Well, what I meant was that it's used for other purposes than
DISP_INFINITY.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22  7:52             ` Gerd Möllmann
@ 2022-07-22 11:54               ` Eli Zaretskii
  2022-07-22 12:56                 ` Gerd Möllmann
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22 11:54 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: andreyorst@gmail.com,  56683@debbugs.gnu.org,  gregory@heytings.org
> Date: Fri, 22 Jul 2022 09:52:16 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> >> If we really want infinity, how about setting last_visible_x to -1 in
> >> that case.  But that requires checking/changing some places where
> >> the iterator pisition is tested against last_visible_x.
> >
> > I don't really see how this could help in general, because the
> > current_x member (what you call the "iterator position") will still
> > overflow at some point, and we can no longer do any layout decisions
> > for the X coordinate after that.
> >
> > Or what am I missing?
> 
> You were asking for a good value of DISP_OMEGA, that's at least what I
> understood.  My answer is -1, plus code changes.
> 
> That current_x can overflow is something completely different, IMO.  But
> now I'm cautious enough to ask what do you mean?  Overflowing which
> bound?  I read this as integer overflow, integer = the data type.

Yes, integer overflow.  This code:

	      init_to_row_start (&it, w, cursor_row);
	      if (hscl)
		it.first_visible_x = window_hscroll_limited (w, it.f)
				     * FRAME_COLUMN_WIDTH (it.f);
	      it.last_visible_x = DISP_INFINITY;
	      move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);

will keep producing glyphs inside move_it_in_display_line_to until
it gets to the position of point.  While producing glyphs,
it.current_x is incremented by the pixel-width of each produced
glyph.  After a large enough number of produced glyphs, it.current_x
will overflow INT_MAX.

> >> Your "ticks" check kicks in should be burn to much time because of the
> >> infinite last x, right?
> >
> > Sorry, I don't think I understand what you are asking here.  Please
> > elaborate or rephrase.
> 
> The thing you implemented in set_iterator_to_next we talked about.
> 
>   if (max_redisplay_ticks > 0)
>     update_redisplay_ticks (1, it->w);

I understood that part, but not the "should be burn to much time
because of the infinite last x" part, even if I replace "to" with
"too".





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22 11:54               ` Eli Zaretskii
@ 2022-07-22 12:56                 ` Gerd Möllmann
  2022-07-22 13:36                   ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22 12:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, gregory

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Gerd Möllmann <gerd.moellmann@gmail.com>
>
> Yes, integer overflow.  This code:
>
> 	      init_to_row_start (&it, w, cursor_row);
> 	      if (hscl)
> 		it.first_visible_x = window_hscroll_limited (w, it.f)
> 				     * FRAME_COLUMN_WIDTH (it.f);
> 	      it.last_visible_x = DISP_INFINITY;
> 	      move_it_in_display_line_to (&it, pt, -1, MOVE_TO_POS);
>
> will keep producing glyphs inside move_it_in_display_line_to until
> it gets to the position of point.  While producing glyphs,
> it.current_x is incremented by the pixel-width of each produced
> glyph.  After a large enough number of produced glyphs, it.current_x
> will overflow INT_MAX.

Right.  I am not worried about that:

It takes a lot of iterations until the ints overflow.  The largest
positive 32-bit integer is very roughly 2 * 10^9.  With a font width of
of 10 pixels, that would mean 2 * 10^8 characters (200 Mb), and so on
with wider fonts.

Se that being said, what I orignally wanted to ask, was:

>> The thing you implemented in set_iterator_to_next we talked about.
>> 
>>   if (max_redisplay_ticks > 0)
>>     update_redisplay_ticks (1, it->w);
>
> I understood that part, but not the "should be burn to much time
> because of the infinite last x" part, even if I replace "to" with
> "too".

Sorry for the typo: s/be/we, i.e. "if we burn...".  What I meant to ask
is if the check above doesn't lead to a signal anyway long before we
reach the overflow.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22 12:56                 ` Gerd Möllmann
@ 2022-07-22 13:36                   ` Eli Zaretskii
  2022-07-22 13:54                     ` Gerd Möllmann
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22 13:36 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: andreyorst@gmail.com,  56683@debbugs.gnu.org,  gregory@heytings.org
> Date: Fri, 22 Jul 2022 14:56:22 +0200
> 
> > will keep producing glyphs inside move_it_in_display_line_to until
> > it gets to the position of point.  While producing glyphs,
> > it.current_x is incremented by the pixel-width of each produced
> > glyph.  After a large enough number of produced glyphs, it.current_x
> > will overflow INT_MAX.
> 
> Right.  I am not worried about that:
> 
> It takes a lot of iterations until the ints overflow.  The largest
> positive 32-bit integer is very roughly 2 * 10^9.  With a font width of
> of 10 pixels, that would mean 2 * 10^8 characters (200 Mb), and so on
> with wider fonts.

We already have an example of a 19-MB file which is a single line.  It
is within an order of magnitude of the limit you described.  JSON
files in particular are known to be like that: long and without
newlines.

So I think the danger is real.

> >>   if (max_redisplay_ticks > 0)
> >>     update_redisplay_ticks (1, it->w);
> >
> > I understood that part, but not the "should be burn to much time
> > because of the infinite last x" part, even if I replace "to" with
> > "too".
> 
> Sorry for the typo: s/be/we, i.e. "if we burn...".  What I meant to ask
> is if the check above doesn't lead to a signal anyway long before we
> reach the overflow.

That feature is disabled by default.  If enabled, then yes, it will
most probably fire before that.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22 13:36                   ` Eli Zaretskii
@ 2022-07-22 13:54                     ` Gerd Möllmann
  2022-07-22 14:35                       ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gerd Möllmann @ 2022-07-22 13:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andreyorst, 56683, gregory

Eli Zaretskii <eliz@gnu.org> writes:

> That feature is disabled by default.  If enabled, then yes, it will
> most probably fire before that.

Could we enabled it automatically when we switch on iterator narrowing?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22 13:54                     ` Gerd Möllmann
@ 2022-07-22 14:35                       ` Eli Zaretskii
  2022-07-25 22:22                         ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-22 14:35 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: andreyorst, 56683, gregory

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: andreyorst@gmail.com,  56683@debbugs.gnu.org,  gregory@heytings.org
> Date: Fri, 22 Jul 2022 15:54:07 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > That feature is disabled by default.  If enabled, then yes, it will
> > most probably fire before that.
> 
> Could we enabled it automatically when we switch on iterator narrowing?

Technically, sure.  I'm not yet convinced we should, though, because
it isn't clear to me what problems, if any, will be left after the
narrowing idea is used as fully as practical.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-22 14:35                       ` Eli Zaretskii
@ 2022-07-25 22:22                         ` Gregory Heytings
  2022-07-26  7:12                           ` Andrey Listopadov
  2022-07-26 11:42                           ` Eli Zaretskii
  0 siblings, 2 replies; 35+ messages in thread
From: Gregory Heytings @ 2022-07-25 22:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, andreyorst, 56683


By the way, we should also decide what to do when the user enables 
truncate-lines in a buffer with "really too long" lines.  With 
DISP_INFINITY == 10000000 (its current value), and with a character pixel 
width of 20 (a not uncommon value nowadays with HiDPI screens), lines 
longer than 500000 (single-width) characters will not be displayed 
correctly.  With a larger character pixel width, or with characters 
occupying more than one column, that would be even less.

Given:

1. that there has not been a single bug report about the fact that 
truncate-line does not work correctly with "really too long" lines in the 
last 20 years,

2. that the limit above, caused by DISP_INFINITY, is not much more than 
10000, the default value for long-line-threshold, and

3. the remaining slowdowns caused by truncate-lines,

I'd be in favor of simply disabling truncate-lines when 
long_line_optimizations_p is set.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-25 22:22                         ` Gregory Heytings
@ 2022-07-26  7:12                           ` Andrey Listopadov
  2022-07-26  7:32                             ` Gregory Heytings
  2022-07-26 11:42                           ` Eli Zaretskii
  1 sibling, 1 reply; 35+ messages in thread
From: Andrey Listopadov @ 2022-07-26  7:12 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: Gerd Möllmann, 56683

> there has not been a single bug report about the fact that truncate-line does not work correctly with "really too long" lines in the last 20 years,

I imagine there's not that big of a percent of Emacs users who open files
with a really long lines (given the issues with these), and for all of those
there's an even smaller percent of those who use truncate-lines (and
even smaller percent of those who would submit a report, perhaps).

Overall, I'd like not to lose the ability to view long lines in such logs with truncated lines enabled, because as I've said earlier, it allows me to partially compare line to above and below ones, without scrolling. And I rarely even scroll to the right that much in such logs, as there's just way too much information to be viewed in a single horizontal line.

If, however nothing will prevent me from enabling truncating even if optimizations are in place, I'm OK with disabling truncating by default.






^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26  7:12                           ` Andrey Listopadov
@ 2022-07-26  7:32                             ` Gregory Heytings
  2022-07-26 12:15                               ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-26  7:32 UTC (permalink / raw)
  To: Andrey Listopadov; +Cc: Gerd Möllmann, 56683, Eli Zaretskii


>
> Overall, I'd like not to lose the ability to view long lines in such 
> logs with truncated lines enabled, because as I've said earlier, it 
> allows me to partially compare line to above and below ones, without 
> scrolling. And I rarely even scroll to the right that much in such logs, 
> as there's just way too much information to be viewed in a single 
> horizontal line.
>

As far as I understand, for your use case disabling truncate-lines when 
the buffer contains long lines would not change anything: you said that in 
your case the long lines are never longer than 10000 characters, which is 
the (default) limit of long-line-threshold.  Should you ever encounter a 
slightly longer line, you could always adapt long-line-threshold 
accordingly.  The point is that there's no way to make truncate-lines work 
with arbitrarily long lines, say a 1 GB long line.

(A side note: if you rarely scroll to the right that much, you can also 
truncate the lines with an external tool like "cut", either before you 
open the file in Emacs, or inside Emacs with C-x h M-| cut -c-1000 RET.)





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-25 22:22                         ` Gregory Heytings
  2022-07-26  7:12                           ` Andrey Listopadov
@ 2022-07-26 11:42                           ` Eli Zaretskii
  2022-07-26 12:17                             ` Gregory Heytings
  1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-26 11:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, andreyorst, 56683

> Date: Mon, 25 Jul 2022 22:22:22 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Gerd Möllmann <gerd.moellmann@gmail.com>, 
>     andreyorst@gmail.com, 56683@debbugs.gnu.org
> 
> By the way, we should also decide what to do when the user enables 
> truncate-lines in a buffer with "really too long" lines.  With 
> DISP_INFINITY == 10000000 (its current value), and with a character pixel 
> width of 20 (a not uncommon value nowadays with HiDPI screens), lines 
> longer than 500000 (single-width) characters will not be displayed 
> correctly.  With a larger character pixel width, or with characters 
> occupying more than one column, that would be even less.
> 
> Given:
> 
> 1. that there has not been a single bug report about the fact that 
> truncate-line does not work correctly with "really too long" lines in the 
> last 20 years,

This might be because no one seriously visited such files in Emacs
until now.

> 2. that the limit above, caused by DISP_INFINITY, is not much more than 
> 10000, the default value for long-line-threshold, and
> 
> 3. the remaining slowdowns caused by truncate-lines,
> 
> I'd be in favor of simply disabling truncate-lines when 
> long_line_optimizations_p is set.

Maybe optionally.  Or maybe displaying a message/warning suggesting
that.  I don't like disabling truncate-lines unconditionally in such
buffers, I prefer leaving that to the user.

And I think we should use INT_MAX instead of DISP_INFINITY, for the
purpose of auto-hscroll.  (There are several other uses of that macro,
but I didn't yet look at all of them to see if it would make sense to
increase DISP_INFINITY itself.)





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26  7:32                             ` Gregory Heytings
@ 2022-07-26 12:15                               ` Eli Zaretskii
  0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-26 12:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: andreyorst, gerd.moellmann, 56683

> Date: Tue, 26 Jul 2022 07:32:55 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, 
>     Gerd Möllmann <gerd.moellmann@gmail.com>, 
>     56683@debbugs.gnu.org
> 
> (A side note: if you rarely scroll to the right that much, you can also 
> truncate the lines with an external tool like "cut", either before you 
> open the file in Emacs, or inside Emacs with C-x h M-| cut -c-1000 RET.)

If you never scroll such windows too much to the right, the problems
with "finite infinity" won't show at all, AFAICT, so there's no need
to use 'cut' or its ilk.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 11:42                           ` Eli Zaretskii
@ 2022-07-26 12:17                             ` Gregory Heytings
  2022-07-26 12:37                               ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-26 12:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, andreyorst, 56683


>
> Maybe optionally.  Or maybe displaying a message/warning suggesting 
> that.  I don't like disabling truncate-lines unconditionally in such 
> buffers, I prefer leaving that to the user.
>

The user would still have the choice to disable the automatic disabling by 
setting long-line-threshold to nil.

>
> And I think we should use INT_MAX instead of DISP_INFINITY, for the 
> purpose of auto-hscroll.  (There are several other uses of that macro, 
> but I didn't yet look at all of them to see if it would make sense to 
> increase DISP_INFINITY itself.)
>

But you said earlier that this was undesirable because it would affect 
performance?





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 12:17                             ` Gregory Heytings
@ 2022-07-26 12:37                               ` Eli Zaretskii
  2022-07-26 12:50                                 ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-26 12:37 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, andreyorst, 56683

> Date: Tue, 26 Jul 2022 12:17:33 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, andreyorst@gmail.com, 56683@debbugs.gnu.org
> 
> > Maybe optionally.  Or maybe displaying a message/warning suggesting 
> > that.  I don't like disabling truncate-lines unconditionally in such 
> > buffers, I prefer leaving that to the user.
> 
> The user would still have the choice to disable the automatic disabling by 
> setting long-line-threshold to nil.

Yes, I understand.  I still don't like it very much.  But if many
users will complain, we might change that before Emacs 29 is released.

> > And I think we should use INT_MAX instead of DISP_INFINITY, for the 
> > purpose of auto-hscroll.  (There are several other uses of that macro, 
> > but I didn't yet look at all of them to see if it would make sense to 
> > increase DISP_INFINITY itself.)
> 
> But you said earlier that this was undesirable because it would affect 
> performance?

No, I said making the type of the struct member current_x a ptrdiff_t
or intmax_t will affect performance.  The above doesn't propose any
such changes, it just enlarges the "infinity" value.  With that value,
lines up to (/ (expt 2 31) 20) => 107374182 (i.e. about 107 million
characters) per line will still display correctly with truncate-lines
when hscrolling is required.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 12:37                               ` Eli Zaretskii
@ 2022-07-26 12:50                                 ` Gregory Heytings
  2022-07-26 13:15                                   ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-26 12:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, andreyorst, 56683


>>> Maybe optionally.  Or maybe displaying a message/warning suggesting 
>>> that.  I don't like disabling truncate-lines unconditionally in such 
>>> buffers, I prefer leaving that to the user.
>>
>> The user would still have the choice to disable the automatic disabling 
>> by setting long-line-threshold to nil.
>
> Yes, I understand.  I still don't like it very much.  But if many users 
> will complain, we might change that before Emacs 29 is released.
>

Do I understand correctly that it's okay to do that on the feature (and 
later master) branch, and that it will be perhaps be revisited later?

>
> No, I said making the type of the struct member current_x a ptrdiff_t or 
> intmax_t will affect performance.  The above doesn't propose any such 
> changes, it just enlarges the "infinity" value.  With that value, lines 
> up to (/ (expt 2 31) 20) => 107374182 (i.e. about 107 million 
> characters) per line will still display correctly with truncate-lines 
> when hscrolling is required.
>

Sorry, I misunderstood what you said.  Now it's much clearer, indeed. 
But still, as you say, that puts a limit at around 100 MB, which isn't 
"that much" nowadays.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 12:50                                 ` Gregory Heytings
@ 2022-07-26 13:15                                   ` Eli Zaretskii
  2022-07-26 13:25                                     ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-26 13:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, andreyorst, 56683

> Date: Tue, 26 Jul 2022 12:50:51 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, andreyorst@gmail.com, 56683@debbugs.gnu.org
> 
> >>> Maybe optionally.  Or maybe displaying a message/warning suggesting 
> >>> that.  I don't like disabling truncate-lines unconditionally in such 
> >>> buffers, I prefer leaving that to the user.
> >>
> >> The user would still have the choice to disable the automatic disabling 
> >> by setting long-line-threshold to nil.
> >
> > Yes, I understand.  I still don't like it very much.  But if many users 
> > will complain, we might change that before Emacs 29 is released.
> 
> Do I understand correctly that it's okay to do that on the feature (and 
> later master) branch, and that it will be perhaps be revisited later?

I'd prefer not to do it just yet, and wait for more user feedback
(once the feature branch is merged, which I guess will be soon).

> > No, I said making the type of the struct member current_x a ptrdiff_t or 
> > intmax_t will affect performance.  The above doesn't propose any such 
> > changes, it just enlarges the "infinity" value.  With that value, lines 
> > up to (/ (expt 2 31) 20) => 107374182 (i.e. about 107 million 
> > characters) per line will still display correctly with truncate-lines 
> > when hscrolling is required.
> 
> Sorry, I misunderstood what you said.  Now it's much clearer, indeed. 
> But still, as you say, that puts a limit at around 100 MB, which isn't 
> "that much" nowadays.

Yes, it's not a solution, just a band-aid.  But it costs almost
nothing, and we get to push the problematic situations farther.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 13:15                                   ` Eli Zaretskii
@ 2022-07-26 13:25                                     ` Gregory Heytings
  2022-07-26 17:26                                       ` Eli Zaretskii
  0 siblings, 1 reply; 35+ messages in thread
From: Gregory Heytings @ 2022-07-26 13:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, andreyorst, 56683


>> Do I understand correctly that it's okay to do that on the feature (and 
>> later master) branch, and that it will be perhaps be revisited later?
>
> I'd prefer not to do it just yet, and wait for more user feedback (once 
> the feature branch is merged, which I guess will be soon).
>

Wouldn't it be easier to get useful user feedback if that automatic 
disabling was present on master?  If it's absent, what kind of user 
feedback can we expect to decide what is better for Emacs 29?

>> But still, as you say, that puts a limit at around 100 MB, which isn't 
>> "that much" nowadays.
>
> Yes, it's not a solution, just a band-aid.  But it costs almost nothing, 
> and we get to push the problematic situations farther.
>

It does indeed, but alas the fact that displaying such buffers is 
noticeably slower with truncate-lines remains.  I could perhaps take a 
look (after finalizing and merging the current branch), but I'm not really 
sure it's worth the price.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 13:25                                     ` Gregory Heytings
@ 2022-07-26 17:26                                       ` Eli Zaretskii
  2022-07-26 20:14                                         ` Gregory Heytings
  0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2022-07-26 17:26 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, andreyorst, 56683

> Date: Tue, 26 Jul 2022 13:25:30 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, andreyorst@gmail.com, 56683@debbugs.gnu.org
> 
> >> Do I understand correctly that it's okay to do that on the feature (and 
> >> later master) branch, and that it will be perhaps be revisited later?
> >
> > I'd prefer not to do it just yet, and wait for more user feedback (once 
> > the feature branch is merged, which I guess will be soon).
> 
> Wouldn't it be easier to get useful user feedback if that automatic 
> disabling was present on master?  If it's absent, what kind of user 
> feedback can we expect to decide what is better for Emacs 29?

My feeling is that we didn't yet exhaust the potential for speedups by
ways other than by turning off features.  So the feedback I'd like to
get is more use cases where the current speedups are still not enough,
so that we could identify additional ones.  Once we get to the point
where either there's no more significant feedback or we see no way of
solving the reported issues by measures like those we took till now,
we will have to consider which features to give up and in what
situations.

The font-lock effect is a good case in point: if we were to decide to
turn it off when there are long lines, we'd have missed the speedup
you just installed.  I think there are more opportunities like that,
or at least there could be.

> It does indeed, but alas the fact that displaying such buffers is 
> noticeably slower with truncate-lines remains.  I could perhaps take a 
> look (after finalizing and merging the current branch), but I'm not really 
> sure it's worth the price.

We already display such buffers faster on the branch than on master,
and, the Isearch issue aside (I will describe what I found in a
minute), there could be more speedup opportunities for that.
truncate-lines is an important feature (we just heard someone
explaining one such use case), so I'd like to make it as performant as
we can before we decide whether it's really necessary to turn it off.





^ permalink raw reply	[flat|nested] 35+ messages in thread

* bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated
  2022-07-26 17:26                                       ` Eli Zaretskii
@ 2022-07-26 20:14                                         ` Gregory Heytings
  0 siblings, 0 replies; 35+ messages in thread
From: Gregory Heytings @ 2022-07-26 20:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, andreyorst, 56683


>
> My feeling is that we didn't yet exhaust the potential for speedups by 
> ways other than by turning off features.
>

My feeling is that we did, if we take the truncate-lines case out of the 
picture.  My feeling is also that adding more optimizations for the 
truncate-lines case is not worth the price.

>
> The font-lock effect is a good case in point: if we were to decide to 
> turn it off when there are long lines, we'd have missed the speedup you 
> just installed.
>

The difference is that I told you that I would look at that problem, and 
that now, after having spent many hours on this, I highly doubt it's 
possible to do better, especially given that no matter what we do to 
improve the truncate-lines case, we'll hit another ceil very soon (the 
DISP_INFINITY one, even if you decide to enlarge it).  It seems to me that 
the most reasonable thing to do is to simply tell users that Emacs has a 
limit in that case (and again, it has one, no matter what we do).

As far as I can see, the only way to really speedup the truncate-lines 
case would be to introduce an entirely new narrowing method, in which the 
buffer would be narrowed in a rectangular way.  That is, instead of 
narrowing a buffer between BEGV and ZV, each line 1, ..., n around point 
would be narrowed between BEGV1..ZV1, ..., BEGVn..ZVn.

>
> truncate-lines is an important feature (we just heard someone explaining 
> one such use case),
>

In that specific use case the lines do not hit the long-line-threshold 
limit.





^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2022-07-26 20:14 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-21 18:49 bug#56683: 29.0.50; long lines fix doesn't work correctly when lines are truncated Andrey Listopadov
2022-07-21 19:45 ` Gregory Heytings
2022-07-21 19:57   ` Eli Zaretskii
2022-07-21 20:15     ` Gregory Heytings
2022-07-22  6:13       ` Eli Zaretskii
2022-07-22  6:51         ` Gerd Möllmann
2022-07-22  7:28           ` Eli Zaretskii
2022-07-22  7:52             ` Gerd Möllmann
2022-07-22 11:54               ` Eli Zaretskii
2022-07-22 12:56                 ` Gerd Möllmann
2022-07-22 13:36                   ` Eli Zaretskii
2022-07-22 13:54                     ` Gerd Möllmann
2022-07-22 14:35                       ` Eli Zaretskii
2022-07-25 22:22                         ` Gregory Heytings
2022-07-26  7:12                           ` Andrey Listopadov
2022-07-26  7:32                             ` Gregory Heytings
2022-07-26 12:15                               ` Eli Zaretskii
2022-07-26 11:42                           ` Eli Zaretskii
2022-07-26 12:17                             ` Gregory Heytings
2022-07-26 12:37                               ` Eli Zaretskii
2022-07-26 12:50                                 ` Gregory Heytings
2022-07-26 13:15                                   ` Eli Zaretskii
2022-07-26 13:25                                     ` Gregory Heytings
2022-07-26 17:26                                       ` Eli Zaretskii
2022-07-26 20:14                                         ` Gregory Heytings
2022-07-22  6:53         ` Gerd Möllmann
2022-07-22  7:31           ` Eli Zaretskii
2022-07-22  7:53             ` Gerd Möllmann
2022-07-22 11:01               ` Eli Zaretskii
2022-07-21 20:31   ` Andrey Listopadov
2022-07-21 20:52     ` Gregory Heytings
2022-07-22  5:03       ` Andrey Listopadov
2022-07-22  6:34         ` Gregory Heytings
2022-07-22  6:30   ` Eli Zaretskii
2022-07-22  7:28     ` Gerd Möllmann

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).