unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
@ 2021-10-04 21:05 Matthias Meulien
  2021-10-09  0:26 ` bug#51016: Status: " Matthias Meulien
                   ` (2 more replies)
  0 siblings, 3 replies; 24+ messages in thread
From: Matthias Meulien @ 2021-10-04 21:05 UTC (permalink / raw)
  To: 51016

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


When `diff-font-lock-prettify' is `t', outline headers aren't displayed
at the beginning of a line.

The following screenshot displays a
*vc-diff* buffer with outline minor mode enabled and body hidden with
and without `diff-font-lock-prettify' being `t':


[-- Attachment #2: Capture d’écran du 2021-10-04 22-50-45.png --]
[-- Type: image/png, Size: 110367 bytes --]

[-- Attachment #3: Type: text/plain, Size: 6904 bytes --]


Recipe to reproduce:

1. Set `diff-font-lock-prettify' to `t' and enable `outline-minor-mode'
in `diff-mode'; For example:

(add-hook 'diff-mode-hook
	  (lambda ()
            (setq diff-font-lock-prettify t)
	    (outline-minor-mode)))

2. In a *vc-change-log* buffer for emacs sources, find the commit with
hash a8de88e330. Press = (`log-view').

3. Press C-c @ C-t (`outline-hide-body') while in the *vc-diff*
buffer. Observe that outline headers are splitted in multiple lines.


In GNU Emacs 28.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0)
 of 2021-09-13 built on carbon
Repository revision: 8c80430824d52e5dfae97db2669b419621817956
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
System Description: Debian GNU/Linux 11 (bullseye)

Configured using:
 'configure --with-native-compilation'

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

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

Major mode: Message

Minor modes in effect:
  goto-address-mode: t
  highlight-changes-visible-mode: t
  show-paren-mode: t
  shell-dirtrack-mode: t
  minions-mode: t
  mml-mode: t
  desktop-save-mode: t
  save-place-mode: t
  electric-pair-mode: t
  icomplete-mode: t
  global-so-long-mode: t
  global-auto-revert-mode: t
  auto-insert-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-layout-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tab-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  window-divider-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  auto-fill-function: message-do-auto-fill
  transient-mark-mode: t
  abbrev-mode: t

Load-path shadows:
/home/matthias/.config/emacs/elpa/transient-20210919.1006/transient hides /usr/local/share/emacs/28.0.50/lisp/transient
/home/matthias/.config/emacs/elpa/flymake-1.2.1/flymake hides /usr/local/share/emacs/28.0.50/lisp/progmodes/flymake
/home/matthias/.config/emacs/elpa/project-0.7.1/project hides /usr/local/share/emacs/28.0.50/lisp/progmodes/project
/home/matthias/.config/emacs/elpa/dictionary-20201001.1727/dictionary hides /usr/local/share/emacs/28.0.50/lisp/net/dictionary

Features:
(shadow emacsbug sendmail nndoc gnus-dup url-cache crm debbugs-gnu
debbugs soap-client url-http url-auth url-gw rng-xsd xsd-regexp
debbugs-browse dabbrev cl-print cus-start texinfo texinfo-loaddefs
help-fns radix-tree js add-log log-view pcvs-util misearch multi-isearch
smerge-mode diff gnus-fun flow-fill mm-archive view sort smiley
gnus-cite mail-extr gnus-async gnus-bcklg qp gnus-ml disp-table
gnus-topic nndraft nnmh nnfolder utf-7 epa-file gnutls network-stream
nsm gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-msg
gnus-cache hl-line conf-mode whitespace ox-odt rng-loc rng-uri rng-parse
rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok
nxml-util ox-latex ox-icalendar ox-html table ox-ascii ox-publish ox
org-element avl-tree generator ol-eww eww xdg url-queue mm-url ol-rmail
ol-mhe ol-irc ol-info ol-gnus nnselect gnus-search eieio-opt speedbar
ezimage dframe gnus-art mm-uu mml2015 mm-view mml-smime smime dig
gnus-sum shr kinsoku svg dom ol-docview doc-view image-mode exif
ol-bibtex bibtex ol-bbdb ol-w3m flyspell goto-addr bug-reference
dired-aux vc-dir follow mule-util display-line-numbers hilit-chg paren
vc-mtn vc-hg vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs vc jka-compr
bash-completion shell eglot array jsonrpc ert ewoc debug backtrace xref
flymake-proc flymake compile pcase project imenu avoid minions
carbon-custom cus-edit cus-load gnus-demon nntp gnus-group gnus-undo
gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source utf7
netrc parse-time iso8601 gnus-spec gnus-win nnoo gnus-int gnus-range
message rmc puny rfc822 mml mml-sec epa derived epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
mailheader gnus nnheader gnus-util rmail rmail-loaddefs rfc2047 rfc2045
ietf-drums mail-utils mm-util mail-prsvr wid-edit gnus-dired dired-x
dired dired-loaddefs org-capture org-refile org ob ob-tangle ob-ref
ob-lob ob-table ob-exp org-macro org-footnote org-src ob-comint
org-pcomplete pcomplete comint ansi-color ring org-list org-faces
org-entities time-date org-version ob-emacs-lisp ob-core ob-eval
org-table ol org-keys org-compat org-macs org-loaddefs format-spec
find-func cal-menu calendar cal-loaddefs dictionary link connection
advice markdown-mode edit-indirect color thingatpt noutline outline
skeleton find-file vc-git diff-mode easy-mmode vc-dispatcher ispell
desktop frameset server bookmark text-property-search pp saveplace
elec-pair edmacro kmacro icomplete so-long autorevert filenotify
autoinsert cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align
cc-engine cc-vars cc-defs generic-x face-remap proof-site
proof-autoloads comp comp-cstr warnings rx cl-extra help-mode info
package browse-url url url-proxy url-privacy url-expand url-methods
url-history url-cookie url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json subr-x map url-vars seq byte-opt gv bytecomp
byte-compile cconv cl-loaddefs cl-lib iso-transl 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 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 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 cl-preloaded nadvice button
loaddefs faces cus-face macroexp files window 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 cairo
move-toolbar gtk x-toolkit x multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 1700523 255710)
 (symbols 48 38830 103)
 (strings 32 227548 67913)
 (string-bytes 1 7153152)
 (vectors 16 75900)
 (vector-slots 8 1725779 101458)
 (floats 8 2990 1100)
 (intervals 56 136558 2364)
 (buffers 992 150))

-- 
Matthias

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

* bug#51016: Status: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-10-04 21:05 bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers Matthias Meulien
@ 2021-10-09  0:26 ` Matthias Meulien
  2021-10-09  0:37 ` Matthias Meulien
  2021-10-13 20:30 ` bug#51016: " Matthias Meulien
  2 siblings, 0 replies; 24+ messages in thread
From: Matthias Meulien @ 2021-10-09  0:26 UTC (permalink / raw)
  To: bug#51016

tags 51016 + patch
quit






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

* bug#51016: Status: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-10-04 21:05 bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers Matthias Meulien
  2021-10-09  0:26 ` bug#51016: Status: " Matthias Meulien
@ 2021-10-09  0:37 ` Matthias Meulien
  2021-10-13 20:30 ` bug#51016: " Matthias Meulien
  2 siblings, 0 replies; 24+ messages in thread
From: Matthias Meulien @ 2021-10-09  0:37 UTC (permalink / raw)
  To: bug#51016

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: 0001-Fix-outline-headers-of-prettified-diff-when-using-Gi.patch --]
[-- Type: text/x-diff, Size: 4209 bytes --]

From 8e07d5518ed49eef95e21bd94bc93ce3d79f6962 Mon Sep 17 00:00:00 2001
From: Matthias Meulien <orontee@gmail.com>
Date: Sat, 9 Oct 2021 00:36:11 +0200
Subject: [PATCH] Fix outline headers of prettified diff when using Git
 (bug#51016)

* lisp/vc/diff-mode.el (diff-outline-level): Make hunk headers be at level 2
(diff-mode): Use prettified line as outline header
* lisp/vc/vc.el (vc-diff-internal): Fix diff mode being set before content
inserted
---
 lisp/vc/diff-mode.el | 28 ++++++++++++++++++++--------
 lisp/vc/vc.el        |  5 +++--
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 057ffcd06e..fd4b2b15df 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -894,6 +894,10 @@ diff-split-hunk
       ;; Fix the original hunk-header.
       (diff-fixup-modifs start pos))))
 
+(defun diff-outline-level ()
+  (if (string-match-p diff-hunk-header-re (match-string 0))
+      2 1))
+
 
 ;;;;
 ;;;; jump to other buffers
@@ -1494,7 +1498,6 @@ diff-mode
 
   (setq-local font-lock-defaults diff-font-lock-defaults)
   (add-hook 'font-lock-mode-hook #'diff--font-lock-cleanup nil 'local)
-  (setq-local outline-regexp diff-outline-regexp)
   (setq-local imenu-generic-expression
               diff-imenu-generic-expression)
   ;; These are not perfect.  They would be better done separately for
@@ -1543,7 +1546,17 @@ diff-mode
     (setq-local diff-buffer-type
                 (if (re-search-forward "^diff --git" nil t)
                     'git
-                  nil))))
+                  nil)))
+  (when (and (eq diff-buffer-type 'git) diff-font-lock-prettify)
+    (setq diff-outline-regexp
+          (concat
+           "\\("
+           "^diff --git.*\n\\(--- .+\n\\+\\+\\+ \\|\\*\\*\\* .+\n--- \\|[^-+!<>0-9@* \n]\\).+\n"
+           "\\|"
+           diff-hunk-header-re
+           "\\)"))
+    (setq-local outline-level #'diff-outline-level))
+  (setq-local outline-regexp diff-outline-regexp))
 
 ;;;###autoload
 (define-minor-mode diff-minor-mode
@@ -2603,13 +2616,12 @@ diff--font-lock-prettify
                            (or (match-beginning 2) (match-beginning 1))
                            'display (propertize
                                      (cond
-                                      ((null (match-beginning 1)) "new file  ")
-                                      ((null (match-beginning 2)) "deleted   ")
-                                      (t                          "modified  "))
+                                      ((null (match-beginning 1)) (concat "new file  " (match-string 2)))
+                                      ((null (match-beginning 2)) (concat "deleted   " (match-string 1)))
+                                      (t                          (concat "modified  " (match-string 1))))
                                      'face '(diff-file-header diff-header)))
-        (unless (match-beginning 2)
-          (put-text-property (match-end 1) (1- (match-end 0))
-                             'display "")))))
+        (put-text-property (match-end 1) (1- (match-end 0))
+                           'display ""))))
   nil)
 
 ;;; Syntax highlighting from font-lock
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index edc4169465..42b0a1b986 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1793,7 +1793,6 @@ vc-diff-internal
         (setq files (nreverse filtered))))
     (vc-call-backend (car vc-fileset) 'diff files rev1 rev2 buffer async)
     (set-buffer buffer)
-    (diff-mode)
     (setq-local diff-vc-backend (car vc-fileset))
     (setq-local diff-vc-revisions (list rev1 rev2))
     (setq-local revert-buffer-function
@@ -1815,7 +1814,9 @@ vc-diff-internal
       ;; after `pop-to-buffer'; the former assumes the diff buffer is
       ;; shown in some window.
       (let ((buf (current-buffer)))
-        (vc-run-delayed (vc-diff-finish buf (when verbose messages))))
+        (vc-run-delayed (progn
+                          (vc-diff-finish buf (when verbose messages))
+                          (diff-mode))))
       ;; In the async case, we return t even if there are no differences
       ;; because we don't know that yet.
       t)))
