From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 13:10:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 51809@debbugs.gnu.org X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.16368089931021 (code B ref -1); Sat, 13 Nov 2021 13:10:02 +0000 Received: (at submit) by debbugs.gnu.org; 13 Nov 2021 13:09:53 +0000 Received: from localhost ([127.0.0.1]:46721 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlsn2-0000GP-VX for submit@debbugs.gnu.org; Sat, 13 Nov 2021 08:09:53 -0500 Received: from lists.gnu.org ([209.51.188.17]:45382) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlsn0-0000GA-1j for submit@debbugs.gnu.org; Sat, 13 Nov 2021 08:09:51 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56228) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mlsmz-0005ZQ-S5 for bug-gnu-emacs@gnu.org; Sat, 13 Nov 2021 08:09:49 -0500 Received: from [2a00:1450:4864:20::429] (port=36555 helo=mail-wr1-x429.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mlsmx-0000st-8Q for bug-gnu-emacs@gnu.org; Sat, 13 Nov 2021 08:09:49 -0500 Received: by mail-wr1-x429.google.com with SMTP id s13so20612436wrb.3 for ; Sat, 13 Nov 2021 05:09:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:user-agent:mime-version; bh=cYEdD8Q+aj0T2hbsnVS2lma0itEpXc8a2QEPEGsX57I=; b=W7Uqu83NU9N+sEG79yV4Qu3g81n2t5hV7d6Bkhw/UNggcZtEiLnA+ue2PeFM+Rr+8V q/ywXpwOL9uxuaeXHkAMm56Dx68QEhdjJxhKlKnkgA/Bub6AFFY9l9dwYVQTsBsodvWH F3isFB704/C/DfWqrlQNgxU0SnYeUJxhZnpvDBn6ErEi0+Hur5yj0eQ3AjJ9STI9Fri6 wQdegtrQqoCMZJJiNBZVxE53qFlpt7rnmuTjpg8l74IQhEEtRttvB8ZV+dNXn2rpAan3 8ShwAUBT4SziSGBLHCGELXXFdNBEDWiYB/tNM6//314BWxgqdierwPr3DPplv+3NL+GU sZ+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:user-agent :mime-version; bh=cYEdD8Q+aj0T2hbsnVS2lma0itEpXc8a2QEPEGsX57I=; b=JyCNxWSMjwy9UJ1HeMeXsunv6dgwx5enHyYP1Rtn8gxPwQyX6zSjij0vhZe7d7u2gD lLitGWfwdLLNDjs1HvCgTaP/lhzCbKZZ8u3TEcnI8YyC6xuknNw6TwEBIzGSqdZPgEzC LrPeH/raV8UrVyV6EpuPE3gpYlP1aXVBlmD8u+GAi2HqxH3Z8B7xAxlsxAMfj1kyr4V7 /kdvf7hzKx4yHlwEAdS3V8JknacRRLUB6O3v/KQrneX7bOtc2PdRVNGKXQ44rSejF+Wt yBTPh4nfTwChhoEl1Mn2Z1UMAzdf9JdFbx2Ri07AE0PDbMqwqtbB2dUYhOA9qjZfFNsH f1GQ== X-Gm-Message-State: AOAM532fEvyVzXc3LSwRVMaUX1mpCQ9nptIoz/DZUQRO5BCtLa4g6IHV UaUbflC56JTEwwFzKlgpjr/Mipmqh5I= X-Google-Smtp-Source: ABdhPJwntkdnAjvkUJQVz/E5ZaWk+bktUEBV+zqTlfErdu2bvkwc45P+ol/wEYlZ3XMTv3sSoYdlfA== X-Received: by 2002:adf:f44e:: with SMTP id f14mr28122329wrp.37.1636808675428; Sat, 13 Nov 2021 05:04:35 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id v15sm4717691wro.35.2021.11.13.05.04.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Nov 2021 05:04:34 -0800 (PST) From: Matthias Meulien Date: Sat, 13 Nov 2021 14:04:33 +0100 Message-ID: <87lf1sw6ji.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::429 (failed) Received-SPF: pass client-ip=2a00:1450:4864:20::429; envelope-from=orontee@gmail.com; helo=mail-wr1-x429.google.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.9 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) --=-=-= Content-Type: text/plain Hi, Attached is a patch that adds support for an outline default state in Diff buffers. One state makes only files and hunks headings visibles. Another one outlines files with long hunks. A third value is proposed for users who want to implement their own state. My point is that, when I first review a changeset, I am trying to get an overview of the changes; And files cumulating long hunks often don't help for that matter. Tell me if it's worth including in Emacs 29. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Support-for-outline-default-state-in-Diff-buffers.patch >From f698c22bffd8cd5dd5c98a86f0e143c4e184b4dc Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Sat, 13 Nov 2021 12:08:58 +0100 Subject: [PATCH] Support for outline default state in Diff buffers * lisp/vc/diff-mode.el (diff-outline-default-state): Add custom variable that defines an outline state and apply that state in Diff buffers. --- lisp/vc/diff-mode.el | 92 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index e68aa2257d..01ea1c3994 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -50,7 +50,11 @@ ;; ;; - in diff-apply-hunk, strip context in replace-match to better ;; preserve markers and spacing. +;; ;; - Handle `diff -b' output in context->unified. +;; +;; - Support outlining files by name (eg to skip automatically +;; generated files like package-lock.json in Javascript projects). ;;; Code: (eval-when-compile (require 'cl-lib)) @@ -147,6 +151,27 @@ diff-font-lock-syntax (const :tag "Highlight syntax" t) (const :tag "Allow hunk-based fallback" hunk-also))) +(defcustom diff-outline-default-state nil + "If non-nil, some files or hunk are outlined. +Outlining is performed by Outline minor mode. + +If `hide-body', only file and hunk headings are visible. + +If `size-threshold', files whose hunks cover more than +`diff-file-outline-threshold' lines are outlined." + :version "29.1" + :type '(choice (const :tag "Don't outline " nil) + (const :tag "Outline hunks" hide-body) + (const :tag "Outline files with long hunks" size-threshold) + (function :tag "Custom function"))) + +(defcustom diff-file-outline-threshold 50 + "Number of lines of hunks for a file to be outlined. + +Used by `diff-outline-file-according-to-size'." + :version "29.1" + :type '(natnum :tag "Number of lines")) + (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") @@ -1578,7 +1603,8 @@ diff-setup-whitespace (defun diff-setup-buffer-type () "Try to guess the `diff-buffer-type' from content of current Diff mode buffer. -`outline-regexp' is updated accordingly." +`outline-regexp' is updated accordingly and outline default state +applied." (save-excursion (goto-char (point-min)) (setq-local diff-buffer-type @@ -1589,7 +1615,8 @@ diff-setup-buffer-type (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)) + (setq-local outline-regexp diff-outline-regexp) + (diff-outline-apply-default-state)) (defun diff-delete-if-empty () ;; An empty diff file means there's no more diffs to integrate, so we @@ -2143,6 +2170,67 @@ diff-refresh-hunk (delete-file file1) (delete-file file2)))) +(defun diff-outline-apply-default-state () + "Apply the outline state defined by `diff-outline-default-state'. + +When `diff-outline-default-state' is non-nil, Outline minor mode +is enabled." + (when diff-outline-default-state + (when (not outline-minor-mode) + (outline-minor-mode)) + (cond + ((eq diff-outline-default-state 'size-threshold) + (diff-outline-file-according-to-size)) + ((eq diff-outline-default-state 'hide-body) + (outline-hide-body)) + ((when (functionp diff-outline-default-state) + (funcall diff-outline-default-state)))))) + +(defun diff-outline-file-according-to-size () + "Outline file with long hunks. + +A file is outlined when its hunks cover more than +`diff-file-outline-threshold' lines. Does nothing when Outline +minor mode is not enabled or `diff-file-outline-threshold'. + +Inspired by `outline-hide-sublevels'." + (interactive) + (when (and outline-minor-mode diff-file-outline-threshold) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point))))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide sublevels + (outline-hide-sublevels 1) + ;; Then unhide short subtrees + (outline-map-region + (lambda () + (when (= (funcall outline-level) 1) + (goto-char (match-end 0)) + (let ((overlays (overlays-at (point)))) + (while overlays + (let ((overlay (car overlays))) + (progn + (when (eq (overlay-get overlay 'invisible) 'outline) + (let ((size (count-lines + (overlay-end overlay) + (overlay-start overlay)))) + (goto-char (match-beginning 0)) + (if (< size diff-file-outline-threshold) + (outline-show-subtree) + (outline-show-branches)))) + (setq overlays (cdr overlays)))))))) + beg end))))) + ;;; Fine change highlighting. (defface diff-refine-changed -- 2.30.2 --=-=-= Content-Type: text/plain In GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0) of 2021-11-13 built on carbon Repository revision: f698c22bffd8cd5dd5c98a86f0e143c4e184b4dc Repository branch: dev/mm 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: VC dir Minor modes in effect: highlight-changes-visible-mode: t shell-dirtrack-mode: t minions-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 text-scale-mode: t tooltip-mode: t global-eldoc-mode: t show-paren-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 buffer-read-only: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t Load-path shadows: /home/matthias/.config/emacs/elpa/transient-20211029.1405/transient hides /usr/local/share/emacs/29.0.50/lisp/transient /home/matthias/.config/emacs/elpa/dictionary-20201001.1727/dictionary hides /usr/local/share/emacs/29.0.50/lisp/net/dictionary Features: (shadow flow-fill nndoc gnus-dup url-cache crm debbugs-gnu debbugs soap-client url-http url-auth url-gw rng-xsd xsd-regexp misearch multi-isearch emacsbug sendmail mm-archive qp gnus-fun sort smiley gnus-cite mail-extr gnus-async gnus-bcklg follow gnus-ml disp-table novice gnus-topic nndraft nnmh nnfolder utf-7 reftex-dcr reftex reftex-loaddefs reftex-vars tex-mode tramp-archive tramp-gvfs tramp-cache zeroconf tramp tramp-loaddefs trampver tramp-integration files-x tramp-compat ls-lisp epa-file gnutls network-stream nsm gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-msg gnus-cache hl-line add-log smerge-mode diff flyspell 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 org-agenda ox-html table ox-ascii ox-publish ox goto-addr 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 ol-bbdb ol-w3m ol-doi org-link-doi mule-util jka-compr dired-aux bug-reference display-line-numbers hilit-chg vc-dir whitespace vc-mtn vc-hg vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs vc 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 gnus-spec gnus-win nnoo gnus-int gnus-range message yank-media 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 org-version ob-emacs-lisp ob-core ob-eval org-table oc-basic bibtex iso8601 time-date ol org-keys oc 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 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 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 eieio eieio-core eieio-loaddefs password-cache json map url-vars comp comp-cstr warnings rx cl-seq cl-macs cl-extra help-mode seq gv subr-x byte-opt bytecomp byte-compile cconv cl-loaddefs cl-lib iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode 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 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 emoji-zwj 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 1000739 201421) (symbols 48 39721 27) (strings 32 228421 52284) (string-bytes 1 7452737) (vectors 16 85442) (vector-slots 8 1542974 101097) (floats 8 3167 1088) (intervals 56 22491 1885) (buffers 992 61)) -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 17:49:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163682573515163 (code B ref 51809); Sat, 13 Nov 2021 17:49:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 17:48:55 +0000 Received: from localhost ([127.0.0.1]:48013 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlx94-0003wV-SD for submit@debbugs.gnu.org; Sat, 13 Nov 2021 12:48:55 -0500 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:59037) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlx91-0003vy-UP for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 12:48:52 -0500 Received: (Authenticated sender: juri@linkov.net) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id D650520002; Sat, 13 Nov 2021 17:48:44 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> Date: Sat, 13 Nov 2021 19:45:52 +0200 In-Reply-To: <87lf1sw6ji.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 14:04:33 +0100") Message-ID: <86h7cgdk4v.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > Attached is a patch that adds support for an outline default state in > Diff buffers. Thanks. > One state makes only files and hunks headings visibles. Another one > outlines files with long hunks. A third value is proposed for users who > want to implement their own state. > > My point is that, when I first review a changeset, I am trying to get an > overview of the changes; And files cumulating long hunks often don't > help for that matter. > > Tell me if it's worth including in Emacs 29. I'm using outline-minor-mode in diff buffers all the time with (add-hook 'diff-mode-hook 'outline-minor-mode) and would like to understand how your patch improves this. Could the above hook be replaced with customization of diff-outline-default-state? > +;; - Support outlining files by name (eg to skip automatically > +;; generated files like package-lock.json in Javascript projects). >… > +(defcustom diff-file-outline-threshold 50 > + "Number of lines of hunks for a file to be outlined. Often the files that need to be hidden contain just one very long line without newlines such as in compiled assets, etc. and eventually make Emacs unresponsive. This is a big problem. Would it be possible in your patch to check the size of the hunk counting characters instead of lines? From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 18:09:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163682689617171 (code B ref 51809); Sat, 13 Nov 2021 18:09:01 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 18:08:16 +0000 Received: from localhost ([127.0.0.1]:48031 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxRo-0004St-6Q for submit@debbugs.gnu.org; Sat, 13 Nov 2021 13:08:16 -0500 Received: from mail-wr1-f44.google.com ([209.85.221.44]:38522) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxRj-0004Sc-LD for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 13:08:15 -0500 Received: by mail-wr1-f44.google.com with SMTP id u18so21607384wrg.5 for <51809@debbugs.gnu.org>; Sat, 13 Nov 2021 10:08:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=u4BRVqzXq8dffPEEKuf5Q2EU7Q8lqJqql0UIoXVAxNQ=; b=que00FrfKsg0eaYVjliDcZbQ9dbS7iqt/nx1JDUuv6Uj7mLImV/jCkHsdb/YYY2uVs hj+ifG+iZ2iWEY5UTWpduBXoGKQbA/7ej0C3gk8+QornvR/TGcmOKiH3fhyH9AU+tuiD dq6mGIEb5r9bt29RmNKRF+8qrs0GQ1IxzW7cX1mXWHHMxHeV1EWM5HF9Gs87DSfVXWXB QegBcuMLDYDw6cTT/7v2hhh0vxTzATapMMdFXb0I2cO5WIqY1WMBI6RFHFR+a1ap+NV0 YN6QwQVtXsFAM4XVUSIqqHkFuPOs0f4ytvHWmh9WYqZjEm4MyNhXGuvb7pyfveD6vfIS PVug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=u4BRVqzXq8dffPEEKuf5Q2EU7Q8lqJqql0UIoXVAxNQ=; b=m2/NlxjCZG0iT9FWKXoQVJM3tCUSWUqgns7EfrQiLbeTuyp/ub8yxoanDIiZV2hqJX 4hGfB+T7yjRoAlqhZ4/M19rdoiBX50fI2A0MqvSehwjv9r/1NRmc1tgNMbeBPBdQia6m JkbekOi/fa7dFRx8Z+R0Ny9j+i/r/epidTU4RSR7lGulcP3ZUmCuR0IrdlY+Mr49nvVL gT8cZDaLKbje4lBlhc/d9KbwMqmcZ8XF8fbk83vD1gF/ToRgBwGblnTP5qHBN+Evdic4 Kb3bBKAqwUbUl050nhgwutJYYEPUs91xb4L2c2wOQB27Wj/pK4UKa8wEpDKBWfdNyuF0 hIcg== X-Gm-Message-State: AOAM531/+Osngne1YqOHFS+8uIsRb8KNC+EzVQmLMp7tgAsPGrILdGAA SbtxmEvlQJQxgT6TAEFAR2Ps3KxfZLI= X-Google-Smtp-Source: ABdhPJzeT5Rcdm6ZlTOpEbp1ny2kE2ZELxl3XQKFVGHJlbWxdR8rus0Gk3qPLHQMEh7NQOe7NTDdIg== X-Received: by 2002:adf:f08d:: with SMTP id n13mr31170041wro.395.1636826885822; Sat, 13 Nov 2021 10:08:05 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id f7sm16795386wmg.6.2021.11.13.10.08.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Nov 2021 10:08:05 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> Date: Sat, 13 Nov 2021 19:08:04 +0100 In-Reply-To: <86h7cgdk4v.fsf@mail.linkov.net> (Juri Linkov's message of "Sat, 13 Nov 2021 19:45:52 +0200") Message-ID: <87ee7kvshn.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > (...) I'm using outline-minor-mode in diff buffers all the time with > (add-hook 'diff-mode-hook 'outline-minor-mode) and would like to > understand how your patch improves this. > > Could the above hook be replaced with customization of > diff-outline-default-state? It was supposed to. But I am also using outline-minor-mode in diff buffers all the time with the same hook as you, and I must confess I've not tested until you asked: `diff-outline-apply-default-state' is supposed to automatically turn on `outline-minor-mode' but I forgot to autoload the later resulting in "Symbol=E2=80=99s value as variable is void: outline-minor-mode". I'll fix this. > >> +;; - Support outlining files by name (eg to skip automatically >> +;; generated files like package-lock.json in Javascript projects). >>=E2=80=A6 >> +(defcustom diff-file-outline-threshold 50 >> + "Number of lines of hunks for a file to be outlined. > > Often the files that need to be hidden contain just one very long line > without newlines such as in compiled assets, etc. and eventually make > Emacs unresponsive. This is a big problem. Would it be possible > in your patch to check the size of the hunk counting characters > instead of lines? Good point. I guess counting characters can be achieved by: (- (overlay-end overlay) (overlay-start overlay)) thus it looks feasible. Wouldn't it better to add a new choice "Outline hunks with long lines" and allow multiple choices in `diff-outline-default-state' customization? It would allow to implement one more usefull choice (from my pov), "Outline files by name" to hide automatically generated files (like package-lock.json in Javascript projects using NPM)... Does it looks reasonnable to you? --=20 Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 18:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163682815619236 (code B ref 51809); Sat, 13 Nov 2021 18:30:01 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 18:29:16 +0000 Received: from localhost ([127.0.0.1]:48040 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxm8-00050B-7X for submit@debbugs.gnu.org; Sat, 13 Nov 2021 13:29:16 -0500 Received: from relay10.mail.gandi.net ([217.70.178.230]:50819) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxm4-0004zv-Hv for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 13:29:15 -0500 Received: (Authenticated sender: juri@linkov.net) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 514BA240005; Sat, 13 Nov 2021 18:29:04 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> Date: Sat, 13 Nov 2021 20:27:36 +0200 In-Reply-To: <87ee7kvshn.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 19:08:04 +0100") Message-ID: <86pmr3c3mv.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >>> +;; - Support outlining files by name (eg to skip automatically >>> +;; generated files like package-lock.json in Javascript projects). >>>… >>> +(defcustom diff-file-outline-threshold 50 >>> + "Number of lines of hunks for a file to be outlined. >> >> Often the files that need to be hidden contain just one very long line >> without newlines such as in compiled assets, etc. and eventually make >> Emacs unresponsive. This is a big problem. Would it be possible >> in your patch to check the size of the hunk counting characters >> instead of lines? > > Good point. I guess counting characters can be achieved by: > (- (overlay-end overlay) (overlay-start overlay)) > thus it looks feasible. It seems this should work. > Wouldn't it better to add a new choice "Outline hunks with long lines" > and allow multiple choices in `diff-outline-default-state' > customization? Many customizable variables that check the size such as large-file-warning-threshold etc. count bytes/characters. But if you think that someone might want to restrict only the number of lines whereas wanting to see long lines, then a new option could be added too. > It would allow to implement one more usefull choice (from my pov), > "Outline files by name" to hide automatically generated files (like > package-lock.json in Javascript projects using NPM)... > > Does it looks reasonnable to you? An option to hide by file names (I assume a regexp?) looks useful too. This is how I configured the xref output buffer to initially hide only ChangeLog and test files: #+begin_src emacs-lisp (add-hook 'xref-after-update-hook (lambda () (setq-local outline-regexp (if (eq xref-file-name-display 'abs) "/" "[^ 0-9]")) (outline-minor-mode +1) (save-excursion (goto-char (point-min)) (while (and (re-search-forward "ChangeLog\\|test/manual/etags" nil t) (get-text-property (point) 'xref-group)) (outline-cycle))))) #+end_src Something like this could be customizable in diff-mode. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 18:42:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163682888720527 (code B ref 51809); Sat, 13 Nov 2021 18:42:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 18:41:27 +0000 Received: from localhost ([127.0.0.1]:48057 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxxv-0005L1-65 for submit@debbugs.gnu.org; Sat, 13 Nov 2021 13:41:27 -0500 Received: from mail-wr1-f49.google.com ([209.85.221.49]:44596) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlxxs-0005Kg-W2 for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 13:41:25 -0500 Received: by mail-wr1-f49.google.com with SMTP id n29so21661490wra.11 for <51809@debbugs.gnu.org>; Sat, 13 Nov 2021 10:41:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=LuJoc0dVlPOnY+8INI9suDCuwMg/Uz5aQqdD+m8kFdk=; b=fR2vziQCZv4ziwivMDXIFTV4H25nehemRnkryEJ8desLIq7BDx2uw+vAYseqXek9KK rrH2gYloifFvzGs23SGsrTIKG/utiNsgpPJI/U5ZMpzXywuJrPh1sS2wTSELnFKWJyFv rLKha8N+EeSYHElwPEgH1LMAK5r+lwS70EQ/RcszGgiUpDw8rondCgpy2MF4Dj0lTmE2 FA+VX0ulsg9P6DnD46Tg2kPPNHiWocV+Yf4hnFmqw26R2aXhAvkNpZL6/AQyRBEHcvxt GjHRY5IoKcSkntHFsQMkF7WPQebJPsnr2aUHaNzyLXP/qaKdtq8YKRJ5YpM1rz7RSnUM QJAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=LuJoc0dVlPOnY+8INI9suDCuwMg/Uz5aQqdD+m8kFdk=; b=V7m905aBNPItJadsCwng3WD0gohp9pq4D0tIQcL4YhpYQAy91Q/EGqB7wGCrAIE3/X aH8ZAYLKHWCgA6IDtMk4elynTJLmZnAdx8Lu6nGAqc7ixqCqjMKrrq23UI5fJSgdNPxt cUTQidBOh1Fnp06gZmG3swUhRGLR1vMh0qRaXdpF8O3ufzg32336r2anXCi5k70vhP+y IEXOVovDcyyz2hmkpAw6EYrPg1pySzA1y/YHVPN6A+IVPMeR1cZwm39ZHy21xfCq47Bv yXwEZuGR1g0mjkKFxa6ykjSSAnUqFsxROznxB/MoByfIvjCifee6nkiqIsvjAuwWnFeT kdDA== X-Gm-Message-State: AOAM530AV365J6zzlfuUuhECO26uFExkef4xl+mmzVi7IdbecVrfD9TL U2/LxVvonNHM5+0IAZATj7bcdarEu9c= X-Google-Smtp-Source: ABdhPJzQlwpN0p4m85CiNsWjEeB4Cv7zlRt7KVKuMT976WDkeX+GedoDHPX4C62dZ+ypuk5FUjUX5g== X-Received: by 2002:a05:6000:4b:: with SMTP id k11mr29294527wrx.86.1636828879011; Sat, 13 Nov 2021 10:41:19 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id be3sm4840901wmb.1.2021.11.13.10.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Nov 2021 10:41:18 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> Date: Sat, 13 Nov 2021 19:41:17 +0100 In-Reply-To: <87ee7kvshn.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 19:08:04 +0100") Message-ID: <87a6i7x5iq.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Matthias Meulien writes: >> (...) Could the above hook be replaced with customization of >> diff-outline-default-state? With the attached patch, Outline minor mode is automatically enabled when `diff-outline-default-state' is customized. Tested within "emacs -q". That said, I am not a proficient elisper and my use of the autoload, declare-function, eval-when-compile machinery may not be standard. Sorry for this. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Support-for-outline-default-state-in-Diff-buffers.patch >From 967df41ffc0bcaf74d4b2c8da4be9a354169498b Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Sat, 13 Nov 2021 12:08:58 +0100 Subject: [PATCH] Support for outline default state in Diff buffers * lisp/vc/diff-mode.el (diff-outline-default-state): Add custom variable that defines an outline state and apply that state in Diff buffers. --- lisp/vc/diff-mode.el | 95 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index e68aa2257d..8751a9905c 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -50,7 +50,11 @@ ;; ;; - in diff-apply-hunk, strip context in replace-match to better ;; preserve markers and spacing. +;; ;; - Handle `diff -b' output in context->unified. +;; +;; - Support outlining files by name (eg to skip automatically +;; generated files like package-lock.json in Javascript projects). ;;; Code: (eval-when-compile (require 'cl-lib)) @@ -62,6 +66,9 @@ (defvar vc-find-revision-no-save) (defvar add-log-buffer-file-name-function) +(eval-when-compile (require 'outline)) +(autoload 'outline-minor-mode "outline") +(defvar outline-minor-mode) (defgroup diff-mode () "Major mode for viewing/editing diffs." @@ -147,6 +154,27 @@ diff-font-lock-syntax (const :tag "Highlight syntax" t) (const :tag "Allow hunk-based fallback" hunk-also))) +(defcustom diff-outline-default-state nil + "If non-nil, some files or hunk are outlined. +Outlining is performed by Outline minor mode. + +If `hide-body', only file and hunk headings are visible. + +If `size-threshold', files whose hunks cover more than +`diff-file-outline-threshold' lines are outlined." + :version "29.1" + :type '(choice (const :tag "Don't outline " nil) + (const :tag "Outline hunks" hide-body) + (const :tag "Outline files with long hunks" size-threshold) + (function :tag "Custom function"))) + +(defcustom diff-file-outline-threshold 50 + "Number of lines of hunks for a file to be outlined. + +Used by `diff-outline-file-according-to-size'." + :version "29.1" + :type '(natnum :tag "Number of lines")) + (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") @@ -1578,7 +1606,8 @@ diff-setup-whitespace (defun diff-setup-buffer-type () "Try to guess the `diff-buffer-type' from content of current Diff mode buffer. -`outline-regexp' is updated accordingly." +`outline-regexp' is updated accordingly and outline default state +applied." (save-excursion (goto-char (point-min)) (setq-local diff-buffer-type @@ -1589,7 +1618,8 @@ diff-setup-buffer-type (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)) + (setq-local outline-regexp diff-outline-regexp) + (diff-outline-apply-default-state)) (defun diff-delete-if-empty () ;; An empty diff file means there's no more diffs to integrate, so we @@ -2143,6 +2173,67 @@ diff-refresh-hunk (delete-file file1) (delete-file file2)))) +(defun diff-outline-apply-default-state () + "Apply the outline state defined by `diff-outline-default-state'. + +When `diff-outline-default-state' is non-nil, Outline minor mode +is enabled." + (when diff-outline-default-state + (when (not outline-minor-mode) + (outline-minor-mode)) + (cond + ((eq diff-outline-default-state 'size-threshold) + (diff-outline-file-according-to-size)) + ((eq diff-outline-default-state 'hide-body) + (outline-hide-body)) + ((when (functionp diff-outline-default-state) + (funcall diff-outline-default-state)))))) + +(defun diff-outline-file-according-to-size () + "Outline file with long hunks. + +A file is outlined when its hunks cover more than +`diff-file-outline-threshold' lines. Does nothing when Outline +minor mode is not enabled. + +Inspired by `outline-hide-sublevels'." + (interactive) + (when outline-minor-mode + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point))))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide sublevels + (outline-hide-sublevels 1) + ;; Then unhide short subtrees + (outline-map-region + (lambda () + (when (= (funcall outline-level) 1) + (goto-char (match-end 0)) + (let ((overlays (overlays-at (point)))) + (while overlays + (let ((overlay (car overlays))) + (progn + (when (eq (overlay-get overlay 'invisible) 'outline) + (let ((size (count-lines + (overlay-end overlay) + (overlay-start overlay)))) + (goto-char (match-beginning 0)) + (if (< size diff-file-outline-threshold) + (outline-show-subtree) + (outline-show-branches)))) + (setq overlays (cdr overlays)))))))) + beg end))))) + ;;; Fine change highlighting. (defface diff-refine-changed -- 2.30.2 --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 19:31:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163683181325540 (code B ref 51809); Sat, 13 Nov 2021 19:31:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 19:30:13 +0000 Received: from localhost ([127.0.0.1]:48102 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlyj7-0006dr-Ho for submit@debbugs.gnu.org; Sat, 13 Nov 2021 14:30:13 -0500 Received: from relay8-d.mail.gandi.net ([217.70.183.201]:56395) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mlyj5-0006cT-Hf for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 14:30:12 -0500 Received: (Authenticated sender: juri@linkov.net) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 25C7E1BF205; Sat, 13 Nov 2021 19:30:03 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> Date: Sat, 13 Nov 2021 21:29:12 +0200 In-Reply-To: <87a6i7x5iq.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 19:41:17 +0100") Message-ID: <86k0hbam7r.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >>> (...) Could the above hook be replaced with customization of >>> diff-outline-default-state? > > With the attached patch, Outline minor mode is automatically enabled > when `diff-outline-default-state' is customized. Tested within "emacs > -q". That said, I am not a proficient elisper and my use of the > autoload, declare-function, eval-when-compile machinery may not be > standard. Sorry for this. > +(autoload 'outline-minor-mode "outline") Actually, outline-minor-mode is already autoloaded, so no special handling is needed for it. But the problem is that too many outline functions are used in diff-mode.el in your patch. This is a clear indication that some part should be moved to outline.el. Note that the following function has no diff-specific code, so it could be refactored and some generalized function added to outline.el. Such function could be like `outline-map-region' to accept arguments `beg', `end' and a predicate function that defines whether to hide or show the body. > + (when outline-minor-mode > + (save-excursion > + (let* (outline-view-change-hook > + (beg (progn > + (goto-char (point-min)) > + ;; Skip the prelude, if any. > + (unless (outline-on-heading-p t) (outline-next-heading)) > + (point))) > + (end (progn > + (goto-char (point-max)) > + ;; Keep empty last line, if available. > + (if (bolp) (1- (point)) (point))))) > + (if (< end beg) > + (setq beg (prog1 end (setq end beg)))) > + ;; First hide sublevels > + (outline-hide-sublevels 1) > + ;; Then unhide short subtrees > + (outline-map-region > + (lambda () > + (when (= (funcall outline-level) 1) > + (goto-char (match-end 0)) > + (let ((overlays (overlays-at (point)))) > + (while overlays > + (let ((overlay (car overlays))) > + (progn > + (when (eq (overlay-get overlay 'invisible) 'outline) > + (let ((size (count-lines > + (overlay-end overlay) > + (overlay-start overlay)))) > + (goto-char (match-beginning 0)) > + (if (< size diff-file-outline-threshold) > + (outline-show-subtree) > + (outline-show-branches)))) > + (setq overlays (cdr overlays)))))))) > + beg end))))) From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 21:29:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163683889013910 (code B ref 51809); Sat, 13 Nov 2021 21:29:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 21:28:10 +0000 Received: from localhost ([127.0.0.1]:48308 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mm0ZF-0003cI-SU for submit@debbugs.gnu.org; Sat, 13 Nov 2021 16:28:10 -0500 Received: from mail-wm1-f46.google.com ([209.85.128.46]:51815) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mm0ZB-0003bk-7d for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 16:28:08 -0500 Received: by mail-wm1-f46.google.com with SMTP id z200so10613684wmc.1 for <51809@debbugs.gnu.org>; Sat, 13 Nov 2021 13:28:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=9W+xJS/8OF3hfO2V1BrkCUJm3xGkA8amfDS6i68dNJM=; b=VJFr6PfjlM55wHTkl1WOBdbcp7/wzUVTbkmUF6tu8W8mTZbze2smVhffNecKNRH7TQ OSa293WznWEFQkvqM3orvimCjUyViRNRlu2zCIWWdSIg6Gu6liYmYGr4Z7mnwl0wzMP3 0q1x95Vt7JBpvenduGrewleI/tvzAXwOtF4Bmcn4xcdzbIMVT6CiLnFHdFjw6VY0si83 4FyLLMx8lrFP94jEjV1/7wEzreimxdE5XN22azXqHXcfgZcFzEcayrTty2+gGeGvL110 Qkwc9ICRKKfopQAYYxeZVnbKz3EYbh2ZjZpv7oCQIVjgPzL+ALS0q6tI+iX+7F5e9X1M L1Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=9W+xJS/8OF3hfO2V1BrkCUJm3xGkA8amfDS6i68dNJM=; b=kA81XwVQnc+qXJ6mq+pg61Lb72MR2lIEfiAudsXdJy2gS17koWTLNy4O7dRL+yj51f 0MDa4z2xCBzzjSo7WL1ocotQGN0Vs92yx92sNnDzsce+seVv4nD9uQA2D2RtUf3wccfj nVdbqxmcSjOL0fZKlh5oqPvVNfgWvq+GcfJBWFYMkyXV3KfuNQkAxqjSBLkAkEfVIsXR nRAsGdVoPd7Wbg6reyPMF3bblNDYIEsSkp/Ur/BJQuoS1BQoGh6WIFlXf2CI9LEom2W/ CVRAfIjcm5WFLg+8QFKjriXl4L33z4SFO/LcHN3O2GJOf2kc2wUTPH4C6/OGy9u8JEXI 6q4A== X-Gm-Message-State: AOAM532lFZl/4RymFM+xTUTvZrg4GnPL8jAlOQMVieGOQunCH0e2nvcs GeguZlr6E8KlfWzyptaTW8oUJDEi1XA= X-Google-Smtp-Source: ABdhPJx9aLYFzuyplQyLpiJTWsr/8flF0q+E5lDNERl3YCNHLkUgzgLoXu001BMUt3UIrP8Dj20JKA== X-Received: by 2002:a05:600c:3b28:: with SMTP id m40mr46642674wms.100.1636838879042; Sat, 13 Nov 2021 13:27:59 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id o63sm10151595wme.2.2021.11.13.13.27.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Nov 2021 13:27:58 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> Date: Sat, 13 Nov 2021 22:27:52 +0100 In-Reply-To: <86k0hbam7r.fsf@mail.linkov.net> (Juri Linkov's message of "Sat, 13 Nov 2021 21:29:12 +0200") Message-ID: <87wnlbwxt3.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Juri Linkov writes: Thanks for your comments! >> +(autoload 'outline-minor-mode "outline") > > Actually, outline-minor-mode is already autoloaded, so no special > handling is needed for it. Ok, I'll improve this. > But the problem is that too many outline functions are used in > diff-mode.el in your patch. This is a clear indication that > some part should be moved to outline.el. You're right. > Note that the following function has no diff-specific code, so it could > be refactored and some generalized function added to outline.el. Such > function could be like `outline-map-region' to accept arguments `beg', `end' > and a predicate function that defines whether to hide or show the > body. Ok. I'll make a try. In the meantime, here is a new version that implements both: - Outline based on presence of long lines (using `so-long-detected-long-line-p' predicate) - Outline based on file names matching a regexp (well, truly file heading matching a regexp). --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Support-for-outline-default-state-in-Diff-buffers.patch >From a571efeb5f90e42d1c86e0bef8fe0ebba819914c Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Sat, 13 Nov 2021 12:08:58 +0100 Subject: [PATCH] Support for outline default state in Diff buffers * lisp/vc/diff-mode.el (diff-outline-default-state): Add custom variable that defines an outline state and apply that state in Diff buffers. --- lisp/vc/diff-mode.el | 166 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 164 insertions(+), 2 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index e68aa2257d..578e80b4e2 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -50,7 +50,11 @@ ;; ;; - in diff-apply-hunk, strip context in replace-match to better ;; preserve markers and spacing. +;; ;; - Handle `diff -b' output in context->unified. +;; +;; - Support outlining files by name (eg to skip automatically +;; generated files like package-lock.json in Javascript projects). ;;; Code: (eval-when-compile (require 'cl-lib)) @@ -62,6 +66,15 @@ (defvar vc-find-revision-no-save) (defvar add-log-buffer-file-name-function) +(eval-when-compile (require 'outline)) +(autoload 'outline-minor-mode "outline") +(defvar outline-minor-mode) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) (defgroup diff-mode () "Major mode for viewing/editing diffs." @@ -147,6 +160,61 @@ diff-font-lock-syntax (const :tag "Highlight syntax" t) (const :tag "Allow hunk-based fallback" hunk-also))) +(defcustom diff-outline-default-state nil + "If non-nil, some files or hunk are outlined. +Outlining is performed by Outline minor mode. + +If equal to `outline-hunks', only file and hunk headings are +visibles. + +If equal to a lambda function or function name, this function is +expected to toggle file or hunks visibility, and will be called +after the mode is enabled. + +If equal to a list of symbols, hunk headings will be outlined +depending on the conditions defined for each symbol: + +- If `line-count-threshold', when hunks under a given file + heading cover more than `diff-outline-line-count-threshold' + lines, they are outlined; + +- If `file-heading-regexp', file headings which match the regexp + `diff-outline-file-heading-regexp' are outlined; + +- If `long-line-threshold', when a hunk under a given file + heading have a line with more than + `diff-outline-long-line-threshold' characters, all hunks for + that file heading are outlined." + :version "29.1" + :type '(choice (const :tag "Don't outline " nil) + (const :tag "Outline hunks" outline-hunks) + (set :tag "Outline some files" + (const + :tag "Outline files with long hunks" + line-count-threshold) + (const + :tag "Outline files by name" + file-heading-regexp) + (const + :tag "Outline files whose hunks involve long lines" + long-line-threshold)) + (function :tag "Custom function"))) + +(defcustom diff-outline-line-count-threshold 50 + "Minimal number of lines of hunks for a file to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defcustom diff-outline-file-heading-regexp "ChangeLog\\|package-lock\\.json" + "Regexp to match file headings to be outlined." + :version "29.1" + :type '(regexp :tag "Files to outline")) + +(defcustom diff-outline-long-line-threshold 1000 + "Minimal number of characters in a line for a file to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") @@ -1578,7 +1646,8 @@ diff-setup-whitespace (defun diff-setup-buffer-type () "Try to guess the `diff-buffer-type' from content of current Diff mode buffer. -`outline-regexp' is updated accordingly." +`outline-regexp' is updated accordingly and outline default state +applied." (save-excursion (goto-char (point-min)) (setq-local diff-buffer-type @@ -1589,7 +1658,8 @@ diff-setup-buffer-type (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)) + (setq-local outline-regexp diff-outline-regexp) + (diff-outline-apply-default-state)) (defun diff-delete-if-empty () ;; An empty diff file means there's no more diffs to integrate, so we @@ -2143,6 +2213,98 @@ diff-refresh-hunk (delete-file file1) (delete-file file2)))) +(defun diff-outline-apply-default-state () + "Apply the outline state defined by `diff-outline-default-state'. + +When `diff-outline-default-state' is non-nil, Outline minor mode +is enabled." + (when diff-outline-default-state + (when (not outline-minor-mode) + (outline-minor-mode)) + (cond + ((eq diff-outline-default-state 'outline-hunks) + (outline-hide-body)) + ((listp diff-outline-default-state) + (diff--outline-apply-default-state)) + ((when (functionp diff-outline-default-state) + (funcall diff-outline-default-state)))))) + +(defun diff--outline-apply-default-state () + "Outline file or hunks according to `diff-outline-default-state'. + +See `diff-outline-default-state' for details. + +Inspired by `outline-hide-sublevels'." + (interactive) + (when outline-minor-mode + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point))))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide sublevels + (outline-hide-sublevels 1) + ;; Then unhide short subtrees + (outline-map-region + (lambda () + (when (= (funcall outline-level) 1) + (goto-char (match-end 0)) + (let ((overlays (overlays-at (point)))) + (while overlays + (let ((overlay (car overlays))) + (progn + (when (eq (overlay-get overlay 'invisible) 'outline) + (goto-char (match-beginning 0)) + (cond + ((and + (memq 'file-heading-regexp + diff-outline-default-state) + ;; hide entry when file heading match + ;; `diff-outline-file-heading-regexp' + (message (concat "trying regexp on " (match-string 0))) + (string-match-p + diff-outline-file-heading-regexp + (match-string 0))) + (outline-hide-entry)) + + ((and + (memq 'line-count-threshold + diff-outline-default-state) + ;; show only branches when line count > + ;; threshold + (let ((line-count (count-lines + (overlay-end overlay) + (overlay-start overlay)))) + (< diff-outline-line-count-threshold line-count))) + (outline-show-branches)) + + ((and + (memq 'long-line-threshold + diff-outline-default-state) + ;; show only branches when a long line is + ;; detected + (save-restriction + (narrow-to-region (overlay-start overlay) + (overlay-end overlay)) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold + diff-outline-long-line-threshold) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))) + (outline-show-branches)) + + (t (outline-show-subtree)))) + (setq overlays (cdr overlays)))))))) + beg end))))) + ;;; Fine change highlighting. (defface diff-refine-changed -- 2.30.2 --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 13 Nov 2021 23:30:04 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16368461642329 (code B ref 51809); Sat, 13 Nov 2021 23:30:04 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Nov 2021 23:29:24 +0000 Received: from localhost ([127.0.0.1]:48473 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mm2SZ-0000bV-Me for submit@debbugs.gnu.org; Sat, 13 Nov 2021 18:29:24 -0500 Received: from mail-wr1-f54.google.com ([209.85.221.54]:44721) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mm2SW-0000bH-PH for 51809@debbugs.gnu.org; Sat, 13 Nov 2021 18:29:21 -0500 Received: by mail-wr1-f54.google.com with SMTP id n29so22425490wra.11 for <51809@debbugs.gnu.org>; Sat, 13 Nov 2021 15:29:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=aPw/dq/+E/risRZKWfFRccNB1qFIVEkLoHFTdhBplqU=; b=XS4/sNkTJ0EdvpOh9yJhLhtviSeI1EhVXA50C4q1gBKTMt0H+3XEIIvgEc0fIWn3lk 3bCMZ7qeoi2LADef2+lhlXuEZH2QG97D9J/p5opizLi5VgAaUZiUdBCRCISEjtS0rXa4 EGHxjHciL13Umk8EuaYiuoTCwGWYhU8Yz77XDFPHnPN+mFbwY7svcB71qQ2DE0OdNR1m dWqraEV10m0JVPpo1k+MrqmPSZh3r+zG91WSrxaRRHNs/lF3eTFWXdvgMCrCRYivMllh znvMTZcxaw24683utiW3AQqS4hr+Szs2gPScnPJjzXGUKQh4mdnfink+TGi0zg1zi8u8 CH3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=aPw/dq/+E/risRZKWfFRccNB1qFIVEkLoHFTdhBplqU=; b=xgQVHESqzgMIUfLJqw7WOL2p3ApDnnRWWeB2y3lmqIDerah8rRPL3Mt8DGgf4f3ca9 WMaPUhjfnu2xLGk6kghfVuaNSM68Pa2dLwksjGPyDrl+/YX2AYQujak4+n4Kzdwq+Edj So8LJBZUascOUorxO478vXSTDtgR86R62rQRXFw3KHIiesvu4ZxrWD2/rr/9WVAgIzh0 RBiFGZ1bn7bRxXbx1kCsUefUfo5nXLLTEoBA1leebW8TB5KM0/na43OBgr00y8ltWTWQ ApX+G58Sn7UO9vJmvuAuIwMEA0l/TAQdO7zpnMNCfnXpi/pVo6K19sMzEiVwtMxPTPGL pWkA== X-Gm-Message-State: AOAM533ZZBZeOYOfWmXE2BYxuX5/6M3WkA608JUq62OFS6ZHcBUaEKYy 5ky5LhBpcsOQVkSquyoIgWWn76RjOjk= X-Google-Smtp-Source: ABdhPJxYx7l27Orhquzh25P7XWQDcNdwxugH/AWoJsA2aXX8iPJNrRwoJEdns+niMwqoXPm60B/BSQ== X-Received: by 2002:adf:f708:: with SMTP id r8mr32039536wrp.198.1636846154940; Sat, 13 Nov 2021 15:29:14 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id x1sm9604441wmc.22.2021.11.13.15.29.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Nov 2021 15:29:14 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> Date: Sun, 14 Nov 2021 00:29:13 +0100 In-Reply-To: <86k0hbam7r.fsf@mail.linkov.net> (Juri Linkov's message of "Sat, 13 Nov 2021 21:29:12 +0200") Message-ID: <878rxrmy7q.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Updated patch that takes Juri comments into account. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Support-for-outline-default-state-in-Diff-buffers.patch >From 4a9f53e73dcbcd77df339bca012ee72aec343f18 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Sat, 13 Nov 2021 12:08:58 +0100 Subject: [PATCH] Support for outline default state in Diff buffers * lisp/outline.el (outline-map-sublevel-overlay): * lisp/vc/diff-mode.el (diff-outline-default-state): Variable that defines an outline state. (diff-outline-apply-default-state) (diff--outline-set-file-heading-visibility): Apply outline state defined in `diff-outline-default-state'. --- lisp/outline.el | 40 ++++++++++++++ lisp/vc/diff-mode.el | 128 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 166 insertions(+), 2 deletions(-) diff --git a/lisp/outline.el b/lisp/outline.el index cefb811703..77de31f785 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -1100,6 +1100,46 @@ outline-hide-sublevels (define-obsolete-function-alias 'hide-sublevels #'outline-hide-sublevels "25.1") +(defun outline-map-sublevel-overlay (level fun) + "Hide everything and call FUN on the LEVEL sublevels of headers . + +When FUN is called, point is at the beginning of the heading, the +match data is set appropriately, and FUN receives one argument, +the outline overlay for the heading entry. + +This also unhides the top heading-less body, if any." + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point))))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (when (= (funcall outline-level) level) + (goto-char (match-end 0)) + (let ((overlays (overlays-at (point)))) + (while overlays + (let ((overlay (car overlays))) + (when (eq (overlay-get overlay 'invisible) 'outline) + (goto-char (match-beginning 0)) + (funcall fun overlay)) + (setq overlays (cdr overlays))))))) + beg end))) + (run-hooks 'outline-view-change-hook)) + (defun outline-hide-other () "Hide everything except current body and parent and top-level headings. This also unhides the top heading-less body, if any." diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index e68aa2257d..9617e6ceee 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -50,6 +50,7 @@ ;; ;; - in diff-apply-hunk, strip context in replace-match to better ;; preserve markers and spacing. +;; ;; - Handle `diff -b' output in context->unified. ;;; Code: @@ -62,6 +63,18 @@ (defvar vc-find-revision-no-save) (defvar add-log-buffer-file-name-function) +(eval-when-compile (require 'outline)) +(defvar outline-minor-mode) +(declare-function outline-minor-mode "outline" (&optional args)) +(declare-function outline-hide-entry "outline") +(declare-function outline-show-branches "outline") +(declare-function outline-show-subtree "outline" (&optional event)) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) (defgroup diff-mode () "Major mode for viewing/editing diffs." @@ -147,6 +160,61 @@ diff-font-lock-syntax (const :tag "Highlight syntax" t) (const :tag "Allow hunk-based fallback" hunk-also))) +(defcustom diff-outline-default-state nil + "If non-nil, some files or hunk are outlined. +Outlining is performed by Outline minor mode. + +If equal to `outline-hunks', only file and hunk headings are +visibles. + +If equal to a lambda function or function name, this function is +expected to toggle file or hunks visibility, and will be called +after the mode is enabled. + +If equal to a list of symbols, hunk headings will be outlined +depending on the conditions defined for each symbol: + +- If `line-count-threshold', when hunks under a given file + heading cover more than `diff-outline-line-count-threshold' + lines, they are outlined; + +- If `file-heading-regexp', file headings which match the regexp + `diff-outline-file-heading-regexp' are outlined; + +- If `long-line-threshold', when a hunk under a given file + heading have a line with more than + `diff-outline-long-line-threshold' characters, all hunks for + that file heading are outlined." + :version "29.1" + :type '(choice (const :tag "Don't outline " nil) + (const :tag "Outline hunks" outline-hunks) + (set :tag "Outline some files" + (const + :tag "Outline files with long hunks" + line-count-threshold) + (const + :tag "Outline files by name" + file-heading-regexp) + (const + :tag "Outline files whose hunks involve long lines" + long-line-threshold)) + (function :tag "Custom function"))) + +(defcustom diff-outline-line-count-threshold 50 + "Minimal number of lines of hunks for a file to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defcustom diff-outline-file-heading-regexp "ChangeLog\\|package-lock\\.json" + "Regexp to match file headings to be outlined." + :version "29.1" + :type '(regexp :tag "Files to outline")) + +(defcustom diff-outline-long-line-threshold 1000 + "Minimal number of characters in a line for a file to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") @@ -1578,7 +1646,8 @@ diff-setup-whitespace (defun diff-setup-buffer-type () "Try to guess the `diff-buffer-type' from content of current Diff mode buffer. -`outline-regexp' is updated accordingly." +`outline-regexp' is updated accordingly and outline default state +applied." (save-excursion (goto-char (point-min)) (setq-local diff-buffer-type @@ -1589,7 +1658,8 @@ diff-setup-buffer-type (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)) + (setq-local outline-regexp diff-outline-regexp) + (diff-outline-apply-default-state)) (defun diff-delete-if-empty () ;; An empty diff file means there's no more diffs to integrate, so we @@ -2143,6 +2213,60 @@ diff-refresh-hunk (delete-file file1) (delete-file file2)))) +(defun diff-outline-apply-default-state () + "Apply the outline state defined by `diff-outline-default-state'. + +When `diff-outline-default-state' is non-nil, Outline minor mode +is enabled." + (interactive) + (when diff-outline-default-state + (when (not outline-minor-mode) + (outline-minor-mode)) + (cond + ((eq diff-outline-default-state 'outline-hunks) + (outline-hide-body)) + ((listp diff-outline-default-state) + (outline-map-sublevel-overlay + 1 #'diff--outline-set-file-heading-visibility)) + ((when (functionp diff-outline-default-state) + (funcall diff-outline-default-state)))))) + +(defun diff--outline-set-file-heading-visibility (overlay) + (cond + ;; hide entry when file heading match + ;; `diff-outline-file-heading-regexp' + ((and + (memq 'file-heading-regexp + diff-outline-default-state) + (string-match-p + diff-outline-file-heading-regexp + (match-string 0))) + (outline-hide-entry)) + ;; show only branches when line count > threshold + ((and + (memq 'line-count-threshold + diff-outline-default-state) + (let ((line-count (count-lines + (overlay-end overlay) + (overlay-start overlay)))) + (< diff-outline-line-count-threshold line-count))) + (outline-show-branches)) + ;; show only branches when a long line is detected + ((and + (memq 'long-line-threshold + diff-outline-default-state) + (save-restriction + (narrow-to-region (overlay-start overlay) + (overlay-end overlay)) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold + diff-outline-long-line-threshold) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))) + (outline-show-branches)) + ;; otherwise show subtree + (t (outline-show-subtree)))) + ;;; Fine change highlighting. (defface diff-refine-changed -- 2.30.2 --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Nov 2021 18:39:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16369150827558 (code B ref 51809); Sun, 14 Nov 2021 18:39:02 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Nov 2021 18:38:02 +0000 Received: from localhost ([127.0.0.1]:51684 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmKO9-0001xp-Rz for submit@debbugs.gnu.org; Sun, 14 Nov 2021 13:38:02 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:58121) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmKO8-0001xR-Oh for 51809@debbugs.gnu.org; Sun, 14 Nov 2021 13:38:01 -0500 Received: (Authenticated sender: juri@linkov.net) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id E8F77E0008; Sun, 14 Nov 2021 18:37:52 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> Date: Sun, 14 Nov 2021 20:25:18 +0200 In-Reply-To: <87ee7kvshn.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 19:08:04 +0100") Message-ID: <865ysuy56x.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> (...) I'm using outline-minor-mode in diff buffers all the time with >> (add-hook 'diff-mode-hook 'outline-minor-mode) and would like to >> understand how your patch improves this. >> >> Could the above hook be replaced with customization of >> diff-outline-default-state? > > It was supposed to. But I am also using outline-minor-mode in diff > buffers all the time with the same hook as you, and I must confess I've > not tested until you asked: `diff-outline-apply-default-state' is > supposed to automatically turn on `outline-minor-mode' but I forgot to > autoload the later resulting in "Symbol’s value as variable is void: > outline-minor-mode". I'll fix this. Something strange happened recently with diff-mode and outline-minor-mode. I can't use this combination anymore. While reading your patches, I'm trying to type TAB on the hunk header to hide already viewed hunks of your patch. But TAB does nothing now. Do you see the same? TAB is used to hide/show body when outline-minor-mode-cycle is t. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Nov 2021 19:36:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163691854321996 (code B ref 51809); Sun, 14 Nov 2021 19:36:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Nov 2021 19:35:43 +0000 Received: from localhost ([127.0.0.1]:51756 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLHz-0005ii-CJ for submit@debbugs.gnu.org; Sun, 14 Nov 2021 14:35:43 -0500 Received: from mail-wm1-f46.google.com ([209.85.128.46]:35725) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLHy-0005iV-0e for 51809@debbugs.gnu.org; Sun, 14 Nov 2021 14:35:42 -0500 Received: by mail-wm1-f46.google.com with SMTP id 77-20020a1c0450000000b0033123de3425so14114662wme.0 for <51809@debbugs.gnu.org>; Sun, 14 Nov 2021 11:35:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=iKPWAg2N3RCdgB6IhhFFFDOdbRKQgmq1x+fNtYnMbW4=; b=KSFztEevCaF/Y1eCZLZNrMtExsd5pnzEnpW5NaTsz2G80mftLqp0JnBO4Cbhber4Fz RXD5SGTLBPyli8zocmQqvqXyD/q+aSkP928MgzgevzJdSPDTD/oDZFz6+HMra0lLmVsZ M2pko4b8+p4Q8tAzIylOf+q3c8krhZMcO2jOme2SeQLFuXXmZNaSd95wlqnF6lGSP07i PpqwXXUyPyACZxCHtnkZvRW/DG71GqDRBRnQ+UFmB+dBQSld5grT4mIM6fcxkn5f5D6x AIWH3o8tdHZnnS8Tgdv97FCp3/wVRhet9aqatryFRt/h7U3ZMBJ9kjbIs95CJbrqxLuj WF2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=iKPWAg2N3RCdgB6IhhFFFDOdbRKQgmq1x+fNtYnMbW4=; b=JbWq/u/0kru/yNwrJhvSYOtztxE/KUlUWc7aSNQ7yYuTokPGmlOchXTW2lRdamKKis HaqRhRCw6ffWZ/aW4BcIh5chxoOZ1jpwNHIllT4yQ1J5YtEHZJ6skuEdWJzQZq283zY7 BzAVqsjtl7KrjbeFExNoabAMRBIvC3CSxGrAzN16IQrHzvUeKm6WwkyEurD/UntnZyh0 02C9dYAnI2Zo8dZEsKdX/yvqb6FAVHFxKYlnHkbPXu0pEicS9OJpeuEz+PNwQuVDcMTQ WBrjWVf2vgSNwBq35Zpzj9xOHSPNM1JGIDw5Jyax9XloqO7CcHZseCu9zgv9HqnxgioS OEWQ== X-Gm-Message-State: AOAM5301UWqr4xnIbgnLlVtcWQLuL1lg99ZlhQ4v+sjHLTVFj3Oglp5W PWBKds3Lsch+sRNeHaujybNzDL4Z1Oc= X-Google-Smtp-Source: ABdhPJyNyh5e+LNj4EepgghvXTW1fIShyYI1nIlQ4q1X3Jc6+UAbdr6C6Qvv3G35kKk0yz3i9F74bA== X-Received: by 2002:a05:600c:3486:: with SMTP id a6mr20085303wmq.32.1636918536081; Sun, 14 Nov 2021 11:35:36 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id z15sm11807675wrr.65.2021.11.14.11.35.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Nov 2021 11:35:35 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <865ysuy56x.fsf@mail.linkov.net> Date: Sun, 14 Nov 2021 20:35:33 +0100 In-Reply-To: <865ysuy56x.fsf@mail.linkov.net> (Juri Linkov's message of "Sun, 14 Nov 2021 20:25:18 +0200") Message-ID: <8735nymsxm.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > Something strange happened recently with diff-mode and outline-minor-mode. > I can't use this combination anymore. While reading your patches, I'm trying > to type TAB on the hunk header to hide already viewed hunks of your patch. > But TAB does nothing now. Do you see the same? TAB is used to hide/show body > when outline-minor-mode-cycle is t. I've observed too that `outline-minor-mode-cycle' didn't worked well in `diff-mode' buffers but I never saw it working! Since I am used to hitting TAB to go to next button or for completion, and I am used to the horrible `outline-minor-mode-prefix' bindings, my feeling is that TAB was a bad choice for this, and I didn't try to debug: I just turned off `outline-minor-mode-cycle'... Do you have `diff-font-lock-prettify' enabled? I remember the situation was better without this, not sure... -- Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Nov 2021 19:48:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163691927523281 (code B ref 51809); Sun, 14 Nov 2021 19:48:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Nov 2021 19:47:55 +0000 Received: from localhost ([127.0.0.1]:51760 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLTn-00063Q-GY for submit@debbugs.gnu.org; Sun, 14 Nov 2021 14:47:55 -0500 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:36709) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLTk-00062u-Lg for 51809@debbugs.gnu.org; Sun, 14 Nov 2021 14:47:53 -0500 Received: (Authenticated sender: juri@linkov.net) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 58E17240007; Sun, 14 Nov 2021 19:47:44 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <865ysuy56x.fsf@mail.linkov.net> <8735nymsxm.fsf@gmail.com> Date: Sun, 14 Nov 2021 21:46:33 +0200 In-Reply-To: <8735nymsxm.fsf@gmail.com> (Matthias Meulien's message of "Sun, 14 Nov 2021 20:35:33 +0100") Message-ID: <86r1bisep2.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> Something strange happened recently with diff-mode and outline-minor-mode. >> I can't use this combination anymore. While reading your patches, I'm trying >> to type TAB on the hunk header to hide already viewed hunks of your patch. >> But TAB does nothing now. Do you see the same? TAB is used to hide/show body >> when outline-minor-mode-cycle is t. > > I've observed too that `outline-minor-mode-cycle' didn't worked well in > `diff-mode' buffers but I never saw it working! > > Since I am used to hitting TAB to go to next button or for completion, > and I am used to the horrible `outline-minor-mode-prefix' bindings, my > feeling is that TAB was a bad choice for this, and I didn't try to > debug: I just turned off `outline-minor-mode-cycle'... TAB is not a problem when `outline-minor-mode-cycle-filter' is customized to allow outline's TAB only on some parts of the outline heading, e.g. only at the beginning, or everywhere except the beginning of the diff hunk line. Then typing TAB everywhere else will go to the next button. > Do you have `diff-font-lock-prettify' enabled? I remember the situation > was better without this, not sure... Nope, `diff-font-lock-prettify' is disabled. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Nov 2021 19:55:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163691965223898 (code B ref 51809); Sun, 14 Nov 2021 19:55:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Nov 2021 19:54:12 +0000 Received: from localhost ([127.0.0.1]:51773 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLZr-0006DN-Qe for submit@debbugs.gnu.org; Sun, 14 Nov 2021 14:54:12 -0500 Received: from mail-wr1-f47.google.com ([209.85.221.47]:43586) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmLZq-0006DA-Ai for 51809@debbugs.gnu.org; Sun, 14 Nov 2021 14:54:10 -0500 Received: by mail-wr1-f47.google.com with SMTP id t30so26299844wra.10 for <51809@debbugs.gnu.org>; Sun, 14 Nov 2021 11:54:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=3RcbNX+lX7x9F7mIQ4bYkFVbyP7nRNheS/jh/fVVAf0=; b=G0e5NU65Lfv60Avp2iKC7oYaP9F/VNefWMdA0QkRTDKJkqIutLf1mr6MzlCKfoQC/j lXkZKEeTpR9CGsPG64eac+HQh/yBnNWGJ9aTLBQ6BD0JeQkJz8QOi3pbE4a6tBK2nD/R 65B+wvKpY1wsifXXi6p++1j1SexwdGjvZp5qHUOWC5QlXOX5We3pvQRBjMlirOvoDLsk hu7Dn08t1NA3GRcK3XfzoTcsM48SyqIG+jPvX/2yGo2arI/N6Sa7/KK1Ku1dQAbYaTfO X+4ZsG6BTXeY3cohcv1cGH/8eGKfKbEsbFOkNyEUgypKCyhpbXnevdKzt4ga1PsCkngt X/dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=3RcbNX+lX7x9F7mIQ4bYkFVbyP7nRNheS/jh/fVVAf0=; b=u8UKxEDWQpEzZclMKpQTAh5zSU1ATUzzVVSiRIsk9Xe+XDVyoEysdlNPps8kozfv/2 a1SS88WhgjCGg9sU+Lya+GkfxObnYg/5D+yosmD/Llc1CDRVYuX3aB6ULRljlmxhh4kY dUcbNUUwUphabgRbEHDadFH6HRda0hivV3SYoq+EQlsxu9hrqyhdZRGQ8GS3hT8HKVh/ vpwhKkmKZh4WAW0oU9fkPh5B2TOwscTzBrMO35JhVb8tmoKFA3/zOMD2xmxWmTRDYN6q uFjrGTIniRZxSbhUEXF9U7whXzH1jbEa2+RT65QkeZNiQK91qyVzi41oEG6JrIANxQpb FaoA== X-Gm-Message-State: AOAM531Nri0M9EGNl8RTNpiYDSj6naa5ilxLcOGO7Nk9GXYKCvP3NQfC WjwzNxBCmRWKF0RQ+8tlRaOyLJxnnVU= X-Google-Smtp-Source: ABdhPJzTJqUsmdGiXGJ7c22fIICTMdvWK2Fvi3sXIbTIo1jBatlWzxVweM1FWnJjnbSMBwpOtdbVyA== X-Received: by 2002:a5d:6481:: with SMTP id o1mr41324153wri.305.1636919644253; Sun, 14 Nov 2021 11:54:04 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id be3sm7510607wmb.1.2021.11.14.11.54.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Nov 2021 11:54:03 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <865ysuy56x.fsf@mail.linkov.net> Date: Sun, 14 Nov 2021 20:54:02 +0100 In-Reply-To: <865ysuy56x.fsf@mail.linkov.net> (Juri Linkov's message of "Sun, 14 Nov 2021 20:25:18 +0200") Message-ID: <87y25qldid.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > Something strange happened recently with diff-mode and outline-minor-mode. > I can't use this combination anymore. While reading your patches, I'm trying > to type TAB on the hunk header to hide already viewed hunks of your patch. > But TAB does nothing now. Do you see the same? TAB is used to hide/show body > when outline-minor-mode-cycle is t. I just tested it: On hunk heading, TAB calls `diff-hunk-next'. On file headings TAB cycle visibility. It's what I always observed. Looks crazy but not buggy to my eyes. -- Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Nov 2021 20:33:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163692197227731 (code B ref 51809); Sun, 14 Nov 2021 20:33:02 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Nov 2021 20:32:52 +0000 Received: from localhost ([127.0.0.1]:51816 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmMBH-0007DD-Qn for submit@debbugs.gnu.org; Sun, 14 Nov 2021 15:32:51 -0500 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:59309) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mmMBG-0007Cg-Cv for 51809@debbugs.gnu.org; Sun, 14 Nov 2021 15:32:50 -0500 Received: (Authenticated sender: juri@linkov.net) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 9EF9A240005; Sun, 14 Nov 2021 20:32:42 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <865ysuy56x.fsf@mail.linkov.net> <87y25qldid.fsf@gmail.com> Date: Sun, 14 Nov 2021 22:31:02 +0200 In-Reply-To: <87y25qldid.fsf@gmail.com> (Matthias Meulien's message of "Sun, 14 Nov 2021 20:54:02 +0100") Message-ID: <86zgq6pji1.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> Something strange happened recently with diff-mode and outline-minor-mode. >> I can't use this combination anymore. While reading your patches, I'm trying >> to type TAB on the hunk header to hide already viewed hunks of your patch. >> But TAB does nothing now. Do you see the same? TAB is used to hide/show body >> when outline-minor-mode-cycle is t. > > I just tested it: On hunk heading, TAB calls `diff-hunk-next'. On file > headings TAB cycle visibility. It's what I always observed. Looks crazy > but not buggy to my eyes. Before the recent changes, TAB cycled visibility not only on file headings, but also on hunk headings. It was very useful to use TAB to cycle visibility on hunk headings on a long patch where navigating to the file heading to be able to use TAB on it will take too much time. It's much easier to navigate to the nearest hunk heading to cycle its visibility. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 29 Nov 2021 17:23:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163820657315180 (code B ref 51809); Mon, 29 Nov 2021 17:23:02 +0000 Received: (at 51809) by debbugs.gnu.org; 29 Nov 2021 17:22:53 +0000 Received: from localhost ([127.0.0.1]:39218 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mrkMf-0003wh-9f for submit@debbugs.gnu.org; Mon, 29 Nov 2021 12:22:53 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:39473) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mrkMQ-0003w2-IV for 51809@debbugs.gnu.org; Mon, 29 Nov 2021 12:22:39 -0500 Received: (Authenticated sender: juri@linkov.net) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id B9717E000B; Mon, 29 Nov 2021 17:22:31 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> Date: Mon, 29 Nov 2021 19:06:40 +0200 In-Reply-To: <878rxrmy7q.fsf@gmail.com> (Matthias Meulien's message of "Sun, 14 Nov 2021 00:29:13 +0100") Message-ID: <86y256uc0v.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Matthias, > Updated patch that takes Juri comments into account. I didn't forget about your patch. Actually, I have been using it all the time, and it saved me in many cases when long lines in diffs make Emacs unresponsive. With your patch, there are only slight delays for 2-3 seconds while scrolling a lot of hidden outlines, but this is not a problem, thank you very much. I have the same problem of too long outline-body lines in xref buffers, so need to use a similar feature with: #+begin_src emacs-lisp (add-hook 'xref-after-update-hook (lambda () (setq-local outline-regexp (if (eq xref-file-name-display 'abs) "/" "[^ 0-9]")) (outline-minor-mode +1) (outline-map-region (lambda () (when (string-match-p "ChangeLog\\|test/manual/etags" (buffer-substring (line-beginning-position) (line-end-position))) (outline-hide-entry))) (point-min) (point-max)))) #+end_src It would be nice to move this feature completely to outline.el, so it could be used by other modes, not only in diff-mode. Please see bug#49731 that will be closed after this feature will be supported generally by outline-minor-mode. Then there are two variants: to add customizable variables to outline-minor-mode like outline-default-state or outline-hide-initial, or allow hiding initial heading with a hook like (add-hook 'outline-minor-mode-hook 'outline-hide-file-headings) that could use a regexp from e.g. outline-hide-heading-regexp or some better name. > +(defun outline-map-sublevel-overlay (level fun) Instead of adding a new function, you can use outline-map-region after adding a new argument, e.g. (defun outline-map-region (fun beg end &optional next-heading-fun) By default, outline-map-region uses outline-next-heading to move to the next heading, but a new argument could allow to use outline-next-visible-heading or outline-forward-same-level, etc. with (or (and next-heading-fun (funcall next-heading-fun)) (outline-next-heading)) > +(defcustom diff-outline-file-heading-regexp "ChangeLog\\|package-lock\\.json" There is no need to add arbitrary default values. The users know better what values are needed. For example, I customized it to "public/packs", so it hides the outline headings for compiled assets like: "public/packs-pro/js/application-fa9d8202220130e40f46.js" > +(defun diff-outline-apply-default-state () > + (when diff-outline-default-state > + (when (not outline-minor-mode) > + (outline-minor-mode)) Actually, the above lines are not needed because the same can be achieved by: (add-hook 'diff-mode-hook 'outline-minor-mode) > + (cond > + ((eq diff-outline-default-state 'outline-hunks) > + (outline-hide-body)) These lines are not needed too, because the same can be achieved by: (add-hook 'outline-minor-mode-hook 'outline-hide-body) > + ((when (functionp diff-outline-default-state) > + (funcall diff-outline-default-state)))))) And this can be achieved by: (add-hook 'outline-minor-mode-hook 'custom-function) > +(defun diff--outline-set-file-heading-visibility (overlay) > + (cond > + ((and > + (memq 'file-heading-regexp > + diff-outline-default-state) > + (string-match-p > + diff-outline-file-heading-regexp > + (match-string 0))) Here (match-string 0) is unusable in most values of outline-regexp that don't contain the whole heading line. A better way to get the whole heading line usable in modes other than diff-mode would be: (buffer-substring (line-beginning-position) (line-end-position)) From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers In-Reply-To: <87lf1sw6ji.fsf@gmail.com> Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 30 Nov 2021 19:34:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16383008228541 (code B ref 51809); Tue, 30 Nov 2021 19:34:01 +0000 Received: (at 51809) by debbugs.gnu.org; 30 Nov 2021 19:33:42 +0000 Received: from localhost ([127.0.0.1]:42552 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ms8so-0002Dh-Df for submit@debbugs.gnu.org; Tue, 30 Nov 2021 14:33:42 -0500 Received: from mail-wm1-f49.google.com ([209.85.128.49]:44940) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ms8sm-0002DU-SQ for 51809@debbugs.gnu.org; Tue, 30 Nov 2021 14:33:41 -0500 Received: by mail-wm1-f49.google.com with SMTP id p27-20020a05600c1d9b00b0033bf8532855so15563415wms.3 for <51809@debbugs.gnu.org>; Tue, 30 Nov 2021 11:33:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:message-id:mime-version; bh=16cvAqB3D8dz28wv//XGQCoRIPzwb0bVaE8Emv42hfo=; b=fdTawBWfRv/Dy//RMZVIVCBzwsuc5If9v03FlLmWGzFJeALVox+1YRZoPL/ybKgoZq OHWM9FKSrrRNqi4kRqdf4GvEX7doMFZpHnWBMElkmoI7q20pGXE9rs6ByBIoD7twXd9B 6XR3IoOhIfdTxo7P3J5wKml5gj/m9oZBcJxuzlyJ6Iy/tI6/7p3jZlUyB2nX9e/88KZw bgW7vxkdQIgpAYoEqUSRdTlMDnEfLT1wQCcWg2zPZcfxaTXlfLTrvvDZX/w+XGogLRPF Zm8GYEha0nzT1jUVwcQguGEMoeMXMu/zNtTNCztOtUKihPqujernFy4Fj3opkF5t9ntY U5lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:message-id :mime-version; bh=16cvAqB3D8dz28wv//XGQCoRIPzwb0bVaE8Emv42hfo=; b=DNrS7WMOnfayFbYeHF3SgDtmFKJu4VZ2V3W7Uqdf6IRAE52JW/DCuI8mnbvNL76ubM EgkvGob8Vilb+vI/ZmIsf48aDDaT3O4tH0sKKTMeEwQUXrujJBHytTWRVf4vH9797Vc2 5hB4An9ZuD6BhUAR6SQ57gEEF1ZpxwD0fnOL+zNK/emtYUClpLjws4pPcbj6NFKKPrYj NAVD9hs6fmcB22acPexsHEYp7b0Zgg2x6tBRjcWM6OVPUFON8zsrf6dPIbcj/eq10ipw +LFyLeKzr4huw7lAYp6MiUzdYSutJc+W0F//vMFM9rHTodCLl5JiINPmPbxUbLPdwx43 tTTA== X-Gm-Message-State: AOAM5306XdaxOT30VMMSDqxrUuHCSv73f4dIHY+CIEeGx1VQLzFsUMuw yjGFcLcQ6X8zTi60x85YTaz/Wl0nzNk= X-Google-Smtp-Source: ABdhPJxu5CrUMsaIq6SBULOLN16gJbBiMyy6TO1FrNajbiNyZtpAJI+akJUAp8eixrGvrT7FqtBfeg== X-Received: by 2002:a1c:9d03:: with SMTP id g3mr794976wme.143.1638300814839; Tue, 30 Nov 2021 11:33:34 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:f180:2554:8940:34b0]) by smtp.gmail.com with ESMTPSA id n32sm4206647wms.1.2021.11.30.11.33.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Nov 2021 11:33:34 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> Date: Tue, 30 Nov 2021 20:33:33 +0100 Message-ID: <87bl21igky.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Juri, > (...) Actually, I have been using it all the time, and it saved me in > many cases when long lines in diffs make Emacs unresponsive. Good news! > I have the same problem of too long outline-body lines in xref > buffers, (...) It would be nice to move this feature completely to > outline.el, I fully agree. > so it could be used by other modes, not only in diff-mode. > Please see bug#49731 that will be closed after this feature > will be supported generally by outline-minor-mode. > > Then there are two variants: Yes. I'll think of it. If I remember correctly, org-mode handles an initial state too, I've no idea of how it's implemented there. It may help to choose between the two variants in order to merge all implementations in one place at some point. And many thanks for your comments on the patch. I'll modify it after I have had a look at your sugestion to move the feature to outline.el. But since I've not much spare time, please be patient! -- Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 11 Dec 2021 18:19:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163924674023628 (code B ref 51809); Sat, 11 Dec 2021 18:19:02 +0000 Received: (at 51809) by debbugs.gnu.org; 11 Dec 2021 18:19:00 +0000 Received: from localhost ([127.0.0.1]:49958 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mw6xX-000692-Io for submit@debbugs.gnu.org; Sat, 11 Dec 2021 13:18:59 -0500 Received: from mail-wm1-f41.google.com ([209.85.128.41]:54130) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mw6xT-00068S-0d for 51809@debbugs.gnu.org; Sat, 11 Dec 2021 13:18:57 -0500 Received: by mail-wm1-f41.google.com with SMTP id y196so9102142wmc.3 for <51809@debbugs.gnu.org>; Sat, 11 Dec 2021 10:18:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=lUrGX/JN2Zwn2nf80DrQU2Qhpiu8to3tyEqnNigNaIs=; b=dcnHH2KVgIePsGhQgH1LzlPFC9miAD20CUnGB0CUR4cgz0Ulr0n9AsEGrFlDWMxqm/ en1s/mjdRnplitjsLrmC5DzW7jOjJ0CM3K+CHvaiEZGUyxfTXz2bVV3JjbZksJBIwviO pjqDtbEYcVrHSROXpZxE8vu20TTWpuX/z34k8pltluNfQsp+gQQEEw4OjnEGmxhlAeoU lMIbDXIdxpVsG3SqLwMvbvkAweyHw8pLYQFaAvsl7dSLCZ2mryP26mQVf9uU9YDEw85K dLL6IvX7wB4UjY+5xNr3If0X0pRqhJVIQB4XgPbL+6P39lHoMMW2ZKhqUyymU+bD+EXM 5ruA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=lUrGX/JN2Zwn2nf80DrQU2Qhpiu8to3tyEqnNigNaIs=; b=O6AW3Cd1l+k5mAUgkDeqUhz1omOB4kGTV7wK4dDa97G1Eu4Qja+9gE/uyOe7HAdOV+ gKPbH/JjJnC2ueI/dZPDz9/jcqsVDxQcIrAgSGi1fNRhoercL9mIp7Ou5JeIr7+k+mvo W7qA8p3s3G+FsA5Le3SCsuDADVo0IFdyFap6eWPD6KOOMQIK69AG07+4CR6yz1LmliT5 Nb6bTQYcdryopXJwU//a5uv3mVrSxdWbKuMOKaU5OqmHTrZK3cGORFqByR3bEgE8r18T KkZScYsszNI1NB4oqEfTa+rEabft9o76k177GsliENC+l8X9owkoN3WO8hoO8x4K4dSP IDpQ== X-Gm-Message-State: AOAM533xL92xSYbFGqghycIliPwIe0JMIWpT5T06pYR+G7n2iOUduQg/ /7w1YfAU35Cts15/1J1/FP6pq50CeRA= X-Google-Smtp-Source: ABdhPJzuHpENWjnrecmZk5tNZDP87V4IKC/M3WdF39D4pCyaJZTU4IJXs0rcGAjJTIrEXDF20LX4+A== X-Received: by 2002:a1c:23d2:: with SMTP id j201mr25564049wmj.76.1639246728780; Sat, 11 Dec 2021 10:18:48 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id g13sm2708599wri.102.2021.12.11.10.18.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Dec 2021 10:18:47 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> Date: Sat, 11 Dec 2021 19:18:44 +0100 In-Reply-To: <86y256uc0v.fsf@mail.linkov.net> (Juri Linkov's message of "Mon, 29 Nov 2021 19:06:40 +0200") Message-ID: <87r1ajknsr.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Hi Juri, Juri Linkov writes: > (...) It would be nice to move this feature completely to outline.el, > so it could be used by other modes, not only in diff-mode. I've this simple patch for the outline.el part. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From d8fee4c307178fc2e0e7c206b8b8a42b2acda719 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied (outline-hide-sublevels): Add optional argument for function to call on each heading (outline-default-state): Define the default visibility state (outline-apply-default-state): Apply default visibility state --- lisp/outline.el | 50 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/lisp/outline.el b/lisp/outline.el index 2ede4e23ea..a3e5da4f5b 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -353,7 +353,8 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (outline-apply-default-state)) (defvar outline-minor-mode-map) @@ -436,7 +437,8 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (outline-apply-default-state)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1058,13 +1060,16 @@ outline-show-heading (progn (outline-end-of-heading) (point)) nil)) -(defun outline-hide-sublevels (levels) +(defun outline-hide-sublevels (levels &optional fun) "Hide everything but the top LEVELS levels of headers, in whole buffer. This also unhides the top heading-less body, if any. Interactively, the prefix argument supplies the value of LEVELS. When invoked without a prefix argument, LEVELS defaults to the level -of the current heading, or to 1 if the current line is not a heading." +of the current heading, or to 1 if the current line is not a heading. + +When FUN is defined, sublevels aren't hidden but FUN is called +for each of them." (interactive (list (cond (current-prefix-arg (prefix-numeric-value current-prefix-arg)) @@ -1093,7 +1098,9 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (if fun + (funcall fun) + (outline-show-heading)))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1307,6 +1314,39 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +If equal to `only-headings', only heading are shown. + +If equal to a number, hide everything but the headings at that +level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Show all" nil) + (const :tag "Only headings" only-headings) + (natnum :tag "Outline level") + (function :tag "Custom function")) + :local t + :safe t) +;; TODO fix variable being set through file local variable + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((not outline-default-state) (outline-show-all)) + ((eq outline-default-state 'only-headings) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + ((integerp outline-default-state) + (outline-hide-sublevels outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-= Content-Type: text/plain One thing that bothers me is that I am not able to store the wanted default visibility state as a local variable... Any suggestion welcome! Also, I've not started to rewrite the diff-mode part on top of this patch, so comments are most welcome in case I am going in wrong direction. -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 12 Dec 2021 08:59:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163929952620490 (code B ref 51809); Sun, 12 Dec 2021 08:59:02 +0000 Received: (at 51809) by debbugs.gnu.org; 12 Dec 2021 08:58:46 +0000 Received: from localhost ([127.0.0.1]:50648 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwKgv-0005KQ-Tx for submit@debbugs.gnu.org; Sun, 12 Dec 2021 03:58:46 -0500 Received: from relay11.mail.gandi.net ([217.70.178.231]:56863) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwKgt-0005Jr-Ou for 51809@debbugs.gnu.org; Sun, 12 Dec 2021 03:58:44 -0500 Received: (Authenticated sender: juri@linkov.net) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 9B511100006; Sun, 12 Dec 2021 08:58:36 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> Date: Sun, 12 Dec 2021 10:43:39 +0200 In-Reply-To: <87r1ajknsr.fsf@gmail.com> (Matthias Meulien's message of "Sat, 11 Dec 2021 19:18:44 +0100") Message-ID: <86ilvu6w6k.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > I've this simple patch for the outline.el part. Thanks, this is a good starting point to add just the basic functionality like org-mode initial visibility supported by ‘org-startup-folded’ and per-file settings: #+STARTUP: fold (or ‘overview’, this is equivalent) #+STARTUP: nofold (or ‘showall’, this is equivalent) #+STARTUP: content #+STARTUP: showlevels ( = 2..5) #+STARTUP: showeverything > @@ -1058,13 +1060,16 @@ outline-show-heading > -(defun outline-hide-sublevels (levels) > +(defun outline-hide-sublevels (levels &optional fun) It seems you don't use this argument in this patch? > + :local t > + :safe t) > +;; TODO fix variable being set through file local variable > One thing that bothers me is that I am not able to store the wanted > default visibility state as a local variable... Any suggestion welcome! For example, `outline-minor-mode-cycle' and `outline-minor-mode-highlight' have no `:local t', but when visiting a file that sets these file local variables, then automatically become local. > +(defun outline-apply-default-state () > + "Apply the outline state defined by `outline-default-state'." > + (interactive) > + (cond > + ((not outline-default-state) (outline-show-all)) It seems this change doesn't keep the current default behavior. Maybe the result will look like it currently works, maybe not. Who knows what effect will have calling `outline-show-all' by default in some user configurations. > + ((eq outline-default-state 'only-headings) > + (outline-show-all) > + (outline-hide-region-body (point-min) (point-max))) > + ((integerp outline-default-state) > + (outline-hide-sublevels outline-default-state)) > + ((when (functionp outline-default-state) > + (funcall outline-default-state))))) Maybe some other values from org-mode could be supported too? > Also, I've not started to rewrite the diff-mode part on top of this > patch, so comments are most welcome in case I am going in wrong > direction. I think the direction is right: first outline could support the initial visibility feature, then later various modes could use it: in diff-mode, xref, etc. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 13 Dec 2021 07:56:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.163938215621742 (code B ref 51809); Mon, 13 Dec 2021 07:56:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Dec 2021 07:55:56 +0000 Received: from localhost ([127.0.0.1]:53935 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwgBg-0005eb-4o for submit@debbugs.gnu.org; Mon, 13 Dec 2021 02:55:56 -0500 Received: from mail-wr1-f43.google.com ([209.85.221.43]:46054) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwgBc-0005eM-TJ for 51809@debbugs.gnu.org; Mon, 13 Dec 2021 02:55:54 -0500 Received: by mail-wr1-f43.google.com with SMTP id o13so25405683wrs.12 for <51809@debbugs.gnu.org>; Sun, 12 Dec 2021 23:55:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=gLRXiwU7+S++uM5mYo7JKoieAqn0EwjL0sCvvOdT5Yg=; b=MYXuyoq0hPNamnvhgtQ/ddJbdgTmXO8VQEuQ+TL+LVoA2jdrwLne6ku1xvuWzJY8M/ q20zfYXATRc9sJ31vD83+hy5zIW3FTtQrn/5eQ6kUJ2i4iICw3ovvIEzxfmdC4xhsPia BwxsjZCzN7bah2XOKJr2bf3pil7n+mkCNj5Qzk1FlxfayYsK+klHfLqckWQscm/0ftAR btI0USRalqGik8zvSw7aDQWMI4ZGls7zIFyMgSpj8vvFbnXK9wbQdRdFLilBbi/1O4/u t4PKSLozdI7RUIJIKdSNjG5tgAsbrMm2C7pz0fpArA/2Toy7UTajRKFQXJli8R5Rf2OF lSeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=gLRXiwU7+S++uM5mYo7JKoieAqn0EwjL0sCvvOdT5Yg=; b=x1MVtEmqyxDnydXrMEW7qzLkjWDGnYi5SVFkpYbqYN2//zo6RQfT0coyHqnrJio4jo QZ8rOk9z+iVLKGFAe/IBkA1JSn/sdzKax7Bzcd0c6dUwQG5CLdQifGJMjtTd/ruJ1q19 soN5AOGNMw75QyWdqJjQ1Cn3NBmV2jblIp9op3KP0H/jbQhPJr1mmFBjqQ6tu69bKAHH PueZj84J1lCOca4wwteTfRsaWR0e0QPf4GShpYcUG/Uypb76x9wjSQLAAxD35ofczLYs VAuJGPmHeo4hUyMyqqf//cZM70N2aNJmH7bmNqOhlb8BkhmPTIzIcFjIIC3qkHYNmdle 4fvw== X-Gm-Message-State: AOAM532rCX441k8vlJZ34VUMQMPShRMCDcQOGIKxcDwBNM0oZE/J7qPw bE3j5UbhaJ+Kyvms0yAsd5ChZgiKQXo= X-Google-Smtp-Source: ABdhPJxVTd/3oJImtVHsLYa+QhnDr1QBMiRj/3AkWY3QhkG71htiqFGYddq8k0+QKfVvy69/0+0Cwg== X-Received: by 2002:adf:f0c8:: with SMTP id x8mr30473924wro.290.1639382146703; Sun, 12 Dec 2021 23:55:46 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id p12sm10025162wro.33.2021.12.12.23.55.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Dec 2021 23:55:46 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> Date: Mon, 13 Dec 2021 08:55:45 +0100 In-Reply-To: <86ilvu6w6k.fsf@mail.linkov.net> (Juri Linkov's message of "Sun, 12 Dec 2021 10:43:39 +0200") Message-ID: <871r2hc51a.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: >> I've this simple patch for the outline.el part. > > Thanks, this is a good starting point to add just the basic functionality > like org-mode initial visibility supported by =E2=80=98org-startup-folded= =E2=80=99 and > per-file settings: > > #+STARTUP: fold (or =E2=80=98overview=E2=80=99, this is e= quivalent) > #+STARTUP: nofold (or =E2=80=98showall=E2=80=99, this is eq= uivalent) > > #+STARTUP: content > #+STARTUP: showlevels ( =3D 2..5) > > #+STARTUP: showeverything > >> @@ -1058,13 +1060,16 @@ outline-show-heading >> -(defun outline-hide-sublevels (levels) >> +(defun outline-hide-sublevels (levels &optional fun) > > It seems you don't use this argument in this patch? It will be necessary for `diff-mode' to provide its own default state functions that decide of the visibility of each heading individually. You're right, it's not needed right now so I'll remove it and reintroduce it when working on `diff-mode'. >> + :local t >> + :safe t) >> +;; TODO fix variable being set through file local variable > >> One thing that bothers me is that I am not able to store the wanted >> default visibility state as a local variable... Any suggestion welcome! > > For example, `outline-minor-mode-cycle' and `outline-minor-mode-highlight' > have no `:local t', but when visiting a file that sets these file local v= ariables, > then automatically become local. > >> +(defun outline-apply-default-state () >> + "Apply the outline state defined by `outline-default-state'." >> + (interactive) >> + (cond >> + ((not outline-default-state) (outline-show-all)) > > It seems this change doesn't keep the current default behavior. > Maybe the result will look like it currently works, maybe not. > Who knows what effect will have calling `outline-show-all' > by default in some user configurations. Good point. I can remove that line but one must be aware that calling `outline-apply-default-state' interactively after changing some headings visibility won't restore the default state. Not very intuitive... > >> + ((eq outline-default-state 'only-headings) >> + (outline-show-all) >> + (outline-hide-region-body (point-min) (point-max))) >> + ((integerp outline-default-state) >> + (outline-hide-sublevels outline-default-state)) >> + ((when (functionp outline-default-state) >> + (funcall outline-default-state))))) > > Maybe some other values from org-mode could be supported too? Sure. Let me first fix handling of local values. I saw that `outline-mode' is set *before* local variables when I visit a file whose major mode default to `outline-mode'.=20 > I think the direction is right: first outline could support > the initial visibility feature, then later various modes > could use it: in diff-mode, xref, etc. That's my plan. For xref mode I am wondering whether "regexp" based outline mode is the right thing to use. Should there be an outline mode based on text-properties? The buffer content is built internally and we know where "headings" are inserted... But it's another topic. Thanks for reading the patch! I'll send another one, hopefully taking your remarks into account, when support of local variables is fixed. --=20 Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 13 Dec 2021 09:49:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.1639388905393 (code B ref 51809); Mon, 13 Dec 2021 09:49:02 +0000 Received: (at 51809) by debbugs.gnu.org; 13 Dec 2021 09:48:25 +0000 Received: from localhost ([127.0.0.1]:54174 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwhwW-00006G-MH for submit@debbugs.gnu.org; Mon, 13 Dec 2021 04:48:25 -0500 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:47557) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mwhwU-00005j-0i for 51809@debbugs.gnu.org; Mon, 13 Dec 2021 04:48:23 -0500 Received: (Authenticated sender: juri@linkov.net) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id C67DA1C0002; Mon, 13 Dec 2021 09:48:14 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> Date: Mon, 13 Dec 2021 10:58:42 +0200 In-Reply-To: <871r2hc51a.fsf@gmail.com> (Matthias Meulien's message of "Mon, 13 Dec 2021 08:55:45 +0100") Message-ID: <86fsqwc01d.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> Thanks, this is a good starting point to add just the basic functionality >> like org-mode initial visibility supported by ‘org-startup-folded’ and >> per-file settings: >> >> #+STARTUP: fold (or ‘overview’, this is equivalent) >> #+STARTUP: nofold (or ‘showall’, this is equivalent) >> #+STARTUP: content >> #+STARTUP: showlevels ( = 2..5) >> #+STARTUP: showeverything >> >>> @@ -1058,13 +1060,16 @@ outline-show-heading >>> -(defun outline-hide-sublevels (levels) >>> +(defun outline-hide-sublevels (levels &optional fun) >> >> It seems you don't use this argument in this patch? > > It will be necessary for `diff-mode' to provide its own default state > functions that decide of the visibility of each heading > individually. You're right, it's not needed right now so I'll remove it > and reintroduce it when working on `diff-mode'. When we will have enough outline functions to be used as values of `outline-default-state', then `diff-mode' doesn't need to provide its own default state functions - `diff-mode' could just set a suitable buffer-local value of `outline-default-state' from the list of options provided by `outline-default-state'. Also `outline-default-state' could support a string value applied as a regexp on outline heading lines to decide whether to hide or show that outline. >>> + (cond >>> + ((not outline-default-state) (outline-show-all)) >> >> It seems this change doesn't keep the current default behavior. >> Maybe the result will look like it currently works, maybe not. >> Who knows what effect will have calling `outline-show-all' >> by default in some user configurations. > > Good point. I can remove that line but one must be aware that calling > `outline-apply-default-state' interactively after changing some headings > visibility won't restore the default state. Not very intuitive... `outline-default-state' could provide an explicit value that will show all outlines. Maybe even the default value of `outline-default-state' could be changed to this explicit value. Then calling `outline-apply-default-state' interactively will show all outlines. This way it will be more clear to users what is going on. >>> + ((eq outline-default-state 'only-headings) >>> + (outline-show-all) >>> + (outline-hide-region-body (point-min) (point-max))) >>> + ((integerp outline-default-state) >>> + (outline-hide-sublevels outline-default-state)) >>> + ((when (functionp outline-default-state) >>> + (funcall outline-default-state))))) >> >> Maybe some other values from org-mode could be supported too? > > Sure. Ideally, there should be an outline-mode function for most values, so there should be no need for special handling, e.g. instead of special handling of `only-headings', an outline command should handle this by funcall (maybe there is an existing function that does this?) Only integer and string values should have special handling here. > Let me first fix handling of local values. I saw that `outline-mode' is > set *before* local variables when I visit a file whose major mode > default to `outline-mode'. I don't know where is the problem. For example, in etc/compilation.txt these lines set local variables correctly: ;;; outline-minor-mode-cycle: t ;;; outline-minor-mode-highlight: t ;;; mode: outline-minor > For xref mode I am wondering whether "regexp" based outline mode is the > right thing to use. Should there be an outline mode based on > text-properties? The buffer content is built internally and we know > where "headings" are inserted... But it's another topic. Good idea. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 26 Dec 2021 16:06:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16405347376802 (code B ref 51809); Sun, 26 Dec 2021 16:06:02 +0000 Received: (at 51809) by debbugs.gnu.org; 26 Dec 2021 16:05:37 +0000 Received: from localhost ([127.0.0.1]:41340 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1W1g-0001lb-9o for submit@debbugs.gnu.org; Sun, 26 Dec 2021 11:05:36 -0500 Received: from mail-wm1-f53.google.com ([209.85.128.53]:38722) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1W1e-0001lN-6k for 51809@debbugs.gnu.org; Sun, 26 Dec 2021 11:05:34 -0500 Received: by mail-wm1-f53.google.com with SMTP id p1-20020a1c7401000000b00345c2d068bdso7221889wmc.3 for <51809@debbugs.gnu.org>; Sun, 26 Dec 2021 08:05:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=IvjGxsGNHYA1R3qbbbxA5SE3zYTrkq2nJbOel6YB1zg=; b=cVow58PlrCbFe9q1VPa9+j5C6X5uPiQBCrmIxgeBiudz1AuI1OOCL+COqe4zVI2OVG 0A4m2b4OxMmI8cje7HyEMUr6h+rOubloVYxV55BrG0wDRM3knAc/2oQMnA4XeJ1pjMoM iraLunP9slzKFzwNzRAVf3zK2QZF/FfDLGRcR3XsnAfHJ1xsFuEF2D/s/VmEMzfWSubF U5Ia2qtte8KzXQPzdSW5dOQTeJTAAWrOStFFdFjUYebK5BKto1XO99KzVcHjQRu1sT9G XfDJyVX2LzllgCX7Yg2uZ1BkBoZjlXm1VtRpTzjWm+9YB+zt39QVKqtbyuhOGWvZrGYz CypQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=IvjGxsGNHYA1R3qbbbxA5SE3zYTrkq2nJbOel6YB1zg=; b=T2A45uaBXW/JMuHRMb5dwvAS2elAKUv9LiRBPKMZQxY/pxGco4NOM/WsJheSBRoPPo hGwWjYLkt11oPH4gkNtBxwTsPX2t7o6kCQYO8hm/i+cxRYCwKS1KB39jx5usgpcC50fs DiCG/guL7RvowCZ3eocSxX/6H0Fksv/uTpX1CicYVVxgJ6sIrxKELhY4/loGpbUHmIhj kWwEVo8b6zX/f7JgwHo5oblrOXp6QsEzAvRrO2vzV0CkaTp1f2ERCKJ1bXqieeH02Zjo pIbKFlCs0BF2NJBezpVS16YC82CQEfUFwwZZWVogTTPd8M27iSnuAzcalykfsKFasxE8 waHw== X-Gm-Message-State: AOAM530FCAGdjUmRo1ocxK55d4g/bNQhYycqC7a7nIKmK5ZW7WrZ7bdX DBeOuPDhYdcM7CZzfC91wrWxUSPeR2Y= X-Google-Smtp-Source: ABdhPJyrWmnyJ7+fA641VPNkGGqjsefOwc8x5K2iIgXuFrGogtADU4oRaMxZdgUxFkEretXwiKtHug== X-Received: by 2002:a1c:8002:: with SMTP id b2mr10628226wmd.2.1640534728436; Sun, 26 Dec 2021 08:05:28 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id m17sm12953105wrz.91.2021.12.26.08.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Dec 2021 08:05:27 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> Date: Sun, 26 Dec 2021 17:05:25 +0100 In-Reply-To: <871r2hc51a.fsf@gmail.com> (Matthias Meulien's message of "Mon, 13 Dec 2021 08:55:45 +0100") Message-ID: <87r19zs662.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Matthias Meulien writes: > (...) Thanks for reading the patch! I'll send another one, hopefully > taking your remarks into account, when support of local variables is > fixed. Here is an updated patch implementing a default state for Outline mode and Outline minor mode: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From db0cf942950c7e997d2701742ce16c8385f452e0 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied (outline-hide-sublevels): Add optional argument for function to call on each heading (outline-default-state): Define the default visibility state (outline-apply-default-state): Apply default visibility state --- lisp/outline.el | 183 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 3 deletions(-) diff --git a/lisp/outline.el b/lisp/outline.el index 2ede4e23ea..c52b9cd4e7 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -353,7 +353,9 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (defvar outline-minor-mode-map) @@ -436,7 +438,9 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1093,7 +1097,7 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (outline-show-heading))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1307,6 +1311,179 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +If equal to `outline-show-all', all text of buffer is shown. + +If equal to `outline-show-only-headings', only headings are shown. + +If equal to a number, show only headings up to the corresponding +level. See `outline-default-state-subtree-visibility' to +customize visibility of the subtree at the choosen level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Disabled" nil) + (const :tag "Show all" outline-show-all) + (const :tag "Only headings" outline-show-only-headings) + (natnum :tag "Show headings up to level" :value 1) + (function :tag "Custom function"))) + +(defcustom outline-default-state-subtree-visibility nil + "Defines visibility of subtree starting at level defined by `outline-default-state'. + +When nil, the subtree is hidden unconditionally. + +When equal to a list, each element is expected to equal one of: + +- A cons cell with CAR `match-regexp' and CDR a regexp, the + subtree will be hidden when the outline heading match the + regexp. + +- `subtree-has-long-lines' to only show the heading branches when + long lines are detected in its subtree (see + `outline-long-line-threshold' for the definition of long + lines). + +- `subtree-is-long' to only show the heading branches when its + subtree contains more than `outline-line-count-threshold' + lines. + +- A lambda function or function name which will be evaluated with + point at the beginningg of the heading and the match data set + appropriately, the function being expected to toggle the + heading visibility." + :version "29.1" + :type '(choice (const :tag "Hide subtree" nil) + (set :tag "Show subtree unless" + (cons :tag "Heading match regexp" + (const match-regexp) string) + (const :tag "Body has long lines" + subtree-has-long-lines) + (const :tag "Body is long" + subtree-is-long) + (cons :tag "Custom function" + (const custom-function) function)))) + +(defcustom outline-long-line-threshold 1000 + "Minimal number of characters in a line for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defcustom outline-line-count-threshold 50 + "Minimal number of lines for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((integerp outline-default-state) + (outline--show-headings-up-to-level outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + +(defun outline-show-only-headings () + "Show only headings." + (interactive) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) + +(defun outline--show-headings-up-to-level (level) + "Show only headings up to a LEVEL level and call FUN on the leaves. + +Like `outline-hide-sublevels' but but call +`outline-default-state-subtree-visibility' for each heading at +level equal to LEVEL." + (if (not outline-default-state-subtree-visibility) + (outline-hide-sublevels level) + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point)))) + (heading-regexp + (cdr-safe + (assoc 'match-regexp + outline-default-state-subtree-visibility))) + (check-line-count + (memq 'subtree-is-long + outline-default-state-subtree-visibility)) + (check-long-lines + (memq 'subtree-has-long-lines + outline-default-state-subtree-visibility)) + (custom-function + (cdr-safe + (assoc 'custom-function + outline-default-state-subtree-visibility)))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (let ((current-level (outline-level))) + (when (< current-level level) + (outline-show-heading) + (outline-show-entry)) + (when (= current-level level) + (cond + ((and heading-regexp + (let ((beg (point)) + (end (progn (outline-end-of-heading) (point)))) + (string-match-p heading-regexp (buffer-substring beg end)))) + ;; hide entry when heading match regexp + (outline-hide-entry)) + ((and check-line-count + (save-excursion + (let* ((beg (point)) + (end (progn (outline-end-of-subtree) (point))) + (line-count (count-lines beg end))) + (< outline-line-count-threshold line-count)))) + ;; show only branches when line count of subtree > + ;; threshold + (outline-show-branches)) + ((and check-long-lines + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (save-restriction + (narrow-to-region beg end) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold outline-long-line-threshold) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))))) + ;; show only branches when long lines are detected + ;; in subtree + (outline-show-branches)) + (custom-function + ;; call custom function if defined + (funcall custom-function)) + (t + ;; if no previous clause succeeds, show subtree + (outline-show-subtree)))))) + beg end))) + (run-hooks 'outline-view-change-hook))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-= Content-Type: text/plain Here is a file used to test this feature: --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=test.outline # -*- mode: outline; -*- Help to test implementation of outline default state. * Heading 1 Preambule ** Heading with long lines 1.1 With looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line ** Heading 1.2 Some text ** Heading 1.3 A first paragraph followed by a second paragraph but with less interesting text. To be discussed. ** Heading with not so long line 1.4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa * Heading 2 Preamble to a heading with many lines. ** Heading with many lines 2.1 Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines Many lines ** Heading 2.2 Many lines * Heading 3 Preamble ** Heading matching regex 3.1 TOHIDE Hidden body *** Heading 3.1.1 Body of hidden parent **** Heading 3.1.1.1 *** Heading 3.1.2 Still in a hidden parent * Heading 4 Last body and nothing else but those three lines # Local Variables: # outline-default-state: 2 # outline-default-state-subtree-visibility: ((match-regexp . "TOHIDE") subtree-has-long-lines subtree-is-long) # outline-long-line-threshold: 200 # outline-line-count-threshold: 100 # End: --=-=-= Content-Type: text/plain There's a bug when used with diff-mode (where `outline-level' returns unexpected values), the starting point of that thread! I'll try to study this in the forthcoming days. --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 26 Dec 2021 16:22:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org, juri@linkov.net Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16405356978672 (code B ref 51809); Sun, 26 Dec 2021 16:22:02 +0000 Received: (at 51809) by debbugs.gnu.org; 26 Dec 2021 16:21:37 +0000 Received: from localhost ([127.0.0.1]:41369 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1WHA-0002Fn-P5 for submit@debbugs.gnu.org; Sun, 26 Dec 2021 11:21:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:33422) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1WH9-0002FY-G0 for 51809@debbugs.gnu.org; Sun, 26 Dec 2021 11:21:35 -0500 Received: from [2001:470:142:3::e] (port=57308 helo=fencepost.gnu.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n1WH4-00059e-2Q; Sun, 26 Dec 2021 11:21:30 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=thFBSIxK+setVGIFc7B0Z/FeCaeaWCYL1SeGO7piPwY=; b=ptN7I9McvFem twpXnwsfqYbV0si7b3r75/6QgJUdbA4rGAquPZ17F7DzffVxzBX9EEUHVPqda/F5y27aa9IIpcuFv 3Kb93RGUqST0WURZtEsESHjgolVc+qMToF+eyDo4nFe9x8qEDspxR7GYbxLIihsCF586Pujt+hlFz X4aRI8wpZyzhL/M6rZSIpneKayU77Sz7UqFMMgxteyecq+rHQhvVLnWanj+cpJXvdauWgVON+i7ae GSmbE8MOKjvnvdbpleFDka5T75UOishaNFryAzHjrkR2cdjobpcmFeCDnTPaTG36T4CVQlgXeTax3 x1Po9iTsgY+H+rZAbvTXoQ==; Received: from [87.69.77.57] (port=2897 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n1WH2-0001JK-C4; Sun, 26 Dec 2021 11:21:30 -0500 Date: Sun, 26 Dec 2021 18:21:42 +0200 Message-Id: <83fsqfnxpl.fsf@gnu.org> From: Eli Zaretskii In-Reply-To: <87r19zs662.fsf@gmail.com> (message from Matthias Meulien on Sun, 26 Dec 2021 17:05:25 +0100) References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Matthias Meulien > Date: Sun, 26 Dec 2021 17:05:25 +0100 > Cc: 51809@debbugs.gnu.org > > Here is an updated patch implementing a default state for Outline mode > and Outline minor mode: Thanks, a few comments to the documentation parts: > +If equal to a number, show only headings up to the corresponding > +level. "Up to and including" or "up to and excluding"? Also, please make sure you leave 2 spaces between sentences in all the doc strings and comments, per our conventions. > + :type '(choice (const :tag "Disabled" nil) It isn't clear what exactly is "disabled" under this value. The doc string itself is also not clear about what happens when the value is nil: "some headings are outlined" leaves me wondering what that means. > +(defcustom outline-default-state-subtree-visibility nil > + "Defines visibility of subtree starting at level defined by `outline-default-state'. Not "Defines", "Determines". Also, the first line is too long. > +When equal to a list, each element is expected to equal one of: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "...should be one of the following:" (Using "equal" here is not appropriate in any case, since you don't always describe actual values.) > +- A lambda function or function name which will be evaluated with > + point at the beginningg of the heading and the match data set ^^^^^^^^^^ A typo. And finally, I think this should have a NEWS entry. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 26 Dec 2021 19:20:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Eli Zaretskii Cc: 51809@debbugs.gnu.org, juri@linkov.net Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164054636422624 (code B ref 51809); Sun, 26 Dec 2021 19:20:02 +0000 Received: (at 51809) by debbugs.gnu.org; 26 Dec 2021 19:19:24 +0000 Received: from localhost ([127.0.0.1]:41584 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1Z3D-0005sq-FT for submit@debbugs.gnu.org; Sun, 26 Dec 2021 14:19:24 -0500 Received: from mail-wr1-f54.google.com ([209.85.221.54]:46022) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1Z3B-0005sa-6C for 51809@debbugs.gnu.org; Sun, 26 Dec 2021 14:19:22 -0500 Received: by mail-wr1-f54.google.com with SMTP id v7so28378362wrv.12 for <51809@debbugs.gnu.org>; Sun, 26 Dec 2021 11:19:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=N80EcxkVP7MISBBsmo5gqNA5xFgUNQbL2vV+GG6ReXs=; b=WWDKpvwQxepd9IT8V1wFd3+m6uSityw3oU0URWxC7BaIuWdDCcYmyr8zrGe17Rk8gg 0o2BYOw/pW8NiFDy3KxEh/uUqGrMqk1G6ouxflIk88YSHPD8n8jjJN/VBacJj805Mspa v2RtOyjyDHqK9t6PVwuG4nNa1YF2nKlIGsbV0BnIs5IBr3NzYbLnrrxADbl7zsubyCDh imB+ftSbxM7hDOjB+UiwpTRDN+l1ehdpOSTXJulnKV9D9Lnu6Nct5A1F3JoMG6HadMWu YpmWIDzuyfT7mGDtD14+r18+rFkH6GGTWw2ow9VCgOAsy3/bj3t6es2zGTImrpOXRSg/ 5G9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=N80EcxkVP7MISBBsmo5gqNA5xFgUNQbL2vV+GG6ReXs=; b=unNJyiiHeBAQIVUPOGOxwJ7syAIvC3sZwAboOdArYUMn5mYOq3RdVl6dwPHRnO5Pyp 4BtzO1HmA1SHNKf/WE02X59Y/LRkdYsQXlKup0/TPH8Mfyp9b733+qI0a1zZWiweXyau /88MYV55xhVYXs+EDZXaulzXy+Md0lEZgeVVuEk3LPG2kRBPughkv+/KXx+PUGEpEpZM JQtSomfn0BY++CbZYk3qgT6CWAZCxXFCm4qr4k96jCNBXLSwnHjHsR0CLgJlWgWKUWzj 9gisChc2g5CEJnsmVRl8LprEYI3CinwFo+J8StyhdqORL+NToWbpbRHT0yXoHZgacIrU NOtQ== X-Gm-Message-State: AOAM533VluwLfpYhyULKkfMlDaImd8vbFzV+qZekqvngoX9cUBnhl5RW vjfQkA5HhKQisOnVy0Gp8RWzIYRsVzY= X-Google-Smtp-Source: ABdhPJyttfyCXI0CM0d8zOamx/UsPzHX8Nq6Nw8RhAxSRIim74Wf7efeoVB+ordgaT/S+4B9NyQIGA== X-Received: by 2002:a5d:4c4a:: with SMTP id n10mr10855435wrt.100.1640546355319; Sun, 26 Dec 2021 11:19:15 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id k33sm17387725wms.21.2021.12.26.11.19.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Dec 2021 11:19:14 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <83fsqfnxpl.fsf@gnu.org> Date: Sun, 26 Dec 2021 20:19:13 +0100 In-Reply-To: <83fsqfnxpl.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 26 Dec 2021 18:21:42 +0200") Message-ID: <87fsqfmaxa.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Eli Zaretskii writes: > (...) a few comments to the documentation parts: Here is an updated patch taking your remarks into account: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From ecf57d0fb33ba3d569ca8fb2933993e139bbf94e Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * etc/NEWS: Announce support for default visibility state. * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied. (outline-hide-sublevels): Add optional argument for function to call on each heading. (outline-default-state): Define the default visibility state. (outline-apply-default-state): Apply default visibility state. --- etc/NEWS | 10 +++ lisp/outline.el | 190 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 197 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index cfea513cca..9a49ff8379 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -215,6 +215,16 @@ These will take you (respectively) to the next and previous "page". --- *** 'describe-char' now also outputs the name of emoji combinations. +** Outline Mode + +*** Support for a default visibility state. +Customize the option 'outline-default-state' to define what headings +are visible when the mode is set. When equal to a number, the option +'outline-default-state-subtree-visibility' determines the visibility +of the subtree starting at the corresponding level. Values are +provided to show a heading subtree unless the heading match a regexp, +or its subtree has long lines or is long. + ** Outline Minor Mode +++ diff --git a/lisp/outline.el b/lisp/outline.el index 5e3d4e0e00..ad45e38946 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -354,7 +354,9 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (defvar outline-minor-mode-map) @@ -437,7 +439,9 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1094,7 +1098,7 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (outline-show-heading))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1308,6 +1312,186 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +Note that the default state is applied when the major mode is set +or when the command `outline-apply-default-state' is called +interactively. + +When nil, headings visibility is left unchanged. + +If equal to `outline-show-all', all text of buffer is shown. + +If equal to `outline-show-only-headings', only headings are shown. + +If equal to a number, show only headings up to and including the +corresponding level. See +`outline-default-state-subtree-visibility' to customize +visibility of the subtree at the choosen level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Disabled" nil) + (const :tag "Show all" outline-show-all) + (const :tag "Only headings" outline-show-only-headings) + (natnum :tag "Show headings up to level" :value 1) + (function :tag "Custom function"))) + +(defcustom outline-default-state-subtree-visibility nil + "Determines visibility of subtree starting at `outline-default-state' level. + +When nil, the subtree is hidden unconditionally. + +When equal to a list, each element should be one of the following: + +- A cons cell with CAR `match-regexp' and CDR a regexp, the + subtree will be hidden when the outline heading match the + regexp. + +- `subtree-has-long-lines' to only show the heading branches when + long lines are detected in its subtree (see + `outline-long-line-threshold' for the definition of long + lines). + +- `subtree-is-long' to only show the heading branches when its + subtree contains more than `outline-line-count-threshold' + lines. + +- A lambda function or function name which will be evaluated with + point at the beginning of the heading and the match data set + appropriately, the function being expected to toggle the + heading visibility." + :version "29.1" + :type '(choice (const :tag "Hide subtree" nil) + (set :tag "Show subtree unless" + (cons :tag "Heading match regexp" + (const match-regexp) string) + (const :tag "Subtree has long lines" + subtree-has-long-lines) + (const :tag "Subtree is long" + subtree-is-long) + (cons :tag "Custom function" + (const custom-function) function)))) + +(defcustom outline-long-line-threshold 1000 + "Minimal number of characters in a line for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defcustom outline-line-count-threshold 50 + "Minimal number of lines for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((integerp outline-default-state) + (outline--show-headings-up-to-level outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + +(defun outline-show-only-headings () + "Show only headings." + (interactive) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) + +(defun outline--show-headings-up-to-level (level) + "Show only headings up to a LEVEL level and call FUN on the leaves. + +Like `outline-hide-sublevels' but but call +`outline-default-state-subtree-visibility' for each heading at +level equal to LEVEL." + (if (not outline-default-state-subtree-visibility) + (outline-hide-sublevels level) + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point)))) + (heading-regexp + (cdr-safe + (assoc 'match-regexp + outline-default-state-subtree-visibility))) + (check-line-count + (memq 'subtree-is-long + outline-default-state-subtree-visibility)) + (check-long-lines + (memq 'subtree-has-long-lines + outline-default-state-subtree-visibility)) + (custom-function + (cdr-safe + (assoc 'custom-function + outline-default-state-subtree-visibility)))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (let ((current-level (outline-level))) + (when (< current-level level) + (outline-show-heading) + (outline-show-entry)) + (when (= current-level level) + (cond + ((and heading-regexp + (let ((beg (point)) + (end (progn (outline-end-of-heading) (point)))) + (string-match-p heading-regexp (buffer-substring beg end)))) + ;; hide entry when heading match regexp + (outline-hide-entry)) + ((and check-line-count + (save-excursion + (let* ((beg (point)) + (end (progn (outline-end-of-subtree) (point))) + (line-count (count-lines beg end))) + (< outline-line-count-threshold line-count)))) + ;; show only branches when line count of subtree > + ;; threshold + (outline-show-branches)) + ((and check-long-lines + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (save-restriction + (narrow-to-region beg end) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold outline-long-line-threshold) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))))) + ;; show only branches when long lines are detected + ;; in subtree + (outline-show-branches)) + (custom-function + ;; call custom function if defined + (funcall custom-function)) + (t + ;; if no previous clause succeeds, show subtree + (outline-show-subtree)))))) + beg end))) + (run-hooks 'outline-view-change-hook))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 26 Dec 2021 20:33:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164055074630728 (code B ref 51809); Sun, 26 Dec 2021 20:33:01 +0000 Received: (at 51809) by debbugs.gnu.org; 26 Dec 2021 20:32:26 +0000 Received: from localhost ([127.0.0.1]:41636 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1aBu-0007zY-FX for submit@debbugs.gnu.org; Sun, 26 Dec 2021 15:32:26 -0500 Received: from mail-wm1-f53.google.com ([209.85.128.53]:52808) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1aBs-0007zI-Mv for 51809@debbugs.gnu.org; Sun, 26 Dec 2021 15:32:25 -0500 Received: by mail-wm1-f53.google.com with SMTP id g132so8601453wmg.2 for <51809@debbugs.gnu.org>; Sun, 26 Dec 2021 12:32:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=ENI60ZEOrnZ79lbOnhvmmDZpTo9n7kRjQUDQaZRDZuY=; b=BbFQU59/rA42LcLQ/P73o96JmgoDkZP9ozWoZVXxa0yD4BwJE5IEQxGiOtPnpizg5S TM83Je+xSZCGuSIUKqaBYkebiA+hARylPRwH3KJdyrP3bV5BFqvrlLcG+NIhHZ2vXqpX 59d1ob3GSIjJ8W6k1ZAhfvHrGLOCPCufWFCKTvT3f2ZvPorgu+jCF8dLr7K+N5Hiy9Fr yR4x1Y90t33o9zXDBn84CVucy5syb2Dm1bBNqDOLQ3SgzAUnZx3YPd5PdTOEE6T6GFqR jDrV6vLaQMNuFHY8yBGpjg3/cLOIVFpWqJcMg83yyCeP56Kjp9Az/4qseMHgt4m6ATP8 ySaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=ENI60ZEOrnZ79lbOnhvmmDZpTo9n7kRjQUDQaZRDZuY=; b=RuAQjqXl02hx/B0uovLwfBwHrE6JDrgcfFKWZXU5hu19MCi4dDkerI2IGHXewVet8G v55gb/DhERQctg+vZsApttS08Xpmi5xB3FuGOKgk5rUxzPZ3QK1leniuLWtdenI51ZLp y3oqTA3dKC6mQZ4Bf719ILtdfbeWs9//eveuWVY7tMHBqbqZmYqT4+qsk2WGJr2tvm75 ioGnuzsq1CS4cSz0Oi1hki1Kk6lUSoJzLkMF3ipiSXdpTRLbfwKNuN/Kw3RKnPUHEuxk 4lUjJVWGbil8tXLyWsHHdcA6v3aK9eUN1AFH2JdkLQC7c2SftZ9aVwVXzN+BpOj8N3nz yfZw== X-Gm-Message-State: AOAM530DfOprDnDG2//uRR01VqTWDASQOSrwm+o41IFKBQ4HakAjfUgh MVvRLbnFI1QJDwwKM2kPx5+TvRpvt4g= X-Google-Smtp-Source: ABdhPJxlNJiyUPMB7ApFhou7S91tpEPtPkGj10PuCEOsNCMZIu798ra8uThUHP+mYoig2xcj9e5j/A== X-Received: by 2002:a05:600c:4f08:: with SMTP id l8mr11294375wmq.59.1640550738441; Sun, 26 Dec 2021 12:32:18 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id b10sm13731371wrg.19.2021.12.26.12.32.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Dec 2021 12:32:18 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> Date: Sun, 26 Dec 2021 21:32:17 +0100 In-Reply-To: <87r19zs662.fsf@gmail.com> (Matthias Meulien's message of "Sun, 26 Dec 2021 17:05:25 +0100") Message-ID: <871r1zm7ji.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Matthias Meulien writes: > There's a bug when used with diff-mode (where `outline-level' returns > unexpected values), the starting point of that thread! I'll try to > study this in the forthcoming days. Fixed with (applied to the patch sent in reply to Eli's suggestions on documentation): diff --git a/lisp/outline.el b/lisp/outline.el index ad45e38946..2dc9805b85 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -1449,7 +1449,7 @@ outline--show-headings-up-to-level ;; Then unhide the top level headers. (outline-map-region (lambda () - (let ((current-level (outline-level))) + (let ((current-level (funcall outline-level))) (when (< current-level level) (outline-show-heading) (outline-show-entry)) I am now back to the origin of this bug report (toggling visibility of some diff hunks depending on long lines, chunks size, or file names) and I see there's a major drawback with the outline mode default visibility state approach: When outline minor mode is set through diff-mode-hook, the buffer is emtpy and applying the default state visibility is a no-op; It's a side-effect of the buffer content being generated asynchronously... From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 26 Dec 2021 20:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.1640552139937 (code B ref 51809); Sun, 26 Dec 2021 20:56:01 +0000 Received: (at 51809) by debbugs.gnu.org; 26 Dec 2021 20:55:39 +0000 Received: from localhost ([127.0.0.1]:41697 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1aYM-0000F2-U5 for submit@debbugs.gnu.org; Sun, 26 Dec 2021 15:55:39 -0500 Received: from mail-wr1-f41.google.com ([209.85.221.41]:34316) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1aYL-0000Ed-7n for 51809@debbugs.gnu.org; Sun, 26 Dec 2021 15:55:37 -0500 Received: by mail-wr1-f41.google.com with SMTP id s1so28833308wrg.1 for <51809@debbugs.gnu.org>; Sun, 26 Dec 2021 12:55:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=uyPAa1ThAg+97ewM6vtuowBMaz4klm8UEufT4FiH/gY=; b=OJULhCac+gra/QKkOPYlkhApt0qIo21vsBXEF6U4mOSaPc64goBQ9yDLX2xm1nqlTl BPlQV5K06ATbGYS6OP2zHv/CEJoAxp/Awu8Ukrbo+EE893iNXnlLpNwqFxr2pfFQQnln SZAz9yIdIlkCQ1RH4YbBHvBhzU6WUg+Q68E+R7br0oUBFXzeQVmlhm+/BTrOGbId6QJg WnxKgnMGrYiDx+zd5Cxd2dtBTmp1N2ZIXrXXUPdEj+KjuB5pJ3O5jQOE7LMjqGib0vMF TSESCq2cn2TuAqBUZ1SSw5+vND73E5PcQEe7m/vjL8nUq7AEyMaFYsGq/CsBeCyzAB42 bkWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=uyPAa1ThAg+97ewM6vtuowBMaz4klm8UEufT4FiH/gY=; b=zOJ6BgUPnNckrVL59c5HPTDetbevNhba8FRwSIzEMTxozhzuovSSIpg9dhQZ4mWAnt lLQGfu6rtG43SFf+UXJEs7LpOrb8E2QqZqj9bA74vdc7SikAfu4ECVlYHySn5YUEQQMZ WH4ocqH1dyxJVfv9xtn5JpIMDmQD5g11+4CVUhdQmBoxc2EbbwoQxWzQEeW06YgTVMVe G+kh5lgbQUPbvDjvPCtGhCKvzv9se8Z7icuIpnp1A0KuoedUEysbwGK9qetSDFBzaQMp 8vJi67K3YstOXBSZoKS00T9pmByoeh3dtnQHHsb2ezPZrLi2wevLSpF6tQ5ctOAxCF6y PsGg== X-Gm-Message-State: AOAM531PdOxW/Ic12c+jkhdDAbLg6mYGR+BtYefaxZVcU593oHwBNnpA jVkqDfy80pVOhCjg2Bih1CB1iFOm5aE= X-Google-Smtp-Source: ABdhPJwR2klHc/PfQvzAHj7Y2fVJTw9AA3i1jQy785tkH/tI2QDhZAn/Gz1O67p6hqqfIR+3eVfUVQ== X-Received: by 2002:a5d:61cf:: with SMTP id q15mr10363426wrv.623.1640552131362; Sun, 26 Dec 2021 12:55:31 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id g18sm12355479wmq.5.2021.12.26.12.55.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Dec 2021 12:55:30 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> Date: Sun, 26 Dec 2021 21:55:30 +0100 In-Reply-To: <871r1zm7ji.fsf@gmail.com> (Matthias Meulien's message of "Sun, 26 Dec 2021 21:32:17 +0100") Message-ID: <87wnjrkrwd.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Matthias Meulien writes: > I am now back to the origin of this bug report (toggling visibility of > some diff hunks depending on long lines, chunks size, or file names) and > I see there's a major drawback with the outline mode default visibility > state approach: When outline minor mode is set through diff-mode-hook, > the buffer is emtpy and applying the default state visibility is a > no-op; It's a side-effect of the buffer content being generated > asynchronously... I fixed it using an advice to `vc-diff-finish', but wondering whether there's a clean way to achieve the same... For posterity, here is a sample configuration for *vc-diff* buffers to hide hunks with long lines, long hunks or matching some regexp. (add-hook 'diff-mode-hook #'(lambda () (setq diff-font-lock-prettify t outline-default-state 1 outline-default-state-subtree-visibility '(subtree-is-long subtree-has-long-lines (match-regexp . "NEWS\\|test"))) (outline-minor-mode))) (defadvice vc-diff-finish (after ensure-outline-apply-default-state activate) (when outline-minor-mode (outline-apply-default-state))) From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 27 Dec 2021 19:54:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164063482526702 (code B ref 51809); Mon, 27 Dec 2021 19:54:02 +0000 Received: (at 51809) by debbugs.gnu.org; 27 Dec 2021 19:53:45 +0000 Received: from localhost ([127.0.0.1]:44333 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1w41-0006wb-19 for submit@debbugs.gnu.org; Mon, 27 Dec 2021 14:53:45 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:34965) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n1w3y-0006wG-Nk for 51809@debbugs.gnu.org; Mon, 27 Dec 2021 14:53:43 -0500 Received: (Authenticated sender: juri@linkov.net) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 6B891E0006; Mon, 27 Dec 2021 19:53:34 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> Date: Mon, 27 Dec 2021 21:52:13 +0200 In-Reply-To: <87wnjrkrwd.fsf@gmail.com> (Matthias Meulien's message of "Sun, 26 Dec 2021 21:55:30 +0100") Message-ID: <86tuethlle.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> I am now back to the origin of this bug report (toggling visibility of >> some diff hunks depending on long lines, chunks size, or file names) and >> I see there's a major drawback with the outline mode default visibility >> state approach: When outline minor mode is set through diff-mode-hook, >> the buffer is emtpy and applying the default state visibility is a >> no-op; It's a side-effect of the buffer content being generated >> asynchronously... > > I fixed it using an advice to `vc-diff-finish', This problem is not specific to diff-mode. Like I demonstrated earlier, xref requires using xref-after-update-hook, so now it could look like this: #+begin_src emacs-lisp (add-hook 'xref-after-update-hook (lambda () (setq-local outline-regexp (if (eq xref-file-name-display 'abs) "/" "[^ 0-9]") outline-default-state 1) (outline-minor-mode) (outline-apply-default-state))) #+end_src > but wondering whether there's a clean way to achieve the same... Some time ago in another bug report I proposed to add a hook at the end of 'vc-diff-finish', so it will solve this problem. PS: Please give me more time to test your patch thoroughly in various modes. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 08:10:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16406789552618 (code B ref 51809); Tue, 28 Dec 2021 08:10:01 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 08:09:15 +0000 Received: from localhost ([127.0.0.1]:44964 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n27Xm-0000gA-Pd for submit@debbugs.gnu.org; Tue, 28 Dec 2021 03:09:15 -0500 Received: from mail-wr1-f44.google.com ([209.85.221.44]:37482) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n27Xk-0000fw-80 for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 03:09:13 -0500 Received: by mail-wr1-f44.google.com with SMTP id t26so36803010wrb.4 for <51809@debbugs.gnu.org>; Tue, 28 Dec 2021 00:09:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:references:date:in-reply-to:message-id:user-agent :mime-version; bh=gdt6N3+zRhZ42h11PUS4NmiiS6xuRUT8GPIIA4/GoQE=; b=D9ZjlWSZH7DQtulQUEg2/eoCYfPtkOtp1ZRiBtndl4lGnuH8m+K2r6KRVBIU0LcwkK VFmt4OhEkGPnTV1+Qbavm86s9+xykYkUoyNFvcIaYwylncR6UNOpFCV50JiBnpE8lgDH EaVr1xWG4Y2igRmBRHzAd/hrcpWeOuKNp0WlInGZNnzcZ0+ax9t/PQmOuYCRPjVBgqQl VGluPTHbh3IMZXZ+LdPvRdrSXQe2zD12WCJtB3LUtQnZPnPyE/cKgflIh/pCJPjim88Q iHOOzLhOOho5oVtLoSfhGh8whP65IyQnitug8cc+xlLDKSLXBrm/AESqxyvrP7w1KGdW wfoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=gdt6N3+zRhZ42h11PUS4NmiiS6xuRUT8GPIIA4/GoQE=; b=uWPB3CMi9WK98kQr+KyuTDLZhs3tlbO5ipEeCrpEKdq12t8Whu/sQai29KfMur/uzt qJOxc59T9FxEa6XNTTHnb0jXNP8pl6rkPlKVG8JN91DmDECw9rsPboNZhteiiF8kJenJ TJVOi7lJPLn2Il9uMIDHoEoCtFXI+UKJoZVrUDLzTv3JT6ejptb38i9HkecHV6aCY3vT jy5YVHkjqUw7H10frklAi5PPRK1fyYRh4JxxVYEtZXuww1mVCBoeLoc69t2y0xXTzVvi HOzQ5gpQfatEQ6JtxXyRrSiP27GxhGRROD/9kvcZkwSx7bNfD8EpIFs/+ocXIFg1zcxa a3CA== X-Gm-Message-State: AOAM532tcQL3SygksmM1uknZm9ebu+F1fyU1FLiY5x5bTBeXS9lbXj9V c1puR9Vzys/X/HOwQvBRpxmUJuvabao= X-Google-Smtp-Source: ABdhPJx8b0RBunf0dUKB/2zWcABvxstdLkOAHb8KfDn2qiCkfSUKMiii/yMXJbT42yb4naM2qb/1Lw== X-Received: by 2002:a5d:610c:: with SMTP id v12mr15262669wrt.410.1640678946371; Tue, 28 Dec 2021 00:09:06 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:57c9:ca7e:b934:d778]) by smtp.gmail.com with ESMTPSA id c2sm19037681wri.50.2021.12.28.00.09.05 for <51809@debbugs.gnu.org> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Dec 2021 00:09:05 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> Date: Tue, 28 Dec 2021 09:09:04 +0100 In-Reply-To: <87lf1sw6ji.fsf@gmail.com> (Matthias Meulien's message of "Sat, 13 Nov 2021 14:04:33 +0100") Message-ID: <877dbpw3q7.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Updated patch with docstring fix. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From 167e7f9d8d26b075e01c3a8c8618da3a2138d145 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * etc/NEWS: Announce support for default visibility state. * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied. (outline-hide-sublevels): Add optional argument for function to call on each heading. (outline-default-state): Define the default visibility state. (outline-apply-default-state): Apply default visibility state. --- etc/NEWS | 10 +++ lisp/outline.el | 190 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 197 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index cfea513cca..9a49ff8379 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -215,6 +215,16 @@ These will take you (respectively) to the next and previous "page". --- *** 'describe-char' now also outputs the name of emoji combinations. +** Outline Mode + +*** Support for a default visibility state. +Customize the option 'outline-default-state' to define what headings +are visible when the mode is set. When equal to a number, the option +'outline-default-state-subtree-visibility' determines the visibility +of the subtree starting at the corresponding level. Values are +provided to show a heading subtree unless the heading match a regexp, +or its subtree has long lines or is long. + ** Outline Minor Mode +++ diff --git a/lisp/outline.el b/lisp/outline.el index 5e3d4e0e00..abb0d93adf 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -354,7 +354,9 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (defvar outline-minor-mode-map) @@ -437,7 +439,9 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1094,7 +1098,7 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (outline-show-heading))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1308,6 +1312,186 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +Note that the default state is applied when the major mode is set +or when the command `outline-apply-default-state' is called +interactively. + +When nil, headings visibility is left unchanged. + +If equal to `outline-show-all', all text of buffer is shown. + +If equal to `outline-show-only-headings', only headings are shown. + +If equal to a number, show only headings up to and including the +corresponding level. See +`outline-default-state-subtree-visibility' to customize +visibility of the subtree at the choosen level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Disabled" nil) + (const :tag "Show all" outline-show-all) + (const :tag "Only headings" outline-show-only-headings) + (natnum :tag "Show headings up to level" :value 1) + (function :tag "Custom function"))) + +(defcustom outline-default-state-subtree-visibility nil + "Determines visibility of subtree starting at `outline-default-state' level. + +When nil, the subtree is hidden unconditionally. + +When equal to a list, each element should be one of the following: + +- A cons cell with CAR `match-regexp' and CDR a regexp, the + subtree will be hidden when the outline heading match the + regexp. + +- `subtree-has-long-lines' to only show the heading branches when + long lines are detected in its subtree (see + `outline-long-line-threshold' for the definition of long + lines). + +- `subtree-is-long' to only show the heading branches when its + subtree contains more than `outline-line-count-threshold' + lines. + +- A lambda function or function name which will be evaluated with + point at the beginning of the heading and the match data set + appropriately, the function being expected to toggle the + heading visibility." + :version "29.1" + :type '(choice (const :tag "Hide subtree" nil) + (set :tag "Show subtree unless" + (cons :tag "Heading match regexp" + (const match-regexp) string) + (const :tag "Subtree has long lines" + subtree-has-long-lines) + (const :tag "Subtree is long" + subtree-is-long) + (cons :tag "Custom function" + (const custom-function) function)))) + +(defcustom outline-long-line-threshold 1000 + "Minimal number of characters in a line for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defcustom outline-line-count-threshold 50 + "Minimal number of lines for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((integerp outline-default-state) + (outline--show-headings-up-to-level outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + +(defun outline-show-only-headings () + "Show only headings." + (interactive) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) + +(defun outline--show-headings-up-to-level (level) + "Show only headings up to a LEVEL level. + +Like `outline-hide-sublevels' but, for each heading at level +LEVEL, decides of subtree visibility according to +`outline-default-state-subtree-visibility'." + (if (not outline-default-state-subtree-visibility) + (outline-hide-sublevels level) + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point)))) + (heading-regexp + (cdr-safe + (assoc 'match-regexp + outline-default-state-subtree-visibility))) + (check-line-count + (memq 'subtree-is-long + outline-default-state-subtree-visibility)) + (check-long-lines + (memq 'subtree-has-long-lines + outline-default-state-subtree-visibility)) + (custom-function + (cdr-safe + (assoc 'custom-function + outline-default-state-subtree-visibility)))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (let ((current-level (funcall outline-level))) + (when (< current-level level) + (outline-show-heading) + (outline-show-entry)) + (when (= current-level level) + (cond + ((and heading-regexp + (let ((beg (point)) + (end (progn (outline-end-of-heading) (point)))) + (string-match-p heading-regexp (buffer-substring beg end)))) + ;; hide entry when heading match regexp + (outline-hide-entry)) + ((and check-line-count + (save-excursion + (let* ((beg (point)) + (end (progn (outline-end-of-subtree) (point))) + (line-count (count-lines beg end))) + (< outline-line-count-threshold line-count)))) + ;; show only branches when line count of subtree > + ;; threshold + (outline-show-branches)) + ((and check-long-lines + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (save-restriction + (narrow-to-region beg end) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold outline-long-line-threshold) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))))) + ;; show only branches when long lines are detected + ;; in subtree + (outline-show-branches)) + (custom-function + ;; call custom function if defined + (funcall custom-function)) + (t + ;; if no previous clause succeeds, show subtree + (outline-show-subtree)))))) + beg end))) + (run-hooks 'outline-view-change-hook))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 19:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164071820731390 (code B ref 51809); Tue, 28 Dec 2021 19:04:02 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 19:03:27 +0000 Received: from localhost ([127.0.0.1]:47407 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2Hks-0008AD-Qm for submit@debbugs.gnu.org; Tue, 28 Dec 2021 14:03:27 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:38999) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2Hkq-00089y-P5 for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 14:03:25 -0500 Received: (Authenticated sender: juri@linkov.net) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 8C217E0008; Tue, 28 Dec 2021 19:03:17 +0000 (UTC) From: Juri Linkov In-Reply-To: <87r19zs662.fsf@gmail.com> (Matthias Meulien's message of "Sun, 26 Dec 2021 17:05:25 +0100") Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) Date: Tue, 28 Dec 2021 20:32:22 +0200 Message-ID: <86zgokpoll.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > @@ -353,7 +353,9 @@ outline-mode > + (add-hook 'change-major-mode-hook #'outline-show-all nil t) > + (add-hook 'hack-local-variables-hook > + #'outline-apply-default-state)) > > @@ -436,7 +438,9 @@ outline-minor-mode > + (add-hook 'hack-local-variables-hook > + #'outline-apply-default-state)) Are you sure about modifying the global value of hack-local-variables-hook instead of the buffer-local hook with `nil t' at the end? > Here is a file used to test this feature: > > # -*- mode: outline; -*- > [...] > # LocalVariables: > # outline-default-state: 2 > # outline-default-state-subtree-visibility: ((match-regexp . "TOHIDE") subtree-has-long-lines subtree-is-long) > # outline-long-line-threshold: 200 > # outline-line-count-threshold: 100 > # End: When this feature will be used a lot, even variable names will affect usability - with longer names usability deteriorates, and 40 characters of 'outline-default-state-subtree-visibility' takes half of the standard window width. Would it be possible to find a shorter name? Since it defines the rules, how about 'outline-default-rules'? It has the same length as 'outline-default-state', so these names will align nicely: # LocalVariables: # outline-default-state: 1 # outline-default-rules: ((match-regexp . "ChangeLog")) # mode: outline-minor # End: Also outline-long-line-threshold and outline-line-count-threshold could share the same prefix, maybe: # outline-default-long-line: 200 # outline-default-line-count: 100 From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 19:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164071821431408 (code B ref 51809); Tue, 28 Dec 2021 19:04:02 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 19:03:34 +0000 Received: from localhost ([127.0.0.1]:47410 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2Hl0-0008AW-1P for submit@debbugs.gnu.org; Tue, 28 Dec 2021 14:03:34 -0500 Received: from relay10.mail.gandi.net ([217.70.178.230]:60669) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2Hku-0008A2-A2 for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 14:03:28 -0500 Received: (Authenticated sender: juri@linkov.net) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 26AE8240008; Tue, 28 Dec 2021 19:03:20 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> Date: Tue, 28 Dec 2021 20:37:52 +0200 In-Reply-To: <87wnjrkrwd.fsf@gmail.com> (Matthias Meulien's message of "Sun, 26 Dec 2021 21:55:30 +0100") Message-ID: <86ilv8pnf3.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> I am now back to the origin of this bug report (toggling visibility of >> some diff hunks depending on long lines, chunks size, or file names) and >> I see there's a major drawback with the outline mode default visibility >> state approach: When outline minor mode is set through diff-mode-hook, >> the buffer is emtpy and applying the default state visibility is a >> no-op; It's a side-effect of the buffer content being generated >> asynchronously... > > I fixed it using an advice to `vc-diff-finish', but wondering whether > there's a clean way to achieve the same... > [...] > (defadvice vc-diff-finish (after ensure-outline-apply-default-state activate) > (when outline-minor-mode > (outline-apply-default-state))) After bug#52855 will be closed, it should be possible to do this by: (add-hook 'vc-diff-finish-functions 'outline-apply-default-state) Also xref works nicely, although I don't know why it requires `outline-apply-default-state' after enabling `outline-minor-mode': #+begin_src emacs-lisp (add-hook 'xref-after-update-hook (lambda () (setq-local outline-regexp (if (eq xref-file-name-display 'abs) "/" "[^ 0-9]") outline-default-state 1 outline-default-state-subtree-visibility '((match-regexp . "ChangeLog\\|test/manual/etags"))) (outline-minor-mode +1) (outline-apply-default-state))) #+end_src From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 21:46:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164072794722958 (code B ref 51809); Tue, 28 Dec 2021 21:46:01 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 21:45:47 +0000 Received: from localhost ([127.0.0.1]:47627 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KHy-0005yD-Np for submit@debbugs.gnu.org; Tue, 28 Dec 2021 16:45:47 -0500 Received: from mail-wr1-f48.google.com ([209.85.221.48]:44843) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KHw-0005y0-Q1 for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 16:45:45 -0500 Received: by mail-wr1-f48.google.com with SMTP id k18so3918406wrg.11 for <51809@debbugs.gnu.org>; Tue, 28 Dec 2021 13:45:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=gdcoaAJlJe61MxWe6/P2oQhuVBFVxmnEgfoyzaVxCFQ=; b=mqmAGsOkGXBwso1HwH6VM1qnK5Ctuzjkz5mIZcbRC9oLSKUGx347auQNPDzw4CGLCP 9ltW1kIfFz/XZqtPNIJdhXhKjEM/GbE68nN3GdH1AUfdLg1hGSq/i6D82V2tsC5qRJGk aA1oIFS6GJFQH+VYHKnAUsU+9I0/dfS6HrzFQCuAtd6p4ZU5iNTLswp/TOvfa8CPk0ZT Fz7t38OtP+saP/EAPLOVHWOdfHId28PSCdLXaRPGfJHqbLjTo4eX3y9/Prqbx2UhBcPg Qs7QVf55Xqg+VeQCZd3xDe13fY6bT7t13+AJB8ERTKSqtne6rAVlOa+j3czGd2DIyBhs eJlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=gdcoaAJlJe61MxWe6/P2oQhuVBFVxmnEgfoyzaVxCFQ=; b=OaX6Du8CaJiskASMbyzPKFK9hSYEEtikVb6L6GDFiX+RazWson1mKPWmid50T/5a8S MbCtvHAfzgnBkEnYTuFYtDJYvVMiObIY3MyZjJ2JZgkrYz7QkCar4kc6SmKLo78X2ids x4mU2z+6HpsBlTsX54O19vv43cU0ZAn72yvUIBPWls1YrYb53aO9SQ/H+9ErWfF6hdT3 /8SNBuhaM0glmu06P67Mym5HcPa3l4RSGlEszmLFqiiGWI8kA1ww8QdiIaGLDi82gnxP AaTT+CbpmK9Y5bZnbeug4h5efQLvlbFsKRymBDAJFWvy7Jx0sYFa2d03e5r6hcNQ5dbd PB3Q== X-Gm-Message-State: AOAM532HDBjMhIbb9vRDqjjZsmE0ukEAWDlkU2+z7QWASm+5Cu0jxAUL bWGTPsnukcdXaT1No5Yo5WyOZhePn+g= X-Google-Smtp-Source: ABdhPJwx2cI6J/1w9i3o0w81llGYfAgW1bWLsvsg8cQ2vBuu+gnE+v5FqjnQJkdxV2ceUqwa10+cAA== X-Received: by 2002:adf:f907:: with SMTP id b7mr17822161wrr.5.1640727938747; Tue, 28 Dec 2021 13:45:38 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id k19sm21669773wmo.29.2021.12.28.13.45.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Dec 2021 13:45:37 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <86zgokpoll.fsf@mail.linkov.net> Date: Tue, 28 Dec 2021 22:45:37 +0100 In-Reply-To: <86zgokpoll.fsf@mail.linkov.net> (Juri Linkov's message of "Tue, 28 Dec 2021 20:32:22 +0200") Message-ID: <87v8z8v1xa.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Juri Linkov writes: >> @@ -353,7 +353,9 @@ outline-mode >> + (add-hook 'change-major-mode-hook #'outline-show-all nil t) >> + (add-hook 'hack-local-variables-hook >> + #'outline-apply-default-state)) >> >> @@ -436,7 +438,9 @@ outline-minor-mode >> + (add-hook 'hack-local-variables-hook >> + #'outline-apply-default-state)) > > Are you sure about modifying the global value of hack-local-variables-hook > instead of the buffer-local hook with `nil t' at the end? Ah, ah, my bad. Many thanks! > (...) When this feature will be used a lot, even variable names will > affect usability - with longer names usability deteriorates, and 40 > characters of 'outline-default-state-subtree-visibility' takes half of > the standard window width. Would it be possible to find a shorter > name? Good point. > Since it defines the rules, how about 'outline-default-rules'? LGTM. > (...) Also outline-long-line-threshold and > outline-line-count-threshold could share the same prefix, maybe: > > # outline-default-long-line: 200 > # outline-default-line-count: 100 Adopted! --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From 6f8fb8b142c913405d9e00732ffbdecb8331ddb7 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * etc/NEWS: Announce support for default visibility state. * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied. (outline-hide-sublevels): Add optional argument for function to call on each heading. (outline-default-state): Define the default visibility state. (outline-apply-default-state): Apply default visibility state. --- etc/NEWS | 10 +++ lisp/outline.el | 181 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 188 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index cfea513cca..9a49ff8379 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -215,6 +215,16 @@ These will take you (respectively) to the next and previous "page". --- *** 'describe-char' now also outputs the name of emoji combinations. +** Outline Mode + +*** Support for a default visibility state. +Customize the option 'outline-default-state' to define what headings +are visible when the mode is set. When equal to a number, the option +'outline-default-state-subtree-visibility' determines the visibility +of the subtree starting at the corresponding level. Values are +provided to show a heading subtree unless the heading match a regexp, +or its subtree has long lines or is long. + ** Outline Minor Mode +++ diff --git a/lisp/outline.el b/lisp/outline.el index 5e3d4e0e00..1a878dee04 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -354,7 +354,8 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (add-hook 'hack-local-variables-hook #'outline-apply-default-state nil t)) (defvar outline-minor-mode-map) @@ -437,7 +438,9 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (add-hook 'hack-local-variables-hook + #'outline-apply-default-state nil t)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1094,7 +1097,7 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (outline-show-heading))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1308,6 +1311,178 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +Note that the default state is applied when the major mode is set +or when the command `outline-apply-default-state' is called +interactively. + +When nil, headings visibility is left unchanged. + +If equal to `outline-show-all', all text of buffer is shown. + +If equal to `outline-show-only-headings', only headings are shown. + +If equal to a number, show only headings up to and including the +corresponding level. See `outline-default-rules' to customize +visibility of the subtree at the choosen level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Disabled" nil) + (const :tag "Show all" outline-show-all) + (const :tag "Only headings" outline-show-only-headings) + (natnum :tag "Show headings up to level" :value 1) + (function :tag "Custom function"))) + +(defcustom outline-default-rules nil + "Determines visibility of subtree starting at `outline-default-state' level. + +When nil, the subtree is hidden unconditionally. + +When equal to a list, each element should be one of the following: + +- A cons cell with CAR `match-regexp' and CDR a regexp, the + subtree will be hidden when the outline heading match the + regexp. + +- `subtree-has-long-lines' to only show the heading branches when + long lines are detected in its subtree (see + `outline-default-long-line' for the definition of long lines). + +- `subtree-is-long' to only show the heading branches when its + subtree contains more than `outline-default-line-count' lines. + +- A lambda function or function name which will be evaluated with + point at the beginning of the heading and the match data set + appropriately, the function being expected to toggle the + heading visibility." + :version "29.1" + :type '(choice (const :tag "Hide subtree" nil) + (set :tag "Show subtree unless" + (cons :tag "Heading match regexp" + (const match-regexp) string) + (const :tag "Subtree has long lines" + subtree-has-long-lines) + (const :tag "Subtree is long" + subtree-is-long) + (cons :tag "Custom function" + (const custom-function) function)))) + +(defcustom outline-default-long-line 1000 + "Minimal number of characters in a line for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of characters")) + +(defcustom outline-default-line-count 50 + "Minimal number of lines for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((integerp outline-default-state) + (outline--show-headings-up-to-level outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + +(defun outline-show-only-headings () + "Show only headings." + (interactive) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) + +(defun outline--show-headings-up-to-level (level) + "Show only headings up to a LEVEL level. + +Like `outline-hide-sublevels' but, for each heading at level +LEVEL, decides of subtree visibility according to +`outline-default-rules'." + (if (not outline-default-rules) + (outline-hide-sublevels level) + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point)))) + (heading-regexp + (cdr-safe + (assoc 'match-regexp outline-default-rules))) + (check-line-count + (memq 'subtree-is-long outline-default-rules)) + (check-long-lines + (memq 'subtree-has-long-lines outline-default-rules)) + (custom-function + (cdr-safe + (assoc 'custom-function outline-default-rules)))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (let ((current-level (funcall outline-level))) + (when (< current-level level) + (outline-show-heading) + (outline-show-entry)) + (when (= current-level level) + (cond + ((and heading-regexp + (let ((beg (point)) + (end (progn (outline-end-of-heading) (point)))) + (string-match-p heading-regexp (buffer-substring beg end)))) + ;; hide entry when heading match regexp + (outline-hide-entry)) + ((and check-line-count + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (<= outline-default-line-count (count-lines beg end))))) + ;; show only branches when line count of subtree > + ;; threshold + (outline-show-branches)) + ((and check-long-lines + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (save-restriction + (narrow-to-region beg end) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold outline-default-long-line) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))))) + ;; show only branches when long lines are detected + ;; in subtree + (outline-show-branches)) + (custom-function + ;; call custom function if defined + (funcall custom-function)) + (t + ;; if no previous clause succeeds, show subtree + (outline-show-subtree)))))) + beg end))) + (run-hooks 'outline-view-change-hook))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 21:47:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164072800823068 (code B ref 51809); Tue, 28 Dec 2021 21:47:02 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 21:46:48 +0000 Received: from localhost ([127.0.0.1]:47631 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KIy-000600-E6 for submit@debbugs.gnu.org; Tue, 28 Dec 2021 16:46:48 -0500 Received: from mail-wr1-f44.google.com ([209.85.221.44]:46777) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KIw-0005zn-Nw for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 16:46:47 -0500 Received: by mail-wr1-f44.google.com with SMTP id i22so40590958wrb.13 for <51809@debbugs.gnu.org>; Tue, 28 Dec 2021 13:46:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=zyZSoeuDMbN+1UtuUGmZozvLR20rjeXQk+3Ls7+rVsE=; b=A3Wziw48JXOnjkrFpdJHGCJL8ZYr0YFysBlPUVIlVkPIU2KxVAd+qjmQjKF6fiF26y k8vP6/t5p1zmLH2Y/Q3OdWkvXNurOopC9MDloizRPOZzJEnyBzeDXXccaqsmO8sgVvpr GiF00zByaNjzL1Xc6XZqcxE3jZCPt9uR/ofM+hQSImxTvXior5yWIhYIFwN6y3dFidwt GEqMVLDigWlCuckPlHEA2eSx1WT7M60omdgEVp85NbdYPCfITnata8CMcdkiVKurowbr hMepjg/fX9RM3gJOF28TvrTv6gNacux7O2zU1NWz3O96yQ56NBdV7eb8tPRzNwzuZVLF vPHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=zyZSoeuDMbN+1UtuUGmZozvLR20rjeXQk+3Ls7+rVsE=; b=IVzSTnv4nPBstnMxPjtjYAfVyYFt0zOKCheDNS1j1D8V+F76Zhi3YsvwgcGY4JQYMs MqnxIQ3mQZSm86Bpk0QfMnZSM/qLs3WvMf9cW2MvlT1sGDcnfO2/rdgCvPG36UmfLsuU mYDPyPZMSJjpatkfFve/j9Sp/B0Ay4Xcpcrvn3lV8787Ul+kUKKfMnwV16bKKHck0p+9 stC3Qx5nqF46/DpNKvHXHbVkQa1BplGyxzU9EpAmndi0oWxFYUFiqvjOVW+5WFadWzoX bnfDSmBqT8z0qpVWBCfa7Ig9yo7heFXykLUUGDSelx9TUQfHLXD5kqXaTFXXec7xiQJo FnDg== X-Gm-Message-State: AOAM531Bx9HCRQbWr/0Tt651oPF+KK7x2Mx1fknosGIN1FkNn1RKPjRI XZ++HJsvn9jG2Yjv5n4hwAQ28FcaVMQ= X-Google-Smtp-Source: ABdhPJz5KjM89EVeXhNs/VP9KBx80U1Zn3Ymg4Jte1R986+nG3VlsXQQpt+Ws3VW3vEEiB1q1qxfQQ== X-Received: by 2002:adf:fc83:: with SMTP id g3mr17941976wrr.255.1640728001187; Tue, 28 Dec 2021 13:46:41 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id h4sm19332263wrf.93.2021.12.28.13.46.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Dec 2021 13:46:40 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> Date: Tue, 28 Dec 2021 22:46:40 +0100 In-Reply-To: <86ilv8pnf3.fsf@mail.linkov.net> (Juri Linkov's message of "Tue, 28 Dec 2021 20:37:52 +0200") Message-ID: <87r19wv1vj.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > (...) Also xref works nicely, although I don't know why it requires > `outline-apply-default-state' after enabling `outline-minor-mode': Same here. I'll have a look. -- Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 28 Dec 2021 22:29:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164073052027007 (code B ref 51809); Tue, 28 Dec 2021 22:29:02 +0000 Received: (at 51809) by debbugs.gnu.org; 28 Dec 2021 22:28:40 +0000 Received: from localhost ([127.0.0.1]:47663 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KxT-00071W-Mv for submit@debbugs.gnu.org; Tue, 28 Dec 2021 17:28:39 -0500 Received: from mail-wr1-f44.google.com ([209.85.221.44]:39459) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n2KxS-00071K-39 for 51809@debbugs.gnu.org; Tue, 28 Dec 2021 17:28:38 -0500 Received: by mail-wr1-f44.google.com with SMTP id s1so40807604wra.6 for <51809@debbugs.gnu.org>; Tue, 28 Dec 2021 14:28:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=aMa2Vq88Si5TONexhYXkJVTUI/P57YQi/3G/L+Hd9/o=; b=l6MHL57tKANiLPQAhYQp9GnbKwRXdQk/FuwBzAOlgSDHYupRhBbsnQSWBpjF2bSqaE cIL+mH2ZtREWwz+TG7+RaerHhnAQH+4WXXigplchOMeGeresNwt99rvt+T3kyylJFYzG yA2QHsvqlC6gFQlC/c50bA5MVXrqPX9TTp1O8y6Cm1MVaeWKXRrA5ntaNmiXL/tCqFfm SWBO4/t/mSd3jLUBzNHJA5t2THbe2uI9WpwHsvCDRYvInCw683ysXbvloRXJ+ayqhoMu 7HqlMAphCdUnDlchRg9FDgsRZnw5itbEgada8UKAvhQsKg7M0ZI4efYQ/2Lo1nuDj87C uMxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=aMa2Vq88Si5TONexhYXkJVTUI/P57YQi/3G/L+Hd9/o=; b=w1rEB5MU19OgS61QDuRUsG2r29wLRqKqkKyc/k9g8zBpt+R/6OT8BOvNQdSD0da+LM jt3b2VPGyB1uQz46TX4EhrMQ7sivhts0xhwCuo1WezW34HUeszA6MpAOVH0raf76ShbM sWHbjgMLCSpeixvjRA6z2Z+sWTzJh1eogLz1CwIyAUh7EWfHIuM8Tn7KMPghU2LYHM77 oA3oUq3f0NAF9WTTv3vzVP+iWFrPOAgLgM9LmcJL7g399qVm7AmVvZ8YcX/+6/1ZPDl6 yo1WQnc2uNF21QsG8DKZglS2siqWoC+ouiK7oG5w9BVgEvw6nPclAIyOPtnXk7NHgi11 zvOQ== X-Gm-Message-State: AOAM533ulQf+EiF3kuho329+VM/OFK5F2dE6wB9qvZOrPitab0Wn90iE KoD3VvgAF2lwL7vbSMe4fKygH0/v2Io= X-Google-Smtp-Source: ABdhPJyM591TKs7Op0uM8t8/CWZ2RU0ZTEVJre1EajckPt5mntWORU5DCuV6DOqhEir+Tqb7dugowg== X-Received: by 2002:a5d:64c3:: with SMTP id f3mr17802952wri.295.1640730512236; Tue, 28 Dec 2021 14:28:32 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id l26sm18836055wrz.44.2021.12.28.14.28.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Dec 2021 14:28:31 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> Date: Tue, 28 Dec 2021 23:28:31 +0100 In-Reply-To: <86ilv8pnf3.fsf@mail.linkov.net> (Juri Linkov's message of "Tue, 28 Dec 2021 20:37:52 +0200") Message-ID: <87k0fouzxs.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > (...) Also xref works nicely, although I don't know why it requires > `outline-apply-default-state' after enabling `outline-minor-mode': It's a mistake to rely on `hack-local-variables-hook' to call `outline-apply-default-state' when Outline minor mode is enabled since `hack-local-variables-hook' is run after processing a file's local variable specs. An explicit call to `outline-apply-default-state' in the implementation of outline-minor-mode fix the problem: diff --git a/lisp/outline.el b/lisp/outline.el index 1a878dee04..65956b9dae 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -439,8 +439,7 @@ outline-minor-mode (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. (add-to-invisibility-spec '(outline . t)) - (add-hook 'hack-local-variables-hook - #'outline-apply-default-state nil t)) + (outline-apply-default-state)) (when (or outline-minor-mode-cycle outline-minor-mode-highlight) (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) I'll send an updated patch after some time using this. -- Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 11 Jan 2022 17:48:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16419232274408 (code B ref 51809); Tue, 11 Jan 2022 17:48:01 +0000 Received: (at 51809) by debbugs.gnu.org; 11 Jan 2022 17:47:07 +0000 Received: from localhost ([127.0.0.1]:55472 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n7LEg-00018s-Ju for submit@debbugs.gnu.org; Tue, 11 Jan 2022 12:47:06 -0500 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:44551) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n7LEb-000106-85 for 51809@debbugs.gnu.org; Tue, 11 Jan 2022 12:47:05 -0500 Received: (Authenticated sender: juri@linkov.net) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id F062460002; Tue, 11 Jan 2022 17:46:53 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> Date: Tue, 11 Jan 2022 19:46:05 +0200 In-Reply-To: <87k0fouzxs.fsf@gmail.com> (Matthias Meulien's message of "Tue, 28 Dec 2021 23:28:31 +0100") Message-ID: <86sftumahu.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> (...) Also xref works nicely, although I don't know why it requires >> `outline-apply-default-state' after enabling `outline-minor-mode': > > It's a mistake to rely on `hack-local-variables-hook' to call > `outline-apply-default-state' when Outline minor mode is enabled since > `hack-local-variables-hook' is run after processing a file's local > variable specs. There is also such a case possible where the file begins with a prop-line: # -*- mode: outline-minor; -*- and ends with the Local Variables section, e.g.: # outline-default-state: 2 `hack-local-variables-hook' can handle such case in `outline-minor-mode'. > I'll send an updated patch after some time using this. Now you can take in use a new hook added in bug#52855 that allows applying the default state after vc-diff finishes: (add-hook 'vc-diff-finish-functions 'outline-apply-default-state) From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 14 Jan 2022 16:42:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164217848823556 (code B ref 51809); Fri, 14 Jan 2022 16:42:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Jan 2022 16:41:28 +0000 Received: from localhost ([127.0.0.1]:37951 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n8Pdn-00067s-LE for submit@debbugs.gnu.org; Fri, 14 Jan 2022 11:41:28 -0500 Received: from mail-wr1-f46.google.com ([209.85.221.46]:35837) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n8Pdk-00067a-Jo for 51809@debbugs.gnu.org; Fri, 14 Jan 2022 11:41:26 -0500 Received: by mail-wr1-f46.google.com with SMTP id e9so16602768wra.2 for <51809@debbugs.gnu.org>; Fri, 14 Jan 2022 08:41:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=wTzyuGS3/Y69mPp8YSLoxSLfwwfrMNtOZbR87Y05FcA=; b=LcZjGXJiCDFSQXGtT3cTJiuDjsk54EVvGCTtO2jNbAIz8GxOPpHQkniC1W0ZoDWIkQ 2VhxqrPXdhMS2eA/QEu/I78H/VLbsQVxvWAuSU9siOXFX5wD+Nk4iU80rZMzgH8iYSza ZV2uDtB1buQjElqlFFq5b7exCCr55NYRoLARBczWlAAyQQRojLHivEnesvmsd2NKzHKm IPOvt2LQj61lWbJ77cKKsSAbYFM1qk8NlLDVGjCbzQi5XERL0RgUHfDhY7f6Ah3IuPeU y6ijLHVEXknAevp9hZ1prFNc4rnP86LIMVB0ERzRgyV6U2oMlJssAbSq5cmG92v5Ckcm mrZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=wTzyuGS3/Y69mPp8YSLoxSLfwwfrMNtOZbR87Y05FcA=; b=5rgk2Pm+jb7dF9szPRLPR/cA4xTwxhc6J1PV+3oxDAGq7VrFL5y7NsCCy72784AXgD U7x8A6IdJ+PbNz+u8ybVwDZKxPcffSPMaVnGAVUzS7Q+4upl5y/x7iQ/nLTE9jx2Qo4v V5MuryqeHdSVgiqmNhfDsHOoB7pHbSZxkh6Y6jh1K9UJmWmmSQbWNBiOqyHhAXOCf702 gn1v6evLw6JYkyyFqbxf/lc6n+zLFR+4j9EBDhB6nPFgWbwM38lDjvQUdBvkSkwGghuK aPRKRDnx8xcgk3HdqPvrZWyL8zY9+SUhG3d00MsiAG/1ePMYXuHYELgOdemr66RczN0N RfCQ== X-Gm-Message-State: AOAM532xIvH5uhYecIgt427FDOcQYeyN0Tu82/4QQa/5F3Kh1xqi+wHT 4igjd4p91k4mQlIDCf3Jk8IiJs8Gjtw= X-Google-Smtp-Source: ABdhPJyhBAmKUdggnOJ9ziEMX+bZ1Shso9lXoV5/3BZkJkvMzbwfuKzy5IVQCjjnbIaH+Cq6itNlHA== X-Received: by 2002:a05:6000:12cc:: with SMTP id l12mr9049058wrx.290.1642178478565; Fri, 14 Jan 2022 08:41:18 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id bk2sm5518565wrb.65.2022.01.14.08.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Jan 2022 08:41:17 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> Date: Fri, 14 Jan 2022 17:41:16 +0100 In-Reply-To: <86sftumahu.fsf@mail.linkov.net> (Juri Linkov's message of "Tue, 11 Jan 2022 19:46:05 +0200") Message-ID: <87pmouw9qr.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Juri, Juri Linkov writes: >>> (...) Also xref works nicely, although I don't know why it requires >>> `outline-apply-default-state' after enabling `outline-minor-mode': >> >> It's a mistake to rely on `hack-local-variables-hook' to call >> `outline-apply-default-state' when Outline minor mode is enabled since >> `hack-local-variables-hook' is run after processing a file's local >> variable specs. > > There is also such a case possible where the file begins with a prop-line: > > # -*- mode: outline-minor; -*- > > and ends with the Local Variables section, e.g.: > > # outline-default-state: 2 > > `hack-local-variables-hook' can handle such case in `outline-minor-mode'. > This usage of "mode:" looks quite exotic to me. Isn't outine-minor a minor mode? According to the documentation: The special variable/value pair =E2=80=98mode: MODENAME;=E2=80=99, if pr= esent, specifies a major mode (without the =E2=80=9C-mode=E2=80=9D suffix). I prefer not support this if possible. >> I'll send an updated patch after some time using this. > > Now you can take in use a new hook added in bug#52855 that allows > applying the default state after vc-diff finishes: > > (add-hook 'vc-diff-finish-functions 'outline-apply-default-state) Thanks, I updated my configuration to the following: (add-hook 'diff-mode-hook #'(lambda () (setq outline-default-state 1 outline-default-rules '(subtree-is-long subtree-has-long-lines (match-regexp . "NEWS\\|test\\|package-lock\\.json\\|poetry\\.loc= k"))))) (add-hook 'vc-diff-finish-functions #'(lambda () (when outline-minor-mode (outline-apply-default-state)))) (add-hook 'xref-after-update-hook #'(lambda () (setq outline-regexp (if (eq xref-file-name-display 'abs) "/" "[^ 0-9]") outline-default-state 1 outline-default-rules '((match-regexp . "ChangeLog\\|te= st/manual/etags"))) (outline-minor-mode))) Here is an updated patch (just rebased my local branch, some minor conflicts appeared in outline.el): --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Extend-Outline-mode-with-default-visibility-state.patch >From 46934ba08d597a4d0d6e9d6c3918e5eabc1ec613 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Wed, 8 Dec 2021 22:35:42 +0100 Subject: [PATCH] Extend Outline mode with default visibility state * etc/NEWS: Announce support for default visibility state. * lisp/outline.el (outline-mode, outline-minor-mode): Ensure default visibility state is applied. (outline-hide-sublevels): Add optional argument for function to call on each heading. (outline-default-state): Define the default visibility state. (outline-apply-default-state): Apply default visibility state. --- etc/NEWS | 10 +++ lisp/outline.el | 180 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 187 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index ea9ba49892..49b5db9b1a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -243,6 +243,16 @@ These will take you (respectively) to the next and previous "page". --- *** 'describe-char' now also outputs the name of emoji combinations. +** Outline Mode + +*** Support for a default visibility state. +Customize the option 'outline-default-state' to define what headings +are visible when the mode is set. When equal to a number, the option +'outline-default-state-subtree-visibility' determines the visibility +of the subtree starting at the corresponding level. Values are +provided to show a heading subtree unless the heading match a regexp, +or its subtree has long lines or is long. + ** Outline Minor Mode +++ diff --git a/lisp/outline.el b/lisp/outline.el index 4027142c94..bca0f3bef8 100644 --- a/lisp/outline.el +++ b/lisp/outline.el @@ -351,7 +351,8 @@ outline-mode '(outline-font-lock-keywords t nil nil backward-paragraph)) (setq-local imenu-generic-expression (list (list nil (concat "^\\(?:" outline-regexp "\\).*$") 0))) - (add-hook 'change-major-mode-hook #'outline-show-all nil t)) + (add-hook 'change-major-mode-hook #'outline-show-all nil t) + (add-hook 'hack-local-variables-hook #'outline-apply-default-state nil t)) (defvar outline-minor-mode-map) @@ -434,7 +435,8 @@ outline-minor-mode nil t) (setq-local line-move-ignore-invisible t) ;; Cause use of ellipses for invisible text. - (add-to-invisibility-spec '(outline . t))) + (add-to-invisibility-spec '(outline . t)) + (outline-apply-default-state)) (when outline-minor-mode-highlight (if font-lock-fontified (font-lock-remove-keywords nil outline-font-lock-keywords)) @@ -1089,7 +1091,7 @@ outline-hide-sublevels (outline-map-region (lambda () (if (<= (funcall outline-level) levels) - (outline-show-heading))) + (outline-show-heading))) beg end) ;; Finally unhide any trailing newline. (goto-char (point-max)) @@ -1303,6 +1305,178 @@ outline-headers-as-kill (insert "\n\n")))))) (kill-new (buffer-string))))))) +(defcustom outline-default-state nil + "If non-nil, some headings are initially outlined. + +Note that the default state is applied when the major mode is set +or when the command `outline-apply-default-state' is called +interactively. + +When nil, headings visibility is left unchanged. + +If equal to `outline-show-all', all text of buffer is shown. + +If equal to `outline-show-only-headings', only headings are shown. + +If equal to a number, show only headings up to and including the +corresponding level. See `outline-default-rules' to customize +visibility of the subtree at the choosen level. + +If equal to a lambda function or function name, this function is +expected to toggle headings visibility, and will be called after +the mode is enabled." + :version "29.1" + :type '(choice (const :tag "Disabled" nil) + (const :tag "Show all" outline-show-all) + (const :tag "Only headings" outline-show-only-headings) + (natnum :tag "Show headings up to level" :value 1) + (function :tag "Custom function"))) + +(defcustom outline-default-rules nil + "Determines visibility of subtree starting at `outline-default-state' level. + +When nil, the subtree is hidden unconditionally. + +When equal to a list, each element should be one of the following: + +- A cons cell with CAR `match-regexp' and CDR a regexp, the + subtree will be hidden when the outline heading match the + regexp. + +- `subtree-has-long-lines' to only show the heading branches when + long lines are detected in its subtree (see + `outline-default-long-line' for the definition of long lines). + +- `subtree-is-long' to only show the heading branches when its + subtree contains more than `outline-default-line-count' lines. + +- A lambda function or function name which will be evaluated with + point at the beginning of the heading and the match data set + appropriately, the function being expected to toggle the + heading visibility." + :version "29.1" + :type '(choice (const :tag "Hide subtree" nil) + (set :tag "Show subtree unless" + (cons :tag "Heading match regexp" + (const match-regexp) string) + (const :tag "Subtree has long lines" + subtree-has-long-lines) + (const :tag "Subtree is long" + subtree-is-long) + (cons :tag "Custom function" + (const custom-function) function)))) + +(defcustom outline-default-long-line 1000 + "Minimal number of characters in a line for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of characters")) + +(defcustom outline-default-line-count 50 + "Minimal number of lines for a heading to be outlined." + :version "29.1" + :type '(natnum :tag "Number of lines")) + +(defun outline-apply-default-state () + "Apply the outline state defined by `outline-default-state'." + (interactive) + (cond + ((integerp outline-default-state) + (outline--show-headings-up-to-level outline-default-state)) + ((when (functionp outline-default-state) + (funcall outline-default-state))))) + +(defun outline-show-only-headings () + "Show only headings." + (interactive) + (outline-show-all) + (outline-hide-region-body (point-min) (point-max))) + +(eval-when-compile (require 'so-long)) +(autoload 'so-long-detected-long-line-p "so-long") +(defvar so-long-skip-leading-comments) +(defvar so-long-threshold) +(defvar so-long-max-lines) + +(defun outline--show-headings-up-to-level (level) + "Show only headings up to a LEVEL level. + +Like `outline-hide-sublevels' but, for each heading at level +LEVEL, decides of subtree visibility according to +`outline-default-rules'." + (if (not outline-default-rules) + (outline-hide-sublevels level) + (if (< level 1) + (error "Must keep at least one level of headers")) + (save-excursion + (let* (outline-view-change-hook + (beg (progn + (goto-char (point-min)) + ;; Skip the prelude, if any. + (unless (outline-on-heading-p t) (outline-next-heading)) + (point))) + (end (progn + (goto-char (point-max)) + ;; Keep empty last line, if available. + (if (bolp) (1- (point)) (point)))) + (heading-regexp + (cdr-safe + (assoc 'match-regexp outline-default-rules))) + (check-line-count + (memq 'subtree-is-long outline-default-rules)) + (check-long-lines + (memq 'subtree-has-long-lines outline-default-rules)) + (custom-function + (cdr-safe + (assoc 'custom-function outline-default-rules)))) + (if (< end beg) + (setq beg (prog1 end (setq end beg)))) + ;; First hide everything. + (outline-hide-sublevels level) + ;; Then unhide the top level headers. + (outline-map-region + (lambda () + (let ((current-level (funcall outline-level))) + (when (< current-level level) + (outline-show-heading) + (outline-show-entry)) + (when (= current-level level) + (cond + ((and heading-regexp + (let ((beg (point)) + (end (progn (outline-end-of-heading) (point)))) + (string-match-p heading-regexp (buffer-substring beg end)))) + ;; hide entry when heading match regexp + (outline-hide-entry)) + ((and check-line-count + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (<= outline-default-line-count (count-lines beg end))))) + ;; show only branches when line count of subtree > + ;; threshold + (outline-show-branches)) + ((and check-long-lines + (save-excursion + (let ((beg (point)) + (end (progn (outline-end-of-subtree) (point)))) + (save-restriction + (narrow-to-region beg end) + (let ((so-long-skip-leading-comments nil) + (so-long-threshold outline-default-long-line) + (so-long-max-lines nil)) + (so-long-detected-long-line-p)))))) + ;; show only branches when long lines are detected + ;; in subtree + (outline-show-branches)) + (custom-function + ;; call custom function if defined + (funcall custom-function)) + (t + ;; if no previous clause succeeds, show subtree + (outline-show-subtree)))))) + beg end))) + (run-hooks 'outline-view-change-hook))) + (defun outline--cycle-state () "Return the cycle state of current heading. Return either 'hide-all, 'headings-only, or 'show-all." -- 2.30.2 --=-=-= Content-Type: text/plain What would be the next step? Should we stop here or introduce some customization in Diff mode to help people discover how the "outline default state feature" can be used there (not convinced myself it'd be usefull)? -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 16 Jan 2022 18:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164235689625114 (code B ref 51809); Sun, 16 Jan 2022 18:15:02 +0000 Received: (at 51809) by debbugs.gnu.org; 16 Jan 2022 18:14:56 +0000 Received: from localhost ([127.0.0.1]:44225 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n9A3M-0006Wz-E1 for submit@debbugs.gnu.org; Sun, 16 Jan 2022 13:14:56 -0500 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:40741) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n9A3K-0006Wg-Jq; Sun, 16 Jan 2022 13:14:55 -0500 Received: (Authenticated sender: juri@linkov.net) by mail.gandi.net (Postfix) with ESMTPSA id 2CD88FF805; Sun, 16 Jan 2022 18:14:46 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> Date: Sun, 16 Jan 2022 20:14:15 +0200 In-Reply-To: <87pmouw9qr.fsf@gmail.com> (Matthias Meulien's message of "Fri, 14 Jan 2022 17:41:16 +0100") Message-ID: <86bl0b35vs.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) tags 51809 + patch fixed thanks Hi Matthias, >> # -*- mode: outline-minor; -*- > > This usage of "mode:" looks quite exotic to me. Isn't outine-minor a > minor mode? According to the documentation: > > The special variable/value pair ‘mode: MODENAME;’, if present, > specifies a major mode (without the “-mode” suffix). > > I prefer not support this if possible. You are right, it rather should be more like: -*- mode: text; mode: outline-minor; -*- that is supported. > Here is an updated patch (just rebased my local branch, some minor > conflicts appeared in outline.el): Thanks for working on this patch! I've tested it thoroughly, and everything works nicely, so I pushed it to master. > What would be the next step? Should we stop here or introduce some > customization in Diff mode to help people discover how the "outline > default state feature" can be used there (not convinced myself it'd be > usefull)? Maybe more documentation about using this in diff-mode could be added to the docstrings and to the manual? From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 17 Jan 2022 21:11:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164245386117285 (code B ref 51809); Mon, 17 Jan 2022 21:11:02 +0000 Received: (at 51809) by debbugs.gnu.org; 17 Jan 2022 21:11:01 +0000 Received: from localhost ([127.0.0.1]:48278 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n9ZHI-0004Uj-Uc for submit@debbugs.gnu.org; Mon, 17 Jan 2022 16:11:01 -0500 Received: from mail-wm1-f48.google.com ([209.85.128.48]:54226) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1n9ZHF-0004UU-0e for 51809@debbugs.gnu.org; Mon, 17 Jan 2022 16:11:00 -0500 Received: by mail-wm1-f48.google.com with SMTP id k5so14102959wmj.3 for <51809@debbugs.gnu.org>; Mon, 17 Jan 2022 13:10:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=tm0JdP+lAu/3cfOVbpHpa5TKdKuW4sZTwtcRSH/YGog=; b=H8jiOXHvrZil66iQETQ0o2s3n6W/f3YSytNJv8/o02verKZ9J5ysSYnhDed9inZ9O6 kMEtDSMtPN8E9Mu/dGm9wmjRaXhRoNnaW0vz0XzjrY/NMicpEUd8MasTBbBZakcxvxaO BMHIQFmQcVRenYOjxKzgzeR8OUX3PSAvnQAnbuBAckwIrE7D1wjezlwoBJDwtQAkiH6F nIrYYpBhsqx7CxmuFC0LzvaTSEQUIP1VVvb2UEMFRBfrqRU5gkgx8OTrCjKrUrRQ3b0p GT7cvvVCey7Zn1zZhswEZ4w2FjO9ZseFlPL1CsrmqhSVeCtUl8W10ko0U2dpzCh1eHsi AsSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=tm0JdP+lAu/3cfOVbpHpa5TKdKuW4sZTwtcRSH/YGog=; b=ErbU07L1kOhgLxvscOVRAV9OQ6cWjFlLbvhI7scRVAb+JNLSyP97mxDVRaRK8RlIql 406HHTMRV2eHBRo89V8uBGqXrayZ9EnsKQ5CFM+rf2zmu24vA5ssJR0DelvhvKd1rXZz euC03N7PqTLJ+xQtITzukXS7uwxoF7UTJiZUtRcKwQnvmUBA02VrVrAv+rgFNF+QT8PC /NeKPlUUD+kv0TRcMj2g2NqHLhU7q6oabSXMty6RH8iiW9vDntW84oPLEPebIdY737F6 eehwg+9cb7NinCDtrpujr19jwC8flculTS+K4CP5niG44rzSi7afpZVQQskePbKIfyOi Vgig== X-Gm-Message-State: AOAM531Zo2pVFeZcYT5PnWQ8VKhI+IgMUdIC/Y9sbdmiv487DvWFhduf gnnoOQINrABxBs4heQ7aOj1Ibh1Ecvc= X-Google-Smtp-Source: ABdhPJyjXlCndNJoIcclkC+cx2OkRb5WuXthNiNdAWiQGReONkoai6v4dBPf3WMDtm1o9owfAGDEJw== X-Received: by 2002:a5d:64a5:: with SMTP id m5mr4469940wrp.503.1642453851225; Mon, 17 Jan 2022 13:10:51 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id 10sm410008wmc.44.2022.01.17.13.10.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jan 2022 13:10:50 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> Date: Mon, 17 Jan 2022 22:10:50 +0100 In-Reply-To: <87pmouw9qr.fsf@gmail.com> (Matthias Meulien's message of "Fri, 14 Jan 2022 17:41:16 +0100") Message-ID: <87a6fuvzj9.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Matthias Meulien writes: > (...) What would be the next step? Should we stop here or introduce > some customization in Diff mode to help people discover how the > "outline default state feature" can be used there (not convinced > myself it'd be usefull)? I see one problem: Once one has some default state configured for Diff mode, it applies to patch embedded in Gnus Article buffers, but there the outline-minor-mode keymap isn't active and there's no way to toggle headings visibility... No idea how to improve this situation... From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 29 Jan 2022 19:15:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164348366820685 (code B ref 51809); Sat, 29 Jan 2022 19:15:01 +0000 Received: (at 51809) by debbugs.gnu.org; 29 Jan 2022 19:14:28 +0000 Received: from localhost ([127.0.0.1]:34833 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nDtB5-0005NY-Q5 for submit@debbugs.gnu.org; Sat, 29 Jan 2022 14:14:27 -0500 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:42013) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nDtB3-0005NE-9a for 51809@debbugs.gnu.org; Sat, 29 Jan 2022 14:14:25 -0500 Received: (Authenticated sender: juri@linkov.net) by mail.gandi.net (Postfix) with ESMTPSA id 0227760003; Sat, 29 Jan 2022 19:14:17 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> Date: Sat, 29 Jan 2022 21:12:55 +0200 In-Reply-To: <87a6fuvzj9.fsf@gmail.com> (Matthias Meulien's message of "Mon, 17 Jan 2022 22:10:50 +0100") Message-ID: <86mtjenyo8.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > I see one problem: Once one has some default state configured for Diff > mode, it applies to patch embedded in Gnus Article buffers, but there > the outline-minor-mode keymap isn't active and there's no way to toggle > headings visibility... No idea how to improve this situation... A hackish way would be something like this: diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el index c40c38a95f..49cac01e2f 100644 --- a/lisp/gnus/mm-view.el +++ b/lisp/gnus/mm-view.el @@ -532,7 +532,8 @@ mm-display-inline-fontify (funcall mode)) (let ((auto-mode-alist (delq (rassq 'doc-view-mode-maybe auto-mode-alist) - (copy-sequence auto-mode-alist)))) + (copy-sequence auto-mode-alist))) + outline-default-state) ;; Don't run hooks that might assume buffer-file-name ;; really associates buffer with a file (bug#39190). (delay-mode-hooks (set-auto-mode)) But OTOH, when long lines is a problem, then it's natural to expect that the user would want to hide long lines in Gnus Article buffers as well. And it's still possible to use outline cycling commands after saving an attachment to a file. From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 05 Feb 2022 18:48:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Matthias Meulien Cc: 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164408682716353 (code B ref 51809); Sat, 05 Feb 2022 18:48:01 +0000 Received: (at 51809) by debbugs.gnu.org; 5 Feb 2022 18:47:07 +0000 Received: from localhost ([127.0.0.1]:35583 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGQ5T-0004Fh-Dg for submit@debbugs.gnu.org; Sat, 05 Feb 2022 13:47:07 -0500 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:34847) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGQ5Q-0004FB-SG for 51809@debbugs.gnu.org; Sat, 05 Feb 2022 13:47:06 -0500 Received: (Authenticated sender: juri@linkov.net) by mail.gandi.net (Postfix) with ESMTPSA id 7B8CF20002; Sat, 5 Feb 2022 18:46:52 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> Date: Sat, 05 Feb 2022 20:45:30 +0200 In-Reply-To: <87a6fuvzj9.fsf@gmail.com> (Matthias Meulien's message of "Mon, 17 Jan 2022 22:10:50 +0100") Message-ID: <86bkzli245.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) --=-=-= Content-Type: text/plain > I see one problem: Once one has some default state configured for Diff > mode, it applies to patch embedded in Gnus Article buffers, but there > the outline-minor-mode keymap isn't active and there's no way to toggle > headings visibility... No idea how to improve this situation... Oh, I see now it's a real problem. Some patches are not displayed because their hunks are hidden. Fro example, a patch from bug#53770 attached below, becomes hidden with these settings: (add-hook 'diff-mode-hook (lambda () (setq-local outline-default-state 2) (outline-minor-mode 1))) For some unknown reason, outline--show-headings-up-to-level first hides all sublevels, but never shows them again, because or some level problem - it uses the level 21. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=woman.patch --- woman.el.orig 2022-02-04 14:08:54.188622150 +1100 +++ woman.el 2022-02-04 14:08:51.254677185 +1100 @@ -2299,9 +2299,9 @@ (replace-match woman-unpadded-space-string t t)) ;; Discard optional hyphen \%; concealed newlines \; - ;; point-size change function \sN,\s+N, \s-N: + ;; kerning \/, \,; point-size change function \sN,\s+N, \s-N: (goto-char from) - (while (re-search-forward "\\\\\\([%\n]\\|s[-+]?[0-9]+\\)" nil t) + (while (re-search-forward "\\\\\\([%\n/,]\\|s[-+]?[0-9]+\\)" nil t) (woman-delete-match 0)) ;; BEWARE: THIS SHOULD PROBABLY ALL BE DONE MUCH LATER!!!!! --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Lars Ingebrigtsen Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 05 Feb 2022 22:01:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: 51809@debbugs.gnu.org, Matthias Meulien Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.16440984203550 (code B ref 51809); Sat, 05 Feb 2022 22:01:01 +0000 Received: (at 51809) by debbugs.gnu.org; 5 Feb 2022 22:00:20 +0000 Received: from localhost ([127.0.0.1]:35771 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGT6S-0000up-44 for submit@debbugs.gnu.org; Sat, 05 Feb 2022 17:00:20 -0500 Received: from quimby.gnus.org ([95.216.78.240]:49558) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nGT6Q-0000ml-Bi for 51809@debbugs.gnu.org; Sat, 05 Feb 2022 17:00:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date: References:Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=m8Gz4pmOCGifFMWAjQP0wj4FgkMmvCJCcaB6JdkbrRA=; b=JkCRPzII1J91sDnLkLCPm2uska kZSB3GmrXfBXv9dDprUTOf9/051SyRo4w8KgQRf3tRMuSaZ+nxTLtnFDvxvj/98APFMC6nc3cprsK 8O2rW1W98HOlrg42MinxdN6VfkoRLY8LeJHdNNEtl8iFQHdo3yu891IuLde89wIzKhH8=; Received: from [84.212.220.105] (helo=giant) by quimby.gnus.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nGT6G-0004Dn-Hz; Sat, 05 Feb 2022 23:00:12 +0100 From: Lars Ingebrigtsen References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAABGdBTUEAALGPC/xhBQAAACBj SFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAD1BMVEUKBAYvHCFdOT68 i4T////X5tW9AAAAAWJLR0QEj2jZUQAAAAd0SU1FB+YCBRUbDYy9J9EAAAGNSURBVDjLjZMBkuQg CEXFuYDoBSJcYAL3v9uAojHTu1VjVaoTn3zwQ6f0lwXX517FklKTzioHReyIhZrO9Q7JF7PyAKfg nbKJiAUD631kvRM3ojLTqTw6d9VGPb6alhVApsx5a+8QENunts6lFqIO+len8e5bX0s0a0/cZaoa ybKB6eJIAeynFaYW2AfHKztneq7Cs6Y8fttxR40U+hvw8K7aLQlKkxMUDyB7sDT9BSwASS6sYQoM YKVhNwu1VwqAA9wegURClaInE0gB9BxV6GyWA+8FmaEbwAI42i5VX1JaoI6eC27go2MfMIehG4hy TauyXnmOT4fV/mnrbY/YBElPpQZwN8owz7IYSPCA2WzxsgzkyPGMC89JjInJTyYfJDzBzAZWj0ld qa6b20Yf/roDNsN1eTWvrEK+b13eE0f6Wsv2FF4c63tN3P+BMBF/AECW1/7uoJXrrQtkZzYoYFKY kKIjj+2JerEwHAUeg+j/V9cjHHctb4KIM9c7xJmROsq70sfCgljpHyDWD2kXUIuxbhsYAAAAJXRF WHRkYXRlOmNyZWF0ZQAyMDIyLTAyLTA1VDIxOjI3OjEzKzAwOjAwVyvRBgAAACV0RVh0ZGF0ZTpt b2RpZnkAMjAyMi0wMi0wNVQyMToyNzoxMyswMDowMCZ2aboAAAAASUVORK5CYII= X-Now-Playing: David Bowie's _Young Americans_: "Can You Hear Me" Date: Sat, 05 Feb 2022 23:00:05 +0100 In-Reply-To: <86bkzli245.fsf@mail.linkov.net> (Juri Linkov's message of "Sat, 05 Feb 2022 20:45:30 +0200") Message-ID: <875yptas9m.fsf@gnus.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Report: Spam detection software, running on the system "quimby.gnus.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: Juri Linkov writes: >> I see one problem: Once one has some default state configured for Diff >> mode, it applies to patch embedded in Gnus Article buffers, but there >> the outline-minor-mode keymap isn't active and the [...] Content analysis details: (-2.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Juri Linkov writes: >> I see one problem: Once one has some default state configured for Diff >> mode, it applies to patch embedded in Gnus Article buffers, but there >> the outline-minor-mode keymap isn't active and there's no way to toggle >> headings visibility... No idea how to improve this situation... > > Oh, I see now it's a real problem. Some patches are not displayed > because their hunks are hidden. Fro example, a patch from bug#53770 > attached below, becomes hidden with these settings: > > (add-hook 'diff-mode-hook > (lambda () > (setq-local outline-default-state 2) > (outline-minor-mode 1))) Hm, that's not good... Perhaps we could just disable outline on the Gnus level when displaying parts? -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 12 Feb 2022 17:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Lars Ingebrigtsen Cc: 51809@debbugs.gnu.org, Matthias Meulien Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164468615826408 (code B ref 51809); Sat, 12 Feb 2022 17:16:02 +0000 Received: (at 51809) by debbugs.gnu.org; 12 Feb 2022 17:15:58 +0000 Received: from localhost ([127.0.0.1]:35552 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nIw06-0006rs-Kt for submit@debbugs.gnu.org; Sat, 12 Feb 2022 12:15:58 -0500 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:40631) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nIw03-0006rF-A2 for 51809@debbugs.gnu.org; Sat, 12 Feb 2022 12:15:55 -0500 Received: (Authenticated sender: juri@linkov.net) by mail.gandi.net (Postfix) with ESMTPSA id 438FE1C0002; Sat, 12 Feb 2022 17:15:47 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> Date: Sat, 12 Feb 2022 19:09:00 +0200 In-Reply-To: <875yptas9m.fsf@gnus.org> (Lars Ingebrigtsen's message of "Sat, 05 Feb 2022 23:00:05 +0100") Message-ID: <86y22gypxn.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >>> I see one problem: Once one has some default state configured for Diff >>> mode, it applies to patch embedded in Gnus Article buffers, but there >>> the outline-minor-mode keymap isn't active and there's no way to toggle >>> headings visibility... No idea how to improve this situation... >> >> Oh, I see now it's a real problem. Some patches are not displayed >> because their hunks are hidden. Fro example, a patch from bug#53770 >> attached below, becomes hidden with these settings: >> >> (add-hook 'diff-mode-hook >> (lambda () >> (setq-local outline-default-state 2) >> (outline-minor-mode 1))) > > Hm, that's not good... Perhaps we could just disable outline on the > Gnus level when displaying parts? I'm still not sure about disabling outlines in Gnus because when the user configured to hide outlines e.g. with long lines, then it makes sense to hide long lines in Gnus too. But the problem with the reported attached file is different: in that file outlines are never displayed even outside of Gnus. This is because the diff format is slightly different, but `outline--show-headings-up-to-level' first hides all outlines, but then fails to unhide them back. Matthias, could you please check what is wrong with the reported diff file and why vasibility of its outlines can't be changed? From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 12 Feb 2022 17:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164468680727532 (code B ref 51809); Sat, 12 Feb 2022 17:27:02 +0000 Received: (at 51809) by debbugs.gnu.org; 12 Feb 2022 17:26:47 +0000 Received: from localhost ([127.0.0.1]:35576 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nIwAZ-0007A0-0z for submit@debbugs.gnu.org; Sat, 12 Feb 2022 12:26:47 -0500 Received: from mail-wm1-f53.google.com ([209.85.128.53]:55957) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nIwAX-00079l-TH for 51809@debbugs.gnu.org; Sat, 12 Feb 2022 12:26:46 -0500 Received: by mail-wm1-f53.google.com with SMTP id i19so5823798wmq.5 for <51809@debbugs.gnu.org>; Sat, 12 Feb 2022 09:26:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=DumZkazRhw0ioxqgxmXmFYnr5bKDjPGjOspDJjC0q68=; b=GXfSJK0X2hbRp5i/UG17BaWDJrOaiWGFv4t8HzIi6L97YLN1Uo5VybLm56Z5m/2qyR LMsShlBWpnhvzI0rAVT6Ee1yQ29Q9/pL1pBP0undZrPjCOIZv7T+Anz33qhqM4fb5YKw 66PLvmLnbbBZe94ojxF2FA1Vjh2UzF30KivWczWOv8Kil5q5BSG36X1cTdVgrOOH38xA XfIfAelyBxlU3Fh45PPzJ39rWYVXYE4eB8SBawLiA7LtkuG+sCZkAvi+zYRevXUZe189 o4S/9lOC0uCJPdITUbgTUEnd3p9uKMQj78NoiVEfTrZBOfsciuvEF0DcFf+/3iZN1kFj GQnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=DumZkazRhw0ioxqgxmXmFYnr5bKDjPGjOspDJjC0q68=; b=EJFPIJ1iGK1z1JtFfLRdqcrEPLCMjMlzCQMgAqEVvIS4H0jtE8DZJ1hQ/exnw9glyB 3R4YfK3O8+783Hsw5ZjbQVwOaJyJkI5x40nPl5zRw3ikX7VzxEUwnZrUGdyTOqzHd6uD lXSS5bD4WQqZyLjK1X3u5NQI0lOB3m14ah+oy2vlIZZX8R+sKczNQTYlq8jjK34weK1C iCnQwPk2iW3Yenn+NiNsIpuI3RcxPUKLDZQLZYHXa/V+iq2XYO5f33vDLPBMqF565yFw zSpnBGd9MJHsEAMO1FbBVx7wsxYIEGYxwFu8lZc/dIiDBV5QoCFhq3REFB/yK08n69w/ hoRg== X-Gm-Message-State: AOAM533TaxOixGJA/MsKOcg3yi8ja+uacjjg8N8ghQNWag368B5esMif tn3OkZ0KXpiZaMdE4QE243GVQZOxj14Ru2arPDg= X-Google-Smtp-Source: ABdhPJyY/hz4wT30+1FRfLciC6zLobWMTbTyoZFvFfWXhvqUm0CVki3dTBblgvYhY8BOv22RCLCPU9KVGhOiTHtcpC0= X-Received: by 2002:a1c:27c3:: with SMTP id n186mr4813722wmn.92.1644686799888; Sat, 12 Feb 2022 09:26:39 -0800 (PST) MIME-Version: 1.0 References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> In-Reply-To: <86y22gypxn.fsf@mail.linkov.net> From: Matthias Meulien Date: Sat, 12 Feb 2022 18:26:29 +0100 Message-ID: Content-Type: multipart/alternative; boundary="0000000000007965ca05d7d57c76" X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --0000000000007965ca05d7d57c76 Content-Type: text/plain; charset="UTF-8" > > Matthias, could you please check what is wrong with the reported diff file > and why vasibility of its outlines can't be changed? > Sure. In the forthcoming days, I am away from home right now, without computer. > --0000000000007965ca05d7d57c76 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Matthias, could you please check what is wrong with the reported diff= file
and why vasibility of its outlines can't be changed?

Sure. In the forthc= oming days, I am away from home right now, without computer.
--0000000000007965ca05d7d57c76-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Feb 2022 21:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164487286324991 (code B ref 51809); Mon, 14 Feb 2022 21:08:02 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Feb 2022 21:07:43 +0000 Received: from localhost ([127.0.0.1]:42795 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJiZT-0006V0-2f for submit@debbugs.gnu.org; Mon, 14 Feb 2022 16:07:43 -0500 Received: from mail-wr1-f41.google.com ([209.85.221.41]:37749) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJiZQ-0006Ul-23 for 51809@debbugs.gnu.org; Mon, 14 Feb 2022 16:07:41 -0500 Received: by mail-wr1-f41.google.com with SMTP id w11so28878260wra.4 for <51809@debbugs.gnu.org>; Mon, 14 Feb 2022 13:07:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=O7CF3ER2p6Hvht0METS+i+JpH4eeQ/Utzwwbx5S/khs=; b=JreScTuEDmRYb4p0XHUkdEfW9Rc+loLt8RXzoa6e4VOqpq1UG155QsGUWvusDgZGjG Ahw5/7DO2lKU2//dOlHOnUtAQQEFIUR6BuTRVBLnUyiKuz48Tom44MLCUqQk+MT5S2Jj Hr6VN3bj8jvmwulTovND/wPhsZXMJCmgq38Z93W0M/dUcrl30xjz0fgG24Lw63fjreeq K2z1KTQFwAQ3TAg1liydHuKVuS21BeGY0jjwMwjGGZn2pknWatVMWQtntiEp35uMFnuw OggNGBTMz8LjlCqijZu2vqvGXmz3gx0RG/4WR3nvjuJm3eA5q3Ex9sbRG7TGqlHHw0P5 KRmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=O7CF3ER2p6Hvht0METS+i+JpH4eeQ/Utzwwbx5S/khs=; b=IdoSfQj8ZqBp5ed0UiT2FtfkHx9TR5Y17Ry/7zjUb63iNqM97B8YHf8Lyd9qot/iZm aZ1nsbN8pQPlNSWLRIBoTBnO92PtlcYGlrziXWqMPkEwtU0T/N9DxRF6nvtB5yiVyGma /CRIav5TwVs3C91uZYFYtrFDT6c3fplkjDquuplFJ4WlflzEMHPLY7e5isfTpWy2GBKi lVsqE3doLzgiv8bR3g58PMle14zRY/bmrvD1wre+hTtTWcipm9nM+h/vltAj24V77/RN yuDOWlvO0FmAmiMhyaH/vaHXoXszxlrHF2FSw7wKNm5WEVJrwdyiwgXpMMuGCpiw60zo atpA== X-Gm-Message-State: AOAM530HbnWmAFKsUMBkdrTRYNLOSJDETCr4EDkeMAc14xSaCV1cOO6G oKrpR0x7agNaGNSBi02FK1Xrtd2euBU= X-Google-Smtp-Source: ABdhPJxRomxIGHwTHbLKyF4Ie8Bg7x96knvMNJaU4Te5rCnSh9lSUSJAqyfVKQ290p1pcYYv5NOBMA== X-Received: by 2002:a5d:453c:: with SMTP id j28mr637344wra.351.1644872853497; Mon, 14 Feb 2022 13:07:33 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id az7sm16142500wmb.14.2022.02.14.13.07.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 13:07:33 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <86h7cgdk4v.fsf@mail.linkov.net> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> Date: Mon, 14 Feb 2022 22:07:32 +0100 In-Reply-To: <86y22gypxn.fsf@mail.linkov.net> (Juri Linkov's message of "Sat, 12 Feb 2022 19:09:00 +0200") Message-ID: <871r0517jf.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Juri Linkov writes: > But the problem with the reported attached file is different: > in that file outlines are never displayed even outside of Gnus. > This is because the diff format is slightly different, but > `outline--show-headings-up-to-level' first hides all outlines, > but then fails to unhide them back. > > Matthias, could you please check what is wrong with the reported diff file > and why vasibility of its outlines can't be changed? First note that with the reported attached file `diff-buffer-type' isn't equal to 'git: There's no "diff --git" header. If you replace the file first three lines with the following four lines then there's no outline problem: diff --git a/woman.el.orig b/woman.el index 44328a2b28..214f7435d9 100644 --- a/woman.el.orig +++ b/woman.el When `diff-buffer-type' is nil, `outline-regexp' is set to `diff-outline-regex', which default to "\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)", and `outline-level' use the default function which returns the number of characters matched by =E2=80=98outline-regexp=E2=80=99 Since the regexp match the first 5 characters of the first line of the diff ("+++ w") and the first 6 characters of the second line ("@@ -22"), the file has two headings at level 5 and 6! If you have set `outline-default-state' to be equal to 1 and kept `outline-default-rules' to its default nil (meaning the subtree starting at level 1 must be hidden), then the file outlines are logically hidden by `outline-apply-default-state'. I suspect that it's what you see. >From my pov, the problem doesn't come from the "default outline state machinery" but from wrong defaults for `outline-level' when `diff-buffer-type' is nil. My first impression is that setting `outline-level' to `diff--outline-level' inconditionnaly should work but since I don't understand why `diff-outline-regex' hasn't been defined in terms of `diff-file-header-re' and `diff-hunk-header-re' I guess I am missing some subtleties. (Note that there's another minor bug when `diff-buffer-type` isn't equal to 'git: `diff--font-lock-prettify` should be a no-op since the regexp written there match only Git generated diffs, confirmed by the FIXME string "This has only been tested with Git's diff output." written in the implementation). --=20 Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Feb 2022 21:14:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164487321425502 (code B ref 51809); Mon, 14 Feb 2022 21:14:02 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Feb 2022 21:13:34 +0000 Received: from localhost ([127.0.0.1]:42799 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJif1-0006d8-QH for submit@debbugs.gnu.org; Mon, 14 Feb 2022 16:13:34 -0500 Received: from mail-wr1-f45.google.com ([209.85.221.45]:38506) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJiex-0006ct-Q9 for 51809@debbugs.gnu.org; Mon, 14 Feb 2022 16:13:26 -0500 Received: by mail-wr1-f45.google.com with SMTP id d27so25102315wrb.5 for <51809@debbugs.gnu.org>; Mon, 14 Feb 2022 13:13:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=aHB8ArjbYppYc1feSjwHHok0A3qMCKGSDrvbNjNWK3M=; b=MX7lmxdcyewNPTs7pEtpqL1q1MSNKyoTNzKtLFb7/0zd98JrL3DXejNBQBusrmZs+r IbUgdXcrr8WWeM4nSPj722qY/AOi3zeevQDpvJZ1hQG4gg5sM4U6b6K5WvBjFHC1dC8A WPNMXSnc6DNZQmT4xmRLZ/t1wCb48UTwC3JnY4z3Q4l5uPS4LjoMtLtnq1pTHxLlWIbD O0hm4sypozjoUsYYIH0Z45NTqBHCpYla6z8pUnBDgIhCCIdUlZv9TexCWMQjnPiBLTx7 9BLzC9tvYrd+g9j9ftb7QrO+zIh5NBJwsXHUlrgKO5ltjbzhTSa6c94eO5XErlZkaX2q /B/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=aHB8ArjbYppYc1feSjwHHok0A3qMCKGSDrvbNjNWK3M=; b=K8JGiABEmmsiQjWrY+WzzQ3WiTNasTbuHCd2syyq6rq5n9giqmXiE8ilakuzvFoFAf HaiLYvZS7SLdV+SFDBTVl3p4xfyxkNmiNGgBnD+kRxGIyN5ojwcoNfbeBsXitVKSb0j5 NdzGYlqUnEFXgQcaobb4U0Ol6uRwgrSSJlDYNXh9Skgk28faiPlpeYqQPRovaN05aOLh l2PQw1xedqumgcygUVyMOVh1wnzjnjBAS2G+xkCp7NdOC9yFydMxOzE3ZctaU+ZH8dvx I63DmpqtHgqcA3C2Q6dL/MlbGFGiHxg1EYY5ogdeQgLQynud0rNP+/1kNL9YIMLtzyuE R29Q== X-Gm-Message-State: AOAM532ekQYu6tH7jqFwCGp58cryGa214DohIxjs4e1OKyISvTNfDONA FkifkqhL9va1nFamZbpWN7OjL/FmaEI= X-Google-Smtp-Source: ABdhPJx329t1XuRzW49a3F6i3kxGu0o7X//DcrouCsG+l7g1ZwPAAtbgVwM5zZO1pdZTCyOb7rZi3A== X-Received: by 2002:a05:6000:1189:: with SMTP id g9mr676940wrx.482.1644873197788; Mon, 14 Feb 2022 13:13:17 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id o4sm11275460wms.9.2022.02.14.13.13.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 13:13:17 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> <871r0517jf.fsf@gmail.com> Date: Mon, 14 Feb 2022 22:13:16 +0100 In-Reply-To: <871r0517jf.fsf@gmail.com> (Matthias Meulien's message of "Mon, 14 Feb 2022 22:07:32 +0100") Message-ID: <87wnhxywwj.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Matthias Meulien writes: Oh and don't forget to set `outline-default-state' to nil before reading my previous mail =F0=9F=98=83. --=20 Matthias From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Feb 2022 21:34:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164487443827418 (code B ref 51809); Mon, 14 Feb 2022 21:34:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Feb 2022 21:33:58 +0000 Received: from localhost ([127.0.0.1]:42812 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJiys-00078A-QG for submit@debbugs.gnu.org; Mon, 14 Feb 2022 16:33:58 -0500 Received: from mail-wr1-f43.google.com ([209.85.221.43]:36625) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJiyr-00077w-6l for 51809@debbugs.gnu.org; Mon, 14 Feb 2022 16:33:57 -0500 Received: by mail-wr1-f43.google.com with SMTP id o24so26302963wro.3 for <51809@debbugs.gnu.org>; Mon, 14 Feb 2022 13:33:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=mlD1Loy00o0S6hWlrWK4iT6+nAoeKsjUAZgcZx3inrA=; b=WoeNU2HmgZ6VwGDejXtb4SlWtmmbsTcHGCenon3OKZd7Ly8Ut3OQYyVD7SfvuHPSlM MkK+6E59yAsAxYiUuUPBPcN0YIK+dvVji6bCp9CahKlDArFAUnsDs7+HDrhOKklCOzLj svOJAnt0bjpA0Y8YLcPvJRPS0YPCOpQRc2yAgM7eosldLwy5zUI9bff87AKu9rEtsuP8 QcMtr/OnfptpEaDgIgl7MIUAmSCmg2k1rbzlsZBrUdskU0xCmabwQJIDPtPhrJOm2a+Q Ny42/jXTZebhJr0YIIclv9/qqn93cVutL92wbSBh+uYm0D50EBV7vS9ZphWF7K051k+e IQgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=mlD1Loy00o0S6hWlrWK4iT6+nAoeKsjUAZgcZx3inrA=; b=KEYLRmPBsHqnFFoVTA3e/EP+/GPARe7FJBR32g8Pa1+GuvkwcxK6egb2rESdAdDFQU WGEaABim6CEAxpIbsi6/wL0c34ikLuTA/8ZKnr8kv715pKOabs4HsgQcXwtkM+hDYUN/ OKga2H1xUWC8vD3+an81D4x5AFUx/Wfpr4kz7o9AnHcClqUJLVEPVA/YI38Ig2f2cT4I jQVyjt+HfMeaBQF2dx/W3azGpaPG0SINc2PKbwJB6FAOJ/G688QScqu9K+zlZo85Abi7 m9yD1R6xA/C0/7mXhiNxUhv9exYjTf0pxHXLqqBQxp//f9CcObb/eTo4XzxJLnUHhh7L O/ZQ== X-Gm-Message-State: AOAM532oiPDP9v/AgqO2ycQO5ewcn0hIqX9NuaxzOWFL427ZVmAqwZ3D dTQND0BiWOIXNf0tfo3dCFaCfjUKUQQ= X-Google-Smtp-Source: ABdhPJzruKiypwon4Qv6jPD2z6qF+kcwRWLccidYzk0w+NiFKIH8P6i8Ifr3cd/HQdRXeUDpZ3VlsA== X-Received: by 2002:a5d:4882:: with SMTP id g2mr723855wrq.393.1644874431246; Mon, 14 Feb 2022 13:33:51 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id r13sm18840850wro.89.2022.02.14.13.33.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 13:33:50 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <87ee7kvshn.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> <871r0517jf.fsf@gmail.com> Date: Mon, 14 Feb 2022 22:33:49 +0100 In-Reply-To: <871r0517jf.fsf@gmail.com> (Matthias Meulien's message of "Mon, 14 Feb 2022 22:07:32 +0100") Message-ID: <87sfslyvya.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain Matthias Meulien writes: > My first impression is that setting `outline-level' to > `diff--outline-level' inconditionnaly should work but since I don't > understand why `diff-outline-regex' hasn't been defined in terms of > `diff-file-header-re' and `diff-hunk-header-re' I guess I am missing > some subtleties. > > (Note that there's another minor bug when `diff-buffer-type` isn't equal > to 'git: `diff--font-lock-prettify` should be a no-op since the regexp > written there match only Git generated diffs, confirmed by the FIXME > string "This has only been tested with Git's diff output." written in > the implementation). Here's the corresponding patch: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Fix-computation-of-outline-heading-level-for-non-git.patch >From 4cf31f61caa50ba97e67847b175d598387fabba4 Mon Sep 17 00:00:00 2001 From: Matthias Meulien Date: Mon, 14 Feb 2022 22:29:49 +0100 Subject: [PATCH] Fix computation of outline heading level for non-git diff * lisp/vc/diff-mode.el (diff-setup-buffer-type): Compute outline heading level using diff-hunk-header-re. (diff--font-lock-prettify): Disable prettify in non-git diff. --- lisp/vc/diff-mode.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 0bf7899246..d0c05d3204 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -1596,8 +1596,8 @@ diff-setup-buffer-type 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)) + (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 () @@ -2599,7 +2599,8 @@ 'diff-fringe-nul nil nil 'center) (defun diff--font-lock-prettify (limit) - (when diff-font-lock-prettify + (when (and diff-font-lock-prettify + (eq diff-buffer-type 'git)) (save-excursion ;; FIXME: Include the first space for context-style hunks! (while (re-search-forward "^[-+! ]" limit t) -- 2.30.2 --=-=-= Content-Type: text/plain Without this patch when I visit the reported woman.patch file I see the following: --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=without_patch.png Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAj4AAACiCAYAAABBCce9AAAABHNCSVQICAgIfAhkiAAAABl0RVh0 U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AABHbSURBVHic7d15bFTV/8bxZ+7MFOgiBVpE xC5WWdyIUFmqEKMgAbeIYKy44EJQkQiaGDGIMQY1UTESF8KixAXRKhEVUTTGKCIIWCnKt7QUWmUE utFCaaed7fdHf3PTQint0AV63q9/GOaee+5nboH7cM65dxx7cv8OCQAAwABWZxcAAADQUQg+AADA GAQfAABgDJfEEh8AAGAGRnwAAIAxCD4AAMAYBB8AAGAMKxSqX+MT/vX41029d6p92qPPM2Gfk22P ZJ/OrANmaMnP/vg2kfx5iaSPU+1zpvTREp1VO8xxtlxbzpZruiP/fzv5GwYAAIzAVBcAADAGwQcA ABiD4AMAAIxB8AEAAMYg+AAAAGMQfAAAgDEIPgAAwBiNHmDY3IOAmtreUfscvz2Sfdqj9s46H2fT eY9knzO1jrOp9pa815LtkezTVes402o//hin+n2k+7RFH63d50zpoymdUXtX/TPcWbU78nblnPon DQAA0AUw1QUAAIxB8AEAAMYg+AAAAGO4PP/s6+waAAAAOgQjPgAAwBiOUHl5xHd15ZWUtGUtp+2/ //7r7BJgkP79+3d2CQCAVmLEBwAAGIPgAwAAjEHwAQAAxiD4AAAAY7g6uwCc+W699VYdPXrU/r3D 4VBKSopWrFjRiVVF5rPPPtMvv/yitLQ0Pfroo3K5+CsAACbhX32c0t13360///xTkrR9+3b5fD5V V1d3clWtV1NTo3feeUfBYFA5OTm69tprdcUVV3R2WQCADkTwwSlNnTpVU6dOlSRlZmaq5Ax7jEFL 9ejRQ4888og94nPJJZd0dkkAgA5G8IFRpkyZoilTpnR2GQCATkLwOU5VVZWKi4sVHR2tfv36Ndv2 4MGDCgQC6tevn5xOp6qrq3Xw4EH16NFD5513XpP7lJWVqbS0VL169VLfvn1PWU8oFNKBAwd06NAh JSYmasCAARF9rpOpqKjQP//8o+7duys5OVndunVr0/5bqzXnPywQCMjj8ai8vFz9+vVr8X6nUlpa qp07dyoYDOqyyy7Tueeeq9raWv3777+SeIAhAJyNulTwWb58uVavXi3LsvTpp58qPj7+hDZVVVWa OnWqAoGAHn74YU2ePFmStGXLFi1atEjFxcV22+7du2v69Om644475HA4VFFRoczMTPn9fsXHx6u0 tFSSFBcXp4yMDH3//fcKBoOSpJtuuklPPvmkJKmurk4rVqzQ2rVrVVtba/ffrVs33XjjjZo1a5Ys q/4Gux9++EGvvPKKJGnatGn67rvvGj2ROi0tTa+//rri4uJO61z98ssvWrRokSoqKuz3nE6nJk+e rJkzZ8rpdJ5W/63VkvMftmjRIq1fv14ul0t33nmnsrKydOzYMXt7bGys5s6dq+uuu05S/YLmJUuW KBAISKpfnB0fH681a9Y0WUtZWZlefPFF/fHHH43eT0lJkcfjkc/nkyTt3r27bT48AKDDdKnb2S+8 8EIFAgH5fD4dPnxYkrR06VLdc889evbZZyVJXq9XXq9XPp9P559/viRp9erVmjdvnoqLi9W/f39N nDhRSUlJ8nq9WrJkiV5++WVJ9aMvXq9Xfr9fZWVlmjx5slwul6qqqvTjjz9q4MCBGj58uCRp3bp1 9lqYJUuW6LPPPpPP59M111yje++9V2PGjFFdXZ3WrFlj1ybVj17U1dWprq5Oq1atUllZmUaMGKH0 9HRJUkFBgZ577rnTOk+rV6/WggULVFFRoZEjR+rpp5/W9ddfr0AgoKysLC1atOi0+o+knpac/zCf zye/3y+v16uVK1fq2LFjGjJkiCZOnKjExEQFAgF98803dvuhQ4dqypQpGjNmjGJiYuw+muL3+zVv 3jzl5OSoZ8+emjdvnmbPnq2oqCgVFhYqFApp5syZWrp0afudEABAuzntEZ9Dhw5p+/btzbYZNmyY Pf3Q2vatMWjQIPt1Xl6eUlNTtW3bNnk8Hh08eFA1NTV2IJKk1NRUFRUVafny5ZKk9PR0vfTSS3K5 XAoGg3r++ef1888/a8OGDRo/frzS0tLsfUePHq3Zs2dr165dys3Nlc/n0zPPPKOtW7dq+/btCoVC 2r9/vxITE3X//fdr/PjxiomJUVJSkt3HsmXLtGrVKm3atEm5ubkaPHhwo8/j9/v1wgsvaPTo0ZKk p556Slu3blV2drb2798f0bTXgQMH9N5778myLI0bN07z5s2TJE2YMEG9e/dWVlaWvvnmG02bNq1D pnJac/7D4a8hh8OhOXPm6JZbbpEkVVdXq6CgQN27d7fbXHzxxbr44oslSTNmzNDevXtPWs+vv/6q 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 RU5ErkJggg== --=-=-= Content-Type: text/plain but with the patch I see: --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=with_patch.png Content-Transfer-Encoding: base64 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 wsJMvt8sN76kr776CqtWrYKDgwP27dtX5gXEqjK+LbD+1q+/rbbHFi1aVCkvIiIiIqLa5O7duxbP Gx4eDrVajQ4dOkCj0Ug/arXa5McqwmjTvwAAIABJREFUDTdQfGumb775Br///jsKCgqk6T169MDM mTPh4+NjMq/ceFuJiorCyJEjK4x57733MGXKFIviAeC///0vPv/8c6SkpAAANBoNgoODMX36dNSv X7/U/HLjjVatWoWvvvoKALBixQp07969zDhLx7cF1t829bfF9siGm4iIiIjqkgeq4TbS6/VISEhA bm4ufH19Kz1SLTf+QZaSkoLbt2+jWbNm0i2ZrBkPAB999BF27NiBffv2wdvb2+rjP8gexvpbc3tk w01EREREdUlVGu7Q0FCo1Wo8/vjjUKvV0Gg0UKlUUqOtUqmgUqms33BTzXrzzTehUqmwYsWKmk7l oVSX68+Gm4iIiIjqkupouKt8lXKqPSIjI3H27Fls3769plN5KLH+RERERERUUpWvUk61x+7du/Hd d9+hadOmNZ3KQ4n1JyIiIiKikniEuw5ZuXJlTafwUGP9iYiIiIioJB7hJiIiIiIiIrKBKh3h5kWU iIiIiIiIiMrGI9xERERERERENsCGm4iIiIiIiMgG2HATERERERER2QAbbiIiIiIiIiIbYMP9gBBC YOnSpRg/fnxNp1IpFxcXNGrUSPpp165dTadE5di+fTsaNWqE+fPn13QqVMfcvHkT9evXx4QJE2wS b+t8qO5ZtGgRQkJCoNPpajqVB9bw4cMRFRVls3giorqIDfcD4Pr16+jevTvef/995OTkoKioqKZT qtCMGTMwc+ZMzJw5EwqFAtnZ2TWdUp2RnZ2NrKwsq42n0+mQmZkJBwcHq41JZJSfn4+GDRvaLN7W +VD1svb+raScnBxMmTIFixcvxl9//WWTZdiaLetjzvi5ubk4dOgQgoKCMGXKlEo/i8iNJyKqq9hw 13I5OTkYOHAgzpw5gw0bNuCnn36CWl2lu7nZ3OTJkzFlyhRMmTKFH26t6PPPP0fDhg1x5syZmk6F iMiqbL1/c3R0RGhoKCZMmICuXbvaZBm2ZOv6mDO+g4MDzp49i+eeew4LFy7E2LFjKxxTbjwRUV1V uzu3h5wQAsOHD8c///yD3377Db17967plKgGpaSkAAD8/PxqOBMiIuuqjv3bxIkTbTa2rdm6PuaO 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 iEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCA m4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiI iIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgG DLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iIiIiIiEgGDLiJiIiIiIiIZMCAm4iI iIiIiEgGDLhJVqmpqYVdhH88IUSxzT8rKwtKpVK2/P9p5G7Pf1p//6fVt6jh+JC/9PT0wi6C2Ypz /0pISECFChUwbNiwf0R6IjKOAXcx16hRI7i4uGhebm5u8Pb2RufOnbFlyxad9MOGDYOTk5PR18iR IwEAU6ZMgaura74f2K1atUJoaKjedWFhYXj8+LHBbQcMGKBVfhcXF5QvXx4tWrTAggULkJ2dbXb5 5Xbs2LF8y6J+PX36FADw8ccfw8XFBUlJSTr5JSYmwsXFBYMGDdJaXqNGDZ02Ur9++OEHvWW7fPky PvroI/j4+KBUqVJo3rw5xo8fj7S0NKvU3dT8zakvAOzbtw8tWrTQ1LN27dpYv369TrrmzZujYsWK yMzM1FvOjz/+GDVq1ND8vWLFCri4uODnn382qZ7dunXTam8fHx80btwY8+bNw4sXL0zKw5gRI0bo vKeenp4ICgrCxIkT8fLlS630UvuLmqntKXU8eVN+/V1q/lLer4cPH8LNzQ1NmjQx+CPQgAED4Obm hoSEhHzzM0V+9ZV6vElNL5WcnxfmMLd/SRkfypYti3v37unNp2rVqvjXv/5VIPXNyMiAi4sLJk6c aDDNzJkz4eTkhIyMDE35pYxvasnJyQgLC0ONGjVQsmRJuLq6okePHoiKitLZ3pzx2VSWHs/G+pc5 n79S319zx1sAOHLkCJ48eWJy3Yt7eiIyTlHYBSDLpKWlwdnZGUOHDgUAZGdn4+HDh9ixYwf27t2L 8ePHY9q0aZr02dnZSE9Px4QJEwzm+X//938AAH9/f7x8+RI3btxAUFAQgNwvtUuWLMHUqVM16WNi YtChQwedfDIyMrB161ZUr14dY8aM0buvjIwMKJVK9O/fH3Z2dhBC4OXLl/jzzz8xcuRIHDhwAHv3 7oWdnZ3k8svN19dX0+4AoFKpMG/ePFStWhVdu3bVSluyZEkAuWcblEolXFxcdPITQkCpVMLR0VFr +fDhw/Hy5Us8f/4c//3vf9GiRQt06dIFQO4Xsjft2rUL3bp1Q+3atfH111/DwcEBJ0+exJw5c7Br 1y7s2rULAQEBZtdbSv7m1HfJkiX4z3/+A29vbwwePBhOTk5Yv349PvnkE9y4cQOTJ0/WpH39+jWc nZ3h4OCgt6zp6elaPwJkZ2dDqVTCw8PDpLqmp6dDoVDgm2++gUqlwvPnz3Hs2DGMGjUKy5cvx++/ /w4fHx+T8tJHffyHhITA1dUVQghkZGTg7NmzmDp1KrZu3YozZ87A1dVVK72p/QWQ1p5Sx5M365Jf fzdnvDL1/fLx8UG/fv0QERGBnTt3olu3blrr7927h3Xr1qF79+7w8/PLN7/8mFJfqceb1PRSyfl5 YQ5z+pfU8SE5ORnh4eF6A/KMjAw4OTkVWH2VSiUWLFiA4cOH67zHL168wKxZs7R+4JY6vgG5x3mr Vq3w6NEjDB48GD/88AMuXbqENWvWoGnTpti+fbvm89qc8VkKS47n/PqXOZ+/Ut9fc8ZbNRsbGwCA ra1p57WKe3oiykdqaqow90WFLzAwUNSvX19n+YMHD0RgYKCws7MTd+7c0SwPDQ0VAEzK+9y5cwKA 2LBhg2bZqlWrRNWqVTV/v3z5UgAQO3bs0Nl++/btAoAIDAw0uI/evXsLACI9PV1reUpKimjWrJkA IH799Vezyl/QsrOzBQDRtWtXg2k6d+6st75CCPHkyRMBQAwdOlTvtgkJCQKAGDFihMH8s7KyRJky ZUTDhg1FZmam1rqjR4+KOnXqiOfPn5tYI8vzl1rfa9euCXt7e9GkSRORmJioWZ6amiqaNm0qbGxs xIkTJzTL69evb/T46ty5s/D19dX8HRkZKQCIrVu3mlTf4OBg4efnp7N86dKlAoBo3ry5SfkYoj6e b9++rbU8JydHDBgwQAAQ4eHhmuVS+4vU9pQ6nuRlSn+Xmr/U9+vBgweiRIkSol69ekKlUmmtGzFi hAAgLl68aFJe+TGlvlLLLzW9VHJ+XphDav8yZ3wAIACIU6dO6ezH19dXBAcHa/6Ws77p6emasowZ M0Zn/ffff69Zr+7fUsc3lUolmjZtKkqVKiWOHDmilfb27dvC19dXeHl5iRcvXmi2N/fzyBSWHM+m 9K+8TPn8lfr+Sh1v89qzZ48AICpVqmTSvop7eqLizJJYeE7EHLFg6QJx9NxRceLyCXEq+pQ4d/Oc uBx/WUTdixKxj2LFzcSbgj9dvaV8fHwwaNAg5OTk4Pz582blERgYCBsbG8TGxmqWHT58GHFxcZpL MuPj4wEANWvW1Nl+w4YNKFWqFK5fv45Tp05J2rebmxvmzZsHADh48KBZ5f8nunbtGpKTk9GxY0fY 29trrWvVqhVOnTqF0qVLF9n858yZg6ysLCxZsgSenp6a5S4uLli1ahVsbW2xfPlys/O3lkGDBuHL L7/EyZMnsWfPHovzU59NULO1tcVPP/0EBwcH7N27N9/tDfUXa7WnKeOJJf3dGuOVOp8hQ4bg6tWr 2LZtm2Z5SkoKli9fjg4dOqBBgwZm55+XJfUtaqzV/tZiqH+Zczz7+PjA2dm5wG41yo+6bycmJmqW JScnY/78+TpjqlT79+/H6dOnMWzYMLRu3VprXUBAAFasWIFNmzZprpgpyopy/zLl+0nZsmUBQOs4 Naa4pyci4xhwW0jqhC0FOcHLs2fPAADlypUza3tnZ2f4+vrqBNx5/42Pj4dCodC5RFmpVGLPnj2Y MmUK3NzcsGrVKsn7r169OgBo7mezhrd9gh31pXt//fWX3vXOzs5FNn8hBHbv3o3WrVujYcOGOusD AwPRsGFD7Nu3Dzk5OWbvx1rUX+B37NghS/4lS5aEj4+PyfeKv9lfrN2exsYTa/R3S8crtXHjxsHJ yQmTJ0/W3Mu9ZMkSKJVKhIeHW5S3mjXqW9RYq/2t5c3+Ze7x7OnpiTFjxuD06dPYuHFjwRTeiJCQ EGRlZWHWrFmaZer/9+rVy6K8N2/eDIVCYXCiq/bt22vds15UFYf+ld/3Ezc3NwBAmTJlTMqvuKcn IuMYcFtg06ZN8PDwMPkDTGp6S+zZswcRERFo0KABWrRoYXY+NWvW1ATcUVFR+PvvvxEQEKAVcFet WlXnl/nffvsNmZmZ6NevH3r27IlNmzZJnrDryJEjAKC5f9xSBdn+hcXX1xfNmzfH8ePH8dVXX1n9 BwY58799+zb+/vtvvPvuuwbTvPfee0hKSsLNmzettl9zVatWDc7Ozvjzzz8tzuvNM9wAcOfOHdy5 cwe1atUyKY83+4s12zO/8cTS/m6t8QoAypcvjy+//BLXrl3Dli1bkJGRgUWLFqFJkyZW6/vWGN+K Emu2v7W82b8sOZ5HjRoFHx8fjB07ttBn7fbz88PAgQMRERGBJ0+eIDExET/++CPGjh1r8b37J0+e REBAALy9va1U2sJRHPpXft9P1FcRuLu7m5RfcU9PRMZx0jQLnDp1ChkZGTh37hxevXqFUqVKWTW9 qeLi4tCqVSsAuZOC3L9/H3fv3kXnzp2xbt06vZNeGLq8bujQoahSpYrm75o1a+L48ePIycnB4cOH 0aRJE7zzzjtYt24dhBC4ffu23svJN27ciFatWsHLywsDBgzAsmXLsH37dvTr10/vfpOSkjSTs2Rk ZODYsWMIDQ2Fq6srBg8ebHb585Kr/c0RHh4OhUK7+7169coqeW/ZsgVdu3bFkiVLsH79enzxxRcY Pnw4KlasWGj5m1Jf9SWWxr4s+vr6Asi9RLgoCAgIwJ07dyzO5/nz55qJi7KzsxEVFYUhQ4YAyJ00 702m9Bdz29Oc8URKfzcnf6nGjh2LyMhITJo0CS9evMCTJ0+wZMkSi/NVkzq+FSVyfl5YW97+Zcn4 ULJkSUybNg0DBgzAvHnzMH78eKP7lbu+48ePx6pVq/Df//4XQO4l8SNGjMC3335rUb6PHz/WO5Fm fuT8PDKH3P1L6vsr9fsJUPQCYgbcRIWLAbcFvv32W5QtWxYtWrQwKXiTmt5UCoUC5cuXB5D7BcrW 1haPHz/G3bt3ce3aNb0fwJGRkXrzCgkJ0Qm4MzMzcfv2bfz+++9o27YtGjdujIULF+LSpUuIj4/X uScyOTkZBw8exE8//QQgdybtatWqYeXKlQY/MNVflPLy8vLCjh079P7qb2r585Kr/c2xY8cOnbOa xh4xIoW3tzfOnDmD7du3Y9KkSZg7dy4iIiIwZswYjB07VmtW3oLK35T6qh+BVaJECYP7VgelReX5 rH5+frh69SpUKpVFgaK+S2SdnJwQERGB4OBgnXWm9Bdz21PqeCK1v5szXknl5eWFoUOHYtasWRgx YgQCAwPx0UcfWZwvYN74VpTI+XlhbXn7l6XjQ//+/bFw4ULMmDEDAwcO1LSBPnLXt2LFihg0aJBm P/Pnz9fMpG2unJwcKJVKeHl5Sd5Wzs8jqQqif0l9f6V+PwFyb6+ysbExOWAt7umJyDgG3Bbw9PQ0 +kxNS9Obys/PDxs2bNBadvfuXQQHB6N9+/Y4ffo06tSpo7X+9evXJuWtPnt95coVnDhxAuHh4QgK CoKdnR0OHz6M+Ph49O3bV2ubbdu2QQiBkJAQzbLPPvsMEydOREJCgt5H8ixevBj29vYQQmDs2LEo U6YMYmJiDAaHppY/L7na3xw3btzQ+eJ49+5dqzyuCMi9RLl79+4ICQnB4cOHMXv2bEyePBkbNmzA +fPn9T4GRs78Tamv+v7vN589nZf6fjlL70W3lvT0dLi7u1t8VnbKlCmaL8r29vYoV64cWrZsabCe pvQXc9tT6ngitb+bM16ZY/To0YiIiIBSqcTYsWP1XrZvDnPGt6JEzs8La8vbvywdH2xtbTFnzhy0 adMGEyZMMDpZYEHUd9y4cVi+fDkqVqyIL774wuL87Ozs4OjoiCdPnkjeVu7PIykKon9JfX+lfj8B cj8jXVxcTA5Yi3t6IjKOAfdbqnLlyti1axeqV6+OKVOmYPPmzWblow64V65cCQBo2rQpHBwc0Lhx Yxw4cAAJCQkIDAzU2mbjxo1wcnJCaGioZllSUhKEEFi9ejUmTZqks59BgwZpPvAfPnyIqVOn4q+/ /kK7du3MKjflsrGxQbt27dCuXTv88MMP+O677zBhwgQsXLiwyOWvDjiNXaKtntgp75cA9cRY+hhb Zw2PHj0yeqbMVH379pV05syU/mJue+pjbDwxp79Lyd9cHh4eaNGiBQ4ePKj3KgFzWaO+RY0c7W8N efuXNY7n1q1bo3Pnzli1apXWM5wLg7e3N77//nvUrl1b53LuvKSMb56enponiBRXRbF/mfv9xNXV VVLAWtzTE5FhnDTtLVatWjVUqlQJJ0+eNDsPT09PlC1bFgcPHsT7778PBwcHALlfXP744w9kZmai Ro0amvSPHz/G8ePHUatWLTg6Ompevr6+KFeuHFavXp1vEBQWFgZXV1eL72cjbRMnTkTFihVx6NCh Ipl/1apVUbp0aRw9etRgmj/++AOlS5fWzBDr5ORkdBb79PR02W4fePr0KaKjowt9Ej5D/cWc9jRG 33hijf5uLH9Lqc9qW+vstjXrW9TI0f6WeLN/Wet4nj17NmxtbREWFlbo71V4eDi6dOlicL3U8a1J kyZISEjAgwcPrFrOglIc+peU7yeRkZFo3769yXkX9/REZBgD7rfYq1ev8OTJE4vv2Q0MDIQQAm3a tNEsa9OmDVQqFXx8fLSe6bl582aoVCqsXLkSa9eu1XoNGzYMd+/eNfqFCcg9OzF8+HCcO3cOO3fu tKjs/0R///23wXVOTk5G74EszPxtbGzQsWNHXLlyRTMDbF5JSUk4efIkgoODNWeEvL298eDBA733 bAohEBUVpff+O2tYsmQJhBD4+OOPZcnfVIb6izntaYy+8cQa/d1Y/kWNNetb1BS19n+zf1nreA4M DMTgwYNx7NgxPHr0SLbyW4PU8e3DDz9EdnY2Fi1aVJDFtJri0L+kfD/p1KkTKleubHLexT09ERnG gNsCr1+/xoYNG7SeU23N9JZQqVQIDw9HZmamxZMFqS8rb9u2rWZZ8+bNUaJECb2Xk9esWVPvo4w+ ++wz2NramvRMzZEjR8LNzQ0TJ06ESqWyqPxqr1+/xq+//log7V9YDhw4gA4dOuD+/fs663bu3Imb N2+idevWRTb/UaNGwdbWFiNGjMDjx481y7OzszF48GBkZmZiwIABmuXqL5jjxo3TyWvWrFlITExE 165dzS6PIYcPH8bMmTPRpUsXzYzPhclQf5HanoYYGk+s1d+tOV7JyVr1LWqKWvsb6l/WOp4nTZoE V1fXQj9bmh+p41vv3r3h7++Pn376CceOHdNKn5mZiW7dumHMmDGyl9tcxaV/mfL9JDU1FQsXLsSp U6dMyrO4pyci43gPtwUmTpyIuXPnwtnZGXFxcShXrpxV05vq6dOnmseLCCHw6tUrHD58GKdPn0bd unUxYcIEnW2mTZtmML93330XLVu21Pxds2ZNeHh4oF69epplTk5OaNasmVbAfefOHZw+fRrfffed 3nx9fX3Rvn17bN++HS9evICbm5vBMqh/RZ4yZQo2bNiATz75xOzyq02ZMgUzZ86Eu7s7Hj16pHnM R1GWlZWF9evXA8g9gwMAsbGxWLduHQCgUqVKeO+99zTp4+LicPnyZTRs2BChoaF45513kJGRgePH j2Pp0qXw8fEx+P6YQu78GzZsiMmTJ2PixIl455130KdPHygUCuzcuRPXr1/HkCFD0KFDB036Pn36 ICIiAhEREXjx4gV69uwJR0dH7N69Gz/++CPq1q2Lf//73zr72b9/v8HJhRo2bIhmzZpp/k5LS8Pe vXuRnZ2N5ORk7NmzB7/99hvq16+PZcuWmV1XazLUX6S2J2D6eGJufzdnvJLyfsnFkvFNavnlrK/c nxdSSelf5hzP+nh6emL8+PEIDw/Xu17O+kohdXxzcHDApk2b0KZNG3zwwQcICwtD69atER8fjzVr 1uDkyZOYPXt2gZQ9L1OOZ2t+f8iPpe9vft9PgNwfRKZNmwZnZ2c8fvw434k+i3t6IsobBzffAAAG AElEQVRHamqqMPf1TzdnzhwBQAAQ+/fvt3p6UwQGBmryBCBsbGxEyZIlRaNGjcSkSZOEUqnUSh8a GqqVXt9rwoQJWtvs27dP9OrVS2ffP/zwg/jxxx81f0+fPl0AEFFRUQbLu3nzZgFA/Pzzz0IIIXr3 7i0AiPT0dJ20z58/F25ubqJKlSoiKyvL7PKrLVy4UAAQVatWFTk5OQbLaK7s7GwBQHTt2tVgms6d Oxusb0JCggAghg4dqlmWkpJitK49evTQyefMmTOiWbNmokSJEpp0Tk5OolevXiIxMdHiekrJX2p9 1ZYtWyZ8fX01+bu7u4vp06cLlUqlkzYlJUV8/vnnwsHBQZNeoVCI3r17i6SkJK20kZGR+R4/4eHh mvTBwcFa6xwcHES9evXEtGnT9NZJKvXxHBcXZ1J6qf1FzdT2lDKemNPfpY5XUt+vN6nfvydPnhhu VBOZU1+p5be0vvkpiM8LKcztX6Yez/Xr1xf169fXm0d6erqoXLmyCA4OLpD6pqenCwDim2++MZhm xIgROv1byvimFhUVJVq3bi3s7Ow021SrVk1s2rRJK52547OppBzP5vSvvEz5/JX6/po73gqRe4wC EFWqVDHp+0ZxT09UnFkSC8+JmCMWLF0gjp47Kk5cPiFORZ8S526eE5fjL4uoe1Ei9lGsuJl4U9ik pqYKmMnSRwu9DT755BOsX78ecXFxJs0yLDV9UZCVlYXXr19r3asN/P9Ha6jv+cvKyoJKpbL4HmE5 xcbGwt/fX7az2xkZGbC1tYW9vb3Z29vZ2Wndg2hs0hxj+8rOzsaNGzdgb2+PqlWrWvzoKjny11ff vB48eIDnz5+jevXq+R5XKSkpuH79OlQqFWrUqIGyZcvqpMnJycn3+bJ5y6M+poHce0jVkwYWV1La Mz8F0d+lvl9yMqe+UstflOpbECztX5Yez9nZ2RBCmD1eS5XfeJednY2cnBy9dTFlfHtTWloaYmNj Ubp0aQQEBEiePDC/8uZHyvFsjfHE0s9fa7tx4wYqV65s8veN4p6eqLgy9rjJ/Pz6669QKBRo0KAB 7O3tNS+FQqH1YsBtoXbt2kGhUGD//v2ypCciIiIiIiLrK4iA++34mbyQrFy5EmfOnMGVK1dkSU9E RERERETFF2cpt8CmTZuwefNm+Pv7y5KeiIiIiIiIii+e4bbAwYMHZU1PRERERERExRfPcBMRERER ERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwY cBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERER ERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJ gAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMR ERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERER kQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3 ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERER ERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwY cBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERER ERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJ gAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQwYcBMRERERERHJgAE3ERERERERkQz+H9up kaQ2hZ4dAAAAAElFTkSuQmCC --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Matthias Meulien Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 14 Feb 2022 21:40:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Juri Linkov Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164487477727948 (code B ref 51809); Mon, 14 Feb 2022 21:40:01 +0000 Received: (at 51809) by debbugs.gnu.org; 14 Feb 2022 21:39:37 +0000 Received: from localhost ([127.0.0.1]:42822 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJj4L-0007Gi-Cb for submit@debbugs.gnu.org; Mon, 14 Feb 2022 16:39:37 -0500 Received: from mail-wm1-f47.google.com ([209.85.128.47]:37544) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nJj4K-0007GW-GF for 51809@debbugs.gnu.org; Mon, 14 Feb 2022 16:39:37 -0500 Received: by mail-wm1-f47.google.com with SMTP id l12-20020a7bc34c000000b003467c58cbdfso259749wmj.2 for <51809@debbugs.gnu.org>; Mon, 14 Feb 2022 13:39:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=09TPtBjaAvQgY1IoRh8z9MGmawl9Jo8i8sV+DiK2f2w=; b=Rd/XWZQag1cGK3gm89VaoGGjjFENHBo7P6PhEhcLfW8QcZUtgSGUzi5cr3nA53CGmi hoxJFl7yxjf9WUEbjmd8RwK5eW3hDhoOZjclHO+k1FxEOzz46QqqWz5ozvJU3CA9maz8 PqQesrlBZe4pvTx7/4VOSPefQJigtcGXIwwrGRpfLeH3dYgG+uZfkanEdo5/sBWbsXLU u5ve5jrKiV1PNB4nXFof2fIvouGF/toBRp6kFaP+z7tkXzE6Dazp2ndDZujHmJ563r3p 1F1WypTPrZzRRG1GMu0AjylW1svnxrGaBqe5RfWr1j6fdFd6aK785ioGt0oC2tM4NN/4 uuHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=09TPtBjaAvQgY1IoRh8z9MGmawl9Jo8i8sV+DiK2f2w=; b=fWyhHqddg0I/yVuDyCz47083Is+dZ6QolNLlufSiy4qenN0HdUKLMd/dGC/GZbq66X VcCkg8KQoigN+m58Go5UZaCn8J2o+QepDhSw0vvAO4tf66WN/RDD/ahHXebuiY8wbLLl abCaJBUZL84q5dOV4fP7eFK2KtwfU5x4Wfxm5C3fY6m2ipaUgLx8x+4ana2h2n1XuNM6 XvlAbLoEFn1M/6AMSz/7Gn/Dklu9VW5bYt7wCbB4NdpvEESCPXgl9RGEgPK0EBOzWfPC ry0EEN7EysqMltqSH5nLO7syRnpMvfARD56bPBMrpgf4XRqJT4LSljtgX7EvOUejOJqz DrQQ== X-Gm-Message-State: AOAM533Bj1rKkWbINlmw+bHlu8OMIldGYbTjuRrSOQUTosERQUmBMMOJ chL58fpASgiFYm6EOInhyBKsofrtxt8= X-Google-Smtp-Source: ABdhPJyUiiF5AjOw67jcClLdFl4Koc79OeCkscdjpsEE3Gp+zJ0FEYAnQqpYdERwKQB1DMFt+COt/A== X-Received: by 2002:a05:600c:692:b0:37b:c64f:a66d with SMTP id a18-20020a05600c069200b0037bc64fa66dmr492174wmn.165.1644874770726; Mon, 14 Feb 2022 13:39:30 -0800 (PST) Received: from carbon.localdomain ([2a01:e0a:245:c850:98f5:429a:aa8e:95bb]) by smtp.gmail.com with ESMTPSA id o14sm12960982wms.4.2022.02.14.13.39.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 13:39:30 -0800 (PST) From: Matthias Meulien References: <87lf1sw6ji.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> <871r0517jf.fsf@gmail.com> <87sfslyvya.fsf@gmail.com> Date: Mon, 14 Feb 2022 22:39:29 +0100 In-Reply-To: <87sfslyvya.fsf@gmail.com> (Matthias Meulien's message of "Mon, 14 Feb 2022 22:33:49 +0100") Message-ID: <87o839yvou.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Sorry in the second screenshot, `outline-default-state' was nil. I wanted to show you when it's set to 1: --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=with_patch_level_1.png Content-Transfer-Encoding: base64 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 9fX1RoilpaXhcrmoq6sjLy/Pa1u1tbXGfZ5ndu921PLly42W61NPPWXsF75qDV5IKSkpuN1uHA4H ubm5F3z/IiKXOp8F6Le//W3uvvvuS2b5c+nRowfh4eFYrVb8/PxISkoiOjqakSNHYrVaqa+vp6am xgiyO++801j373//uzGgCGDhwoU0Nzfjdru55ZZbTJXHbrdjsViw2Wx0797dmN7Y2Ojzh7GfOnWK devWsXTpUgoLC9tcZsKECUa3+csvv+z1ed1uNwUFBe2uKyJyOfBZv9xtt912SS3fEf369WP37t00 NTUZ92VeffXVrF+/Hmh5QEJcXBwAQ4YM4bbbbuNf//oXn3/+OQ888ABjx44lKyuL3bt3A3DNNdcw duxYr1tgOmrs2LHs2bOH5uZmZs+ezfTp08nNzWX16tWmtnc2ixYtMkb1LlmyhNWrV7e6tpyWlsb0 6dNZvHgxWVlZfP/73+f2228H4N///jcFBQUEBATw5ptvEh0djd1uZ8OGDcbo4pqaGlwuFzU1Nbzw wgtAS9f0xIkTffpZREQulsv6wlb//v2N8PM8gGDEiBFYrVZcLpdx/dPjiSeeIDU1lXnz5lFYWMgb b7wBtAzamTp1Kg899JDpskyePJmKigqWL19OZmYmmZmZQMtTf8aMGcNHH31kettnio6ONl5369at 3eubDz74IElJSbz00ksUFxfzt7/9zZjXq1cv5syZY2yrpqaGF198sdU2Ghsbee+994CWh0aMGjXK Z59DRORispw8ebLTQ0bP9gzXrwPPqFKXy4XD4cBiseDv72+EpcPhoLm5GX9//zbDxeVyUVhYyOHD h4mJiSEjI6PTo4NdLpfR7evv72+MnG1oaCA7O5vq6mpSU1NJTk72yajaMxUWFuJwOEhKSupQ2Ssq KsjJySEwMJCMjAyvW2U6Sw9eEJFvgss6QOXiUICKyDfBZTsKV0RE5HwoQEVERExQgIqIiJigABUR ETHhG3Eby5kPU/f18iIiImdSC1RERMQEBaiIiIgJClARERETFKAiIiImKEBFRERMUICKiIiYoAAV ERExQQEqIiJiggJURETEBAWoiIiICQpQERERExSgIiIiJihARURETFCAioiImKAAFRERMUEBKiIi YoICVERExASfBKjdbufdd98lPz//klheRESkq/n5YiN//etfeeWVV4iIiGDbtm0EBgZe1OVFRES6 mk9aoLGxsQB0794df3//i768iIhIV7OcPHnS3dmVSkpKWk3Lz88nMTGxw61DXy7fr1+/Dm1DRETE V3wWoBeTAlRERC40jcIVERExQQEqIiJiggJURETEBAWoiIiICaYGEYWHh3dFWURERL421AIVEREx QQEqIiJiggJURETEBAWoiIiICQpQERERExSgIiIiJihARURETFCAioiImKAAFRERMUEBKiIiYoIC VERExAQFqIiIiAkKUBERERMUoCIiIiYoQEVERExQgIqIiJigABURETFBASoiImKCAlRERMQEBaiI iIgJClARERETFKAiIiImKEBFRERMUICKiIiYoAAVERExQQEqIiJiggJURETEBAWoiIiICQpQERER ExSgIiIiJihARURETFCAioiImKAAFRERMUEBKiIiYoICVERExAQFqIiIiAkKUBERERMUoCIiIiYo QEVERExQgIqIiJigABURETFBASoiImKCAlRERMQEBaiIiIgJClARERETFKAiIiImKEBFRERMUICK iIiYoAAVERExQQEqIiJiggJURETEBAWoiIiICQpQERERExSgIiIiJihARURETFCAioiImKAAFRER MUEBKiIiYoICVERExAQFqIiIiAkKUBERERMUoCIiIiYoQEVERExQgIqIiJigABURETFBASoiImKC AlRERMQEBaiIiIgJClARERETFKAiIiImKEBFRERMUICKiIiYoAAVERExQQEqIiJiggJURETEBAWo iIiICQpQERERExSgIiIiJihARURETFCAioiImKAAFRERMUEBKiIiYoICVERExAQFqIiIiAkKUBER ERMUoCIiIiYoQEVERExQgIqIiJigABURETFBASoiImKCAlRERMQEBaiIiIgJClARERETFKAiIiIm KEBFRERMUICKiIiYoAAVERExQQEqIiJiggJURETEhP8PAl1Xvlke80EAAAAASUVORK5CYII= --=-=-= Content-Type: text/plain and 2: --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=with_patch_level_2.png Content-Transfer-Encoding: base64 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 upqiomKCgoJITEz0+LWfTc2henLolpSUsH//fsaNG8fll1/O3r17OXbsmLH+008/BZrCvNny5csp Li4mOjqa9957j1GjRhEUFERCQgK/+c1v+OUvfwnAyy+/3Go7fvOb3zB79mySkpIICwtj8uTJPPzw wwAcOXKE119/nTvvvJOEhASioqL46U9/yg033ADA5s2b3ep66623ePzxxxkyZAjR0dGEhISQlpbG nDlzmDlzJrW1tS0+ZDT7n//5H55++mlSU1MJCQlh2LBhzJs3z9iPq3mYxgO33norzzzzDL169SIw MJChQ4eycuVKYmNjOXr0KP/617981v62vPfee+zfv5/o6GjWrl3LtGnTiImJISQkhEGDBvHQQw/x t7/97az0ydixY7jggsFER3clKCgIPz8/IiMjGTLkIvr0SaGxsdE4qTiVp++9HdnXybw53s+US14H ckhIMFdfPbnVGdYAPXv25OqrJ/t0hnVqasszi6ioKPz9/WhsbHQbBoiObrp5PTs7m/r6+tPWW1BQ CECfPimtTkILDQ0hLq4bTqezxVCHN23rqC5dIgkJCaGyspK6uqY/8HdnwAl07x7vtsxms1FRUUlo aCgRERFnrL+4uARo+gTY2uhG8wS+U/miH08nLS2t0/Y7YED/FssCAgJIS+sLfNcnp2OxWOjbt6n8 qUPrWVlNv6ekJPtkxKgz9e/fn+7du7N//37jDa05cCdMmMD48eP/OyrRtKykpIR9+/bRq1cv+vT5 bn7Bli1bAJg1a5ZxJnCy5nA9dOgQR48ebbF+5syZLZYNGTIEgG7dujFx4sQ21598+QaazgbffPNN pkyZQkpKCl27diUyMpLIyEjeeecdAA4fbv1D11133dVi2QUXXEBISAg1NTXU1NS0ut3pPPjggy2W hYeHG8POp36g6Ej727Ju3Tqg6e/To0cPj7b1dZ+4XC6ys7NZt2497767isWLl7Jo0RIWLVrCwYNN w+lt1enpe29H9nUyb473M+WST64hnw0Wi6XFJKxm/v4BNDY63K53DhgwgMLCQnJz88jLO0xUVBQx MdHExcXRq1dPtzfumppqAPbs+ZY9e741lrf2Ka85ADvSNl9ISIgnJyeX4uIikpOTTzoDTgCa2l1U VERycpIRzN27J7Sr7uaHu7R1nbN5NORUHe3HM4mICG91uS/2GxnZ+geV5j5o7wNv+vZNZc+ebzl0 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 oaEkJCSctmxRUREOh4OEhAT8/Pyora2lqKiIkJAQunfv3uo2x48fp7S0lK5duxIXF3fG9rhcLgoL CykuLqZbt2706tXLq9fVloqKCg4fPkxwcDBJSUkEBQX5tH5PedL/zRwOBwUFBZSVlZGQkNDu7c6k tLSUPXv24HQ6ueCCC4iPj6e+vp4jR44AejCIiLTPeRnICxYsYOnSpVitVpYvX05UVFSLMtXV1Uyf Ph2Hw8H999/P1KlTAfjqq6+YO3cuJSUlRtng4GBmzZrFrbfeisVioaKighkzZtDY2EhUVBSlpaUA REREMHr0aD755BOcTicA1113HY899hgADQ0NvP7667z//vvU19cb9QcFBTFlyhQefPBBrNamifHr 1q3j+eefB+COO+7g448/dnsCWWpqKn/5y1+IiIjoUF9t3ryZuXPnUlFRYSzz8/Nj6tSp/OxnP8PP z69D9XuqPf3fbO7cuXz00Uf4+/tz++23s2LFCmpqaoz14eHh/OpXv+KKK64AmiZyzZs3D4fDATRN SouKimLVqlWttuX48eM8++yzfP31127Lk5OTKSgowG63A3Dge/YkOxE5N87L25769OmDw+HAbrdT Xl4OwGuvvcadd97J73//ewBsNhs2mw273U7Pnj0BWLp0KU888QQlJSX06NGDa665hsTERGw2G/Pm zeNPf/oT0HS2arPZaGxs5Pjx40ydOhV/f3+qq6vZsGED/fr1Y/jw4QCsWbPGuNY6b9483n33Xex2 O2PGjOGuu+5i7NixNDQ0sGrVKqNt0HS219DQQENDA4sXL+b48eOMGjWKESNGAHDw4EH+8Ic/dKif li5dypNPPklFRQUXX3wxs2fP5sorr8ThcLBixQrmzp3bofq9aU97+r+Z3W6nsbERm83GwoULqamp YeDAgVxzzTV069YNh8PBhx9+aJQfMmQI06ZNY+zYsYSFhRl1tKaxsZEnnniC3bt306VLF5544gke eughAgMDyc3NxeVy8bOf/YzXXnut8zpERH5QfHKGfPKb2smGDRtmDAsWFxezc+fO09bTkfKe6N+/ v/FzZmYmKSkp7Nixg4KCAoqKiqirqzOCGiAlJYW8vDwWLFgAwIgRI3juuefw9/fH6XTy9NNP89ln n7F27VomTZpEamqqse2ll17KQw89xL59+8jIyMBut/Pb3/6W7du3s3PnTlwuF/n5+XTr1o27776b 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 /X+2jsfm1xsUHoXVP+CM7ers8iI/FB06Qz6Zy+mkMv8QjfV1RHRPPGOwelr++6z62FFsFceJ7JlC 4H9vOfFleYDN/282hzZ/yNS/rTEe+ODL+r/Pzsf+7+zjsTL/EOHxPdt99trZ5UV+CHwWyHJurX36 /2D182PinFfPdVPOS+p/EemoDg1ZizlkbfgXpVl7uGHuu+e6Kecl9b+I+ILvptXKOZO75WMuf+wF wuN6nuumnJfU/yLiCxqyFhERMQGdIYuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURE TECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIi YgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBER ERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuI iJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiAAllE RMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgi IiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAW ERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWy iIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQ RURETECBLCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECB LCIiYgIKZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIK ZBERERNQIIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQ IIuIiJiAAllERMQEFMgiIiImoEAWERExAQWyiIiICSiQRURETECBLCIiYgIKZBERERNQIIuIiJiA AllERMQEFMgiIiIm8P8DNJ839P9EHOcAAAAASUVORK5CYII= --=-=-= Content-Type: text/plain -- Matthias --=-=-=-- From unknown Sun Jun 15 08:55:37 2025 X-Loop: help-debbugs@gnu.org Subject: bug#51809: 29.0.50; [PATCH] Support for outline default state in Diff buffers Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 16 Feb 2022 19:22:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: fixed patch To: Matthias Meulien Cc: Lars Ingebrigtsen , 51809@debbugs.gnu.org Received: via spool by 51809-submit@debbugs.gnu.org id=B51809.164503929827013 (code B ref 51809); Wed, 16 Feb 2022 19:22:02 +0000 Received: (at 51809) by debbugs.gnu.org; 16 Feb 2022 19:21:38 +0000 Received: from localhost ([127.0.0.1]:49498 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nKPru-00071a-16 for submit@debbugs.gnu.org; Wed, 16 Feb 2022 14:21:38 -0500 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:58125) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nKPrs-00071G-D7; Wed, 16 Feb 2022 14:21:37 -0500 Received: (Authenticated sender: juri@linkov.net) by mail.gandi.net (Postfix) with ESMTPSA id BA1BD1C0002; Wed, 16 Feb 2022 19:21:28 +0000 (UTC) From: Juri Linkov Organization: LINKOV.NET References: <87lf1sw6ji.fsf@gmail.com> <87a6i7x5iq.fsf@gmail.com> <86k0hbam7r.fsf@mail.linkov.net> <878rxrmy7q.fsf@gmail.com> <86y256uc0v.fsf@mail.linkov.net> <87r1ajknsr.fsf@gmail.com> <86ilvu6w6k.fsf@mail.linkov.net> <871r2hc51a.fsf@gmail.com> <87r19zs662.fsf@gmail.com> <871r1zm7ji.fsf@gmail.com> <87wnjrkrwd.fsf@gmail.com> <86ilv8pnf3.fsf@mail.linkov.net> <87k0fouzxs.fsf@gmail.com> <86sftumahu.fsf@mail.linkov.net> <87pmouw9qr.fsf@gmail.com> <87a6fuvzj9.fsf@gmail.com> <86bkzli245.fsf@mail.linkov.net> <875yptas9m.fsf@gnus.org> <86y22gypxn.fsf@mail.linkov.net> <871r0517jf.fsf@gmail.com> <87sfslyvya.fsf@gmail.com> Date: Wed, 16 Feb 2022 21:20:33 +0200 In-Reply-To: <87sfslyvya.fsf@gmail.com> (Matthias Meulien's message of "Mon, 14 Feb 2022 22:33:49 +0100") Message-ID: <86ee42wrcu.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) close 51809 29.0.50 thanks >> My first impression is that setting `outline-level' to >> `diff--outline-level' inconditionnaly should work but since I don't >> understand why `diff-outline-regex' hasn't been defined in terms of >> `diff-file-header-re' and `diff-hunk-header-re' I guess I am missing >> some subtleties. >> >> (Note that there's another minor bug when `diff-buffer-type` isn't equal >> to 'git: `diff--font-lock-prettify` should be a no-op since the regexp >> written there match only Git generated diffs, confirmed by the FIXME >> string "This has only been tested with Git's diff output." written in >> the implementation). > > Here's the corresponding patch: Thanks for the quick fix! I confirm that it works even when `diff-buffer-type' is nil. So now your patch is pushed to master, and this request is closed.