* bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control
@ 2021-04-01 15:40 Jim McKim
2021-04-01 21:51 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] Harald Jörg
0 siblings, 1 reply; 5+ messages in thread
From: Jim McKim @ 2021-04-01 15:40 UTC (permalink / raw)
To: 47549
[-- Attachment #1: Type: text/plain, Size: 5668 bytes --]
--text follows this line--
- Starting from 'emacs -Q'
- Invoke CPerl mode via 'M-X cperl-mode'.
- Edit (or create) a buffer that has more lines than the display window.
- Open another window (same size), via 'C-x 5 2'.
- Position the view in that second window to the end of the buffer, via
'ESC->'.
- In the first window, near the top of the buffer, enter this string,
the start of a pair of escaped [] brackets within a perl regexp range:
my $x = qr/[\[\
- Enter the second escaped ']':
my $x = qr/[\[\]
When it is entered, a diagnostic like
Couldn't find end of charclass in a REx, pos=33584
is displayed in the echo area at the bottom of the edit window and then
the other window displaying that buffer is scrolled (repositioned) back
to the same view as the window being edited, outside the user's control,
abandoning its previous position.
The views, the windows, that are repositioned are those of any latter
part of the buffer.
Peculiarly, identical edits in latter portions of the buffer do not
cause a similar repositioning of top-of-buffer views although they do
generate the diagnostic.
This is just one example of how the repositioning happens. In general,
any edit that results in a message being displayed in the echo area
causes the view to be repositioned.
In the cperl source (git cperl-master), it looks like these
diagnostics are generated via elisp's (message) function. Is this
repositioning a side effect of that function?
The repositioning causes problems when it's important to maintain
multiple views of different parts of a large file. It's like shaking
all the bookmarks out of a reference book, then trying to find the
bookmarked places again.
In GNU Emacs 26.3 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.14)
of 2020-03-26, modified by Debian built on lcy01-amd64-020
Windowing system distributor 'The X.Org Foundation', version 11.0.12009000
System Description: Ubuntu 20.04.2 LTS
Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Configured using:
'configure --build x86_64-linux-gnu --prefix=/usr
--sharedstatedir=/var/lib --libexecdir=/usr/lib
--localstatedir=/var/lib --infodir=/usr/share/info
--mandir=/usr/share/man --enable-libsystemd --with-pop=yes
--enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.3/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.3/site-lisp:/usr/share/emacs/site-lisp
--with-sound=alsa --without-gconf --with-mailutils --build
x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
--libexecdir=/usr/lib --localstatedir=/var/lib
--infodir=/usr/share/info --mandir=/usr/share/man --enable-libsystemd
--with-pop=yes
--enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.3/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.3/site-lisp:/usr/share/emacs/site-lisp
--with-sound=alsa --without-gconf --with-mailutils --with-x=yes
--with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
-fdebug-prefix-map=/build/emacs-mEZBk7/emacs-26.3+1=.
-fstack-protector-strong
-Wformat -Werror=format-security -Wall' 'CPPFLAGS=-Wdate-time
-D_FORTIFY_SOURCE=2' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro''
Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS GLIB
NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM THREADS LIBSYSTEMD LCMS2
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
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
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
Load-path shadows:
None found.
Features:
(shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv
bytecomp byte-compile cconv cl-loaddefs cl-lib dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils elec-pair time-date
mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar
dnd fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode elisp-mode lisp-mode prog-mode register page menu-bar
rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core term/tty-colors frame cl-generic 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 charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)
Memory information:
((conses 16 94874 11705)
(symbols 48 20386 1)
(miscs 40 44 143)
(strings 32 28402 800)
(string-bytes 1 746365)
(vectors 16 13898)
(vector-slots 8 500864 9876)
(floats 8 49 231)
(intervals 56 262 0)
(buffers 992 11))
[-- Attachment #2: Type: text/html, Size: 6379 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH]
2021-04-01 15:40 bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control Jim McKim
@ 2021-04-01 21:51 ` Harald Jörg
2021-04-01 22:54 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] fixed! Harald Jörg
0 siblings, 1 reply; 5+ messages in thread
From: Harald Jörg @ 2021-04-01 21:51 UTC (permalink / raw)
To: Jim McKim; +Cc: 47549
[-- Attachment #1: Type: text/plain, Size: 3142 bytes --]
Jim McKim writes:
> - Starting from 'emacs -Q'
>
> - Invoke CPerl mode via 'M-X cperl-mode'.
>
> - Edit (or create) a buffer that has more lines than the display window.
>
> - Open another window (same size), via 'C-x 5 2'.
>
> - Position the view in that second window to the end of the buffer, via
> 'ESC->'.
>
> - In the first window, near the top of the buffer, enter this string,
> the start of a pair of escaped [] brackets within a perl regexp range:
>
> my $x = qr/[\[\
>
> - Enter the second escaped ']':
>
> my $x = qr/[\[\]
>
> When it is entered, a diagnostic like
>
> Couldn't find end of charclass in a REx, pos=33584
The "pos" in that message should be the character position of the
beginning of the charclass - 33584 seems to be not near the top of the
buffer? But I guess this isn't relevant - see below.
> is displayed in the echo area at the bottom of the edit window and then
> the other window displaying that buffer is scrolled (repositioned) back
> to the same view as the window being edited, outside the user's control,
> abandoning its previous position.
>
> The views, the windows, that are repositioned are those of any latter
> part of the buffer.
>
> Peculiarly, identical edits in latter portions of the buffer do not
> cause a similar repositioning of top-of-buffer views although they do
> generate the diagnostic.
>
> This is just one example of how the repositioning happens. In general,
> any edit that results in a message being displayed in the echo area
> causes the view to be repositioned.
>
> In the cperl source (git cperl-master), it looks like these
> diagnostics are generated via elisp's (message) function. Is this
> repositioning a side effect of that function?
A similar report occured on Perlmonks recently (coincidence?), and ever
since then I've been trying to reproduce it. I seem to have collected
some relevant components now, but still fail to construct a situation
where an _inactive_ frame is scrolled:
- The qr// construct is apparently unclosed. I'm writing "apparently"
because somewhere in the following source code there will be a slash
which cperl-mode takes for closing the qr construct. There are good
chances that this occurs outside of the visible portion of the
screen.
- cperl-mode writes some diagnostics while its point is at the
(presumed) end of the qr// construct. It appears that Emacs tries to
make that point visible when the message is printed - it scrolls
forward, changing (window-start) so that the (presumed) end of the
qr// construct is centered.
- After the parsing process is done, cperl-mode jumps back to the
original point - but the original value of (window-start) is lost,
Emacs now centers the window at the original position. This makes
the active frame "jump" which should not happen.
The patch avoids this situation by postponing any output from
`cperl-find-pods-heres' until the code has restored the original window
position. This works for me in interactive tests.
Unfortunately, I failed to come up with an automated test for that
situation: Batch tests have no window.
--
Cheers,
haj
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: cperl-mode: Don't reposition frames --]
[-- Type: text/x-diff, Size: 4583 bytes --]
From 7f2651308f43281621af8c481c74d5b0481a302f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Harald=20J=C3=B6rg?= <haj@posteo.de>
Date: Thu, 1 Apr 2021 22:30:56 +0200
Subject: [PATCH] ; cperl-mode: Don't reposition the window when writing
messages
* lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): Avoid
printing messages while point is off-screen (Bug#47549)
---
lisp/progmodes/cperl-mode.el | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 7612f8d284..176ea166f8 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -3608,7 +3608,8 @@ cperl-find-pods-heres
;; 1+6+2+1+1+6+1+1+1=20 extra () before this:
"\\|"
"\\\\\\(['`\"($]\\)") ; BACKWACKED something-hairy
- ""))))
+ "")))
+ warning-message)
(unwind-protect
(progn
(save-excursion
@@ -3671,7 +3672,7 @@ cperl-find-pods-heres
(looking-at "\\(cut\\|end\\)\\>"))
(if (or (nth 3 state) (nth 4 state) ignore-max)
nil ; Doing a chunk only
- (message "=cut is not preceded by a POD section")
+ (setq warning-message "=cut is not preceded by a POD section")
(or (car err-l) (setcar err-l (point))))
(beginning-of-line)
@@ -3686,7 +3687,7 @@ cperl-find-pods-heres
(goto-char b)
(if (re-search-forward "\n=\\(cut\\|end\\)\\>" stop-point 'toend)
(progn
- (message "=cut is not preceded by an empty line")
+ (setq warning-message "=cut is not preceded by an empty line")
(setq b1 t)
(or (car err-l) (setcar err-l b))))))
(beginning-of-line 2) ; An empty line after =cut is not POD!
@@ -3829,7 +3830,8 @@ cperl-find-pods-heres
(progn ; Pretend we matched at the end
(goto-char (point-max))
(re-search-forward "\\'")
- (message "End of here-document `%s' not found." tag)
+ (setq warning-message
+ (format "End of here-document `%s' not found." tag))
(or (car err-l) (setcar err-l b))))
(if cperl-pod-here-fontify
(progn
@@ -3906,7 +3908,8 @@ cperl-find-pods-heres
'face font-lock-string-face)
(cperl-commentify (point) (+ (point) 2) nil)
(cperl-put-do-not-fontify (point) (+ (point) 2) t))
- (message "End of format `%s' not found." name)
+ (setq warning-message
+ (format "End of format `%s' not found." name))
(or (car err-l) (setcar err-l b)))
(forward-line)
(if (> (point) max)
@@ -4426,8 +4429,9 @@ cperl-find-pods-heres
REx-subgr-end argument) ; continue
(setq argument nil)))
(and argument
- (message "Couldn't find end of charclass in a REx, pos=%s"
- REx-subgr-start))
+ (setq warning-message
+ (format "Couldn't find end of charclass in a REx, pos=%s"
+ REx-subgr-start)))
(setq argument (1- (point)))
(goto-char REx-subgr-end)
(cperl-highlight-charclass
@@ -4483,7 +4487,8 @@ cperl-find-pods-heres
(setq qtag "Can't find })")))
(progn
(goto-char (1- e))
- (message "%s" qtag))
+ (setq warning-message
+ (format "%s" qtag)))
(cperl-postpone-fontification
(1- tag) (1- (point))
'face font-lock-variable-name-face)
@@ -4512,7 +4517,7 @@ cperl-find-pods-heres
;; (1- e) 'toend)
(search-forward ")" (1- e) 'toend)
;;)
- (message
+ (setq warning-message
"Couldn't find end of (?#...)-comment in a REx, pos=%s"
REx-subgr-start))))
(if (>= (point) e)
@@ -4592,8 +4597,8 @@ cperl-find-pods-heres
(if (> (point) stop-point)
(progn
(if end
- (message "Garbage after __END__/__DATA__ ignored")
- (message "Unbalanced syntax found while scanning")
+ (setq warning-message "Garbage after __END__/__DATA__ ignored")
+ (setq warning-message "Unbalanced syntax found while scanning")
(or (car err-l) (setcar err-l b)))
(goto-char stop-point))))
(setq cperl-syntax-state (cons state-point state)
@@ -4612,7 +4617,8 @@ cperl-find-pods-heres
;; cperl-mode-syntax-table.
;; (set-syntax-table cperl-mode-syntax-table)
)
- (list (car err-l) overshoot)))
+ (list (car err-l) overshoot)
+ (when warning-message (message warning-message))))
(defun cperl-find-pods-heres-region (min max)
(interactive "r")
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] fixed!
2021-04-01 21:51 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] Harald Jörg
@ 2021-04-01 22:54 ` Harald Jörg
2021-04-01 22:58 ` Harald Jörg
0 siblings, 1 reply; 5+ messages in thread
From: Harald Jörg @ 2021-04-01 22:54 UTC (permalink / raw)
To: Jim McKim; +Cc: 47549
haj@posteo.de (Harald Jörg) writes:
> The patch avoids this situation by postponing any output from
> `cperl-find-pods-heres' until the code has restored the original window
> position. This works for me in interactive tests.
Sorry - the previous message contained a bad patch. Please use the
attached patch instead!
--
Cheers,
haj
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] fixed!
2021-04-01 22:54 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] fixed! Harald Jörg
@ 2021-04-01 22:58 ` Harald Jörg
2021-04-04 20:19 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control Lars Ingebrigtsen
0 siblings, 1 reply; 5+ messages in thread
From: Harald Jörg @ 2021-04-01 22:58 UTC (permalink / raw)
To: Jim McKim; +Cc: 47549
[-- Attachment #1: Type: text/plain, Size: 475 bytes --]
haj@posteo.de (Harald Jörg) writes:
> haj@posteo.de (Harald Jörg) writes:
>
>> The patch avoids this situation by postponing any output from
>> `cperl-find-pods-heres' until the code has restored the original window
>> position. This works for me in interactive tests.
>
> Sorry - the previous message contained a bad patch. Please use the
> attached patch instead!
Oh my. It's too late. This time I forgot to actually attach the patch.
--
Sorry,
haj
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: cperl-mode: Don't reposition windows --]
[-- Type: text/x-diff, Size: 4680 bytes --]
From 42b13aa9bfba74c7a4c6e9285f768615772fda8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Harald=20J=C3=B6rg?= <haj@posteo.de>
Date: Fri, 2 Apr 2021 00:46:38 +0200
Subject: [PATCH] ; cperl-mode: Don't reposition the window when writing
messages
* lisp/progmodes/cperl-mode.el (cperl-find-pods-heres): Avoid
printing messages while point is off-screen (Bug#47549)
---
lisp/progmodes/cperl-mode.el | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 7612f8d284..7878e91096 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -3608,7 +3608,8 @@ cperl-find-pods-heres
;; 1+6+2+1+1+6+1+1+1=20 extra () before this:
"\\|"
"\\\\\\(['`\"($]\\)") ; BACKWACKED something-hairy
- ""))))
+ "")))
+ warning-message)
(unwind-protect
(progn
(save-excursion
@@ -3671,7 +3672,7 @@ cperl-find-pods-heres
(looking-at "\\(cut\\|end\\)\\>"))
(if (or (nth 3 state) (nth 4 state) ignore-max)
nil ; Doing a chunk only
- (message "=cut is not preceded by a POD section")
+ (setq warning-message "=cut is not preceded by a POD section")
(or (car err-l) (setcar err-l (point))))
(beginning-of-line)
@@ -3686,7 +3687,7 @@ cperl-find-pods-heres
(goto-char b)
(if (re-search-forward "\n=\\(cut\\|end\\)\\>" stop-point 'toend)
(progn
- (message "=cut is not preceded by an empty line")
+ (setq warning-message "=cut is not preceded by an empty line")
(setq b1 t)
(or (car err-l) (setcar err-l b))))))
(beginning-of-line 2) ; An empty line after =cut is not POD!
@@ -3829,7 +3830,8 @@ cperl-find-pods-heres
(progn ; Pretend we matched at the end
(goto-char (point-max))
(re-search-forward "\\'")
- (message "End of here-document `%s' not found." tag)
+ (setq warning-message
+ (format "End of here-document `%s' not found." tag))
(or (car err-l) (setcar err-l b))))
(if cperl-pod-here-fontify
(progn
@@ -3906,7 +3908,8 @@ cperl-find-pods-heres
'face font-lock-string-face)
(cperl-commentify (point) (+ (point) 2) nil)
(cperl-put-do-not-fontify (point) (+ (point) 2) t))
- (message "End of format `%s' not found." name)
+ (setq warning-message
+ (format "End of format `%s' not found." name))
(or (car err-l) (setcar err-l b)))
(forward-line)
(if (> (point) max)
@@ -4426,8 +4429,9 @@ cperl-find-pods-heres
REx-subgr-end argument) ; continue
(setq argument nil)))
(and argument
- (message "Couldn't find end of charclass in a REx, pos=%s"
- REx-subgr-start))
+ (setq warning-message
+ (format "Couldn't find end of charclass in a REx, pos=%s"
+ REx-subgr-start)))
(setq argument (1- (point)))
(goto-char REx-subgr-end)
(cperl-highlight-charclass
@@ -4483,7 +4487,8 @@ cperl-find-pods-heres
(setq qtag "Can't find })")))
(progn
(goto-char (1- e))
- (message "%s" qtag))
+ (setq warning-message
+ (format "%s" qtag)))
(cperl-postpone-fontification
(1- tag) (1- (point))
'face font-lock-variable-name-face)
@@ -4512,9 +4517,9 @@ cperl-find-pods-heres
;; (1- e) 'toend)
(search-forward ")" (1- e) 'toend)
;;)
- (message
- "Couldn't find end of (?#...)-comment in a REx, pos=%s"
- REx-subgr-start))))
+ (setq warning-message
+ (format "Couldn't find end of (?#...)-comment in a REx, pos=%s"
+ REx-subgr-start)))))
(if (>= (point) e)
(goto-char (1- e)))
(cond
@@ -4592,8 +4597,8 @@ cperl-find-pods-heres
(if (> (point) stop-point)
(progn
(if end
- (message "Garbage after __END__/__DATA__ ignored")
- (message "Unbalanced syntax found while scanning")
+ (setq warning-message "Garbage after __END__/__DATA__ ignored")
+ (setq warning-message "Unbalanced syntax found while scanning")
(or (car err-l) (setcar err-l b)))
(goto-char stop-point))))
(setq cperl-syntax-state (cons state-point state)
@@ -4612,6 +4617,7 @@ cperl-find-pods-heres
;; cperl-mode-syntax-table.
;; (set-syntax-table cperl-mode-syntax-table)
)
+ (when warning-message (message warning-message))
(list (car err-l) overshoot)))
(defun cperl-find-pods-heres-region (min max)
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control
2021-04-01 22:58 ` Harald Jörg
@ 2021-04-04 20:19 ` Lars Ingebrigtsen
0 siblings, 0 replies; 5+ messages in thread
From: Lars Ingebrigtsen @ 2021-04-04 20:19 UTC (permalink / raw)
To: Harald Jörg; +Cc: Jim McKim, 47549
haj@posteo.de (Harald Jörg) writes:
> Oh my. It's too late. This time I forgot to actually attach the patch.
:-)
Looks good to me; applied to Emacs 28.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-04-04 20:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-01 15:40 bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control Jim McKim
2021-04-01 21:51 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] Harald Jörg
2021-04-01 22:54 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control [PATCH] fixed! Harald Jörg
2021-04-01 22:58 ` Harald Jörg
2021-04-04 20:19 ` bug#47549: 26.3; cperl-mode: buffer view is being re-positioned outside user control Lars Ingebrigtsen
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).