-- 
2.30.2






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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-10-04 21:05 bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers Matthias Meulien
  2021-10-09  0:26 ` bug#51016: Status: " Matthias Meulien
  2021-10-09  0:37 ` Matthias Meulien
@ 2021-10-13 20:30 ` Matthias Meulien
  2021-11-05  2:51   ` Lars Ingebrigtsen
  2 siblings, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-10-13 20:30 UTC (permalink / raw)
  To: 51016

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

I updated the patch after a week using it. Outlines headers are now
updated for diff comming from Git even when diff-font-lock-prettify is
nil.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-outline-headers-of-diff-buffers-when-using-Git-b.patch --]
[-- Type: text/x-diff, Size: 4104 bytes --]

From 67ef81b503b2529e28fcdca35912bf5c9ce54d8e Mon Sep 17 00:00:00 2001
From: Matthias Meulien <orontee@gmail.com>
Date: Sat, 9 Oct 2021 00:36:11 +0200
Subject: [PATCH] Fix outline headers of diff buffers when using Git
 (bug#51016)

* lisp/vc/diff-mode.el (diff-outline-level): Make hunk headers be at level 2
(diff-mode): Use prettified line as outline header
* lisp/vc/vc.el (vc-diff-internal): Fix diff mode being set before content
inserted
---
 lisp/vc/diff-mode.el | 28 ++++++++++++++++++++--------
 lisp/vc/vc.el        |  5 +++--
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 057ffcd06e..f0a6cb7b15 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -894,6 +894,10 @@ diff-split-hunk
       ;; Fix the original hunk-header.
       (diff-fixup-modifs start pos))))
 
