From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 21 12:39:42 2024 Received: (at submit) by debbugs.gnu.org; 21 Feb 2024 17:39:42 +0000 Received: from localhost ([127.0.0.1]:57152 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rcqZJ-0003q8-Ix for submit@debbugs.gnu.org; Wed, 21 Feb 2024 12:39:42 -0500 Received: from lists.gnu.org ([209.51.188.17]:55308) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rcqZG-0003pt-5n for submit@debbugs.gnu.org; Wed, 21 Feb 2024 12:39:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rcqYs-0007UC-N6 for bug-gnu-emacs@gnu.org; Wed, 21 Feb 2024 12:39:14 -0500 Received: from relay6-d.mail.gandi.net ([2001:4b98:dc4:8::226]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rcqYo-0003A3-Vs for bug-gnu-emacs@gnu.org; Wed, 21 Feb 2024 12:39:14 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 9B8A1C0003 for ; Wed, 21 Feb 2024 17:39:01 +0000 (UTC) From: Juri Linkov To: bug-gnu-emacs@gnu.org Subject: outline-minor-mode for tabulated-list-mode Organization: LINKOV.NET Date: Wed, 21 Feb 2024 19:34:17 +0200 Message-ID: <86msrtvi06.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-GND-Sasl: juri@linkov.net Received-SPF: pass client-ip=2001:4b98:dc4:8::226; envelope-from=juri@linkov.net; helo=relay6-d.mail.gandi.net X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -3.4 (---) X-Debbugs-Envelope-To: submit 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: -4.4 (----) --=-=-= Content-Type: text/plain [From emacs-devel] >> +(defcustom Buffer-menu-group-by nil >> + "If non-nil, buffers are grouped by function." >> + :type 'function >> + :group 'Buffer-menu >> + :version "30.1") > > Please consider letting users choose a symbol, not a function. Each > symbol can be mapped to a function, but having a user option whose > values are functions makes it harder for users to customize the > option. Ok, now the type is changed to 'symbol'. Here is the complete patch: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=tabulated-list-groups.patch diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 70d1a40f836..bb2100dbb4d 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1239,6 +1239,21 @@ Tabulated List Mode above form when called with no arguments. @end defvar +@defvar tabulated-list-groups +This buffer-local variable specifies the groups of entries displayed in +the Tabulated List buffer. Its value should be either a list, or a +function. + +If the value is a list, each list element corresponds to one group, and +should have the form @w{@code{(@var{group-name} @var{entries})}}, where +@var{group-name} is a string inserted before all group entries, and +@var{entries} have the same format as @code{tabulated-list-entries} +(see above). + +Otherwise, the value should be a function which returns a list of the +above form when called with no arguments. +@end defvar + @defvar tabulated-list-revert-hook This normal hook is run prior to reverting a Tabulated List buffer. A derived mode can add a function to this hook to recompute diff --git a/etc/NEWS b/etc/NEWS index 7b248c3fe78..b549eab9f0b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1332,6 +1332,11 @@ will return the URL for that bug. This allows for rcirc logs to use a custom timestamp format, than the chat buffers use by default. +--- +*** New user option 'Buffer-menu-group-by'. +It splits buffers by groups that are displayed with headings in +Outline minor mode. + --- *** New command 'Buffer-menu-toggle-internal'. This command toggles the display of internal buffers in Buffer Menu mode; @@ -1997,6 +2002,10 @@ inside 'treesit-language-source-alist', so that calling It may be useful, for example, for the purposes of bisecting a treesitter grammar. ++++ +** New buffer-local variable 'tabulated-list-groups'. +It prints and sorts the groups of entries separately. + * Changes in Emacs 30.1 on Non-Free Operating Systems diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index e13c3b56b4e..62717c4625b 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -95,6 +95,18 @@ Buffer-menu-use-frame-buffer-list :group 'Buffer-menu :version "22.1") +(defcustom Buffer-menu-group-by nil + "If non-nil, buffers are grouped by function. +This function takes one argument: a list of entries in the same format +as in `tabulated-list-entries', and should return a list in the format +suitable for `tabulated-list-groups'. Also when this variable is non-nil, +then `outline-minor-mode' is enabled in the Buffer Menu. Then with the +default value of `outline-regexp' you can use Outline minor mode commands +to show/hide groups of buffers." + :type 'symbol + :group 'Buffer-menu + :version "30.1") + (defvar-local Buffer-menu-files-only nil "Non-nil if the current Buffer Menu lists only file buffers. This is set by the prefix argument to `buffer-menu' and related @@ -674,7 +684,12 @@ list-buffers-noselect (setq Buffer-menu-buffer-list buffer-list) (setq Buffer-menu-filter-predicate filter-predicate) (list-buffers--refresh buffer-list old-buffer) - (tabulated-list-print)) + (tabulated-list-print) + (when tabulated-list-groups + (setq-local outline-minor-mode-cycle t + outline-minor-mode-highlight t + outline-minor-mode-use-buttons 'in-margins) + (outline-minor-mode 1))) buffer)) (defun Buffer-menu-mouse-select (event) @@ -750,7 +765,11 @@ list-buffers--refresh `("Mode" ,Buffer-menu-mode-width t) '("File" 1 t))) (setq tabulated-list-use-header-line Buffer-menu-use-header-line) - (setq tabulated-list-entries (nreverse entries))) + (setq tabulated-list-entries (nreverse entries)) + (when Buffer-menu-group-by + (setq tabulated-list-groups + (seq-group-by Buffer-menu-group-by + tabulated-list-entries)))) (tabulated-list-init-header)) (defun tabulated-list-entry-size-> (entry1 entry2) diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 9884a2fc24b..a78e1726c26 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -139,6 +139,21 @@ tabulated-list-entries arguments and must return a list of the above form.") (put 'tabulated-list-entries 'permanent-local t) +(defvar-local tabulated-list-groups nil + "Groups displayed in the current Tabulated List buffer. +This should be either a function, or a list. +If a list, each element has the form (GROUP-NAME ENTRIES), +where: + + - GROUP-NAME is a group name as a string, which is displayed + at the top line of each group. + + - ENTRIES is a list described in `tabulated-list-entries'. + +If `tabulated-list-groups' is a function, it is called with no +arguments and must return a list of the above form.") +(put 'tabulated-list-groups 'permanent-local t) + (defvar-local tabulated-list-padding 0 "Number of characters preceding each Tabulated List mode entry. By default, lines are padded with spaces, but you can use the @@ -427,6 +444,9 @@ tabulated-list-print specified by `tabulated-list-sort-key'. It then erases the buffer and inserts the entries with `tabulated-list-printer'. +If `tabulated-list-groups' is non-nil, each group of entries +is sorted separately after printing the group header line. + Optional argument REMEMBER-POS, if non-nil, means to move point to the entry with the same ID element as the current line. @@ -437,6 +457,9 @@ tabulated-list-print `tabulated-list-put-tag'). Don't use this immediately after changing `tabulated-list-sort-key'." (let ((inhibit-read-only t) + (groups (if (functionp tabulated-list-groups) + (funcall tabulated-list-groups) + tabulated-list-groups)) (entries (if (functionp tabulated-list-entries) (funcall tabulated-list-entries) tabulated-list-entries)) @@ -447,7 +470,14 @@ tabulated-list-print (setq saved-col (current-column))) ;; Sort the entries, if necessary. (when sorter - (setq entries (sort entries sorter))) + (if groups + (setq groups + (mapcar (lambda (group) + (cons (car group) (sort (cdr group) sorter))) + groups)) + (setq entries (sort entries sorter)))) + (unless (functionp tabulated-list-groups) + (setq tabulated-list-groups groups)) (unless (functionp tabulated-list-entries) (setq tabulated-list-entries entries)) ;; Without a sorter, we have no way to just update. @@ -459,6 +489,25 @@ tabulated-list-print (unless tabulated-list-use-header-line (tabulated-list-print-fake-header))) ;; Finally, print the resulting list. + (if groups + (dolist (group groups) + (insert (car group) ?\n) + (when-let ((saved-pt-new (tabulated-list-print-entries + (cdr group) sorter update entry-id))) + (setq saved-pt saved-pt-new))) + (setq saved-pt (tabulated-list-print-entries + entries sorter update entry-id))) + (when update + (delete-region (point) (point-max))) + (set-buffer-modified-p nil) + ;; If REMEMBER-POS was specified, move to the "old" location. + (if saved-pt + (progn (goto-char saved-pt) + (move-to-column saved-col)) + (goto-char (point-min))))) + +(defun tabulated-list-print-entries (entries sorter update entry-id) + (let (saved-pt) (while entries (let* ((elt (car entries)) (tabulated-list--near-rows @@ -495,14 +544,7 @@ tabulated-list-print (forward-line 1) (delete-region old (point)))))) (setq entries (cdr entries))) - (when update - (delete-region (point) (point-max))) - (set-buffer-modified-p nil) - ;; If REMEMBER-POS was specified, move to the "old" location. - (if saved-pt - (progn (goto-char saved-pt) - (move-to-column saved-col)) - (goto-char (point-min))))) + saved-pt)) (defun tabulated-list-print-entry (id cols) "Insert a Tabulated List entry at point. diff --git a/test/lisp/emacs-lisp/tabulated-list-tests.el b/test/lisp/emacs-lisp/tabulated-list-tests.el index 8be2be3139e..e53268b3f14 100644 --- a/test/lisp/emacs-lisp/tabulated-list-tests.el +++ b/test/lisp/emacs-lisp/tabulated-list-tests.el @@ -130,4 +130,45 @@ tabulated-list-sort (should-error (tabulated-list-sort) :type 'user-error) (should-error (tabulated-list-sort 4) :type 'user-error))) +(ert-deftest tabulated-list-groups () + (with-temp-buffer + (tabulated-list-mode) + (setq tabulated-list-groups + (reverse + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) + tabulated-list--test-entries))) + (setq tabulated-list-format tabulated-list--test-format) + (setq tabulated-list-padding 7) + (tabulated-list-init-header) + (tabulated-list-print) + ;; Basic printing. + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + zzzz-game zzzz-game 2113 installed play zzzz in Emacs + mode mode 1128 installed A simple mode for editing Actionscript 3 files +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +")) + ;; Sort and preserve position. + (forward-line 2) + (let ((pos (thing-at-point 'line))) + (tabulated-list-next-column 2) + (tabulated-list-sort) + (should (equal (thing-at-point 'line) pos)) + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + mode mode 1128 installed A simple mode for editing Actionscript 3 files + zzzz-game zzzz-game 2113 installed play zzzz in Emacs +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +"))))) + ;;; tabulated-list-tests.el ends here --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 21 14:13:22 2024 Received: (at 69305) by debbugs.gnu.org; 21 Feb 2024 19:13:22 +0000 Received: from localhost ([127.0.0.1]:34705 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rcs1x-00083J-P4 for submit@debbugs.gnu.org; Wed, 21 Feb 2024 14:13:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:53558) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rcs1v-00082k-AE for 69305@debbugs.gnu.org; Wed, 21 Feb 2024 14:13:20 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rcs1S-0004Jx-7h; Wed, 21 Feb 2024 14:12:50 -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=LMzIFlkVd5ROjsoT0EdvmbW6QK3cwrvkx3He3AP473U=; b=sHfM0ygZZSv3 BeOmS+h2eNqRk6k3C4DnX1yVV2QCzYKKcUhyKSibx2Oty/3AjNMnH9kQ4xx1sx2GXRW/m9qrvq7XN P+kfq/jooFGu0w8Rz6A/yi2Y/NFJsaifu6/HdHC7gpJYSqsmqmDch7ngyQPnHQBbvDycdXywBzRtG NNDyjFhXyX/78NOKgdxcw6joFmCz+36XubLfT3K7nCPA6etVotnxh9r94xy9P6VZKCgwuuO1gwkub NuL0AC/ZHpmQFj1PqaRNc3DYxcNrbGMouN6lMNypKSWLqoD0ItUCd13AJRu8waG0mxThUac0QyCA4 ccxTTG6UKZRhvOZqSiStTg==; Date: Wed, 21 Feb 2024 21:12:46 +0200 Message-Id: <86frxlmy1d.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86msrtvi06.fsf@mail.linkov.net> (message from Juri Linkov on Wed, 21 Feb 2024 19:34:17 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: -5.2 (-----) > From: Juri Linkov > Date: Wed, 21 Feb 2024 19:34:17 +0200 > > >> +(defcustom Buffer-menu-group-by nil > >> + "If non-nil, buffers are grouped by function." > >> + :type 'function > >> + :group 'Buffer-menu > >> + :version "30.1") > > > > Please consider letting users choose a symbol, not a function. Each > > symbol can be mapped to a function, but having a user option whose > > values are functions makes it harder for users to customize the > > option. > > Ok, now the type is changed to 'symbol'. Here is the complete patch: Thanks, but I wonder if we can be a tad more user-friendly? The user option exists, and it can accept simple enough data structures for customizations, but the default is nil, and there's no example or pre-cooked list of ready-to-use values anywhere in sight, not even in the doc string. Users will have to work hard to produce a grouping of their liking. E.g., suppose I want to group buffers by mode -- how would I go about it? Or what about grouping buffers by their leading directories -- how can that be done? Etc. etc. -- this could be a very powerful feature, but we should make its use easier. And, after reading the documentation of tabulated-list-groups and that of tabulated-list-entries several times, I have no idea how to specify simple groupings such as those described above. Which makes examples or pre-cooked values even more important, IMO. What I had in mind when I said "choose a symbol" was that a symbol will stand for a pre-cooked grouping. For example, 'mode would cause buffers grouped by major-mode, 'directory will group by leading directories, 'alphabet will group by the first letter of the name, etc. What this patch provides is quite a far cry from that. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 22 02:47:46 2024 Received: (at 69305) by debbugs.gnu.org; 22 Feb 2024 07:47:46 +0000 Received: from localhost ([127.0.0.1]:60620 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rd3o1-0007Fl-Qh for submit@debbugs.gnu.org; Thu, 22 Feb 2024 02:47:46 -0500 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:50109) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rd3ny-0007FG-Hj for 69305@debbugs.gnu.org; Thu, 22 Feb 2024 02:47:44 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id CE7E6FF802; Thu, 22 Feb 2024 07:47:12 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86frxlmy1d.fsf@gnu.org> (Eli Zaretskii's message of "Wed, 21 Feb 2024 21:12:46 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> Date: Thu, 22 Feb 2024 09:44:40 +0200 Message-ID: <86cyspt02f.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-GND-Sasl: juri@linkov.net X-Spam-Score: -2.6 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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.6 (---) --=-=-= Content-Type: text/plain >> >> +(defcustom Buffer-menu-group-by nil >> >> + "If non-nil, buffers are grouped by function." >> >> + :type 'function >> >> + :group 'Buffer-menu >> >> + :version "30.1") >> > >> > Please consider letting users choose a symbol, not a function. Each >> > symbol can be mapped to a function, but having a user option whose >> > values are functions makes it harder for users to customize the >> > option. >> >> Ok, now the type is changed to 'symbol'. Here is the complete patch: > > Thanks, but I wonder if we can be a tad more user-friendly? The user > option exists, and it can accept simple enough data structures for > customizations, but the default is nil, and there's no example or > pre-cooked list of ready-to-use values anywhere in sight, not even in > the doc string. Users will have to work hard to produce a grouping of > their liking. E.g., suppose I want to group buffers by mode -- how > would I go about it? Or what about grouping buffers by their leading > directories -- how can that be done? Etc. etc. -- this could be a > very powerful feature, but we should make its use easier. And, after > reading the documentation of tabulated-list-groups and that of > tabulated-list-entries several times, I have no idea how to specify > simple groupings such as those described above. Which makes examples > or pre-cooked values even more important, IMO. Ok, then this patch adds two pre-cooked functions as a starting point for users to understand the principle. Then users will propose more functions and we will choose the most useful candidates for including to the set of default functions later. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=tabulated-list-groups.patch diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 70d1a40f836..bb2100dbb4d 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1239,6 +1239,21 @@ Tabulated List Mode above form when called with no arguments. @end defvar +@defvar tabulated-list-groups +This buffer-local variable specifies the groups of entries displayed in +the Tabulated List buffer. Its value should be either a list, or a +function. + +If the value is a list, each list element corresponds to one group, and +should have the form @w{@code{(@var{group-name} @var{entries})}}, where +@var{group-name} is a string inserted before all group entries, and +@var{entries} have the same format as @code{tabulated-list-entries} +(see above). + +Otherwise, the value should be a function which returns a list of the +above form when called with no arguments. +@end defvar + @defvar tabulated-list-revert-hook This normal hook is run prior to reverting a Tabulated List buffer. A derived mode can add a function to this hook to recompute diff --git a/etc/NEWS b/etc/NEWS index 7b248c3fe78..b549eab9f0b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1332,6 +1332,11 @@ will return the URL for that bug. This allows for rcirc logs to use a custom timestamp format, than the chat buffers use by default. +--- +*** New user option 'Buffer-menu-group-by'. +It splits buffers by groups that are displayed with headings in +Outline minor mode. + --- *** New command 'Buffer-menu-toggle-internal'. This command toggles the display of internal buffers in Buffer Menu mode; @@ -1997,6 +2002,10 @@ inside 'treesit-language-source-alist', so that calling It may be useful, for example, for the purposes of bisecting a treesitter grammar. ++++ +** New buffer-local variable 'tabulated-list-groups'. +It prints and sorts the groups of entries separately. + * Changes in Emacs 30.1 on Non-Free Operating Systems diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el index e13c3b56b4e..53bf66fdab1 100644 --- a/lisp/buff-menu.el +++ b/lisp/buff-menu.el @@ -95,6 +95,25 @@ Buffer-menu-use-frame-buffer-list :group 'Buffer-menu :version "22.1") +(defcustom Buffer-menu-group-by nil + "If non-nil, buffers are grouped by function. +This function takes one argument: a list of entries in the same format +as in `tabulated-list-entries', and should return a list in the format +suitable for `tabulated-list-groups'. Also when this variable is non-nil, +then `outline-minor-mode' is enabled in the Buffer Menu. Then with the +default value of `outline-regexp' you can use Outline minor mode commands +to show/hide groups of buffers. +The default options can group by a mode, and by a root directory of +a project or just `default-directory'." + :type '(choice (const :tag "No grouping" nil) + (function-item :tag "Group by mode" + Buffer-menu-group-by-mode) + (function-item :tag "Group by root" + Buffer-menu-group-by-root) + (function :tag "Custom function")) + :group 'Buffer-menu + :version "30.1") + (defvar-local Buffer-menu-files-only nil "Non-nil if the current Buffer Menu lists only file buffers. This is set by the prefix argument to `buffer-menu' and related @@ -674,7 +691,12 @@ list-buffers-noselect (setq Buffer-menu-buffer-list buffer-list) (setq Buffer-menu-filter-predicate filter-predicate) (list-buffers--refresh buffer-list old-buffer) - (tabulated-list-print)) + (tabulated-list-print) + (when tabulated-list-groups + (setq-local outline-minor-mode-cycle t + outline-minor-mode-highlight t + outline-minor-mode-use-buttons 'in-margins) + (outline-minor-mode 1))) buffer)) (defun Buffer-menu-mouse-select (event) @@ -750,7 +772,11 @@ list-buffers--refresh `("Mode" ,Buffer-menu-mode-width t) '("File" 1 t))) (setq tabulated-list-use-header-line Buffer-menu-use-header-line) - (setq tabulated-list-entries (nreverse entries))) + (setq tabulated-list-entries (nreverse entries)) + (when Buffer-menu-group-by + (setq tabulated-list-groups + (seq-group-by Buffer-menu-group-by + tabulated-list-entries)))) (tabulated-list-init-header)) (defun tabulated-list-entry-size-> (entry1 entry2) @@ -769,4 +795,13 @@ Buffer-menu--pretty-file-name (abbreviate-file-name list-buffers-directory)) (t ""))) +(defun Buffer-menu-group-by-mode (entry) + (concat "* " (aref (cadr entry) 5))) + +(defun Buffer-menu-group-by-root (entry) + (with-current-buffer (car entry) + (if-let ((project (project-current))) + (concat "* " (project-root project)) + (concat "* " default-directory)))) + ;;; buff-menu.el ends here diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 9884a2fc24b..a78e1726c26 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -139,6 +139,21 @@ tabulated-list-entries arguments and must return a list of the above form.") (put 'tabulated-list-entries 'permanent-local t) +(defvar-local tabulated-list-groups nil + "Groups displayed in the current Tabulated List buffer. +This should be either a function, or a list. +If a list, each element has the form (GROUP-NAME ENTRIES), +where: + + - GROUP-NAME is a group name as a string, which is displayed + at the top line of each group. + + - ENTRIES is a list described in `tabulated-list-entries'. + +If `tabulated-list-groups' is a function, it is called with no +arguments and must return a list of the above form.") +(put 'tabulated-list-groups 'permanent-local t) + (defvar-local tabulated-list-padding 0 "Number of characters preceding each Tabulated List mode entry. By default, lines are padded with spaces, but you can use the @@ -427,6 +444,9 @@ tabulated-list-print specified by `tabulated-list-sort-key'. It then erases the buffer and inserts the entries with `tabulated-list-printer'. +If `tabulated-list-groups' is non-nil, each group of entries +is sorted separately after printing the group header line. + Optional argument REMEMBER-POS, if non-nil, means to move point to the entry with the same ID element as the current line. @@ -437,6 +457,9 @@ tabulated-list-print `tabulated-list-put-tag'). Don't use this immediately after changing `tabulated-list-sort-key'." (let ((inhibit-read-only t) + (groups (if (functionp tabulated-list-groups) + (funcall tabulated-list-groups) + tabulated-list-groups)) (entries (if (functionp tabulated-list-entries) (funcall tabulated-list-entries) tabulated-list-entries)) @@ -447,7 +470,14 @@ tabulated-list-print (setq saved-col (current-column))) ;; Sort the entries, if necessary. (when sorter - (setq entries (sort entries sorter))) + (if groups + (setq groups + (mapcar (lambda (group) + (cons (car group) (sort (cdr group) sorter))) + groups)) + (setq entries (sort entries sorter)))) + (unless (functionp tabulated-list-groups) + (setq tabulated-list-groups groups)) (unless (functionp tabulated-list-entries) (setq tabulated-list-entries entries)) ;; Without a sorter, we have no way to just update. @@ -459,6 +489,25 @@ tabulated-list-print (unless tabulated-list-use-header-line (tabulated-list-print-fake-header))) ;; Finally, print the resulting list. + (if groups + (dolist (group groups) + (insert (car group) ?\n) + (when-let ((saved-pt-new (tabulated-list-print-entries + (cdr group) sorter update entry-id))) + (setq saved-pt saved-pt-new))) + (setq saved-pt (tabulated-list-print-entries + entries sorter update entry-id))) + (when update + (delete-region (point) (point-max))) + (set-buffer-modified-p nil) + ;; If REMEMBER-POS was specified, move to the "old" location. + (if saved-pt + (progn (goto-char saved-pt) + (move-to-column saved-col)) + (goto-char (point-min))))) + +(defun tabulated-list-print-entries (entries sorter update entry-id) + (let (saved-pt) (while entries (let* ((elt (car entries)) (tabulated-list--near-rows @@ -495,14 +544,7 @@ tabulated-list-print (forward-line 1) (delete-region old (point)))))) (setq entries (cdr entries))) - (when update - (delete-region (point) (point-max))) - (set-buffer-modified-p nil) - ;; If REMEMBER-POS was specified, move to the "old" location. - (if saved-pt - (progn (goto-char saved-pt) - (move-to-column saved-col)) - (goto-char (point-min))))) + saved-pt)) (defun tabulated-list-print-entry (id cols) "Insert a Tabulated List entry at point. diff --git a/test/lisp/emacs-lisp/tabulated-list-tests.el b/test/lisp/emacs-lisp/tabulated-list-tests.el index 8be2be3139e..e53268b3f14 100644 --- a/test/lisp/emacs-lisp/tabulated-list-tests.el +++ b/test/lisp/emacs-lisp/tabulated-list-tests.el @@ -130,4 +130,45 @@ tabulated-list-sort (should-error (tabulated-list-sort) :type 'user-error) (should-error (tabulated-list-sort 4) :type 'user-error))) +(ert-deftest tabulated-list-groups () + (with-temp-buffer + (tabulated-list-mode) + (setq tabulated-list-groups + (reverse + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) + tabulated-list--test-entries))) + (setq tabulated-list-format tabulated-list--test-format) + (setq tabulated-list-padding 7) + (tabulated-list-init-header) + (tabulated-list-print) + ;; Basic printing. + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + zzzz-game zzzz-game 2113 installed play zzzz in Emacs + mode mode 1128 installed A simple mode for editing Actionscript 3 files +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +")) + ;; Sort and preserve position. + (forward-line 2) + (let ((pos (thing-at-point 'line))) + (tabulated-list-next-column 2) + (tabulated-list-sort) + (should (equal (thing-at-point 'line) pos)) + (should (string-equal + (buffer-substring-no-properties (point-min) (point-max)) + "\ +* installed + mode mode 1128 installed A simple mode for editing Actionscript 3 files + zzzz-game zzzz-game 2113 installed play zzzz in Emacs +* available + abc-mode abc-mode 944 available Major mode for editing abc music files +* obsolete + 4clojure 4clojure 1507 obsolete Open and evaluate 4clojure.com questions +"))))) + ;;; tabulated-list-tests.el ends here --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 22 04:10:22 2024 Received: (at 69305) by debbugs.gnu.org; 22 Feb 2024 09:10:22 +0000 Received: from localhost ([127.0.0.1]:38063 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rd55x-0008Ph-TQ for submit@debbugs.gnu.org; Thu, 22 Feb 2024 04:10:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57690) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rd4tT-00056L-39 for 69305@debbugs.gnu.org; Thu, 22 Feb 2024 03:57:28 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rd4Jz-0000aQ-So; Thu, 22 Feb 2024 03:20:47 -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=5ARP4J2nWHt1ASVKOMtbmQ8/XCXNGsX0KBCgkBEUvsk=; b=IaZkDqmHsbLD CRACDeyFM14kAXEW6/rtt4kQRRk0gM50RtKCdHylXFGSEKcULSi10Uqp1mIZ3UaFSRWAuV31aQgIk Fpjp7qUXLkhoRQfJL0ynUB3VASI57GOqNQRiiNxtnUsCEHCsEPsoK0gsVdN/quRuaZo8UX+jzz6Xi xUZ46k6xUkiuwyMT/zQr0qDDLpErwcbvIWV2m+9t44J8lI0wloExtiavEe8tnyVroIB4ZUCmcYlYG AdaeZZK4uT02Jiu8E7MBSKELsg3QOPvTjQMOZlotRUUK/kufniPWWV+w88ekw5WT2075GkMsOQoyQ EdkZ5RRkW/gzqIw/z5mT0g==; Date: Thu, 22 Feb 2024 10:20:44 +0200 Message-Id: <861q94nc4j.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86cyspt02f.fsf@mail.linkov.net> (message from Juri Linkov on Thu, 22 Feb 2024 09:44:40 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: -5.2 (-----) > From: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Thu, 22 Feb 2024 09:44:40 +0200 > > > Thanks, but I wonder if we can be a tad more user-friendly? The user > > option exists, and it can accept simple enough data structures for > > customizations, but the default is nil, and there's no example or > > pre-cooked list of ready-to-use values anywhere in sight, not even in > > the doc string. Users will have to work hard to produce a grouping of > > their liking. E.g., suppose I want to group buffers by mode -- how > > would I go about it? Or what about grouping buffers by their leading > > directories -- how can that be done? Etc. etc. -- this could be a > > very powerful feature, but we should make its use easier. And, after > > reading the documentation of tabulated-list-groups and that of > > tabulated-list-entries several times, I have no idea how to specify > > simple groupings such as those described above. Which makes examples > > or pre-cooked values even more important, IMO. > > Ok, then this patch adds two pre-cooked functions as a starting point > for users to understand the principle. Then users will propose > more functions and we will choose the most useful candidates > for including to the set of default functions later. Thanks. > +@defvar tabulated-list-groups > +This buffer-local variable specifies the groups of entries displayed in > +the Tabulated List buffer. Its value should be either a list, or a > +function. > + > +If the value is a list, each list element corresponds to one group, and > +should have the form @w{@code{(@var{group-name} @var{entries})}}, where > +@var{group-name} is a string inserted before all group entries, and > +@var{entries} have the same format as @code{tabulated-list-entries} > +(see above). > + > +Otherwise, the value should be a function which returns a list of the > +above form when called with no arguments. > +@end defvar I think the way to specify ENTRIES for this customization should be described in more detail. Reading the above description, even the idea of using ENTRIES for specifying grouping is unclear, since tabulated-list-entries is basically just a list of column descriptors. > +(defcustom Buffer-menu-group-by nil > + "If non-nil, buffers are grouped by function. > +This function takes one argument: a list of entries in the same format > +as in `tabulated-list-entries', and should return a list in the format > +suitable for `tabulated-list-groups'. Also when this variable is non-nil, > +then `outline-minor-mode' is enabled in the Buffer Menu. Then with the > +default value of `outline-regexp' you can use Outline minor mode commands > +to show/hide groups of buffers. > +The default options can group by a mode, and by a root directory of > +a project or just `default-directory'." > + :type '(choice (const :tag "No grouping" nil) > + (function-item :tag "Group by mode" > + Buffer-menu-group-by-mode) > + (function-item :tag "Group by root" > + Buffer-menu-group-by-root) I think the description text should be "Group by project" or "Group by project root directory" or maybe "Group by project or directory". Just "by root" is too vague. > +If `tabulated-list-groups' is non-nil, each group of entries > +is sorted separately after printing the group header line. The part following "after printing" is IMO more confusing than helpful. What will be lost if you remove it? > +(ert-deftest tabulated-list-groups () > + (with-temp-buffer > + (tabulated-list-mode) > + (setq tabulated-list-groups > + (reverse > + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) > + tabulated-list--test-entries))) > + (setq tabulated-list-format tabulated-list--test-format) > + (setq tabulated-list-padding 7) > + (tabulated-list-init-header) > + (tabulated-list-print) This seems to test only the function value of tabulated-list-groups? What about the other form of the value? From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 22 12:49:06 2024 Received: (at 69305) by debbugs.gnu.org; 22 Feb 2024 17:49:06 +0000 Received: from localhost ([127.0.0.1]:45236 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdDBw-0005Re-FR for submit@debbugs.gnu.org; Thu, 22 Feb 2024 12:49:06 -0500 Received: from mslow1.mail.gandi.net ([217.70.178.240]:52993) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdDBs-0005Qi-PZ for 69305@debbugs.gnu.org; Thu, 22 Feb 2024 12:49:03 -0500 Received: from relay9-d.mail.gandi.net (unknown [IPv6:2001:4b98:dc4:8::229]) by mslow1.mail.gandi.net (Postfix) with ESMTP id C8656C3553 for <69305@debbugs.gnu.org>; Thu, 22 Feb 2024 17:41:54 +0000 (UTC) Received: by mail.gandi.net (Postfix) with ESMTPSA id CABB0FF803; Thu, 22 Feb 2024 17:41:33 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <861q94nc4j.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 22 Feb 2024 10:20:44 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> Date: Thu, 22 Feb 2024 19:30:20 +0200 Message-ID: <867ciws983.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (--) >> +@defvar tabulated-list-groups >> +This buffer-local variable specifies the groups of entries displayed in >> +the Tabulated List buffer. Its value should be either a list, or a >> +function. >> + >> +If the value is a list, each list element corresponds to one group, and >> +should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> +@var{group-name} is a string inserted before all group entries, and >> +@var{entries} have the same format as @code{tabulated-list-entries} >> +(see above). >> + >> +Otherwise, the value should be a function which returns a list of the >> +above form when called with no arguments. >> +@end defvar > > I think the way to specify ENTRIES for this customization should be > described in more detail. Reading the above description, even the > idea of using ENTRIES for specifying grouping is unclear, since > tabulated-list-entries is basically just a list of column descriptors. But ENTRIES are described in 'tabulated-list-entries'. Here ENTRIES are no different from 'tabulated-list-entries' that are just column descriptors. >> +(defcustom Buffer-menu-group-by nil >> + "If non-nil, buffers are grouped by function. >> +This function takes one argument: a list of entries in the same format >> +as in `tabulated-list-entries', and should return a list in the format >> +suitable for `tabulated-list-groups'. Also when this variable is non-nil, >> +then `outline-minor-mode' is enabled in the Buffer Menu. Then with the >> +default value of `outline-regexp' you can use Outline minor mode commands >> +to show/hide groups of buffers. >> +The default options can group by a mode, and by a root directory of >> +a project or just `default-directory'." >> + :type '(choice (const :tag "No grouping" nil) >> + (function-item :tag "Group by mode" >> + Buffer-menu-group-by-mode) >> + (function-item :tag "Group by root" >> + Buffer-menu-group-by-root) > > I think the description text should be "Group by project" or "Group by > project root directory" or maybe "Group by project or directory". > Just "by root" is too vague. Ok, then will use "Group by project root or directory". >> +If `tabulated-list-groups' is non-nil, each group of entries >> +is sorted separately after printing the group header line. > > The part following "after printing" is IMO more confusing than > helpful. What will be lost if you remove it? Oops, this was too ugly, will remove this part. >> +(ert-deftest tabulated-list-groups () >> + (with-temp-buffer >> + (tabulated-list-mode) >> + (setq tabulated-list-groups >> + (reverse >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) >> + tabulated-list--test-entries))) >> + (setq tabulated-list-format tabulated-list--test-format) >> + (setq tabulated-list-padding 7) >> + (tabulated-list-init-header) >> + (tabulated-list-print) > > This seems to test only the function value of tabulated-list-groups? > What about the other form of the value? The other forms have no functional difference. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 22 14:29:04 2024 Received: (at 69305) by debbugs.gnu.org; 22 Feb 2024 19:29:05 +0000 Received: from localhost ([127.0.0.1]:52189 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdEkd-00022A-Sv for submit@debbugs.gnu.org; Thu, 22 Feb 2024 14:29:04 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47524) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdEkb-00021h-3F for 69305@debbugs.gnu.org; Thu, 22 Feb 2024 14:28:58 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdET1-0002lJ-9M; Thu, 22 Feb 2024 14:10:47 -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=VxRsB68wr9ESdV6KTyqSxG0xEmuolEA7e24qWRh5K0I=; b=hdVvQran319T L5ya/oltLop4X4nXJ7x/uupEAK1ItbNeNGG1peY9147ChDZiqSKtzrfCAXeHzYzmGSOh8g+ez4GmV KvXm4znUsmxfpn7vcONj9Z0s2xuLRz40lBivnGEerVweQO53Qso2Zravk1NoLO4XTanROuahhiEJS PQhSQQdSP5hEcFgZxQxURpSR5++aaDFg3yPOFhTX0gVFxwv1uReaS2cHJEqb7qXflRtI8TDsz+I8Q RvkMNTBNEYgwkgqfquTdfBfG8WNS5u+AjYRW/6stTRm1ckpRXiN4d+/HFHK49qA+ZuncHmfx10wva 9odF7ybVbyJf05xhyIwR7w==; Date: Thu, 22 Feb 2024 21:10:45 +0200 Message-Id: <86plwo1fii.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <867ciws983.fsf@mail.linkov.net> (message from Juri Linkov on Thu, 22 Feb 2024 19:30:20 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: -5.2 (-----) > From: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Thu, 22 Feb 2024 19:30:20 +0200 > > >> +@defvar tabulated-list-groups > >> +This buffer-local variable specifies the groups of entries displayed in > >> +the Tabulated List buffer. Its value should be either a list, or a > >> +function. > >> + > >> +If the value is a list, each list element corresponds to one group, and > >> +should have the form @w{@code{(@var{group-name} @var{entries})}}, where > >> +@var{group-name} is a string inserted before all group entries, and > >> +@var{entries} have the same format as @code{tabulated-list-entries} > >> +(see above). > >> + > >> +Otherwise, the value should be a function which returns a list of the > >> +above form when called with no arguments. > >> +@end defvar > > > > I think the way to specify ENTRIES for this customization should be > > described in more detail. Reading the above description, even the > > idea of using ENTRIES for specifying grouping is unclear, since > > tabulated-list-entries is basically just a list of column descriptors. > > But ENTRIES are described in 'tabulated-list-entries'. Here ENTRIES > are no different from 'tabulated-list-entries' that are just > column descriptors. My point is that it isn't obvious how to describe grouping in terms of column descriptors. I think the manual should tell in more detail how to use column descriptors to specify how entries should be grouped. Maybe an example or two is all that it takes to do that. > >> +(ert-deftest tabulated-list-groups () > >> + (with-temp-buffer > >> + (tabulated-list-mode) > >> + (setq tabulated-list-groups > >> + (reverse > >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) > >> + tabulated-list--test-entries))) > >> + (setq tabulated-list-format tabulated-list--test-format) > >> + (setq tabulated-list-padding 7) > >> + (tabulated-list-init-header) > >> + (tabulated-list-print) > > > > This seems to test only the function value of tabulated-list-groups? > > What about the other form of the value? > > The other forms have no functional difference. Sorry, I don't follow. Shouldn't we test the capability of specifying grouping by the method other than by providing a function? From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 23 02:13:57 2024 Received: (at 69305) by debbugs.gnu.org; 23 Feb 2024 07:13:57 +0000 Received: from localhost ([127.0.0.1]:44916 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdPkq-0000Yh-Nb for submit@debbugs.gnu.org; Fri, 23 Feb 2024 02:13:57 -0500 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:44201) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdPko-0000YF-CP for 69305@debbugs.gnu.org; Fri, 23 Feb 2024 02:13:54 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id A593660009; Fri, 23 Feb 2024 07:13:04 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86plwo1fii.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 22 Feb 2024 21:10:45 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> Date: Fri, 23 Feb 2024 09:09:03 +0200 Message-ID: <86il2fwuc8.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> +@defvar tabulated-list-groups >> >> +This buffer-local variable specifies the groups of entries displayed in >> >> +the Tabulated List buffer. Its value should be either a list, or a >> >> +function. >> >> + >> >> +If the value is a list, each list element corresponds to one group, and >> >> +should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> >> +@var{group-name} is a string inserted before all group entries, and >> >> +@var{entries} have the same format as @code{tabulated-list-entries} >> >> +(see above). >> >> + >> >> +Otherwise, the value should be a function which returns a list of the >> >> +above form when called with no arguments. >> >> +@end defvar >> > >> > I think the way to specify ENTRIES for this customization should be >> > described in more detail. Reading the above description, even the >> > idea of using ENTRIES for specifying grouping is unclear, since >> > tabulated-list-entries is basically just a list of column descriptors. >> >> But ENTRIES are described in 'tabulated-list-entries'. Here ENTRIES >> are no different from 'tabulated-list-entries' that are just >> column descriptors. > > My point is that it isn't obvious how to describe grouping in terms of > column descriptors. I think the manual should tell in more detail how > to use column descriptors to specify how entries should be grouped. > Maybe an example or two is all that it takes to do that. Sorry, I don't understand what is unclear here: If the value is a list, each list element corresponds to one group, and should have the form @w{@code{(@var{group-name} @var{entries})}}, where @var{group-name} is a string inserted before all group entries, and @var{entries} have the same format as @code{tabulated-list-entries} (see above). Basically this says that the format is (group-name entries) where entries are described in tabulated-list-entries as having the format (id contents). There is no need to duplicate the description of entries. >> >> +(ert-deftest tabulated-list-groups () >> >> + (with-temp-buffer >> >> + (tabulated-list-mode) >> >> + (setq tabulated-list-groups >> >> + (reverse >> >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) >> >> + tabulated-list--test-entries))) >> >> + (setq tabulated-list-format tabulated-list--test-format) >> >> + (setq tabulated-list-padding 7) >> >> + (tabulated-list-init-header) >> >> + (tabulated-list-print) >> > >> > This seems to test only the function value of tabulated-list-groups? >> > What about the other form of the value? >> >> The other forms have no functional difference. > > Sorry, I don't follow. Shouldn't we test the capability of specifying > grouping by the method other than by providing a function? Actually there are no other methods. From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 23 03:13:37 2024 Received: (at 69305) by debbugs.gnu.org; 23 Feb 2024 08:13:37 +0000 Received: from localhost ([127.0.0.1]:48955 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdQga-0003UY-UK for submit@debbugs.gnu.org; Fri, 23 Feb 2024 03:13:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:55552) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdQgY-0003UH-GT for 69305@debbugs.gnu.org; Fri, 23 Feb 2024 03:13:35 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdQg5-0002Ik-Hl; Fri, 23 Feb 2024 03:13:05 -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=DGTYBgN4vfqTtRIdcuojTSZQ7KZN1GaMNsEVkawrm6w=; b=pvRqarj/sxrn IYRUWp+nNPtKnOSblmnFhyWbDX7RN/8ko6cpacMXMF1jluzHyi6hDiVxwzd0TBSLQyGGl9NcYL+sj i/bgrxiPezhydnLis4g3ZYmj/j0ssWXIf4DoGIw6FZxoK3sgcCJkH8mFfpQQ/YyamxEE3bBhHXHbG cC5r6UdholUO70MbBHmTUusoQzi8qEl09BERY6xR4xOT0EmBlCPlFhx2j5bQ1DSiRX96Rozcq/+JC ZV4rVEGERzHR3em0X8LoMkQEcy4lPZaXIbsrdmBRyaLOrh223+d/U9obMuzhoZ8avAiwPtMhBwOaU 64Y9pXrN+ZFsDBwT/WI2jg==; Date: Fri, 23 Feb 2024 10:13:02 +0200 Message-Id: <86edd31tv5.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86il2fwuc8.fsf@mail.linkov.net> (message from Juri Linkov on Fri, 23 Feb 2024 09:09:03 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Fri, 23 Feb 2024 09:09:03 +0200 > > >> >> +@defvar tabulated-list-groups > >> >> +This buffer-local variable specifies the groups of entries displayed in > >> >> +the Tabulated List buffer. Its value should be either a list, or a > >> >> +function. > >> >> + > >> >> +If the value is a list, each list element corresponds to one group, and > >> >> +should have the form @w{@code{(@var{group-name} @var{entries})}}, where > >> >> +@var{group-name} is a string inserted before all group entries, and > >> >> +@var{entries} have the same format as @code{tabulated-list-entries} > >> >> +(see above). > >> >> + > >> >> +Otherwise, the value should be a function which returns a list of the > >> >> +above form when called with no arguments. > >> >> +@end defvar > >> > > >> > I think the way to specify ENTRIES for this customization should be > >> > described in more detail. Reading the above description, even the > >> > idea of using ENTRIES for specifying grouping is unclear, since > >> > tabulated-list-entries is basically just a list of column descriptors. > >> > >> But ENTRIES are described in 'tabulated-list-entries'. Here ENTRIES > >> are no different from 'tabulated-list-entries' that are just > >> column descriptors. > > > > My point is that it isn't obvious how to describe grouping in terms of > > column descriptors. I think the manual should tell in more detail how > > to use column descriptors to specify how entries should be grouped. > > Maybe an example or two is all that it takes to do that. > > Sorry, I don't understand what is unclear here: > > If the value is a list, each list element corresponds to one group, and > should have the form @w{@code{(@var{group-name} @var{entries})}}, where > @var{group-name} is a string inserted before all group entries, and > @var{entries} have the same format as @code{tabulated-list-entries} > (see above). > > Basically this says that the format is (group-name entries) where > entries are described in tabulated-list-entries as having the format > (id contents). There is no need to duplicate the description of entries. Maybe I'm missing something here. To put it more concretely, can you show a value of tabulated-list-groups that will cause the buffers in buffer list grouped by major mode using the above form? > >> >> +(ert-deftest tabulated-list-groups () > >> >> + (with-temp-buffer > >> >> + (tabulated-list-mode) > >> >> + (setq tabulated-list-groups > >> >> + (reverse > >> >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) > >> >> + tabulated-list--test-entries))) > >> >> + (setq tabulated-list-format tabulated-list--test-format) > >> >> + (setq tabulated-list-padding 7) > >> >> + (tabulated-list-init-header) > >> >> + (tabulated-list-print) > >> > > >> > This seems to test only the function value of tabulated-list-groups? > >> > What about the other form of the value? > >> > >> The other forms have no functional difference. > > > > Sorry, I don't follow. Shouldn't we test the capability of specifying > > grouping by the method other than by providing a function? > > Actually there are no other methods. The doc string says the "value can be either a list or a function". I see only one value here, so I'm asking what about a value of the other form. Or what am I missing here? From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 12:56:46 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 17:56:46 +0000 Received: from localhost ([127.0.0.1]:45221 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwGO-00033r-Ux for submit@debbugs.gnu.org; Sat, 24 Feb 2024 12:56:46 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:59803) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwGM-00033P-2i for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 12:56:39 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 0028CE0004; Sat, 24 Feb 2024 17:55:42 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86edd31tv5.fsf@gnu.org> (Eli Zaretskii's message of "Fri, 23 Feb 2024 10:13:02 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> Date: Sat, 24 Feb 2024 19:43:25 +0200 Message-ID: <86jzmtda1y.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> >> +@defvar tabulated-list-groups >> >> >> +This buffer-local variable specifies the groups of entries displayed in >> >> >> +the Tabulated List buffer. Its value should be either a list, or a >> >> >> +function. >> >> >> + >> >> >> +If the value is a list, each list element corresponds to one group, and >> >> >> +should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> >> >> +@var{group-name} is a string inserted before all group entries, and >> >> >> +@var{entries} have the same format as @code{tabulated-list-entries} >> >> >> +(see above). >> >> >> + >> >> >> +Otherwise, the value should be a function which returns a list of the >> >> >> +above form when called with no arguments. >> >> >> +@end defvar >> >> > >> >> > I think the way to specify ENTRIES for this customization should be >> >> > described in more detail. Reading the above description, even the >> >> > idea of using ENTRIES for specifying grouping is unclear, since >> >> > tabulated-list-entries is basically just a list of column descriptors. >> >> >> >> But ENTRIES are described in 'tabulated-list-entries'. Here ENTRIES >> >> are no different from 'tabulated-list-entries' that are just >> >> column descriptors. >> > >> > My point is that it isn't obvious how to describe grouping in terms of >> > column descriptors. I think the manual should tell in more detail how >> > to use column descriptors to specify how entries should be grouped. >> > Maybe an example or two is all that it takes to do that. >> >> Sorry, I don't understand what is unclear here: >> >> If the value is a list, each list element corresponds to one group, and >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> @var{group-name} is a string inserted before all group entries, and >> @var{entries} have the same format as @code{tabulated-list-entries} >> (see above). >> >> Basically this says that the format is (group-name entries) where >> entries are described in tabulated-list-entries as having the format >> (id contents). There is no need to duplicate the description of entries. > > Maybe I'm missing something here. To put it more concretely, can you > show a value of tabulated-list-groups that will cause the buffers in > buffer list grouped by major mode using the above form? Data structure for `tabulated-list-groups' is a list of elements, each element should of the form (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) where GROUP-NAME is the name of the group, ID is a Lisp object that identifies the entry and CONTENTS is a vector with the same number of elements as `tabulated-list-format'. When buffers grouped by major mode: (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) >> >> >> +(ert-deftest tabulated-list-groups () >> >> >> + (with-temp-buffer >> >> >> + (tabulated-list-mode) >> >> >> + (setq tabulated-list-groups >> >> >> + (reverse >> >> >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) >> >> >> + tabulated-list--test-entries))) >> >> >> + (setq tabulated-list-format tabulated-list--test-format) >> >> >> + (setq tabulated-list-padding 7) >> >> >> + (tabulated-list-init-header) >> >> >> + (tabulated-list-print) >> >> > >> >> > This seems to test only the function value of tabulated-list-groups? >> >> > What about the other form of the value? >> >> >> >> The other forms have no functional difference. >> > >> > Sorry, I don't follow. Shouldn't we test the capability of specifying >> > grouping by the method other than by providing a function? >> >> Actually there are no other methods. > > The doc string says the "value can be either a list or a function". I > see only one value here, so I'm asking what about a value of the other > form. Or what am I missing here? Another form is a function. But there is no need to test this. It's just a copy from tabulated-list-entries that is unused. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:03:48 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:03:48 +0000 Received: from localhost ([127.0.0.1]:45656 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwNF-0003Q5-RH for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:03:48 -0500 Received: from mout02.posteo.de ([185.67.36.66]:41463) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwNB-0003PV-9I for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:03:44 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id CA0E9240109 for <69305@debbugs.gnu.org>; Sat, 24 Feb 2024 19:03:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1708797790; bh=EMIQUh98iP3hatTOs0uqqAgYoHEVxilJXfUOgOkQZks=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: From; b=aFOYLaIeRN30pYQ/DpIhtVwD0eOd5eRGy7pIf6lGgvypp3yvLVt3gxOEepRdxnXh6 kBgqPDdKn2FSKj4c4urfyC/v/8nOzpyC09JNXkk4F1qCvQ+jWqDRzCv0Yu+UV3gmQD IbEDt3RGJ+e/WrmTdGe8Te/6tNtakcK827GQrxkshuxZvF1Pzp8imMAabJvnR6DiRV RHeZIPtr8E/x+o5oDsJKZ/ozed4E0bBT88OfuWfuhUj4NJ8lcUVv9jjRph7Db0GuKQ ZpU9wyGKq8gRJsYoJWNPBf6IUxSOKyPyuK7WDaZCh7TGnTEFBEfPNj40fpXR6wexTZ mVyiIY2GMPJCg== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4Thvqx6RN0z9rxL; Sat, 24 Feb 2024 19:03:09 +0100 (CET) From: Ihor Radchenko To: Juri Linkov , Adam Porter Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86cyspt02f.fsf@mail.linkov.net> References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> Date: Sat, 24 Feb 2024 18:06:46 +0000 Message-ID: <87ttlxvirt.fsf@localhost> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii 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: > +@defvar tabulated-list-groups > +This buffer-local variable specifies the groups of entries displayed in > +the Tabulated List buffer. Its value should be either a list, or a > +function. > + > +If the value is a list, each list element corresponds to one group, and > +should have the form @w{@code{(@var{group-name} @var{entries})}}, where > +@var{group-name} is a string inserted before all group entries, and > +@var{entries} have the same format as @code{tabulated-list-entries} > +(see above). > + > +Otherwise, the value should be a function which returns a list of the > +above form when called with no arguments. > +@end defvar I am wondering if flexible grouping system from Adam's org-super-agenda package may provide some inspiration. Check out https://github.com/alphapapa/org-super-agenda/?tab=readme-ov-file#usage -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at . Support Org development at , or support my work at From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:10:21 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:10:21 +0000 Received: from localhost ([127.0.0.1]:46078 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwTc-0003kI-8j for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:10:20 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57304) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwTZ-0003jk-La for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:10:18 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdwT5-0004UF-IN; Sat, 24 Feb 2024 13:09:47 -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=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=; b=PYddF+bEESyt 2UNdE7RoT1BYjy9tEffQ9RAQj/k4LzAe6mWf150ApcP7uPLcxVXdD9OU8QI6mdP8f/xidlDp+HxaL 1GSTwUBXZkrfdJn3XbPb1CjXMfht5974VOuKP7aYrIjRhiVNNSK2vVqGFdtIPFbMJPRcMs6uCPW3R mlU6ldU/6NtFQYsDxVs8idEA8Yvv+QLY+McBdbZitMmXWIxBGANgJkWC8FQKr2TuHv3BWoQVFxG/X gvsgjIq+qrQys79QTDOgPM0T3Z+/ebQuITrXc7Ud3qi57p8UYkwaV7dfMZvTklbTI5WEWownDYQUe Mld2V8yNrtUB5QoniBIwDQ==; Date: Sat, 24 Feb 2024 20:09:43 +0200 Message-Id: <86ttlxybrs.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86jzmtda1y.fsf@mail.linkov.net> (message from Juri Linkov on Sat, 24 Feb 2024 19:43:25 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:33:14 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:33:14 +0000 Received: from localhost ([127.0.0.1]:47718 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwpl-0004ru-OE for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:33:14 -0500 Received: from mout01.posteo.de ([185.67.36.65]:46471) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdwpj-0004rV-Kf for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:33:12 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 3D66F240027 for <69305@debbugs.gnu.org>; Sat, 24 Feb 2024 19:32:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1708799561; bh=aVV40PdrGXVw5kD9FbKAhQZKkMOHqXTBerLix7Zyc6A=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: Content-Transfer-Encoding:From; b=lcwwLHtVLu0snSe8QkmqIu98GcuZMrpDzuWxoSV3/9apg/kCtYTymKyAkPm1+vsr8 BveNr43rCXRfj0Zg+KCNT6wUjbWX83vlNcseXVMrcNMHn9VNEiXw2Fl3c3WoGlBBUE 5jS8Lg7B4HGrUGpvkURY6430TgoCESd6tGglHihoHF4rIRwrGkVzs57vMaf4VJBQgU noTmlSnm2kfZ/qbpgnrpi3tQZjyz2+Acfbds/ctZhJ+G3uiuOddbXvHPd0qNFFZ0qR Hq7ESrvZsme2aMlpGPTlIZJg8rrH2kR7+jXUorcebxAzDYv0Cfc+JdT2owBI53KLA9 oeVMn+kgb1ONw== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4ThwV00tFhz6tw1; Sat, 24 Feb 2024 19:32:39 +0100 (CET) From: Ihor Radchenko To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86r0h1ybgh.fsf@gnu.org> References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> Date: Sat, 24 Feb 2024 18:36:23 +0000 Message-ID: <87r0h1vheg.fsf@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: adam@alphapapa.net, 69305@debbugs.gnu.org, juri@linkov.net 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 (---) Eli Zaretskii writes: >> I am wondering if flexible grouping system from Adam's org-super-agenda >> package may provide some inspiration. >> Check out >> https://github.com/alphapapa/org-super-agenda/?tab=3Dreadme-ov-file#usage > > What I had in mind was much simpler to use. But I guess I'm the only > one who wants to let users set up grouping in some easy way, because > I'm being shown more and more complicated customizations, claiming > they are suitable. Don't be deceived by the length of org-super-agenda readme. Most of the keywords listed there are an equivalent to column names in tabulated-list-mode. What might be relevant are the following group customizations: :face A face to apply to items in the group. If face is a plist containing :append t, it will be appended. See function add-face-text-property. =20=20=20=20 :transformer Used to transform item strings before display. Either a function called with one argument, the item string, or a sexp, in which case the item string is bound to it. and the following options to provide automatic grouping without a need to write dedicated function: :and Group ITEMS that match all selectors in GROUP. =20=20=20=20 :anything Select every item, no matter what. This is probably most useful with :discard, because it doesn=E2=80=99t actually test anything, so it=E2= =80=99s faster than, e.g. ~:regexp =E2=80=9C.=E2=80=9D~, which has to get the entry te= xt for every item. =20=20=20=20 :discard Discard items that match selectors. Any groups processed after this one will not see discarded items. You might use this at the beginning or end of a list of groups, either to narrow down the list of items (used in combination with :not), or to exclude items you=E2=80=99re not interest= ed in. =20=20=20=20 :not Group ITEMS that match no selectors in GROUP. Note that the :not group selector creates a group with items it does not match; it can be combined with :discard to discard items that don=E2=80= =99t match. For example, (:discard (:not (:priority "A"))) as the first selector would mean that only priority A items would appear in the agenda, while (:discard (:priority "C")) would mean that any priority C items would not appear in the agenda. =20=20=20=20 :order A number setting the order sections will be displayed in the agenda, lowest number first. Defaults to 0. =20=20=20=20 :order-multi Set the order of multiple groups at once, like (:order-multi (2 (groupA) (groupB) ...)) to set the order of these groups to 2. =20=20=20=20 :take Take the first N items in GROUP. If N is negative, take the last N items. For example, (:take (-3 group)) will take the last 3 items from the group. The remainder of items are discarded. Note: The order of entries from GROUP is not guaranteed to be preserved, so :take may not always show expected entries. --=20 Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at . Support Org development at , or support my work at From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:50:18 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:50:18 +0000 Received: from localhost ([127.0.0.1]:49074 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdx6I-0005ow-43 for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:50:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:42154) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdx6G-0005oX-3C for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:50:17 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdx5k-0005Kh-Gl; Sat, 24 Feb 2024 13:49:44 -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=K49DoDJ9H2lRW+o9kCr7SibVTxC0G9VFliLJGIwZk3Y=; b=oHq7cpwtzGDT Npeg9YOCWvZ2OHVtO0RwljM8Gf2AEN8gtEhTsPwzdSIWvxhbQWBaz8rGQFHuYjVCIa9lfeLb7H/ll 5L8x7Owr9TnXDDE6Pw9a03jvJJTX6g53aOsqOxFVRJSft9ALWU5BiliDOdgdwiizP6/58QSAdQuwW V/gOMkDyAgykBMf/U2juI3TLQt7Fep/KZmi94fGuIY5wsx9L8NnvHr471OoI9hMeuJmkJXg/xgPFL BRTiqeJGYNtxzgkKgESLreFjN3C9K4/HJMY55A8P301RKth58dNJteAIV933JEu54mhvOhHxpfYsr UbE6JRiD1wr/2ADgb7xCfA==; Date: Sat, 24 Feb 2024 20:49:40 +0200 Message-Id: <86o7c5y9x7.fsf@gnu.org> From: Eli Zaretskii To: Ihor Radchenko In-Reply-To: <87r0h1vheg.fsf@localhost> (message from Ihor Radchenko on Sat, 24 Feb 2024 18:36:23 +0000) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: adam@alphapapa.net, 69305@debbugs.gnu.org, juri@linkov.net 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: Ihor Radchenko > Cc: juri@linkov.net, adam@alphapapa.net, 69305@debbugs.gnu.org > Date: Sat, 24 Feb 2024 18:36:23 +0000 > > Eli Zaretskii writes: > > >> I am wondering if flexible grouping system from Adam's org-super-agenda > >> package may provide some inspiration. > >> Check out > >> https://github.com/alphapapa/org-super-agenda/?tab=readme-ov-file#usage > > > > What I had in mind was much simpler to use. But I guess I'm the only > > one who wants to let users set up grouping in some easy way, because > > I'm being shown more and more complicated customizations, claiming > > they are suitable. > > Don't be deceived by the length of org-super-agenda readme. > Most of the keywords listed there are an equivalent to column names in > tabulated-list-mode. Did you read what I suggested as the preferred way of specifying the grouping? It's way simpler than what org-super-agenda expects. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:55:19 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:55:19 +0000 Received: from localhost ([127.0.0.1]:49406 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdxB9-000639-0q for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:55:19 -0500 Received: from eggs.gnu.org ([209.51.188.92]:41816) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdx1z-0005UP-1L for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:45:51 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdwZc-0005bi-Vd; Sat, 24 Feb 2024 13:16:32 -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=Obl1sTKojZJYcDAqm86TL78PDu/UdCn50moxAOvIY7s=; b=LaxvzuCVM1rb o3O8VwMXVFb3SxjkPwi0itBTojm2imqBx1dLxmupzGtK3P13vTZGSjoGwNhKbSDde3X/FoBsKUCJZ OAP4BM585XRvpW9+EQm3SmbapbEc+V6DBOgcT+7y/BlgPfLjScE1/+/2lQbhkGBa0llO0cocfs1B+ eaI83sP/yjsPNBPJAP6vPLruTszK/XS3QKdJIvjWpj75u64er9wQUTJn71ReurFk4FENPrtocP+sj JV6IUM9bI7cOpRjxCpLcfamxucgS58DUHRseVWkXX/O3v6xIkjfT0DrY5ACpBu1YYstymrPIfnhiJ xjFrcOJffbrmFpGM5iBNSg==; Date: Sat, 24 Feb 2024 20:16:30 +0200 Message-Id: <86r0h1ybgh.fsf@gnu.org> From: Eli Zaretskii To: Ihor Radchenko In-Reply-To: <87ttlxvirt.fsf@localhost> (message from Ihor Radchenko on Sat, 24 Feb 2024 18:06:46 +0000) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: adam@alphapapa.net, 69305@debbugs.gnu.org, juri@linkov.net 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: Ihor Radchenko > Cc: Eli Zaretskii , 69305@debbugs.gnu.org > Date: Sat, 24 Feb 2024 18:06:46 +0000 > > I am wondering if flexible grouping system from Adam's org-super-agenda > package may provide some inspiration. > Check out > https://github.com/alphapapa/org-super-agenda/?tab=readme-ov-file#usage What I had in mind was much simpler to use. But I guess I'm the only one who wants to let users set up grouping in some easy way, because I'm being shown more and more complicated customizations, claiming they are suitable. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 24 13:55:20 2024 Received: (at 69305) by debbugs.gnu.org; 24 Feb 2024 18:55:20 +0000 Received: from localhost ([127.0.0.1]:49408 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdxB9-00063G-HJ for submit@debbugs.gnu.org; Sat, 24 Feb 2024 13:55:20 -0500 Received: from eggs.gnu.org ([209.51.188.92]:41816) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rdx21-0005UP-9w for 69305@debbugs.gnu.org; Sat, 24 Feb 2024 13:45:53 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rdwWN-00059t-M5; Sat, 24 Feb 2024 13:13:11 -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=KcUzyz0CeRQPg/Xlb/hDRJbxB82MquLvZvYBLx9iZak=; b=sc3tKf6Ontyz bE8bepCYW8/cQvHPsSbMHjsQMAcfbZm6b7vo8EFuQ87isXucJ0IRiaYB5B/QcC3+Juq8D1gk57Thb sm79H4FUJuYGuIUo06PzASQUxSaVgqkb2yp270ILbNCGUWq10VNAsq1dfAAsrt5+hmhjc8X3d4psC Fw0hmIXxyqQiX4pTLoQvsFL19yDtYGjne0c43FeJVTjEaethx4lgpqsLpSKAt01lnzYbgMGrCkcTh 6BHeMJeiphw+9f0e4tVtQWKBZI9DdUdYZ4gBIcyX7oxar3fuYMex24ZSkF2C3VEGR7hv2gIkJMKft nx46ltb2w1VwCi5ZXYudMw==; Date: Sat, 24 Feb 2024 20:13:08 +0200 Message-Id: <86sf1hybm3.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86jzmtda1y.fsf@mail.linkov.net> (message from Juri Linkov on Sat, 24 Feb 2024 19:43:25 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Sat, 24 Feb 2024 19:43:25 +0200 > > >> Sorry, I don't understand what is unclear here: > >> > >> If the value is a list, each list element corresponds to one group, and > >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where > >> @var{group-name} is a string inserted before all group entries, and > >> @var{entries} have the same format as @code{tabulated-list-entries} > >> (see above). > >> > >> Basically this says that the format is (group-name entries) where > >> entries are described in tabulated-list-entries as having the format > >> (id contents). There is no need to duplicate the description of entries. > > > > Maybe I'm missing something here. To put it more concretely, can you > > show a value of tabulated-list-groups that will cause the buffers in > > buffer list grouped by major mode using the above form? > > Data structure for `tabulated-list-groups' is a list of elements, > each element should of the form > > (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) > > where GROUP-NAME is the name of the group, ID is a Lisp object that > identifies the entry and CONTENTS is a vector with the same number of > elements as `tabulated-list-format'. When buffers grouped by major mode: > > (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) This is the value that the user is supposed to supply for the defcustom? That is, the user must specify all the buffers explicitly? What happens when there's one more buffer in some mode? does the user have then to modify the value of the defcustom? > >> >> >> +(ert-deftest tabulated-list-groups () > >> >> >> + (with-temp-buffer > >> >> >> + (tabulated-list-mode) > >> >> >> + (setq tabulated-list-groups > >> >> >> + (reverse > >> >> >> + (seq-group-by (lambda (b) (concat "* " (aref (cadr b) 3))) > >> >> >> + tabulated-list--test-entries))) > >> >> >> + (setq tabulated-list-format tabulated-list--test-format) > >> >> >> + (setq tabulated-list-padding 7) > >> >> >> + (tabulated-list-init-header) > >> >> >> + (tabulated-list-print) > >> >> > > >> >> > This seems to test only the function value of tabulated-list-groups? > >> >> > What about the other form of the value? > >> >> > >> >> The other forms have no functional difference. > >> > > >> > Sorry, I don't follow. Shouldn't we test the capability of specifying > >> > grouping by the method other than by providing a function? > >> > >> Actually there are no other methods. > > > > The doc string says the "value can be either a list or a function". I > > see only one value here, so I'm asking what about a value of the other > > form. Or what am I missing here? > > Another form is a function. But there is no need to test this. > It's just a copy from tabulated-list-entries that is unused. I give up. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 02:46:31 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 07:46:31 +0000 Received: from localhost ([127.0.0.1]:50784 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9DS-00015v-Hw for submit@debbugs.gnu.org; Sun, 25 Feb 2024 02:46:31 -0500 Received: from iguana.tulip.relay.mailchannels.net ([23.83.218.253]:14727) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9DJ-00014h-8Y for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 02:46:29 -0500 X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id D5562841882; Sun, 25 Feb 2024 07:45:54 +0000 (UTC) Received: from pdx1-sub0-mail-a258.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 79813842C77; Sun, 25 Feb 2024 07:45:54 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1708847154; a=rsa-sha256; cv=none; b=3ty4jz3Ft5qIn7GPfjuH/wn+da1nbyPTLgNCl5nD7PZRiX0bPDfnh2ZQ1heaZVvI9VozVw /KmhQeQcifgVPXwErm3zV9sUXSz/8LZlWvYmPpr8NsdHu0QyzlpSRQF4H11GUblr5UMaBu A75LJowrXc/yt2FSK7LrgP/gdvTMIcmnp1FgCjkPwfzsinDa/zrgOZjNTRK5Jzn7KnA86L NHIYgnoK5QNsNFFquWMJBtwXRiIiqJPmn1eh3GLjgnTmg6Hfu9PToYRGBooSYvMiGiDdDC szaKGTyD3WeS88hoq+AVZ4UJ1/lRGXGOpQ08XMgxNNlsazRKpNBuhoAWT6MoFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1708847154; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=eP33d0H0JVNbxzAwgwTSimWCeQtWCBYT4EciXLtRnsE=; b=IOaf9qCoxlMPY3gUlRQ6IhMyH9b/uN5WEA4nP4rgIUbMcAn5if807CbpDQL52/Lhgt/jXQ dS4PKO6fB+Y6zoCkf0RPQmJSAteL722P2niGv1mzVxhSdzYcKBrdYnB57Ik//sBzcyUMX0 qpPjLOeiNWpMpT9sE/dQBlzRatNCp72dJkSeNsmwcjIkVIGqqK4qMRju9LERjxoAcxni7i oi5eHUcGomw/fdY2mwWb4A5f/scsHQZJkXyF0cKmMnIpIBZLsqJUzdeXw9GZwARxoTzKKM gAIIudyzbDV0KEUsf90i4LaRKZeCwB3FFGCXT7zIW5s/pL/GAcBQGuRGCPAAFg== ARC-Authentication-Results: i=1; rspamd-6bdc45795d-cstm6; auth=pass smtp.auth=dreamhost smtp.mailfrom=adam@alphapapa.net X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|adam@alphapapa.net X-MailChannels-Auth-Id: dreamhost X-Obese-Belong: 3d7c91077b3644c7_1708847154754_2097315050 X-MC-Loop-Signature: 1708847154754:3861149264 X-MC-Ingress-Time: 1708847154754 Received: from pdx1-sub0-mail-a258.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.97.82.30 (trex/6.9.2); Sun, 25 Feb 2024 07:45:54 +0000 Received: from [10.43.2.174] (unknown [193.56.116.15]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: adam@alphapapa.net) by pdx1-sub0-mail-a258.dreamhost.com (Postfix) with ESMTPSA id 4TjG5F5nKWz5j; Sat, 24 Feb 2024 23:45:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alphapapa.net; s=dreamhost; t=1708847154; bh=eP33d0H0JVNbxzAwgwTSimWCeQtWCBYT4EciXLtRnsE=; h=Date:Subject:To:Cc:From:Content-Type:Content-Transfer-Encoding; b=e/+Qtg+wEBxN9OsuoTYOr7mSoi9L+HhaiugmBcXwfVXAplzspPL9K5W9vbwFRLnZZ ZxvpQ4OpLroMMt7qbNhZCYHphrSTiNjJJJswZ4bUBrr76IorXPdxx+PG254N7Rf/Ps QLXj/vNi+3hPagcvUu7sSXtXmc5PhqpRmuYlu4mYRlkxBPKFlc5ynWQ1QtMo6Glb5c Qu+A5Y+K0vEw/E2yRqV2JbMHn+tsPdcb4rdXX6dBgstIjAP+8T3aqoPKbYMf7DxN+A EZh4/5RDYYxQ1nTAlUgk1Ot6DKZFyDQowyKY6ioEWRG4IBSPluy2f4zCs3seDZAinb lujKIIZwdMozA== Message-ID: <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> Date: Sun, 25 Feb 2024 01:45:52 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode Content-Language: en-US To: Eli Zaretskii , Ihor Radchenko References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> From: Adam Porter In-Reply-To: <86o7c5y9x7.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, juri@linkov.net 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: -0.4 (/) Hi, On 2/24/24 12:49, Eli Zaretskii wrote: >> From: Ihor Radchenko >> Cc: juri@linkov.net, adam@alphapapa.net, 69305@debbugs.gnu.org >> Date: Sat, 24 Feb 2024 18:36:23 +0000 >> >> Eli Zaretskii writes: >> >>>> I am wondering if flexible grouping system from Adam's org-super-agenda >>>> package may provide some inspiration. >>>> Check out >>>> https://github.com/alphapapa/org-super-agenda/?tab=readme-ov-file#usage >>> >>> What I had in mind was much simpler to use. But I guess I'm the only >>> one who wants to let users set up grouping in some easy way, because >>> I'm being shown more and more complicated customizations, claiming >>> they are suitable. >> >> Don't be deceived by the length of org-super-agenda readme. >> Most of the keywords listed there are an equivalent to column names in >> tabulated-list-mode. > > Did you read what I suggested as the preferred way of specifying the > grouping? It's way simpler than what org-super-agenda expects. I appreciate Ihor's mentioning my org-super-agenda library. But while it is indeed a useful tool, please note that since I wrote it, I learned a lot about the topic, and I wrote a new library purposefully designed to facilitate grouping arbitrary data in arbitrary ways with a simple API: taxy.el, which is on GNU ELPA. It supports both statically defined grouping, as well as user-customizeable grouping using a concise DSL defined with top-level forms. So if you were to use one of these as inspiration (or as a library directly), I'd strongly recommend using `taxy', as that's what it's designed for. The documentation is fairly thorough; please see the installed Info manual, or the readme at: https://github.com/alphapapa/taxy.el#usage Let me know if I can help facilitate a solution using it, or help anyone work with the API. Thanks, Adam From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 02:54:26 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 07:54:26 +0000 Received: from localhost ([127.0.0.1]:51300 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9L8-0001Wx-6Z for submit@debbugs.gnu.org; Sun, 25 Feb 2024 02:54:26 -0500 Received: from quail.birch.relay.mailchannels.net ([23.83.209.151]:51003) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9L5-0001Wh-D7 for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 02:54:24 -0500 X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 6FE30C1A01; Sun, 25 Feb 2024 07:53:57 +0000 (UTC) Received: from pdx1-sub0-mail-a258.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 175B0C1C77; Sun, 25 Feb 2024 07:53:57 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1708847637; a=rsa-sha256; cv=none; b=CMNddAPxcXvbqV6YwNpwGlGXkns8W2/hp7l0f20mAIc0C/V0/CslCmx9wFw1xiUz47jlnA 8qYcjS3gJj0SAN5zJ6SpgnuFAKlssDduj7qcS5ZwuIhhttFwy0k0M0dPNdLXrJFlKCiD2v h564T7TE90SrYXlBCCTUdALvsydfYeC4VbwFwcP6LytyPbuYreiH2DWZtuGVl12aK5BNBb vqvOc6Q15LstpQdLt12QpM17eWNi/zEB7auXysPVQLPL5N5LK+c8UYDbA/Ij4baDKQuy76 P7/SSnsMmfVYMECTZ4RMNNPIXTMAIAlXuG154dMNmBz0cSFZwFWzVcqz0pH5Ow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1708847637; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=xOXoDVBjW35b1nZlml5gDwz7dSRbpCCxIMvkq5O/x+0=; b=MqpDaQ4cokgqazxNLlTCUPA4MclxhtpT9J44ZQYzbgqYxiVSMi/ErC7m3ZVVI4xRXkqEgj mWJ+Wc7LvNF+mscPMQ7NqjUDhkyG4Y9xARLjpwgbyp7/ToLEfln9S9YKbZBbqy2R2+hogd EO3YcKqHxBMy2t2TD1ZeTcXE3hpGIW6UvSO7nmIOoqKOclP+LZaDfeJJ3N1sMWqG/pEQGj yYQcxJ/tg24do1XGSaUs4iZzWV8b+O8D9XqE68Yu6bjFn8IpbU8Gh60iVoJ/nDddQS/KaF AGSHZQ82cgvb4U13zlpXww1B9B6Mitd07CFKCfny5uYZQdPytGf6rzf6o3YWJg== ARC-Authentication-Results: i=1; rspamd-6bdc45795d-6v8jp; auth=pass smtp.auth=dreamhost smtp.mailfrom=adam@alphapapa.net X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|adam@alphapapa.net X-MailChannels-Auth-Id: dreamhost X-Fearful-Broad: 143bde4068593013_1708847637336_3638430915 X-MC-Loop-Signature: 1708847637336:3246575451 X-MC-Ingress-Time: 1708847637336 Received: from pdx1-sub0-mail-a258.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.127.49.71 (trex/6.9.2); Sun, 25 Feb 2024 07:53:57 +0000 Received: from [10.43.2.174] (unknown [193.56.116.15]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: adam@alphapapa.net) by pdx1-sub0-mail-a258.dreamhost.com (Postfix) with ESMTPSA id 4TjGGX2Jsjz5j; Sat, 24 Feb 2024 23:53:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alphapapa.net; s=dreamhost; t=1708847636; bh=xOXoDVBjW35b1nZlml5gDwz7dSRbpCCxIMvkq5O/x+0=; h=Date:Subject:To:Cc:From:Content-Type:Content-Transfer-Encoding; b=TyYu8A2gh5sqjPGulC3idqIR0YaqsGeX4zBdyPO/jZWlNlBjm841E+1PKkXzTCu22 8giYhSwfX7PDfsA45bNm4zifi1bV2ZrD9i507k9ipTH+Vpao6UT0wcmZzpoC7UmXeS DIT928wAyAhWanXzZO86u2YRlB2q7zCvjzQueZEi2wQFSXZQv1EnmzsADf4C0xMTTa /Y59wMLtBu/kweugwGsA42HZ01wvPa4jXL+KZD6JZCcDs9IxQ0o4u27ey9HEuelhic ENwxK9NSxoEbZ5U0dnSqdZT89nYh3iLaK2ARRsqqZZivwfKJXzuRhBccmt5qW9vjGK s5iXYxjQ7G89w== Message-ID: Date: Sun, 25 Feb 2024 01:53:55 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode Content-Language: en-US To: Eli Zaretskii , Ihor Radchenko References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> From: Adam Porter In-Reply-To: <86o7c5y9x7.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, juri@linkov.net 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: -0.4 (/) By the way, with regard to grouping buffers specifically, this is what my Bufler package does, again in an extensible, user-programmable way: https://github.com/alphapapa/bufler.el I wrote it after putting significant effort into using Ibuffer's grouping features, which didn't meet my needs. Bufler supports grouping buffers by many different attributes, such as directory, filename, mode, project, parent-project, TRAMP status, etc. And, significantly, it does such grouping dynamically at multiple levels. For example, within a "~/src/emacs" directory, subgroups for git projects within that directory can be created dynamically, providing a grouping like: + Dir: ~/src/emacs |-+ Project: ~/src/emacs/bufler.el | |- *magit-status: bufler.el* |-+ Project: ~/src/emacs/activities.el |- README.org If org-super-agenda was my exploration of the topic, Bufler served as the prototype of a better API, which I then factored out into Taxy. Eventually I'll rebase Bufler on top of Taxy. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 03:10:25 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 08:10:26 +0000 Received: from localhost ([127.0.0.1]:52456 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9aa-0002Hx-Vd for submit@debbugs.gnu.org; Sun, 25 Feb 2024 03:10:25 -0500 Received: from bee.birch.relay.mailchannels.net ([23.83.209.14]:15862) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9Rh-0001rO-7G for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 03:01:13 -0500 X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id B02DA82A68; Sun, 25 Feb 2024 08:00:47 +0000 (UTC) Received: from pdx1-sub0-mail-a258.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 5A39882F2C; Sun, 25 Feb 2024 08:00:47 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1708848047; a=rsa-sha256; cv=none; b=FGoYQ/kntYsjH+K7uBeYc4+XHpssWU2O/rnKQmdXIPKc5THogiILUFlS3bCaHQy/ypZuRd CR6kVIZvNj81bGm8tZN1ZAy6rsw8CA8mAknijTxepkDtghdV5SsSN0C28/NrwkT16w0jxn h6FYbs/znfssd5rmJhraSweU9V6UO1PtLNDKcH0ybuX8d7nPsy+OI1ULp9BbDYLS5ihpeg uroMSuc70Sroueau+Ui8/s3HIwk1Fam94/4luV9pNkWvJzMfnQKzd1F2T+I6EQiVOwKLBn jD/iAMO8fa1tUcHoBisHQqhQacLna/rAV3Aa40R7Hqm0pPqTZx7B4ah2kURX8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1708848047; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZVDxjxdEUEyf0qON2Y8a5x8ofthxH+no/D9+GSov5fU=; b=xKq792hZTK8Rb7tsN/fffM2o+7rU1/LvCtQ90LhwkQtDeCFTyCEDEortSmaHHs3pE6hjWv KV2hLegxmb88WkjPtBvLXLlCDLIX/7cW9VXTpVeGYyXXbScMfyZTmopZgfKLhfIRgzPydl gu0x3MSVzJEakdjoM5ODucgL8Q2sJHVuujobv7n9kWntRZX1FtDqCBQgP6PHVMo7cafIut 3FgKfbawwxAi5HrdbVwSaFVZWdj8jnJlE4yA02WbltfaL1QwKvsRERHvlm+9jiv0K9vO// tJSeTHSUKL2NfZRt16+irI4KRUeflDnf1vK0mKnYEYnAC7rJm1jCPKxv3l9mMg== ARC-Authentication-Results: i=1; rspamd-6bdc45795d-rlbqw; auth=pass smtp.auth=dreamhost smtp.mailfrom=adam@alphapapa.net X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|adam@alphapapa.net X-MailChannels-Auth-Id: dreamhost X-Left-Stupid: 679cfc2a02a3ba49_1708848047600_3083112980 X-MC-Loop-Signature: 1708848047600:1123955501 X-MC-Ingress-Time: 1708848047600 Received: from pdx1-sub0-mail-a258.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.120.66.27 (trex/6.9.2); Sun, 25 Feb 2024 08:00:47 +0000 Received: from [10.43.2.174] (unknown [193.56.116.15]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: adam@alphapapa.net) by pdx1-sub0-mail-a258.dreamhost.com (Postfix) with ESMTPSA id 4TjGQQ5Dvkz4S; Sun, 25 Feb 2024 00:00:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alphapapa.net; s=dreamhost; t=1708848047; bh=ZVDxjxdEUEyf0qON2Y8a5x8ofthxH+no/D9+GSov5fU=; h=Date:To:Cc:Subject:From:Content-Type:Content-Transfer-Encoding; b=N1Iwo+ZlxiKBpvsPKMSMHQ22L5WONNUa1QumHiWVwz/97VWFALWnU4INGSjoWedep 7urKXZWxNnTp+eCaQzRnl3wL8j4eaHR24l2hO4EW7EvlHEKF1UEKiEDvg+9ZcdUvTl 22Lg0ayncttQv3CbiYZxXY61JHgm7PxyD6AzveuhJ/m/qmPTU0yps39kM2HWtaw573 0seucJJvNpqGWWv32Z8ZnRDZ5GziJR7HNTv6Q7DIqZy0Ri80B/4odYj9BWDL1C3+i7 b1KpAZqlHsa1456OM3YaC51NXuansRHAnehobRl08hgORiN5UZRVZzI9NNFEoP7PNF 2HijzSzyMJSlQ== Message-ID: Date: Sun, 25 Feb 2024 02:00:45 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: eliz@gnu.org References: <86sf1hybm3.fsf@gnu.org> Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode Content-Language: en-US From: Adam Porter In-Reply-To: <86sf1hybm3.fsf@gnu.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, juri@linkov.net 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: -0.4 (/) >> Data structure for `tabulated-list-groups' is a list of elements, >> each element should of the form >> >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) >> >> where GROUP-NAME is the name of the group, ID is a Lisp object that >> identifies the entry and CONTENTS is a vector with the same number of >> elements as `tabulated-list-format'. When buffers grouped by major mode: >> >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) > > This is the value that the user is supposed to supply for the > defcustom? That is, the user must specify all the buffers explicitly? > What happens when there's one more buffer in some mode? does the user > have then to modify the value of the defcustom? FWIW, using, e.g. Bufler/Taxy to group buffers, the user would define a set of group key functions like so: (setf buffer-keys '((project) (special mode) mode)) That in effect says, "If a buffer is part of a project, group it by that project's directory; otherwise if a buffer is special, group it with other special buffers, and create subgroups by mode; otherwise group it by mode." Then the groups are created dynamically at runtime when the buffer list buffer is refreshed. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 03:26:43 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 08:26:43 +0000 Received: from localhost ([127.0.0.1]:53541 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9qL-00030t-S5 for submit@debbugs.gnu.org; Sun, 25 Feb 2024 03:26:43 -0500 Received: from eggs.gnu.org ([209.51.188.92]:46440) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1re9qI-00030S-Et for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 03:26:41 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1re9pn-0002Pi-3l; Sun, 25 Feb 2024 03:26:07 -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=3GvuMNkLZTDKo8PpVvTeWZo6SXrv1kar/kiFNsv6jQY=; b=PGFPH3DXplCL zlut3lVh4x7bqGMIZficFnNLBOilvMJNh7gI4lKBZ+XdDGzz8Ujd7bkNBcR1wK7hwW+AH43ZYJYGh vsIgUxK3MEd/5O2EsNjgD+8l0UwpO21jMJGgvKRDK8700vSQGv58Yzk9nr34UyxRUR+J1Ilxb8yvf xtdor3Va1IhzfFGQEGIMLqjl/YCJ6CYTimQKjhWXPK8ZiX+uIEgJt+wzicHAr2ttE5lQgra+4Bt+L lrlG9npGw3KrOZe8MIbYEIQTYl8MyggYyizsXdMCVmJKZkVwZEMTnT0HoMgZ67R3F6cnAF8j/Rbv2 gyhquACU8qon/71k9KGEmA==; Date: Sun, 25 Feb 2024 10:26:04 +0200 Message-Id: <868r39x84j.fsf@gnu.org> From: Eli Zaretskii To: Adam Porter In-Reply-To: (message from Adam Porter on Sun, 25 Feb 2024 01:53:55 -0600) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, yantar92@posteo.net, juri@linkov.net 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 (---) > Date: Sun, 25 Feb 2024 01:53:55 -0600 > Cc: juri@linkov.net, 69305@debbugs.gnu.org > From: Adam Porter > > By the way, with regard to grouping buffers specifically, this is what > my Bufler package does, again in an extensible, user-programmable way: > > https://github.com/alphapapa/bufler.el > > I wrote it after putting significant effort into using Ibuffer's > grouping features, which didn't meet my needs. > > Bufler supports grouping buffers by many different attributes, such as > directory, filename, mode, project, parent-project, TRAMP status, etc. > And, significantly, it does such grouping dynamically at multiple > levels. For example, within a "~/src/emacs" directory, subgroups for > git projects within that directory can be created dynamically, providing > a grouping like: > > + Dir: ~/src/emacs > |-+ Project: ~/src/emacs/bufler.el > | |- *magit-status: bufler.el* > |-+ Project: ~/src/emacs/activities.el > |- README.org Thanks. Once again, my proposal (and frankly, an expectation) was that we provide a much simpler customization facility for grouping entries in a tabulated-list-mode buffer. I won't mind that the current fancy customization is extended to use something like what bufler.el does (although it needs to be generalize to support more than buffer lists), but that will not fill the gap that I feel exists in what we offer now. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 12:55:54 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 17:55:55 +0000 Received: from localhost ([127.0.0.1]:34731 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reIjC-0007Ny-Kw for submit@debbugs.gnu.org; Sun, 25 Feb 2024 12:55:54 -0500 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:52641) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reIj9-0007NG-NI for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 12:55:52 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 149CF60007; Sun, 25 Feb 2024 17:54:49 +0000 (UTC) From: Juri Linkov To: Ihor Radchenko Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <87ttlxvirt.fsf@localhost> (Ihor Radchenko's message of "Sat, 24 Feb 2024 18:06:46 +0000") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> Date: Sun, 25 Feb 2024 19:20:10 +0200 Message-ID: <86v86dx95h.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: Adam Porter , 69305@debbugs.gnu.org, Eli Zaretskii 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 wondering if flexible grouping system from Adam's org-super-agenda > package may provide some inspiration. > Check out > https://github.com/alphapapa/org-super-agenda/?tab=readme-ov-file#usage The designed feature of enabling outline-minor-mode in tabulated-list-mode is intended to be as simple as possible while keeping flexibility for user's customization. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 12:55:55 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 17:55:55 +0000 Received: from localhost ([127.0.0.1]:34733 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reIjC-0007O0-U4 for submit@debbugs.gnu.org; Sun, 25 Feb 2024 12:55:55 -0500 Received: from relay8-d.mail.gandi.net ([217.70.183.201]:51445) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reIj9-0007NE-BF for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 12:55:52 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id CFCB91BF206; Sun, 25 Feb 2024 17:55:16 +0000 (UTC) From: Juri Linkov To: Adam Porter Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> (Adam Porter's message of "Sun, 25 Feb 2024 01:45:52 -0600") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> Date: Sun, 25 Feb 2024 19:36:46 +0200 Message-ID: <86msrov3bl.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii , Ihor Radchenko 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 (-) > So if you were to use one of these as inspiration (or as a library > directly), I'd strongly recommend using `taxy', as that's what it's > designed for. > [...] > Let me know if I can help facilitate a solution using it, or help anyone > work with the API. Thanks for proposing help, but for inspiration I'm using my own package https://github.com/link0ff/emacs-ee It's much more powerful than anything I have seen so far. But on the other hand, it became so unmanageable that I semi-abandoned it due to its overly complexity. Is your package more light-weight than mine? I doubt it ;-) This is why I proposed to do the same with minimal changes relying on existing core packages tabulated-list-mode and outline-minor-mode that already handle 95% of required functionality. What remains to do is just to fill the rest 5%. In addition to the first patch, there will be 2-3 equally small patches that will complete functionality equivalent to the said packages. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 13:39:31 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 18:39:31 +0000 Received: from localhost ([127.0.0.1]:37880 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reJPO-00017I-TH for submit@debbugs.gnu.org; Sun, 25 Feb 2024 13:39:31 -0500 Received: from mslow1.mail.gandi.net ([217.70.178.240]:43135) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reJPM-000172-Bs for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 13:39:29 -0500 Received: from relay7-d.mail.gandi.net (unknown [IPv6:2001:4b98:dc4:8::227]) by mslow1.mail.gandi.net (Postfix) with ESMTP id 37D06C2162 for <69305@debbugs.gnu.org>; Sun, 25 Feb 2024 17:55:29 +0000 (UTC) Received: by mail.gandi.net (Postfix) with ESMTPSA id AAC1D20007; Sun, 25 Feb 2024 17:55:02 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86sf1hybm3.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 24 Feb 2024 20:13:08 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> Date: Sun, 25 Feb 2024 19:25:10 +0200 Message-ID: <86msrpx91u.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: -0.4 (/) >> >> Sorry, I don't understand what is unclear here: >> >> >> >> If the value is a list, each list element corresponds to one group, and >> >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> >> @var{group-name} is a string inserted before all group entries, and >> >> @var{entries} have the same format as @code{tabulated-list-entries} >> >> (see above). >> >> >> >> Basically this says that the format is (group-name entries) where >> >> entries are described in tabulated-list-entries as having the format >> >> (id contents). There is no need to duplicate the description of entries. >> > >> > Maybe I'm missing something here. To put it more concretely, can you >> > show a value of tabulated-list-groups that will cause the buffers in >> > buffer list grouped by major mode using the above form? >> >> Data structure for `tabulated-list-groups' is a list of elements, >> each element should of the form >> >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) >> >> where GROUP-NAME is the name of the group, ID is a Lisp object that >> identifies the entry and CONTENTS is a vector with the same number of >> elements as `tabulated-list-format'. When buffers grouped by major mode: >> >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) > > This is the value that the user is supposed to supply for the > defcustom? That is, the user must specify all the buffers explicitly? > What happens when there's one more buffer in some mode? does the user > have then to modify the value of the defcustom? This describes the internal data structure, not a defcustom. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 14:55:22 2024 Received: (at 69305) by debbugs.gnu.org; 25 Feb 2024 19:55:22 +0000 Received: from localhost ([127.0.0.1]:43696 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reKan-00057a-56 for submit@debbugs.gnu.org; Sun, 25 Feb 2024 14:55:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:46130) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reK0M-00038z-2A for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 14:17:43 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1reJzp-0006Vq-V8; Sun, 25 Feb 2024 14:17:10 -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=iuKc31Kw351JnwJDguLzb8PU7l06kFh6Hp3uh4E42Dg=; b=E8OVVYMQG+jH 08u7LmqtdYKyPDhpDSynkjP1D6twLkJDlHfgoeZlooocwzj3P81PFYUJ/pKpxDKZ07XV/qzMxy2MF JArj5//YXZgvmkPK75n+Abs/fYD/kMYy9ACYDjeTTUBrNt4LkK1UGRkz72DwK+97u5cSsnSw1tD2M 6R+JfZx4AjeGEEGKU7YrMK94o1j0JoIEUErEX9V4fpwAsFp20i1FZqNZTwTVg8vRC/qzalvU6eczt o5NBS4Ut8L817DnPJhMjNsEtaCNGQi9bkyXaq+bCbdcydK9j/tXmqc0wa2FhPJ0E94lHif/wtUVuI 7yKZG7g7oSQa8dDn4A3JcA==; Date: Sun, 25 Feb 2024 21:17:03 +0200 Message-Id: <86frxgwdzk.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86msrpx91u.fsf@mail.linkov.net> (message from Juri Linkov on Sun, 25 Feb 2024 19:25:10 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Sun, 25 Feb 2024 19:25:10 +0200 > > >> >> Sorry, I don't understand what is unclear here: > >> >> > >> >> If the value is a list, each list element corresponds to one group, and > >> >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where > >> >> @var{group-name} is a string inserted before all group entries, and > >> >> @var{entries} have the same format as @code{tabulated-list-entries} > >> >> (see above). > >> >> > >> >> Basically this says that the format is (group-name entries) where > >> >> entries are described in tabulated-list-entries as having the format > >> >> (id contents). There is no need to duplicate the description of entries. > >> > > >> > Maybe I'm missing something here. To put it more concretely, can you > >> > show a value of tabulated-list-groups that will cause the buffers in > >> > buffer list grouped by major mode using the above form? > >> > >> Data structure for `tabulated-list-groups' is a list of elements, > >> each element should of the form > >> > >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) > >> > >> where GROUP-NAME is the name of the group, ID is a Lisp object that > >> identifies the entry and CONTENTS is a vector with the same number of > >> elements as `tabulated-list-format'. When buffers grouped by major mode: > >> > >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) > > > > This is the value that the user is supposed to supply for the > > defcustom? That is, the user must specify all the buffers explicitly? > > What happens when there's one more buffer in some mode? does the user > > have then to modify the value of the defcustom? > > This describes the internal data structure, not a defcustom. Well, my question above, viz.: >> > Maybe I'm missing something here. To put it more concretely, can you >> > show a value of tabulated-list-groups that will cause the buffers in >> > buffer list grouped by major mode using the above form? was about the value of this defcustom. I hoped that by having such a value as part of this discussion, we will be able to clear any misunderstandings that could be getting in the way. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 25 22:40:26 2024 Received: (at 69305) by debbugs.gnu.org; 26 Feb 2024 03:40:26 +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 1reRqq-0005pa-Op for submit@debbugs.gnu.org; Sun, 25 Feb 2024 22:40:26 -0500 Received: from iguana.tulip.relay.mailchannels.net ([23.83.218.253]:52353) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1reRiq-0005Re-83 for 69305@debbugs.gnu.org; Sun, 25 Feb 2024 22:32:10 -0500 X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id F11659431F6; Mon, 26 Feb 2024 03:31:41 +0000 (UTC) Received: from pdx1-sub0-mail-a290.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 6E12C943256; Mon, 26 Feb 2024 03:31:41 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1708918301; a=rsa-sha256; cv=none; b=Z58/gUuIgj1QrEvMRjkCFKlAkJ4kAg5iIddtY29j5thh1c5gb/avCpFur9pBmaNPig2gIs KJu/WK7S9ypMiV9iLb+1VouenUpwF9RmdTOoGbiGte+JmNfjIyYyGB2bECCswQEUhESYib /RyyYOtTPlZMikv3aNFfnRbsM3Q3pMFe2Y7LQE9wV7bmY92WzyWNRC2MAM4UdpGdjgFUss Srgg2W73B81OoWIbf9JYxS0HrOoLHSfg/9RS8BI/ek6EjyDfIgPQ4/CzZ1T5x13F/Zh0Uu o+G6Fh288NyxJoV2zSer5oXM7QTqrJI7A/2MZj4nEBgAJRLEY8avXiDsKCviAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1708918301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:dkim-signature; bh=zmEtUpJ/TLFcCtH1303j8jgNDyDq09uzNQF/Bx344iI=; b=PzbaI/ATzs895SpLKJw+KsdU+64axwWh8SP7AFL8eirVFJbe2HHz9vdGxiCxP5fSRaqCYo IU6vlC+bUucf6KEPB99hHDmWCgCVNE9LPpdxbCmLyktO162170gXE3IQvovL0+ujeqtFH3 061zIjqBekXsPXyaNi7ErXxrWNOLrB6L7IWB7F6BIFb2ki7LQoSgmFM9B8EsLPDAjJrxjI YZ8PR6ME/+BjFat6BpUxEzJm5JXpPE2iEx3+6KMAafmi5Q5jy1iAXuOVFK4cNTEne+n63I cnJ6H9eyXBOufx+5VzFs4UU9svTEVoOBIq+XkUVnXXZsa9bQTZoTiroTLINWBg== ARC-Authentication-Results: i=1; rspamd-6bdc45795d-vhbpb; auth=pass smtp.auth=dreamhost smtp.mailfrom=adam@alphapapa.net X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|adam@alphapapa.net X-MailChannels-Auth-Id: dreamhost X-Share-Harmony: 070dca204da5a4ca_1708918301747_2906767762 X-MC-Loop-Signature: 1708918301746:3750015762 X-MC-Ingress-Time: 1708918301746 Received: from pdx1-sub0-mail-a290.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.119.153.116 (trex/6.9.2); Mon, 26 Feb 2024 03:31:41 +0000 Received: from [10.179.6.34] (unknown [45.130.83.1]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: adam@alphapapa.net) by pdx1-sub0-mail-a290.dreamhost.com (Postfix) with ESMTPSA id 4TjmPR5HKhzDG; Sun, 25 Feb 2024 19:31:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alphapapa.net; s=dreamhost; t=1708918301; bh=zmEtUpJ/TLFcCtH1303j8jgNDyDq09uzNQF/Bx344iI=; h=Content-Type:Date:Subject:To:Cc:From; b=tQ0uugDHI4YoL5jo5QtZ5wbT2zAcOjZeJ2S+ekFNpG3XmxuJMsw+4iCIe22LlPcc9 hUDlTK8eAY/ZsQTkdJB1xLphS1/KdblvawWB5JJraJwHxGJZn8X1FiGNwXK8eCNw3M YxOYaoTorsakUmrT9ulisifO2C1tJcTpkEjc6tMN+PeFhGy5qnZat3/3F0GechUePB 4GODVlrM4A9bF2Dzt7uO9jVd/58iqd7SavpJ4KdRHn784kcYrP8E29B+gl151bKjrC gHRZD85nuJdGIcA4jlkIrH3o1C8yhigXE+F6XZ5l734EgZ+7Q5yTr7JTUy4b1rVCcQ phmrStoXrvr0A== Content-Type: multipart/mixed; boundary="------------T4dUlFdtsZoWBIZquRGVapXl" Message-ID: <0bba7ff4-2dac-4f30-b68d-409f1078d069@alphapapa.net> Date: Sun, 25 Feb 2024 21:31:37 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode To: Juri Linkov References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> <86msrov3bl.fsf@mail.linkov.net> Content-Language: en-US From: Adam Porter In-Reply-To: <86msrov3bl.fsf@mail.linkov.net> X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii , Ihor Radchenko 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: -0.4 (/) This is a multi-part message in MIME format. --------------T4dUlFdtsZoWBIZquRGVapXl Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Juri, On 2/25/24 11:36, Juri Linkov wrote: >> So if you were to use one of these as inspiration (or as a library >> directly), I'd strongly recommend using `taxy', as that's what it's >> designed for. >> [...] >> Let me know if I can help facilitate a solution using it, or help anyone >> work with the API. > > Thanks for proposing help, but for inspiration I'm using > my own package https://github.com/link0ff/emacs-ee > It's much more powerful than anything I have seen so far. > But on the other hand, it became so unmanageable > that I semi-abandoned it due to its overly complexity. Taxy might be able to help with that, because it's designed to simply abstract the matter of classifying data into hierarchies. It's only 381 lines of code, which includes macros that allow applications to define their own, user-extensible grouping languages with top-level forms. UI frontends to render the data structures are separated from the concern of grouping. A simple "pretty print" one is provided, but the main implementation so far is the associated library, taxy-magit-section. > Is your package more light-weight than mine? I doubt it ;-) Well, judge for yourself. :) Attached is a file that provides a simple buffer-grouping command based on Taxy. It's what I would call a "level one" implementation, without defining a DSL or user-customizeable grouping. Adding those features would only take a few more lines of code, but I'm keeping this example as simple as possible. This only takes 41 lines of code. It produces a view as seen in the attached screenshot. And it only took about 5 minutes to write by modifying a similar example that works on another kind of object. Anyway, I'm not necessarily pushing a solution here, only trying to share what's available. I did spend a lot of time on this project, and IMHO it solves the problem elegantly and powerfully, so I would like to see it applied more widely, but things included with Emacs itself are another matter. --------------T4dUlFdtsZoWBIZquRGVapXl Content-Type: text/x-emacs-lisp; charset=UTF-8; name="buffery.el" Content-Disposition: attachment; filename="buffery.el" Content-Transfer-Encoding: base64 Ozs7IGJ1ZmZlcnkuZWwgLS0tIEJ1ZmZlciB2aWV3IHdpdGggVGF4eSBncm91cGluZyAgICAt Ki0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KCjs7IEtleXdvcmRzOiAKCjs7IFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5Cjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cjs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCjs7IChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzsg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgoKOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3Qs IHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6 Cgo7OyAKCjs7OyBDb2RlOgoKKHJlcXVpcmUgJ2NsLWxpYikKKHJlcXVpcmUgJ3Byb2plY3Qp CihyZXF1aXJlICd0YXh5KQoocmVxdWlyZSAndGF4eS1tYWdpdC1zZWN0aW9uKQoKKGRlZnZh ciBidWZmZXJ5LXRheHkKICAoY2wtbGFiZWxzICgoZGlyZWN0b3J5IChidWZmZXIpCiAgICAg ICAgICAgICAgICAoYnVmZmVyLWxvY2FsLXZhbHVlICdkZWZhdWx0LWRpcmVjdG9yeSBidWZm ZXIpKQogICAgICAgICAgICAgIChtb2RlIChidWZmZXIpCiAgICAgICAgICAgICAgICAocHJp bjEtdG8tc3RyaW5nIChidWZmZXItbG9jYWwtdmFsdWUgJ21ham9yLW1vZGUgYnVmZmVyKSkp CiAgICAgICAgICAgICAgKHByb2plY3QgKGJ1ZmZlcikKICAgICAgICAgICAgICAgICh3aXRo LWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAod2hlbi1sZXQgKChw cm9qZWN0IChwcm9qZWN0LWN1cnJlbnQpKSkKICAgICAgICAgICAgICAgICAgICAocHJvamVj dC1yb290IHByb2plY3QpKSkpCiAgICAgICAgICAgICAgKHNwZWNpYWxwIChidWZmZXIpCiAg ICAgICAgICAgICAgICAod2hlbiAobm90IChidWZmZXItZmlsZS1uYW1lIGJ1ZmZlcikpCiAg ICAgICAgICAgICAgICAgICIqc3BlY2lhbCoiKSkKICAgICAgICAgICAgICAobWFrZS1mbiAo JnJlc3QgYXJncykKICAgICAgICAgICAgICAgIChhcHBseSAjJ21ha2UtdGF4eS1tYWdpdC1z ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgOm1ha2UgIydtYWtlLWZuCiAgICAgICAg ICAgICAgICAgICAgICAgOmZvcm1hdC1mbiAjJ2J1ZmZlci1uYW1lCiAgICAgICAgICAgICAg ICAgICAgICAgYXJncykpKQogICAgKG1ha2UtZm4KICAgICA6bmFtZSAiQnVmZmVycyIKICAg ICA6dGFrZSAoYXBwbHktcGFydGlhbGx5ICMndGF4eS10YWtlLWtleWVkCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAobGlzdCAobGlzdCAjJ3Byb2plY3QpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobGlzdCAjJ3NwZWNpYWxwKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIydkaXJlY3RvcnkgIydtb2RlKSkpKSkKCihkZWZ1biBidWZm ZXJ5ICgpCiAgKGludGVyYWN0aXZlKQogIChsZXQqICgoYnVmZmVycyAoYnVmZmVyLWxpc3Qp KQogICAgICAgICAoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKkJ1ZmZlcnkqIikpCiAg ICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKICAgICh3aXRoLWN1cnJlbnQtYnVmZmVy IGJ1ZmZlcgogICAgICAoZXJhc2UtYnVmZmVyKQogICAgICAodGhyZWFkLWxhc3QgYnVmZmVy eS10YXh5CiAgICAgICAgICAgICAgICAgICB0YXh5LWVtcHRpZWQKICAgICAgICAgICAgICAg ICAgICh0YXh5LWZpbGwgYnVmZmVycykKICAgICAgICAgICAgICAgICAgICh0YXh5LXNvcnQq ICMnc3RyaW5nPCAjJ3RheHktbmFtZSkKICAgICAgICAgICAgICAgICAgIHRheHktbWFnaXQt c2VjdGlvbi1pbnNlcnQpKQogICAgKHBvcC10by1idWZmZXIgYnVmZmVyKSkpCgoocHJvdmlk ZSAnYnVmZmVyeSkKOzs7IGJ1ZmZlcnkuZWwgZW5kcyBoZXJlCg== --------------T4dUlFdtsZoWBIZquRGVapXl Content-Type: image/png; name="example.png" Content-Disposition: attachment; filename="example.png" Content-Transfer-Encoding: base64 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 yBuw1iCEvOH/9EcM3mkV5LAAAAAASUVORK5CYII= --------------T4dUlFdtsZoWBIZquRGVapXl-- From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 27 02:42:02 2024 Received: (at 69305) by debbugs.gnu.org; 27 Feb 2024 07:42:02 +0000 Received: from localhost ([127.0.0.1]:58422 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1res6D-00065z-QF for submit@debbugs.gnu.org; Tue, 27 Feb 2024 02:42:02 -0500 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:57051) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1res6C-00065a-DG for 69305@debbugs.gnu.org; Tue, 27 Feb 2024 02:42:00 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id D502A1C0004; Tue, 27 Feb 2024 07:41:27 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86frxgwdzk.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 25 Feb 2024 21:17:03 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> Date: Tue, 27 Feb 2024 09:30:10 +0200 Message-ID: <86jzmqgxvg.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> >> Sorry, I don't understand what is unclear here: >> >> >> >> >> >> If the value is a list, each list element corresponds to one group, and >> >> >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> >> >> @var{group-name} is a string inserted before all group entries, and >> >> >> @var{entries} have the same format as @code{tabulated-list-entries} >> >> >> (see above). >> >> >> >> >> >> Basically this says that the format is (group-name entries) where >> >> >> entries are described in tabulated-list-entries as having the format >> >> >> (id contents). There is no need to duplicate the description of entries. >> >> > >> >> > Maybe I'm missing something here. To put it more concretely, can you >> >> > show a value of tabulated-list-groups that will cause the buffers in >> >> > buffer list grouped by major mode using the above form? >> >> >> >> Data structure for `tabulated-list-groups' is a list of elements, >> >> each element should of the form >> >> >> >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) >> >> >> >> where GROUP-NAME is the name of the group, ID is a Lisp object that >> >> identifies the entry and CONTENTS is a vector with the same number of >> >> elements as `tabulated-list-format'. When buffers grouped by major mode: >> >> >> >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) >> > >> > This is the value that the user is supposed to supply for the >> > defcustom? That is, the user must specify all the buffers explicitly? >> > What happens when there's one more buffer in some mode? does the user >> > have then to modify the value of the defcustom? >> >> This describes the internal data structure, not a defcustom. > > Well, my question above, viz.: > >>> > Maybe I'm missing something here. To put it more concretely, can you >>> > show a value of tabulated-list-groups that will cause the buffers in >>> > buffer list grouped by major mode using the above form? > > was about the value of this defcustom. I hoped that by having such a > value as part of this discussion, we will be able to clear any > misunderstandings that could be getting in the way. But tabulated-list-groups is not a defcustom. There are no defcustoms here. From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 27 03:32:13 2024 Received: (at 69305) by debbugs.gnu.org; 27 Feb 2024 08:32:14 +0000 Received: from localhost ([127.0.0.1]:33912 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ressn-00009k-9U for submit@debbugs.gnu.org; Tue, 27 Feb 2024 03:32:13 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60304) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ressl-00009I-7w for 69305@debbugs.gnu.org; Tue, 27 Feb 2024 03:32:12 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ressF-0005Oc-Lm; Tue, 27 Feb 2024 03:31:39 -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=jhbndIX4d7T2cXiF7RCT01pN3Q+PZvCVUWCmqgbs9G8=; b=ZxWgCQ6heq4q Ra6KsFyJjyWDZ2sSD3bqgW5PexpmooYHgNTvx7opS1HgAnD1KXcWcC2ao7mB+276btsfoUT+3YQpe lzz1uCKnlGsxWbTUB29H737ch+Rd0388NHxGVPyanaftkgInx/Q7YUGdRyySHUbLT3OeKhGKHS5oR EWeFDrU9yPf8Pph4F0jI3TdabM0d10RH4sJUxBhYNOZgTW8mKEc8Jj1V2aCJNeCMA20H6aYdST1iW SZ0ZyimNQncrwD7dkxr3pKl4LhMU1DafHObAJVSEbi1Og/UOYVkIuNPTboKf0jTmhECxelkP34UYu XVSqC8tKM1nFRJcum3yyEQ==; Date: Tue, 27 Feb 2024 10:31:21 +0200 Message-Id: <861q8yux46.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86jzmqgxvg.fsf@mail.linkov.net> (message from Juri Linkov on Tue, 27 Feb 2024 09:30:10 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Tue, 27 Feb 2024 09:30:10 +0200 > > >> >> >> Sorry, I don't understand what is unclear here: > >> >> >> > >> >> >> If the value is a list, each list element corresponds to one group, and > >> >> >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where > >> >> >> @var{group-name} is a string inserted before all group entries, and > >> >> >> @var{entries} have the same format as @code{tabulated-list-entries} > >> >> >> (see above). > >> >> >> > >> >> >> Basically this says that the format is (group-name entries) where > >> >> >> entries are described in tabulated-list-entries as having the format > >> >> >> (id contents). There is no need to duplicate the description of entries. > >> >> > > >> >> > Maybe I'm missing something here. To put it more concretely, can you > >> >> > show a value of tabulated-list-groups that will cause the buffers in > >> >> > buffer list grouped by major mode using the above form? > >> >> > >> >> Data structure for `tabulated-list-groups' is a list of elements, > >> >> each element should of the form > >> >> > >> >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) > >> >> > >> >> where GROUP-NAME is the name of the group, ID is a Lisp object that > >> >> identifies the entry and CONTENTS is a vector with the same number of > >> >> elements as `tabulated-list-format'. When buffers grouped by major mode: > >> >> > >> >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) > >> > > >> > This is the value that the user is supposed to supply for the > >> > defcustom? That is, the user must specify all the buffers explicitly? > >> > What happens when there's one more buffer in some mode? does the user > >> > have then to modify the value of the defcustom? > >> > >> This describes the internal data structure, not a defcustom. > > > > Well, my question above, viz.: > > > >>> > Maybe I'm missing something here. To put it more concretely, can you > >>> > show a value of tabulated-list-groups that will cause the buffers in > >>> > buffer list grouped by major mode using the above form? > > > > was about the value of this defcustom. I hoped that by having such a > > value as part of this discussion, we will be able to clear any > > misunderstandings that could be getting in the way. > > But tabulated-list-groups is not a defcustom. > There are no defcustoms here. Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: + "If non-nil, buffers are grouped by function. +This function takes one argument: a list of entries in the same format +as in `tabulated-list-entries', and should return a list in the format +suitable for `tabulated-list-groups'. So you are inviting users to write functions that return values of a certain format, but the format's documentation IMO doesn't make it clear how to specify a grouping, and for its important part alludes to another variable (tabulated-list-entries), whose documentation is suitable for different kind of uses, not for grouping of entries. Since tabulated-list-groups is such an important part of the documentation of Buffer-menu-group-by, the doc string of tabulated-list-groups is in effect part of the doc string of Buffer-menu-group-by, and should IMO be worded as appropriate for user options. From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 27 12:50:17 2024 Received: (at 69305) by debbugs.gnu.org; 27 Feb 2024 17:50:17 +0000 Received: from localhost ([127.0.0.1]:42098 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rf1aq-0002SX-C6 for submit@debbugs.gnu.org; Tue, 27 Feb 2024 12:50:17 -0500 Received: from relay6-d.mail.gandi.net ([217.70.183.198]:40473) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rf1ao-0002S9-IG for 69305@debbugs.gnu.org; Tue, 27 Feb 2024 12:50:15 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 9CA14C0004; Tue, 27 Feb 2024 17:49:41 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <861q8yux46.fsf@gnu.org> (Eli Zaretskii's message of "Tue, 27 Feb 2024 10:31:21 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> Date: Tue, 27 Feb 2024 19:40:10 +0200 Message-ID: <86plwhg5o5.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> >> >> Sorry, I don't understand what is unclear here: >> >> >> >> >> >> >> >> If the value is a list, each list element corresponds to one group, and >> >> >> >> should have the form @w{@code{(@var{group-name} @var{entries})}}, where >> >> >> >> @var{group-name} is a string inserted before all group entries, and >> >> >> >> @var{entries} have the same format as @code{tabulated-list-entries} >> >> >> >> (see above). >> >> >> >> >> >> >> >> Basically this says that the format is (group-name entries) where >> >> >> >> entries are described in tabulated-list-entries as having the format >> >> >> >> (id contents). There is no need to duplicate the description of entries. >> >> >> > >> >> >> > Maybe I'm missing something here. To put it more concretely, can you >> >> >> > show a value of tabulated-list-groups that will cause the buffers in >> >> >> > buffer list grouped by major mode using the above form? >> >> >> >> >> >> Data structure for `tabulated-list-groups' is a list of elements, >> >> >> each element should of the form >> >> >> >> >> >> (GROUP-NAME (ID . CONTENTS) (ID . CONTENTS) ...) >> >> >> >> >> >> where GROUP-NAME is the name of the group, ID is a Lisp object that >> >> >> identifies the entry and CONTENTS is a vector with the same number of >> >> >> elements as `tabulated-list-format'. When buffers grouped by major mode: >> >> >> >> >> >> (("* Lisp Interaction" (# ["." " " "*" #("*scratch*" 0 9 ...) "225" "Lisp Interaction" ""]) ...)) >> >> > >> >> > This is the value that the user is supposed to supply for the >> >> > defcustom? That is, the user must specify all the buffers explicitly? >> >> > What happens when there's one more buffer in some mode? does the user >> >> > have then to modify the value of the defcustom? >> >> >> >> This describes the internal data structure, not a defcustom. >> > >> > Well, my question above, viz.: >> > >> >>> > Maybe I'm missing something here. To put it more concretely, can you >> >>> > show a value of tabulated-list-groups that will cause the buffers in >> >>> > buffer list grouped by major mode using the above form? >> > >> > was about the value of this defcustom. I hoped that by having such a >> > value as part of this discussion, we will be able to clear any >> > misunderstandings that could be getting in the way. >> >> But tabulated-list-groups is not a defcustom. >> There are no defcustoms here. > > Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: > > + "If non-nil, buffers are grouped by function. > +This function takes one argument: a list of entries in the same format > +as in `tabulated-list-entries', and should return a list in the format > +suitable for `tabulated-list-groups'. > > So you are inviting users to write functions that return values of a > certain format, but the format's documentation IMO doesn't make it > clear how to specify a grouping, and for its important part alludes to > another variable (tabulated-list-entries), whose documentation is > suitable for different kind of uses, not for grouping of entries. The format 'tabulated-list-entries' is input. The format 'tabulated-list-groups' is output. > Since tabulated-list-groups is such an important part of the > documentation of Buffer-menu-group-by, the doc string of > tabulated-list-groups is in effect part of the doc string of > Buffer-menu-group-by, and should IMO be worded as appropriate for user > options. The docstring of 'tabulated-list-groups' already sufficiently documents the format: (defvar-local tabulated-list-groups nil "Groups displayed in the current Tabulated List buffer. This should be either a function, or a list. If a list, each element has the form (GROUP-NAME ENTRIES), where: - GROUP-NAME is a group name as a string, which is displayed at the top line of each group. - ENTRIES is a list described in `tabulated-list-entries'. There is no need to duplicate the description of linked 'tabulated-list-entries'. And here it's clear that the function should add GROUP-NAME to groups from 'tabulated-list-entries'. From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 27 13:55:21 2024 Received: (at 69305) by debbugs.gnu.org; 27 Feb 2024 18:55:21 +0000 Received: from localhost ([127.0.0.1]:45846 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rf2bo-0005aY-Sv for submit@debbugs.gnu.org; Tue, 27 Feb 2024 13:55:21 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60630) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rf2S2-00051v-KT for 69305@debbugs.gnu.org; Tue, 27 Feb 2024 13:45:16 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rf2RW-0000Sz-Tm; Tue, 27 Feb 2024 13:44:42 -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=8fwlnlO4PB15F5s0RpfvXgvcGi14wZh32e4BVkxrT64=; b=QxGr7U0R1rkg u3804qCyZmYeVPciGDAa9XSxSNa00SAJhHtPUCi1uzOvpgKUbrZv65Al+vzbpZl6fh+kHyMvHNQxn Cr7b9ur2u6nJaBfHcubrhe8rCzuvJW06cNIPmy8UE9QjsBzDFrTecZgZ4vGllv6bUrMVoa1AjdWMN Rrrg/7a81lOcCKsablo0Ct8he/LYTG4QtFjCYFy3IzKV/GMBLZ8y6jSbDFI92aFbwvp7IDzT54QaM NvVU/CpnuSsQtdEP4vQdEBNgwQjc8XF0FcSi7gyHhy5DSWLpc0Z9vQm13ZCom/iNdKolzSkxagPQv OZzyQmy4I/i4RcukGf45xQ==; Date: Tue, 27 Feb 2024 20:44:40 +0200 Message-Id: <86le75u4pz.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86plwhg5o5.fsf@mail.linkov.net> (message from Juri Linkov on Tue, 27 Feb 2024 19:40:10 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Tue, 27 Feb 2024 19:40:10 +0200 > > >> But tabulated-list-groups is not a defcustom. > >> There are no defcustoms here. > > > > Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: > > > > + "If non-nil, buffers are grouped by function. > > +This function takes one argument: a list of entries in the same format > > +as in `tabulated-list-entries', and should return a list in the format > > +suitable for `tabulated-list-groups'. > > > > So you are inviting users to write functions that return values of a > > certain format, but the format's documentation IMO doesn't make it > > clear how to specify a grouping, and for its important part alludes to > > another variable (tabulated-list-entries), whose documentation is > > suitable for different kind of uses, not for grouping of entries. > > The format 'tabulated-list-entries' is input. > The format 'tabulated-list-groups' is output. Yes, I'm well aware of that. > > Since tabulated-list-groups is such an important part of the > > documentation of Buffer-menu-group-by, the doc string of > > tabulated-list-groups is in effect part of the doc string of > > Buffer-menu-group-by, and should IMO be worded as appropriate for user > > options. > > The docstring of 'tabulated-list-groups' already > sufficiently documents the format: No, it doesn't document it sufficiently. As I already said several times. > (defvar-local tabulated-list-groups nil > "Groups displayed in the current Tabulated List buffer. > This should be either a function, or a list. > If a list, each element has the form (GROUP-NAME ENTRIES), > where: > > - GROUP-NAME is a group name as a string, which is displayed > at the top line of each group. > > - ENTRIES is a list described in `tabulated-list-entries'. > > There is no need to duplicate the description of linked > 'tabulated-list-entries'. This is not about duplication. This is about adding information that currently isn't there. > And here it's clear that the function should add GROUP-NAME to > groups from 'tabulated-list-entries'. Which doesn't clarify the issue at hand even a single bit. From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 28 02:37:50 2024 Received: (at 69305) by debbugs.gnu.org; 28 Feb 2024 07:37:50 +0000 Received: from localhost ([127.0.0.1]:45461 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfEVh-0001Xr-Si for submit@debbugs.gnu.org; Wed, 28 Feb 2024 02:37:50 -0500 Received: from relay2-d.mail.gandi.net ([217.70.183.194]:53791) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfEVg-0001XS-26 for 69305@debbugs.gnu.org; Wed, 28 Feb 2024 02:37:48 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id D268D40005; Wed, 28 Feb 2024 07:37:14 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86le75u4pz.fsf@gnu.org> (Eli Zaretskii's message of "Tue, 27 Feb 2024 20:44:40 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> Date: Wed, 28 Feb 2024 09:36:30 +0200 Message-ID: <86msrlxcox.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> But tabulated-list-groups is not a defcustom. >> >> There are no defcustoms here. >> > >> > Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: >> > >> > + "If non-nil, buffers are grouped by function. >> > +This function takes one argument: a list of entries in the same format >> > +as in `tabulated-list-entries', and should return a list in the format >> > +suitable for `tabulated-list-groups'. >> > >> > So you are inviting users to write functions that return values of a >> > certain format, but the format's documentation IMO doesn't make it >> > clear how to specify a grouping, and for its important part alludes to >> > another variable (tabulated-list-entries), whose documentation is >> > suitable for different kind of uses, not for grouping of entries. >> >> The format 'tabulated-list-entries' is input. >> The format 'tabulated-list-groups' is output. > > Yes, I'm well aware of that. > >> > Since tabulated-list-groups is such an important part of the >> > documentation of Buffer-menu-group-by, the doc string of >> > tabulated-list-groups is in effect part of the doc string of >> > Buffer-menu-group-by, and should IMO be worded as appropriate for user >> > options. >> >> The docstring of 'tabulated-list-groups' already >> sufficiently documents the format: > > No, it doesn't document it sufficiently. As I already said several > times. > >> (defvar-local tabulated-list-groups nil >> "Groups displayed in the current Tabulated List buffer. >> This should be either a function, or a list. >> If a list, each element has the form (GROUP-NAME ENTRIES), >> where: >> >> - GROUP-NAME is a group name as a string, which is displayed >> at the top line of each group. >> >> - ENTRIES is a list described in `tabulated-list-entries'. >> >> There is no need to duplicate the description of linked >> 'tabulated-list-entries'. > > This is not about duplication. This is about adding information that > currently isn't there. > >> And here it's clear that the function should add GROUP-NAME to >> groups from 'tabulated-list-entries'. > > Which doesn't clarify the issue at hand even a single bit. Sorry, I don't understand what is missing here. Please show an example of changes that you want. From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 28 07:40:49 2024 Received: (at 69305) by debbugs.gnu.org; 28 Feb 2024 12:40:49 +0000 Received: from localhost ([127.0.0.1]:36634 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfJEv-0004SA-86 for submit@debbugs.gnu.org; Wed, 28 Feb 2024 07:40:49 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38482) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfJEs-0004Rf-TO for 69305@debbugs.gnu.org; Wed, 28 Feb 2024 07:40:47 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rfIrY-0007d6-BR; Wed, 28 Feb 2024 07:16:40 -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=tpBAE8WV9ybJqhGMaoQa+YCl9vg1dlCqzn5w3hNQMIM=; b=rhkRUEz0+pei c4uuxuUMMWYpxHH+fc25IiBmJWT+ehC9atX8cUsA2CjpaFSeA89PuJ4nP3SvgpIzX3ppgVv6VILBw Cajlqt4xzE2Mn1XchOnOVsNeCHAG93m5pllgLyWF0g6OzifL9S6GN3lU+47OtbrcacNL8WhF16GRF grNbWe6tu4MvUGUjfD6QFpWTegajABau2LET/74e+sCb/wv5RVO2SBImkcO/kD8UeGQzkK9gbmb7g K1wxXLzsvR9fTl+JP9RTG5NCvEdG3jz+ckC1m21CORXOlg6At5lbCmA8H8HPtwiVmRWZL8FLd5kNJ 34M0lhiARnxVKnbBUxXTKw==; Date: Wed, 28 Feb 2024 14:16:30 +0200 Message-Id: <864jdsu6ld.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <86msrlxcox.fsf@mail.linkov.net> (message from Juri Linkov on Wed, 28 Feb 2024 09:36:30 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Wed, 28 Feb 2024 09:36:30 +0200 > > >> >> But tabulated-list-groups is not a defcustom. > >> >> There are no defcustoms here. > >> > > >> > Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: > >> > > >> > + "If non-nil, buffers are grouped by function. > >> > +This function takes one argument: a list of entries in the same format > >> > +as in `tabulated-list-entries', and should return a list in the format > >> > +suitable for `tabulated-list-groups'. > >> > > >> > So you are inviting users to write functions that return values of a > >> > certain format, but the format's documentation IMO doesn't make it > >> > clear how to specify a grouping, and for its important part alludes to > >> > another variable (tabulated-list-entries), whose documentation is > >> > suitable for different kind of uses, not for grouping of entries. > >> > >> The format 'tabulated-list-entries' is input. > >> The format 'tabulated-list-groups' is output. > > > > Yes, I'm well aware of that. > > > >> > Since tabulated-list-groups is such an important part of the > >> > documentation of Buffer-menu-group-by, the doc string of > >> > tabulated-list-groups is in effect part of the doc string of > >> > Buffer-menu-group-by, and should IMO be worded as appropriate for user > >> > options. > >> > >> The docstring of 'tabulated-list-groups' already > >> sufficiently documents the format: > > > > No, it doesn't document it sufficiently. As I already said several > > times. > > > >> (defvar-local tabulated-list-groups nil > >> "Groups displayed in the current Tabulated List buffer. > >> This should be either a function, or a list. > >> If a list, each element has the form (GROUP-NAME ENTRIES), > >> where: > >> > >> - GROUP-NAME is a group name as a string, which is displayed > >> at the top line of each group. > >> > >> - ENTRIES is a list described in `tabulated-list-entries'. > >> > >> There is no need to duplicate the description of linked > >> 'tabulated-list-entries'. > > > > This is not about duplication. This is about adding information that > > currently isn't there. > > > >> And here it's clear that the function should add GROUP-NAME to > >> groups from 'tabulated-list-entries'. > > > > Which doesn't clarify the issue at hand even a single bit. > > Sorry, I don't understand what is missing here. > Please show an example of changes that you want. Sorry, I cannot show an example of something whose use I don't understand. Which is why I asked _you_ to show an example: how to set up Buffer-menu-group-by to group buffers by major-mode. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 29 02:55:29 2024 Received: (at 69305) by debbugs.gnu.org; 29 Feb 2024 07:55:29 +0000 Received: from localhost ([127.0.0.1]:60904 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfbGJ-0006PC-NU for submit@debbugs.gnu.org; Thu, 29 Feb 2024 02:55:29 -0500 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:46057) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfbBo-0006Bp-B6 for 69305@debbugs.gnu.org; Thu, 29 Feb 2024 02:50:48 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 161B41C0009; Thu, 29 Feb 2024 07:50:13 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <864jdsu6ld.fsf@gnu.org> (Eli Zaretskii's message of "Wed, 28 Feb 2024 14:16:30 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> <864jdsu6ld.fsf@gnu.org> Date: Thu, 29 Feb 2024 09:45:00 +0200 Message-ID: <8634tbn2or.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 (-) >> >> >> But tabulated-list-groups is not a defcustom. >> >> >> There are no defcustoms here. >> >> > >> >> > Buffer-menu-group-by _is_ a defcustom, and it is documented thusly: >> >> > >> >> > + "If non-nil, buffers are grouped by function. >> >> > +This function takes one argument: a list of entries in the same format >> >> > +as in `tabulated-list-entries', and should return a list in the format >> >> > +suitable for `tabulated-list-groups'. >> >> > >> >> > So you are inviting users to write functions that return values of a >> >> > certain format, but the format's documentation IMO doesn't make it >> >> > clear how to specify a grouping, and for its important part alludes to >> >> > another variable (tabulated-list-entries), whose documentation is >> >> > suitable for different kind of uses, not for grouping of entries. >> >> >> >> The format 'tabulated-list-entries' is input. >> >> The format 'tabulated-list-groups' is output. >> > >> > Yes, I'm well aware of that. >> > >> >> > Since tabulated-list-groups is such an important part of the >> >> > documentation of Buffer-menu-group-by, the doc string of >> >> > tabulated-list-groups is in effect part of the doc string of >> >> > Buffer-menu-group-by, and should IMO be worded as appropriate for user >> >> > options. >> >> >> >> The docstring of 'tabulated-list-groups' already >> >> sufficiently documents the format: >> > >> > No, it doesn't document it sufficiently. As I already said several >> > times. >> > >> >> (defvar-local tabulated-list-groups nil >> >> "Groups displayed in the current Tabulated List buffer. >> >> This should be either a function, or a list. >> >> If a list, each element has the form (GROUP-NAME ENTRIES), >> >> where: >> >> >> >> - GROUP-NAME is a group name as a string, which is displayed >> >> at the top line of each group. >> >> >> >> - ENTRIES is a list described in `tabulated-list-entries'. >> >> >> >> There is no need to duplicate the description of linked >> >> 'tabulated-list-entries'. >> > >> > This is not about duplication. This is about adding information that >> > currently isn't there. >> > >> >> And here it's clear that the function should add GROUP-NAME to >> >> groups from 'tabulated-list-entries'. >> > >> > Which doesn't clarify the issue at hand even a single bit. >> >> Sorry, I don't understand what is missing here. >> Please show an example of changes that you want. > > Sorry, I cannot show an example of something whose use I don't > understand. Which is why I asked _you_ to show an example: how to set > up Buffer-menu-group-by to group buffers by major-mode. Ah, you wanted to include a buffer example in "Tabulated List Mode". Ok, here it is: diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 630e42e6878..e79b73eb081 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1246,6 +1246,41 @@ Tabulated List Mode above form when called with no arguments. @end defvar +@defvar tabulated-list-groups +This buffer-local variable specifies the groups of entries displayed in +the Tabulated List buffer. Its value should be either a list, or a +function. + +If the value is a list, each list element corresponds to one group, and +should have the form @w{@code{(@var{group-name} @var{entries})}}, where +@var{group-name} is a string inserted before all group entries, and +@var{entries} have the same format as @code{tabulated-list-entries} +(see above). + +Otherwise, the value should be a function which returns a list of the +above form when called with no arguments. +@end defvar + +You can use @code{seq-group-by} to create @code{tabulated-list-groups} +from @code{tabulated-list-entries}. For example: + +@smallexample +@group + (setq tabulated-list-groups + (seq-group-by 'Buffer-menu-group-by-mode + tabulated-list-entries)) +@end group +@end smallexample + +where you can define @code{Buffer-menu-group-by-mode} like this: + +@smallexample +@group +(defun Buffer-menu-group-by-mode (entry) + (concat "* " (aref (cadr entry) 5))) +@end group +@end smallexample + @defvar tabulated-list-revert-hook This normal hook is run prior to reverting a Tabulated List buffer. A derived mode can add a function to this hook to recompute From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 29 11:34:29 2024 Received: (at 69305) by debbugs.gnu.org; 29 Feb 2024 16:34:29 +0000 Received: from localhost ([127.0.0.1]:35230 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfjMb-00013x-8V for submit@debbugs.gnu.org; Thu, 29 Feb 2024 11:34:29 -0500 Received: from eggs.gnu.org ([209.51.188.92]:54268) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfjMX-00013h-If for 69305@debbugs.gnu.org; Thu, 29 Feb 2024 11:34:27 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rfjLz-0000tM-QE; Thu, 29 Feb 2024 11:33:51 -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=tPk4uVKi6W5OTYpDwzzRcR2LjSOQBEEhwz0tuSI/Fo0=; b=gWUYbcOxltme cqO4fplBpw3AGK5jP6Wt0ZBxgYQxaxT24ESzG4LGGhHS9Sy7fWr8Dv4ha83p83P3rJKN/DkqQFRhG ocOa9eGx2fyzEroSp3vdadgkOEyTIuvSO6oUUuy5EE1fpqpa2UvaVS7wxbjbTLzOFVGI0B2pn1pTD e1NJcxmFdMISd+gLu/F0HUbJSaaTGdJisVZY7TMkrFdbjw7rj1S69XmNXlQz65FssoYy1WOB6CbQb iSDwWuVfKCLs/1g/1UzmfZkn6QuvcnAUIKC/TWXh6p1UMwn6RXyP7HMdPjhy5CDkgNLar87LktTUv 7NUci0lc7UHPWhpF5bETvQ==; Date: Thu, 29 Feb 2024 18:33:48 +0200 Message-Id: <86il27s00j.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <8634tbn2or.fsf@mail.linkov.net> (message from Juri Linkov on Thu, 29 Feb 2024 09:45:00 +0200) Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> <864jdsu6ld.fsf@gnu.org> <8634tbn2or.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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: Juri Linkov > Cc: 69305@debbugs.gnu.org > Date: Thu, 29 Feb 2024 09:45:00 +0200 > > > Sorry, I cannot show an example of something whose use I don't > > understand. Which is why I asked _you_ to show an example: how to set > > up Buffer-menu-group-by to group buffers by major-mode. > > Ah, you wanted to include a buffer example in "Tabulated List Mode". > Ok, here it is: Thanks! From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 29 12:53:24 2024 Received: (at 69305) by debbugs.gnu.org; 29 Feb 2024 17:53:24 +0000 Received: from localhost ([127.0.0.1]:35299 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfkax-0003Ji-TH for submit@debbugs.gnu.org; Thu, 29 Feb 2024 12:53:24 -0500 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:45917) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rfkav-0003JP-4d; Thu, 29 Feb 2024 12:53:21 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 3DF5520003; Thu, 29 Feb 2024 17:52:26 +0000 (UTC) From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <86il27s00j.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 29 Feb 2024 18:33:48 +0200") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <861q94nc4j.fsf@gnu.org> <867ciws983.fsf@mail.linkov.net> <86plwo1fii.fsf@gnu.org> <86il2fwuc8.fsf@mail.linkov.net> <86edd31tv5.fsf@gnu.org> <86jzmtda1y.fsf@mail.linkov.net> <86sf1hybm3.fsf@gnu.org> <86msrpx91u.fsf@mail.linkov.net> <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> <864jdsu6ld.fsf@gnu.org> <8634tbn2or.fsf@mail.linkov.net> <86il27s00j.fsf@gnu.org> Date: Thu, 29 Feb 2024 19:50:45 +0200 Message-ID: <86wmqni2ha.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org 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 69305 30.0.50 thanks >> Ok, here it is: > > Thanks! So now pushed to master. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 03 01:54:29 2024 Received: (at 69305) by debbugs.gnu.org; 3 Mar 2024 06:54:29 +0000 Received: from localhost ([127.0.0.1]:39667 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgfjx-0001Ad-DT for submit@debbugs.gnu.org; Sun, 03 Mar 2024 01:54:29 -0500 Received: from stw1.rcdrun.com ([217.170.207.13]:33075) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgfjs-0001AS-Bx for 69305@debbugs.gnu.org; Sun, 03 Mar 2024 01:54:27 -0500 Received: from localhost ([::ffff:41.75.178.142]) (AUTH: PLAIN admin, TLS: TLS1.3,256bits,ECDHE_RSA_AES_256_GCM_SHA384) by stw1.rcdrun.com with ESMTPSA id 000000000010FA63.0000000065E41E80.00002C79; Sat, 02 Mar 2024 23:53:52 -0700 Date: Sun, 3 Mar 2024 09:53:07 +0300 From: Jean Louis To: Juri Linkov Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode Message-ID: References: <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> <864jdsu6ld.fsf@gnu.org> <8634tbn2or.fsf@mail.linkov.net> <86il27s00j.fsf@gnu.org> <86wmqni2ha.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline In-Reply-To: <86wmqni2ha.fsf@mail.linkov.net> User-Agent: Mutt/2.2.10+64 (b470a9a) (2023-06-05) X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii 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 [2024-02-29 20:54]: > close 69305 30.0.50 > thanks > > >> Ok, here it is: > > > > Thanks! > > So now pushed to master. I hope that the new change will not affect the standard functionality of tabulated-list-mode which I use heavily. Major grouping of tabulated-list-mode is by columns, not by rows, so I really wonder what will happen in the new outline-minor-mode for tabulated-list-mode when it is active and then user sort it by column In my opinion tabulated shall remain tabulated, but I wish to see what is benefit of outline-minor-mode as I cannot understand it yet. Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/ From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 03 03:19:05 2024 Received: (at 69305) by debbugs.gnu.org; 3 Mar 2024 08:19:05 +0000 Received: from localhost ([127.0.0.1]:39726 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgh3o-0006GE-Uj for submit@debbugs.gnu.org; Sun, 03 Mar 2024 03:19:05 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:55787) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgh3n-0006FM-9J for 69305@debbugs.gnu.org; Sun, 03 Mar 2024 03:19:03 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id 2EBFDE0005; Sun, 3 Mar 2024 08:18:26 +0000 (UTC) From: Juri Linkov To: Jean Louis Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: (Jean Louis's message of "Sun, 3 Mar 2024 09:53:07 +0300") Organization: LINKOV.NET References: <86frxgwdzk.fsf@gnu.org> <86jzmqgxvg.fsf@mail.linkov.net> <861q8yux46.fsf@gnu.org> <86plwhg5o5.fsf@mail.linkov.net> <86le75u4pz.fsf@gnu.org> <86msrlxcox.fsf@mail.linkov.net> <864jdsu6ld.fsf@gnu.org> <8634tbn2or.fsf@mail.linkov.net> <86il27s00j.fsf@gnu.org> <86wmqni2ha.fsf@mail.linkov.net> Date: Sun, 03 Mar 2024 09:52:52 +0200 Message-ID: <86wmqjpx4n.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii 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 hope that the new change will not affect the standard functionality > of tabulated-list-mode which I use heavily. Indeed, it should not affect the default behavior. > Major grouping of tabulated-list-mode is by columns, not by rows, so > I really wonder what will happen in the new outline-minor-mode for > tabulated-list-mode when it is active and then user sort it by column When sorted by column then rows in all groups will be sorted by the same column. > In my opinion tabulated shall remain tabulated, but I wish to see what > is benefit of outline-minor-mode as I cannot understand it yet. Rest assured, tabulated will remain tabulated, just outline heading lines are added between groups. From debbugs-submit-bounces@debbugs.gnu.org Wed Mar 06 12:49:47 2024 Received: (at 69305) by debbugs.gnu.org; 6 Mar 2024 17:49:47 +0000 Received: from localhost ([127.0.0.1]:51347 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rhvOl-0005Dp-4R for submit@debbugs.gnu.org; Wed, 06 Mar 2024 12:49:47 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:43319) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rhvOj-0005Cw-0n for 69305@debbugs.gnu.org; Wed, 06 Mar 2024 12:49:45 -0500 Received: by mail.gandi.net (Postfix) with ESMTPSA id DE163E0002; Wed, 6 Mar 2024 17:48:45 +0000 (UTC) From: Juri Linkov To: Adam Porter Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode In-Reply-To: <0bba7ff4-2dac-4f30-b68d-409f1078d069@alphapapa.net> (Adam Porter's message of "Sun, 25 Feb 2024 21:31:37 -0600") Organization: LINKOV.NET References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> <86msrov3bl.fsf@mail.linkov.net> <0bba7ff4-2dac-4f30-b68d-409f1078d069@alphapapa.net> Date: Wed, 06 Mar 2024 19:37:04 +0200 Message-ID: <86a5nbzpm7.fsf@mail.linkov.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain X-GND-Sasl: juri@linkov.net X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii , Ihor Radchenko 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 (-) > (defvar buffery-taxy > (cl-labels ((directory (buffer) > (buffer-local-value 'default-directory buffer)) > (mode (buffer) > (prin1-to-string (buffer-local-value 'major-mode buffer))) > (project (buffer) > (with-current-buffer buffer > (when-let ((project (project-current))) > (project-root project)))) > (specialp (buffer) > (when (not (buffer-file-name buffer)) > "*special*")) > (make-fn (&rest args) > (apply #'make-taxy-magit-section > :make #'make-fn > :format-fn #'buffer-name > args))) > (make-fn > :name "Buffers" > :take (apply-partially #'taxy-take-keyed > (list (list #'project) > (list #'specialp) > #'directory #'mode))))) Thanks for the good example. This is how the same is achieved with 'Buffer-menu-group-by': #+begin_src emacs-lisp (setq Buffer-menu-group-by (lambda (b) (concat "* " (or (with-current-buffer (car b) (when-let ((project (project-current))) (project-root project))) (when (not (buffer-file-name (car b))) "*special*") (buffer-local-value 'default-directory (car b)) (aref (cadr b) 5))))) #+end_src From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 08 18:14:31 2024 Received: (at 69305) by debbugs.gnu.org; 8 Mar 2024 23:14:31 +0000 Received: from localhost ([127.0.0.1]:59941 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rijQ6-00053Z-RP for submit@debbugs.gnu.org; Fri, 08 Mar 2024 18:14:31 -0500 Received: from cross.elm.relay.mailchannels.net ([23.83.212.46]:24437) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rijQ4-00053P-Nh for 69305@debbugs.gnu.org; Fri, 08 Mar 2024 18:14:30 -0500 X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 4A25480251F; Fri, 8 Mar 2024 23:13:55 +0000 (UTC) Received: from pdx1-sub0-mail-a203.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id D60A9802748; Fri, 8 Mar 2024 23:13:54 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1709939634; a=rsa-sha256; cv=none; b=spXDTI9tXPYNjSeCr4vLYN5muIIFQ39RUV660Jw01D3fc8m5zoXhqqfHvGlMkK+pykBKnd hOrCDyJ/NEx0v0h0tDkzwBV8QN1EoBlm/vaiJNLaiEhEXRIa28RA1LbYlJab7+IKti1GxY VME3qF6j74RTNOhsO3QJD6Y1TChg8c++jKbur3ATMas61J48W87o1fvJ3w8XEmdeR1yPjX j8/18qAcFx7zfA+Y61JNh0DFEeBTtE4zcO/07CjBXyQzUozWsJm0aKe+HOVy9qNrdDgW8m 7xVTqL9vmVBLjo2xVs1o7kjTiSTtRJu5ZL3PHcDMH+EvGMIjflpFFQ2Y/FLUvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1709939634; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=hjFWtSvgvLSQty1fsHitVDWYhojdWEb/twaKy2YjL5U=; b=32lwWhiBc2sdkskrDhQl5E3uJMW+Bcp3VOTS9/TXwGWBGblk85JvXpX1jSa84rbsEXoRfY B73UHMXF73QX9uBsqFZIyJkDHxBZtOZnpmXmKN5TwENkPkiR17fVjg3cUTZZWuoA6TIvKX l7gbjd+629yZC/3MkgLNv9FgNwCis165VSty7Evxk7RETX1qUoTcErXVw2pr/Yse6MGgQY McysiO+c3qgb53PzNAw5rDTbSPDcBxk3/EIyi8Mmy4FlmGb/6zjhg/DmpPlLh27tlyoz0T kx6T4LUM/PS824iN48dvOH0FaO4/3y6qd81RlFpXcOby8Y0cvGGNvxSdFs6mcg== ARC-Authentication-Results: i=1; rspamd-5db57bc4b6-5bsvh; auth=pass smtp.auth=dreamhost smtp.mailfrom=adam@alphapapa.net X-Sender-Id: dreamhost|x-authsender|adam@alphapapa.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|adam@alphapapa.net X-MailChannels-Auth-Id: dreamhost X-Grain-Absorbed: 1cd56ef977801707_1709939635140_1683988837 X-MC-Loop-Signature: 1709939635140:1110439670 X-MC-Ingress-Time: 1709939635139 Received: from pdx1-sub0-mail-a203.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.105.100.9 (trex/6.9.2); Fri, 08 Mar 2024 23:13:55 +0000 Received: from [10.43.2.158] (unknown [193.56.116.15]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: adam@alphapapa.net) by pdx1-sub0-mail-a203.dreamhost.com (Postfix) with ESMTPSA id 4Ts26T60sJzjh; Fri, 8 Mar 2024 15:13:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alphapapa.net; s=dreamhost; t=1709939634; bh=hjFWtSvgvLSQty1fsHitVDWYhojdWEb/twaKy2YjL5U=; h=Date:Subject:To:Cc:From:Content-Type:Content-Transfer-Encoding; b=Ip63Qzb5zMWwtlMN1D9ObkDo4rFhSZcq47a4F+g04nQMi22HlCdwgzt3Do+kKukJF iBINJLBCXnrcOhyS95uqUbHgtXJntecDJzkZePjnZncQMeMku4DNgGdXSsFtDtjjNC g4ksqd0mjkovePZ91NFffaI0Alz6Khjxxu45V9l0nvlLSkmW4fU8I8g1/BQeyTEqmj b59vcSUD/aj8fJSvfTLwVyKEkYMxSLbPNnx9CgtQ3aFbVBDVmbJdYkoQBHvqnu01ky rigda9nRWbIF7S6NDUdDpmLTU3OiaVmnehWv2CruZtHRylwObHz4O0Z27+DqoSNIlz 8g0KAUkcg1ctg== Message-ID: <3e170d99-6b3f-43b2-99ab-f8a21c4d3eb8@alphapapa.net> Date: Fri, 8 Mar 2024 17:13:52 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#69305: outline-minor-mode for tabulated-list-mode Content-Language: en-US To: Juri Linkov References: <86msrtvi06.fsf@mail.linkov.net> <86frxlmy1d.fsf@gnu.org> <86cyspt02f.fsf@mail.linkov.net> <87ttlxvirt.fsf@localhost> <86r0h1ybgh.fsf@gnu.org> <87r0h1vheg.fsf@localhost> <86o7c5y9x7.fsf@gnu.org> <0f8d2c11-d393-498e-8324-62e03817ebdb@alphapapa.net> <86msrov3bl.fsf@mail.linkov.net> <0bba7ff4-2dac-4f30-b68d-409f1078d069@alphapapa.net> <86a5nbzpm7.fsf@mail.linkov.net> From: Adam Porter In-Reply-To: <86a5nbzpm7.fsf@mail.linkov.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: 0.6 (/) X-Debbugs-Envelope-To: 69305 Cc: 69305@debbugs.gnu.org, Eli Zaretskii , Ihor Radchenko 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: -0.4 (/) Hi Juri, On 3/6/24 11:37, Juri Linkov wrote: >> (defvar buffery-taxy >> (cl-labels ((directory (buffer) >> (buffer-local-value 'default-directory buffer)) >> (mode (buffer) >> (prin1-to-string (buffer-local-value 'major-mode buffer))) >> (project (buffer) >> (with-current-buffer buffer >> (when-let ((project (project-current))) >> (project-root project)))) >> (specialp (buffer) >> (when (not (buffer-file-name buffer)) >> "*special*")) >> (make-fn (&rest args) >> (apply #'make-taxy-magit-section >> :make #'make-fn >> :format-fn #'buffer-name >> args))) >> (make-fn >> :name "Buffers" >> :take (apply-partially #'taxy-take-keyed >> (list (list #'project) >> (list #'specialp) >> #'directory #'mode))))) > > Thanks for the good example. This is how the same > is achieved with 'Buffer-menu-group-by': > > #+begin_src emacs-lisp > (setq Buffer-menu-group-by > (lambda (b) > (concat "* " > (or > (with-current-buffer (car b) > (when-let ((project (project-current))) > (project-root project))) > (when (not (buffer-file-name (car b))) > "*special*") > (buffer-local-value 'default-directory (car b)) > (aref (cadr b) 5))))) > #+end_src Please note that that does not produce the same result. Your example produces one level of grouping. Taxy, when used with `taxy-take-keyed', produces dynamically nested groups according to the list of key functions and their nesting. The Taxy documentation describes these features extensively, with examples: https://github.com/alphapapa/taxy.el#dynamic-taxys From unknown Tue Jun 17 22:28:36 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sat, 06 Apr 2024 11:24:09 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator