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