+(defun diff-outline-level ()
+  (if (string-match-p diff-hunk-header-re (match-string 0))
+      2 1))
+
 
 ;;;;
 ;;;; jump to other buffers
@@ -1494,7 +1498,6 @@ diff-mode
 
   (setq-local font-lock-defaults diff-font-lock-defaults)
   (add-hook 'font-lock-mode-hook #'diff--font-lock-cleanup nil 'local)
-  (setq-local outline-regexp diff-outline-regexp)
   (setq-local imenu-generic-expression
               diff-imenu-generic-expression)
   ;; These are not perfect.  They would be better done separately for
@@ -1543,7 +1546,17 @@ diff-mode
     (setq-local diff-buffer-type
                 (if (re-search-forward "^diff --git" nil t)
                     'git
-                  nil))))
+                  nil)))
+  (when (eq diff-buffer-type 'git)
+    (setq diff-outline-regexp
+          (concat
+           "\\("
+           "^diff --git.*\n"
+           "\\|"
+           diff-hunk-header-re
+           "\\)"))
+    (setq-local outline-level #'diff-outline-level))
+  (setq-local outline-regexp diff-outline-regexp))
 
 ;;;###autoload
 (define-minor-mode diff-minor-mode
@@ -2603,13 +2616,12 @@ diff--font-lock-prettify
                            (or (match-beginning 2) (match-beginning 1))
                            'display (propertize
                                      (cond
-                                      ((null (match-beginning 1)) "new file  ")
-                                      ((null (match-beginning 2)) "deleted   ")
-                                      (t                          "modified  "))
+                                      ((null (match-beginning 1)) (concat "new file  " (match-string 2)))
+                                      ((null (match-beginning 2)) (concat "deleted   " (match-string 1)))
+                                      (t                          (concat "modified  " (match-string 1))))
                                      'face '(diff-file-header diff-header)))
-        (unless (match-beginning 2)
-          (put-text-property (match-end 1) (1- (match-end 0))
-                             'display "")))))
+        (put-text-property (match-end 1) (1- (match-end 0))
+                           'display ""))))
   nil)
 
 ;;; Syntax highlighting from font-lock
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 5b259fcdb3..c82110274b 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1793,7 +1793,6 @@ vc-diff-internal
         (setq files (nreverse filtered))))
     (vc-call-backend (car vc-fileset) 'diff files rev1 rev2 buffer async)
     (set-buffer buffer)
-    (diff-mode)
     (setq-local diff-vc-backend (car vc-fileset))
     (setq-local diff-vc-revisions (list rev1 rev2))
     (setq-local revert-buffer-function
@@ -1815,7 +1814,9 @@ vc-diff-internal
       ;; after `pop-to-buffer'; the former assumes the diff buffer is
       ;; shown in some window.
       (let ((buf (current-buffer)))
-        (vc-run-delayed (vc-diff-finish buf (when verbose messages))))
+        (vc-run-delayed (progn
+                          (vc-diff-finish buf (when verbose messages))
+                          (diff-mode))))
       ;; In the async case, we return t even if there are no differences
       ;; because we don't know that yet.
       t)))
-- 
2.30.2


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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-10-13 20:30 ` bug#51016: " Matthias Meulien
@ 2021-11-05  2:51   ` Lars Ingebrigtsen
  2021-11-06 16:40     ` Juri Linkov
  2021-11-18 18:06     ` Juri Linkov
  0 siblings, 2 replies; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-05  2:51 UTC (permalink / raw)
  To: Matthias Meulien; +Cc: 51016

Matthias Meulien <orontee@gmail.com> writes:

> I updated the patch after a week using it. Outlines headers are now
> updated for diff comming from Git even when diff-font-lock-prettify is
> nil.

Thanks for the patch and the thorough case for reproduction.  I've now
applied it to Emacs 29 (with some trivial changes).

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-05  2:51   ` Lars Ingebrigtsen
@ 2021-11-06 16:40     ` Juri Linkov
  2021-11-06 18:30       ` Lars Ingebrigtsen
  2021-11-18 18:06     ` Juri Linkov
  1 sibling, 1 reply; 24+ messages in thread
From: Juri Linkov @ 2021-11-06 16:40 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> I updated the patch after a week using it. Outlines headers are now
>> updated for diff comming from Git even when diff-font-lock-prettify is
>> nil.
>
> Thanks for the patch and the thorough case for reproduction.  I've now
> applied it to Emacs 29 (with some trivial changes).

This patch broke vc-diff.  For example, after 'C-x v L' type 'd',
and check that *vc-diff* buffer doesn't have buffer-local variables
diff-vc-backend, diff-vc-revisions anymore, because they were defined
in vc-diff-internal after diff-mode, but now the postponed diff-mode
kills these buffer-local variables:

     (set-buffer buffer)
-    (diff-mode)
     (setq-local diff-vc-backend (car vc-fileset))
     (setq-local diff-vc-revisions (list rev1 rev2))





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-06 16:40     ` Juri Linkov
@ 2021-11-06 18:30       ` Lars Ingebrigtsen
  2021-11-08 22:38         ` Matthias Meulien
  0 siblings, 1 reply; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-06 18:30 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Matthias Meulien, 51016

Juri Linkov <juri@linkov.net> writes:

> This patch broke vc-diff.  For example, after 'C-x v L' type 'd',
> and check that *vc-diff* buffer doesn't have buffer-local variables
> diff-vc-backend, diff-vc-revisions anymore, because they were defined
> in vc-diff-internal after diff-mode, but now the postponed diff-mode
> kills these buffer-local variables:
>
>      (set-buffer buffer)
> -    (diff-mode)
>      (setq-local diff-vc-backend (car vc-fileset))
>      (setq-local diff-vc-revisions (list rev1 rev2))

Right.  Matthias -- can this be fixed in a different way that doesn't
postpone changing the major mode?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-06 18:30       ` Lars Ingebrigtsen
@ 2021-11-08 22:38         ` Matthias Meulien
  2021-11-09  3:47           ` Lars Ingebrigtsen
  0 siblings, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-11-08 22:38 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 51016, Juri Linkov

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

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Juri Linkov <juri@linkov.net> writes:
>
>> This patch broke vc-diff.  For example, after 'C-x v L' type 'd',
>> and check that *vc-diff* buffer doesn't have buffer-local variables
>> diff-vc-backend, diff-vc-revisions anymore, because they were defined
>> in vc-diff-internal after diff-mode, but now the postponed diff-mode
>> kills these buffer-local variables:
>>
>>      (set-buffer buffer)
>> -    (diff-mode)
>>      (setq-local diff-vc-backend (car vc-fileset))
>>      (setq-local diff-vc-revisions (list rev1 rev2))
>
> Right.  Matthias -- can this be fixed in a different way that doesn't
> postpone changing the major mode?

Thanks Juri!

I moved the call to `diff-mode` since in its implementation one
initialize `diff-buffer-type` by searching:

  (save-excursion
    (setq-local diff-buffer-type
                (if (re-search-forward "^diff --git" nil t)
                    'git
                  nil)))

I suggest to restore the original call to `diff-mode` (before the
asynchronous operation completes) and keep the initialization of
`diff-buffer-type` by searching but make it available to
`vc-diff-finish' which is called when the asynchronous operation
completes.

See the attached patch for details.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-local-variables-overwritten-when-diff-mode-is-se.patch --]
[-- Type: text/x-diff, Size: 3612 bytes --]

From 61d0a96df15f3fe4c44ade01747246b05fed2a48 Mon Sep 17 00:00:00 2001
From: Matthias Meulien <orontee@gmail.com>
Date: Mon, 8 Nov 2021 23:37:33 +0100
Subject: [PATCH] Fix local variables overwritten when diff-mode is set

* lisp/vc/diff-mode.el (diff-mode):
(diff-setup-buffer-type): Defun to initialize `diff-buffer-type'

* lisp/vc/vc.el (vc-diff-finish): Set `diff-buffer-type' after content
inserted
(vc-diff-internal): Restore `diff-mode' being set before local variables
---
 lisp/vc/diff-mode.el | 26 ++++++++++++++++----------
 lisp/vc/vc.el        |  6 +++---
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 746f76b46c..e68aa2257d 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -1540,16 +1540,7 @@ diff-mode
                 #'diff--filter-substring)
   (unless buffer-file-name
     (hack-dir-local-variables-non-file-buffer))
-  (save-excursion
-    (setq-local diff-buffer-type
-                (if (re-search-forward "^diff --git" nil t)
-                    'git
-                  nil)))
-  (when (eq diff-buffer-type 'git)
-    (setq diff-outline-regexp
-          (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
-    (setq-local outline-level #'diff--outline-level))
-  (setq-local outline-regexp diff-outline-regexp))
+  (diff-setup-buffer-type))
 
 ;;;###autoload
 (define-minor-mode diff-minor-mode
@@ -1585,6 +1576,21 @@ diff-setup-whitespace
                     "^[-+!] .*?\\([\t ]+\\)$"
                   "^[-+!<>].*?\\([\t ]+\\)$"))))
 
+(defun diff-setup-buffer-type ()
+  "Try to guess the `diff-buffer-type' from content of current Diff mode buffer.
+`outline-regexp' is updated accordingly."
+  (save-excursion
+    (goto-char (point-min))
+    (setq-local diff-buffer-type
+                (if (re-search-forward "^diff --git" nil t)
+                    'git
+                  nil)))
+  (when (eq diff-buffer-type 'git)
+    (setq diff-outline-regexp
+          (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
+    (setq-local outline-level #'diff--outline-level))
+  (setq-local outline-regexp diff-outline-regexp))
+
 (defun diff-delete-if-empty ()
   ;; An empty diff file means there's no more diffs to integrate, so we
   ;; can just remove the file altogether.  Very handy for .rej files if we
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index c9500f454a..87137d8ede 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1739,6 +1739,7 @@ vc-diff-finish
 	       (insert (cdr messages) ".\n")
 	       (message "%s" (cdr messages))))
 	(diff-setup-whitespace)
+        (diff-setup-buffer-type)
 	(goto-char (point-min))
 	(when window
 	  (shrink-window-if-larger-than-buffer window)))
@@ -1804,6 +1805,7 @@ vc-diff-internal
         (setq files (nreverse filtered))))
     (vc-call-backend (car vc-fileset) 'diff files rev1 rev2 buffer async)
     (set-buffer buffer)
+    (diff-mode)
     (setq-local diff-vc-backend (car vc-fileset))
     (setq-local diff-vc-revisions (list rev1 rev2))
     (setq-local revert-buffer-function
@@ -1825,9 +1827,7 @@ vc-diff-internal
       ;; after `pop-to-buffer'; the former assumes the diff buffer is
       ;; shown in some window.
       (let ((buf (current-buffer)))
-        (vc-run-delayed (progn
-                          (vc-diff-finish buf (when verbose messages))
-                          (diff-mode))))
+        (vc-run-delayed (vc-diff-finish buf (when verbose messages))))
       ;; In the async case, we return t even if there are no differences
       ;; because we don't know that yet.
       t)))
-- 
2.30.2


[-- Attachment #3: Type: text/plain, Size: 14 bytes --]


-- 
Matthias

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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-08 22:38         ` Matthias Meulien
@ 2021-11-09  3:47           ` Lars Ingebrigtsen
  2021-11-09  8:19             ` Juri Linkov
  0 siblings, 1 reply; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-09  3:47 UTC (permalink / raw)
  To: Matthias Meulien; +Cc: 51016, Juri Linkov

Matthias Meulien <orontee@gmail.com> writes:

> I suggest to restore the original call to `diff-mode` (before the
> asynchronous operation completes) and keep the initialization of
> `diff-buffer-type` by searching but make it available to
> `vc-diff-finish' which is called when the asynchronous operation
> completes.
>
> See the attached patch for details.

Thanks; this fixes the problem reported by Juri (as far as I can see
after doing some light testing), so I've now pushed the patch to Emacs
29.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-09  3:47           ` Lars Ingebrigtsen
@ 2021-11-09  8:19             ` Juri Linkov
  0 siblings, 0 replies; 24+ messages in thread
From: Juri Linkov @ 2021-11-09  8:19 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> I suggest to restore the original call to `diff-mode` (before the
>> asynchronous operation completes) and keep the initialization of
>> `diff-buffer-type` by searching but make it available to
>> `vc-diff-finish' which is called when the asynchronous operation
>> completes.
>>
>> See the attached patch for details.
>
> Thanks; this fixes the problem reported by Juri (as far as I can see
> after doing some light testing), so I've now pushed the patch to Emacs
> 29.

I confirm it's fixed (Matthias placed two counterpart functions together:
diff-setup-whitespace and diff-setup-buffer-type in the patch,
so I restored the same in master for readability).





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-05  2:51   ` Lars Ingebrigtsen
  2021-11-06 16:40     ` Juri Linkov
@ 2021-11-18 18:06     ` Juri Linkov
  2021-11-19  7:22       ` Lars Ingebrigtsen
  1 sibling, 1 reply; 24+ messages in thread
From: Juri Linkov @ 2021-11-18 18:06 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> I updated the patch after a week using it. Outlines headers are now
>> updated for diff comming from Git even when diff-font-lock-prettify is
>> nil.
>
> Thanks for the patch and the thorough case for reproduction.  I've now
> applied it to Emacs 29 (with some trivial changes).

As noticed in bug#51809, outline-cycle is not bound on hunk headings anymore,
only on file headings.  It seems the problem is somewhere here:

    (setq diff-outline-regexp
          (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))

But I don't know why diff-hunk-header-re doesn't match hunk headings
in outline-minor-mode.





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-18 18:06     ` Juri Linkov
@ 2021-11-19  7:22       ` Lars Ingebrigtsen
  2021-11-19  8:31         ` Juri Linkov
  0 siblings, 1 reply; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-19  7:22 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Matthias Meulien, 51016

Juri Linkov <juri@linkov.net> writes:

> As noticed in bug#51809, outline-cycle is not bound on hunk headings anymore,
> only on file headings.  It seems the problem is somewhere here:
>
>     (setq diff-outline-regexp
>           (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
>
> But I don't know why diff-hunk-header-re doesn't match hunk headings
> in outline-minor-mode.

Hm...  I just tried switching outline-minor-mode on and
(re-search-forward diff-hunk-header-re), and it seemed to work as
expected?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-19  7:22       ` Lars Ingebrigtsen
@ 2021-11-19  8:31         ` Juri Linkov
  2021-11-20  8:37           ` Lars Ingebrigtsen
  0 siblings, 1 reply; 24+ messages in thread
From: Juri Linkov @ 2021-11-19  8:31 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

> Juri Linkov <juri@linkov.net> writes:
>
>> As noticed in bug#51809, outline-cycle is not bound on hunk headings anymore,
>> only on file headings.  It seems the problem is somewhere here:
>>
>>     (setq diff-outline-regexp
>>           (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
>>
>> But I don't know why diff-hunk-header-re doesn't match hunk headings
>> in outline-minor-mode.
>
> Hm...  I just tried switching outline-minor-mode on and
> (re-search-forward diff-hunk-header-re), and it seemed to work as
> expected?

Yep, I already tried `(re-search-forward diff-hunk-header-re)' too,
and it works.  But still typing TAB on the hunk heading
with outline-minor-mode-cycle=t does nothing, whereas typing TAB
on the file heading correctly cycles the file diff.





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-19  8:31         ` Juri Linkov
@ 2021-11-20  8:37           ` Lars Ingebrigtsen
  2021-11-20 19:17             ` Juri Linkov
  0 siblings, 1 reply; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-20  8:37 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Matthias Meulien, 51016

Juri Linkov <juri@linkov.net> writes:

> Yep, I already tried `(re-search-forward diff-hunk-header-re)' too,
> and it works.  But still typing TAB on the hunk heading
> with outline-minor-mode-cycle=t does nothing, whereas typing TAB
> on the file heading correctly cycles the file diff.

Oh yeah, now I'm seeing the problem.  I don't really use outline mode
daily, so I'm not sure how it's supposed to work, but -- TAB in these
buffers are bound to diff-hunk-next, and as far as I can tell, outline
mode has just placed a keymap property on the file headings, not the
hunk headings.

Or is that the actual bug here?  😀  I should probably have read the
entire thread before getting involved.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-20  8:37           ` Lars Ingebrigtsen
@ 2021-11-20 19:17             ` Juri Linkov
  2021-11-21 17:02               ` Lars Ingebrigtsen
  0 siblings, 1 reply; 24+ messages in thread
From: Juri Linkov @ 2021-11-20 19:17 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> Yep, I already tried `(re-search-forward diff-hunk-header-re)' too,
>> and it works.  But still typing TAB on the hunk heading
>> with outline-minor-mode-cycle=t does nothing, whereas typing TAB
>> on the file heading correctly cycles the file diff.
>
> Oh yeah, now I'm seeing the problem.  I don't really use outline mode
> daily, so I'm not sure how it's supposed to work, but -- TAB in these
> buffers are bound to diff-hunk-next, and as far as I can tell, outline
> mode has just placed a keymap property on the file headings, not the
> hunk headings.
>
> Or is that the actual bug here?  😀  I should probably have read the
> entire thread before getting involved.

Actually, ‘outline-font-lock-keywords’ extends the outline regexp
to (concat "^\\(?:" outline-regexp "\\).+").  And indeed,

  (re-search-forward (concat "^\\(?:" diff-hunk-header-re "\\).+"))

fails in diff buffers.  Don't ask me why outline.el adds ".+"
at the end, I don't know 🤐  To circumvent this idiosyncrasy
for headings in ‘describe-bindings’, I had to use a different regexp
in ‘outline-minor-mode-highlight-buffer’ (not based on font-lock):

  (concat "^\\(?:" outline-regexp "\\).*$")))

where ".+" is replaced with less-strict ".*".





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-20 19:17             ` Juri Linkov
@ 2021-11-21 17:02               ` Lars Ingebrigtsen
  2021-11-21 17:26                 ` Matthias Meulien
  2021-11-21 17:49                 ` Juri Linkov
  0 siblings, 2 replies; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-21 17:02 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Matthias Meulien, 51016

Juri Linkov <juri@linkov.net> writes:

> Actually, ‘outline-font-lock-keywords’ extends the outline regexp
> to (concat "^\\(?:" outline-regexp "\\).+").  And indeed,
>
>   (re-search-forward (concat "^\\(?:" diff-hunk-header-re "\\).+"))
>
> fails in diff buffers.  Don't ask me why outline.el adds ".+"
> at the end, I don't know 🤐

That is quite odd, but it's been that way since 2003?  The doc string
says

---
Regular expression to match the beginning of a heading.
Any line whose beginning matches this regexp is considered to start a heading.
---

So it's specifying "the beginning", which could imply that there's
always supposed to be something after it, but it's an odd limitation.

> To circumvent this idiosyncrasy for headings in ‘describe-bindings’, I
> had to use a different regexp in ‘outline-minor-mode-highlight-buffer’
> (not based on font-lock):
>
>   (concat "^\\(?:" outline-regexp "\\).*$")))
>
> where ".+" is replaced with less-strict ".*".

And diff-hunk-header-re definitely specifies an entire line.

Perhaps we could just change the .+ thing to .* and see whether it
breaks anything?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-21 17:02               ` Lars Ingebrigtsen
@ 2021-11-21 17:26                 ` Matthias Meulien
  2021-11-21 17:41                   ` Juri Linkov
  2021-11-21 17:49                 ` Juri Linkov
  1 sibling, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-11-21 17:26 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 51016, Juri Linkov

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Perhaps we could just change the .+ thing to .* and see whether it
> breaks anything?

Good point.

But am I missing something or commit f0768d3145 didn't change
`diff-hunk-header-re' matching an entire line? I thus don't understand
why Juri is seing a regression w.r. to cycling after that commit has
been installed. Note that I've not been able to reproduce the "working"
behavior described by Juri after reverting that commit.

Juri can you confirm there's a relation between cycling not working and
that commit? Otherwise should we open another bug?
-- 
Matthias





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-21 17:26                 ` Matthias Meulien
@ 2021-11-21 17:41                   ` Juri Linkov
  2021-11-21 17:54                     ` Matthias Meulien
  0 siblings, 1 reply; 24+ messages in thread
From: Juri Linkov @ 2021-11-21 17:41 UTC (permalink / raw)
  To: Matthias Meulien; +Cc: Lars Ingebrigtsen, 51016

>> Perhaps we could just change the .+ thing to .* and see whether it
>> breaks anything?
>
> Good point.
>
> But am I missing something or commit f0768d3145 didn't change
> `diff-hunk-header-re' matching an entire line? I thus don't understand
> why Juri is seing a regression w.r. to cycling after that commit has
> been installed. Note that I've not been able to reproduce the "working"
> behavior described by Juri after reverting that commit.
>
> Juri can you confirm there's a relation between cycling not working and
> that commit? Otherwise should we open another bug?

I confirm there is a relation because the commit f0768d3145

  +  (when (eq diff-buffer-type 'git)
  +    (setq diff-outline-regexp
  +          (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
  +    (setq-local outline-level #'diff--outline-level))
  +  (setq-local outline-regexp diff-outline-regexp))

changed diff-outline-regexp to contain diff-hunk-header-re that matches an entire line.
This commit replaced the default value of diff-outline-regexp that is

  (defvar diff-outline-regexp
    "\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)")

that didn't match entire lines.

However, changing the .+ thing to .* in outline-font-lock-keywords
fixes this problem.  So we need to decide whether to try to remove
entire line mathing from diff-hunk-header-re (not sure how easy to do),
or just change .+ to .* in outline-font-lock-keywords.





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-21 17:02               ` Lars Ingebrigtsen
  2021-11-21 17:26                 ` Matthias Meulien
@ 2021-11-21 17:49                 ` Juri Linkov
  1 sibling, 0 replies; 24+ messages in thread
From: Juri Linkov @ 2021-11-21 17:49 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> To circumvent this idiosyncrasy for headings in ‘describe-bindings’, I
>> had to use a different regexp in ‘outline-minor-mode-highlight-buffer’
>> (not based on font-lock):
>>
>>   (concat "^\\(?:" outline-regexp "\\).*$")))
>>
>> where ".+" is replaced with less-strict ".*".
>
> And diff-hunk-header-re definitely specifies an entire line.
>
> Perhaps we could just change the .+ thing to .* and see whether it
> breaks anything?

This looks like the right thing to do.  And this regexp in outline-mode

  (setq-local imenu-generic-expression
	      (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0)))

also uses .* instead of .+, probably because .+ caused a problem in imenu.





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-21 17:41                   ` Juri Linkov
@ 2021-11-21 17:54                     ` Matthias Meulien
  2021-11-22 22:11                       ` Matthias Meulien
  0 siblings, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-11-21 17:54 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Lars Ingebrigtsen, 51016

Juri Linkov <juri@linkov.net> writes:

> I confirm there is a relation because the commit f0768d3145

Oh you're right. Sorry.

> However, changing the .+ thing to .* in outline-font-lock-keywords
> fixes this problem.  So we need to decide whether to try to remove
> entire line mathing from diff-hunk-header-re (not sure how easy to
> do),

I'll have a look.
-- 
Matthias





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-21 17:54                     ` Matthias Meulien
@ 2021-11-22 22:11                       ` Matthias Meulien
  2021-11-22 23:03                         ` Matthias Meulien
  0 siblings, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-11-22 22:11 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Lars Ingebrigtsen, 51016

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

Matthias Meulien <orontee@gmail.com> writes:

> Juri Linkov <juri@linkov.net> writes:
>
>> I confirm there is a relation because the commit f0768d3145
>
> Oh you're right. Sorry.
>
>> However, changing the .+ thing to .* in outline-font-lock-keywords
>> fixes this problem.  So we need to decide whether to try to remove
>> entire line mathing from diff-hunk-header-re (not sure how easy to
>> do),

I just skipped last character of `diff-hunk-header-re' (the culprit `$')
when building `diff-outline-regexp'; Cycling is restored when on hunk
headers. Looks safe to me since `diff-hunk-header-re' is unchanged.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-broken-outline-minor-mode-cycling-in-diff-buffer.patch --]
[-- Type: text/x-diff, Size: 979 bytes --]

From cf4ccd97e6d6e82faee5b01224c5a3caa8908cc1 Mon Sep 17 00:00:00 2001
From: Matthias Meulien <orontee@gmail.com>
Date: Mon, 22 Nov 2021 23:06:06 +0100
Subject: [PATCH] Fix broken outline minor mode cycling in diff buffers

* lisp/vc/diff-mode.el (diff-setup-buffer-type): Fix outline regexp
matching whole line
---
 lisp/vc/diff-mode.el | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 8f83aa580e..eeda503afb 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -1588,7 +1588,8 @@ diff-setup-buffer-type
                   nil)))
   (when (eq diff-buffer-type 'git)
     (setq diff-outline-regexp
-          (concat "\\(^diff --git.*\n\\|" diff-hunk-header-re "\\)"))
+          (concat "\\(^diff --git.*\n\\|"
+                  (substring diff-hunk-header-re 0 -1) "\\)"))
     (setq-local outline-level #'diff--outline-level))
   (setq-local outline-regexp diff-outline-regexp))
 
-- 
2.30.2


[-- Attachment #3: Type: text/plain, Size: 14 bytes --]


-- 
Matthias

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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-22 22:11                       ` Matthias Meulien
@ 2021-11-22 23:03                         ` Matthias Meulien
  2021-11-24  6:54                           ` Lars Ingebrigtsen
  0 siblings, 1 reply; 24+ messages in thread
From: Matthias Meulien @ 2021-11-22 23:03 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Lars Ingebrigtsen, 51016

Matthias Meulien <orontee@gmail.com> writes:

>> Juri Linkov <juri@linkov.net> writes:
>>
>>> I confirm there is a relation because the commit f0768d3145
>>
>> Oh you're right. Sorry.
>>
>>> However, changing the .+ thing to .* in outline-font-lock-keywords
>>> fixes this problem.  So we need to decide whether to try to remove
>>> entire line mathing from diff-hunk-header-re (not sure how easy to
>>> do),
>
> I just skipped last character of `diff-hunk-header-re' (the culprit `$')
> when building `diff-outline-regexp'; Cycling is restored when on hunk
> headers. Looks safe to me since `diff-hunk-header-re' is unchanged.

Ok, it works on hunks with "context information" like

   @@ -147,6 +160,61 @@ diff-font-lock-syntax

But it's still broken when there's no "context information" like

   @@ -50,6 +50,7 @@

which argues for your second suggestion, changing
`outline-font-lock-keywords'.
-- 
Matthias





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-22 23:03                         ` Matthias Meulien
@ 2021-11-24  6:54                           ` Lars Ingebrigtsen
  2021-11-24 18:48                             ` Juri Linkov
  0 siblings, 1 reply; 24+ messages in thread
From: Lars Ingebrigtsen @ 2021-11-24  6:54 UTC (permalink / raw)
  To: Matthias Meulien; +Cc: 51016, Juri Linkov

Matthias Meulien <orontee@gmail.com> writes:

> But it's still broken when there's no "context information" like
>
>    @@ -50,6 +50,7 @@
>
> which argues for your second suggestion, changing
> `outline-font-lock-keywords'.

Yup.  Juri, please go ahead and make the change -- it seems like the
correct fix ere.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers
  2021-11-24  6:54                           ` Lars Ingebrigtsen
@ 2021-11-24 18:48                             ` Juri Linkov
  0 siblings, 0 replies; 24+ messages in thread
From: Juri Linkov @ 2021-11-24 18:48 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Matthias Meulien, 51016

>> But it's still broken when there's no "context information" like
>>
>>    @@ -50,6 +50,7 @@
>>
>> which argues for your second suggestion, changing
>> `outline-font-lock-keywords'.
>
> Yup.  Juri, please go ahead and make the change -- it seems like the
> correct fix ere.

So now pushed to master.





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

end of thread, other threads:[~2021-11-24 18:48 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-04 21:05 bug#51016: 28.0.50; 'diff-font-lock-prettify' breaks display of outline headers Matthias Meulien
2021-10-09  0:26 ` bug#51016: Status: " Matthias Meulien
2021-10-09  0:37 ` Matthias Meulien
2021-10-13 20:30 ` bug#51016: " Matthias Meulien
2021-11-05  2:51   ` Lars Ingebrigtsen
2021-11-06 16:40     ` Juri Linkov
2021-11-06 18:30       ` Lars Ingebrigtsen
2021-11-08 22:38         ` Matthias Meulien
2021-11-09  3:47           ` Lars Ingebrigtsen
2021-11-09  8:19             ` Juri Linkov
2021-11-18 18:06     ` Juri Linkov
2021-11-19  7:22       ` Lars Ingebrigtsen
2021-11-19  8:31         ` Juri Linkov
2021-11-20  8:37           ` Lars Ingebrigtsen
2021-11-20 19:17             ` Juri Linkov
2021-11-21 17:02               ` Lars Ingebrigtsen
2021-11-21 17:26                 ` Matthias Meulien
2021-11-21 17:41                   ` Juri Linkov
2021-11-21 17:54                     ` Matthias Meulien
2021-11-22 22:11                       ` Matthias Meulien
2021-11-22 23:03                         ` Matthias Meulien
2021-11-24  6:54                           ` Lars Ingebrigtsen
2021-11-24 18:48                             ` Juri Linkov
2021-11-21 17:49                 ` Juri Linkov

Code repositories for project(s) associated with this 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).