* bug#41868: [PATCH] Add project-clean-up command
@ 2020-06-15 10:00 Philip K.
2020-06-15 11:04 ` Basil L. Contovounesios
2020-06-15 12:28 ` Dmitry Gutov
0 siblings, 2 replies; 31+ messages in thread
From: Philip K. @ 2020-06-15 10:00 UTC (permalink / raw)
To: 41868
[-- Attachment #1: Type: text/plain, Size: 895 bytes --]
Hi,
I wanted to propose a command for project.el to kill all opened buffers
in a project, called when one finishes working on some specific
code-base. I gave it the name "project-clean-up", but maybe it should be
renamed? I have been using it in my local emacs branch for about a week,
and have found it to be useful.
One issue I ran into is that a buffer might be falsely associated with a
project, such as *Help*. That's why I added an user option
project-dont-clean-regexps to contain a list of regular expression of
what buffer names to spare. The reason I couldn't just stick to checking
the value of buffer-file-name is that Dired, VC, etc. buffers don't get
recognized. There might be a better way to do this, but I'm not sure if
it's worth the effort.
And it might be worth considering to add a prompt, to ask the user if
they actually want to kill all the buffers.
--
Philip K.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-project-clean-up-command.patch --]
[-- Type: text/x-diff, Size: 1635 bytes --]
From d7d4127cc561b3f2d1650d19a3fb58895a4cabd1 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 12 Jun 2020 23:37:51 +0200
Subject: [PATCH] Add project-clean-up command
---
lisp/progmodes/project.el | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index f3df44fa7b..9e55f3594c 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -744,6 +744,35 @@ project-compile
(default-directory (project-root pr)))
(compile command comint)))
+(defcustom project-dont-clean-regexps
+ '("\\*Help\\*")
+ "List of regular expressions to be ignored by `project-clean-up'."
+ :type '(repeat regexp))
+
+(defun project--list-buffers (pr)
+ "Return a list of all buffers in project PR."
+ (let ((root (project-root pr))
+ bufs)
+ (dolist (buf (buffer-list))
+ (when-let* ((path (or (buffer-file-name buf)
+ (buffer-local-value 'default-directory buf)))
+ (true (file-truename path)))
+ (when (file-in-directory-p true root)
+ (push buf bufs))))
+ bufs))
+
+;;;###autoload
+(defun project-clean-up ()
+ "Kill all opened buffers in a project."
+ (interactive)
+ (let* ((pr (project-current t)))
+ (dolist (buf (project--list-buffers pr))
+ (let ((match (mapcar (lambda (re)
+ (and (string-match-p re (buffer-name buf)) t))
+ project-dont-clean-regexps)))
+ (unless (memq t match)
+ (kill-buffer buf))))))
+
\f
;;; Project list
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 10:00 bug#41868: [PATCH] Add project-clean-up command Philip K.
@ 2020-06-15 11:04 ` Basil L. Contovounesios
2020-06-15 11:32 ` Philip K.
2020-06-15 12:28 ` Dmitry Gutov
1 sibling, 1 reply; 31+ messages in thread
From: Basil L. Contovounesios @ 2020-06-15 11:04 UTC (permalink / raw)
To: Philip K.; +Cc: 41868
"Philip K." <philip@warpmail.net> writes:
> I wanted to propose a command for project.el to kill all opened buffers
> in a project, called when one finishes working on some specific
> code-base.
Thanks, just some minor nits from me.
[...]
> And it might be worth considering to add a prompt, to ask the user if
> they actually want to kill all the buffers.
Something like "Kill <N> buffers under <root>? "?
[...]
> +(defcustom project-dont-clean-regexps
> + '("\\*Help\\*")
> + "List of regular expressions to be ignored by `project-clean-up'."
> + :type '(repeat regexp))
This needs a :version tag.
> +(defun project--list-buffers (pr)
> + "Return a list of all buffers in project PR."
> + (let ((root (project-root pr))
> + bufs)
> + (dolist (buf (buffer-list))
> + (when-let* ((path (or (buffer-file-name buf)
^^^^
Nit: Paths in Emacs are directory lists, whereas this is a file name.
> + (buffer-local-value 'default-directory buf)))
> + (true (file-truename path)))
Doesn't file-in-directory-p do this for us?
> + (when (file-in-directory-p true root)
> + (push buf bufs))))
> + bufs))
Maybe the list should be returned in the same order as (buffer-list), by
using either nreverse or seq-filter?
> +;;;###autoload
> +(defun project-clean-up ()
> + "Kill all opened buffers in a project."
^^^^^^
live?
> + (interactive)
> + (let* ((pr (project-current t)))
Nit: No need for let*.
> + (dolist (buf (project--list-buffers pr))
> + (let ((match (mapcar (lambda (re)
> + (and (string-match-p re (buffer-name buf)) t))
> + project-dont-clean-regexps)))
> + (unless (memq t match)
> + (kill-buffer buf))))))
Nit: AKA
(unless (seq-some (lambda (re)
(string-match-p re (buffer-name buf)))
project-dont-clean-regexps)
...)
Thanks,
--
Basil
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 11:04 ` Basil L. Contovounesios
@ 2020-06-15 11:32 ` Philip K.
2020-06-15 11:38 ` Basil L. Contovounesios
0 siblings, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-15 11:32 UTC (permalink / raw)
To: Basil L. Contovounesios; +Cc: 41868
Thanks for the notes, just a few questions/justifications below:
"Basil L. Contovounesios" <contovob@tcd.ie> writes:
>> And it might be worth considering to add a prompt, to ask the user if
>> they actually want to kill all the buffers.
>
> Something like "Kill <N> buffers under <root>? "?
Yes, I'll propose something like that in my next patch.
>> + (when (file-in-directory-p true root)
>> + (push buf bufs))))
>> + bufs))
>
> Maybe the list should be returned in the same order as (buffer-list), by
> using either nreverse or seq-filter?
Is there any benifit to this, or is this just a matter of not disrupting
expectations? My thought was that this was more like a set than a proper
list (despite the function name).
>> + (dolist (buf (project--list-buffers pr))
>> + (let ((match (mapcar (lambda (re)
>> + (and (string-match-p re (buffer-name buf)) t))
>> + project-dont-clean-regexps)))
>> + (unless (memq t match)
>> + (kill-buffer buf))))))
>
> Nit: AKA
>
> (unless (seq-some (lambda (re)
> (string-match-p re (buffer-name buf)))
> project-dont-clean-regexps)
> ...)
Would this require adding a "(require 'seq)" to the top? I always kind
of hesistate in adding new dependencies in patches, but if it's already
loaded, it would look better this way.
--
Philip K.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 11:32 ` Philip K.
@ 2020-06-15 11:38 ` Basil L. Contovounesios
0 siblings, 0 replies; 31+ messages in thread
From: Basil L. Contovounesios @ 2020-06-15 11:38 UTC (permalink / raw)
To: Philip K.; +Cc: 41868
"Philip K." <philip@warpmail.net> writes:
> Thanks for the notes, just a few questions/justifications below:
>
> "Basil L. Contovounesios" <contovob@tcd.ie> writes:
>
>>> + (when (file-in-directory-p true root)
>>> + (push buf bufs))))
>>> + bufs))
>>
>> Maybe the list should be returned in the same order as (buffer-list), by
>> using either nreverse or seq-filter?
>
> Is there any benifit to this, or is this just a matter of not disrupting
> expectations? My thought was that this was more like a set than a proper
> list (despite the function name).
I just thought it might be more natural to process buffers in their
usual order, in case it makes a difference in any kill-buffer-related
hooks. It probably doesn't matter much.
>>> + (dolist (buf (project--list-buffers pr))
>>> + (let ((match (mapcar (lambda (re)
>>> + (and (string-match-p re (buffer-name buf)) t))
>>> + project-dont-clean-regexps)))
>>> + (unless (memq t match)
>>> + (kill-buffer buf))))))
>>
>> Nit: AKA
>>
>> (unless (seq-some (lambda (re)
>> (string-match-p re (buffer-name buf)))
>> project-dont-clean-regexps)
>> ...)
>
> Would this require adding a "(require 'seq)" to the top? I always kind
> of hesistate in adding new dependencies in patches, but if it's already
> loaded, it would look better this way.
A lot of seq.el functions are autoloaded, including seq-some.
Thanks,
--
Basil
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 10:00 bug#41868: [PATCH] Add project-clean-up command Philip K.
2020-06-15 11:04 ` Basil L. Contovounesios
@ 2020-06-15 12:28 ` Dmitry Gutov
2020-06-15 18:18 ` Philip K.
1 sibling, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-15 12:28 UTC (permalink / raw)
To: Philip K., 41868
On 15.06.2020 13:00, Philip K. wrote:
> I wanted to propose a command for project.el to kill all opened buffers
> in a project, called when one finishes working on some specific
> code-base. I gave it the name "project-clean-up", but maybe it should be
> renamed?
I've just looked it up, and Projectile has a command called
project-kill-buffers. Perhaps follow its example?
https://github.com/bbatsov/projectile/blob/33bc91e7518fb8cecd89580f16e0ac21799de2c2/projectile.el#L3642
I somewhat prefer the explicit naming. Looking at it, you won't mistake
it for a command that removes build artefacts, or "tidies up" the code,
for instance.
> I have been using it in my local emacs branch for about a week,
> and have found it to be useful.
Sounds useful indeed!
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 12:28 ` Dmitry Gutov
@ 2020-06-15 18:18 ` Philip K.
2020-06-15 20:50 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-15 18:18 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: 41868
[-- Attachment #1: Type: text/plain, Size: 940 bytes --]
Dmitry Gutov <dgutov@yandex.ru> writes:
> On 15.06.2020 13:00, Philip K. wrote:
>> I wanted to propose a command for project.el to kill all opened buffers
>> in a project, called when one finishes working on some specific
>> code-base. I gave it the name "project-clean-up", but maybe it should be
>> renamed?
>
> I've just looked it up, and Projectile has a command called
> project-kill-buffers. Perhaps follow its example?
>
> https://github.com/bbatsov/projectile/blob/33bc91e7518fb8cecd89580f16e0ac21799de2c2/projectile.el#L3642
>
> I somewhat prefer the explicit naming. Looking at it, you won't mistake
> it for a command that removes build artefacts, or "tidies up" the code,
> for instance.
I changed the name to project-kill-buffer in the patch below. It kind of
feels like a ripoff now, but there probably aren't that many way to
implement the idea either.
Hope I didn't miss any of the issues brought up.
--
Philip K.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-project-kill-buffers-command.patch --]
[-- Type: text/x-diff, Size: 1841 bytes --]
From 35c10566382dd31442fd59bf8e3ee695dc595386 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 12 Jun 2020 23:37:51 +0200
Subject: [PATCH] Add project-kill-buffers command
---
lisp/progmodes/project.el | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index f3df44fa7b..6fe5dfa880 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -744,6 +744,39 @@ project-compile
(default-directory (project-root pr)))
(compile command comint)))
+(defcustom project-spare-buffers-regexps
+ '("\\*Help\\*")
+ "List of regular expressions to be ignored by `project-clean-up'."
+ :type '(repeat regexp)
+ :version "28.1")
+
+(defun project--buffer-list (pr)
+ "Return a list of all buffers in project PR."
+ (let ((root (project-root pr))
+ bufs)
+ (dolist (buf (buffer-list))
+ (let ((filename (or (buffer-file-name buf)
+ (buffer-local-value 'default-directory buf))))
+ (when (and filename (file-in-directory-p filename root))
+ (push buf bufs))))
+ (nreverse bufs)))
+
+;;;###autoload
+(defun project-kill-buffers ()
+ "Kill all live buffers of a project."
+ (interactive)
+ (let* ((pr (project-current t))
+ (bufs (project--buffer-list pr)))
+ (with-temp-buffer
+ (setf (buffer-name) " *project buffer list*")
+ (when (yes-or-no-p (format "Kill %d buffers in %s? "
+ (length bufs) (project-root pr)))
+ (dolist (buf bufs)
+ (unless (seq-some (lambda (re)
+ (string-match-p re (buffer-name buf)))
+ project-spare-buffers-regexps)
+ (kill-buffer buf)))))))
+
\f
;;; Project list
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 18:18 ` Philip K.
@ 2020-06-15 20:50 ` Dmitry Gutov
2020-06-15 21:50 ` Philip K.
2020-06-15 22:49 ` Juri Linkov
0 siblings, 2 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-15 20:50 UTC (permalink / raw)
To: Philip K.; +Cc: 41868
On 15.06.2020 21:18, Philip K. wrote:
> I changed the name to project-kill-buffer in the patch below. It kind of
> feels like a ripoff now, but there probably aren't that many way to
> implement the idea either.
Indeed. And, well, following the example in a few (functional) names
shouldn't be considered a fault WRT copyright.
Taking pains to be "different" won't serve anyone either.
> +(defcustom project-spare-buffers-regexps
> + '("\\*Help\\*")
Perhaps also call this project-buffer-spare-conditions? Or something
like that. Point is, no tie the name to regexps, for easy extension into
having functions in that list as well.
> + "List of regular expressions to be ignored by `project-clean-up'."
Forgotten reference to the previous name.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 20:50 ` Dmitry Gutov
@ 2020-06-15 21:50 ` Philip K.
2020-06-16 10:19 ` Dmitry Gutov
2020-06-16 10:52 ` Basil L. Contovounesios
2020-06-15 22:49 ` Juri Linkov
1 sibling, 2 replies; 31+ messages in thread
From: Philip K. @ 2020-06-15 21:50 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: 41868
[-- Attachment #1: Type: text/plain, Size: 880 bytes --]
Dmitry Gutov <dgutov@yandex.ru> writes:
> On 15.06.2020 21:18, Philip K. wrote:
>
> > +(defcustom project-spare-buffers-regexps
> > + '("\\*Help\\*")
>
> Perhaps also call this project-buffer-spare-conditions? Or something
> like that. Point is, no tie the name to regexps, for easy extension into
> having functions in that list as well.
Renamed it an implemented support for predicates too.
> > + "List of regular expressions to be ignored by `project-clean-up'."
>
> Forgotten reference to the previous name.
There was also some superfluous code from an attempt to reimplement
yes-or-no-p with a third option I removed. Also fixed an inconsistency,
where the prompt would tell the user that more buffers would be killed
that would actually be, depending on the value of
project-buffer-spare-conditions.
(naively) Hoping everything it ok this time.
--
Philip K.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-project-kill-buffers-command.patch --]
[-- Type: text/x-diff, Size: 2287 bytes --]
>From 20ab9f1f8fe603e8ea8fe24a7d0e1fdd60be08bb Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 12 Jun 2020 23:37:51 +0200
Subject: [PATCH] Add project-kill-buffers command
---
lisp/progmodes/project.el | 41 +++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index f3df44fa7b..50155e55dd 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -744,6 +744,47 @@ project-compile
(default-directory (project-root pr)))
(compile command comint)))
+(defcustom project-spare-buffers-conditions
+ '("\\*Help\\*")
+ "List of conditions to be ignored by `project-kill-buffers'.
+If a condition is a string, it will be interpreted as a regular
+expression. If the buffer name matches the regular expresion, the
+buffer will not be killed. If a contition is a function, it will
+be called with the buffer object. If it returns a non-nil value,
+the buffer will not be killed."
+ :type '(repeat (choice regexp function))
+ :version "28.1")
+
+(defun project--buffer-list (pr)
+ "Return a list of all buffers in project PR."
+ (let ((root (project-root pr)) bufs)
+ (dolist (buf (buffer-list))
+ (let ((filename (or (buffer-file-name buf)
+ (buffer-local-value 'default-directory buf))))
+ (when (and filename (file-in-directory-p filename root))
+ (push buf bufs))))
+ (nreverse bufs)))
+
+;;;###autoload
+(defun project-kill-buffers ()
+ "Kill all live buffers of a project.
+Certain buffers may be ignored, depending on the value of
+`project-spare-buffers-conditions'."
+ (interactive)
+ (let* ((pr (project-current t)) bufs)
+ (dolist (buf (project--buffer-list pr))
+ (unless (seq-some
+ (lambda (c)
+ (cond ((stringp c)
+ (string-match-p c (buffer-name buf)))
+ ((functionp c)
+ (funcall c buf))))
+ project-spare-buffers-conditions)
+ (push buf bufs)))
+ (when (yes-or-no-p (format "Kill %d buffers in %s? "
+ (length bufs) (project-root pr)))
+ (mapc #'kill-buffer bufs))))
+
\f
;;; Project list
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 20:50 ` Dmitry Gutov
2020-06-15 21:50 ` Philip K.
@ 2020-06-15 22:49 ` Juri Linkov
2020-06-16 0:23 ` Dmitry Gutov
1 sibling, 1 reply; 31+ messages in thread
From: Juri Linkov @ 2020-06-15 22:49 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Philip K., 41868
>> +(defcustom project-spare-buffers-regexps
>> + '("\\*Help\\*")
>
> Perhaps also call this project-buffer-spare-conditions?
I think the suffix ‘-regexps’ is fine. The problem is that
the word “spare” has no reference to the related command name
‘project-kill-buffers’. Maybe better would be something like
‘project-kill-buffers-ignore-regexps’ or
> Or something like that. Point is, no tie the name to regexps, for easy
> extension into having functions in that list as well.
For functions it's easy to add a separate variable like
‘project-kill-buffers-ignore-functions’.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 22:49 ` Juri Linkov
@ 2020-06-16 0:23 ` Dmitry Gutov
2020-06-16 21:47 ` Juri Linkov
0 siblings, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-16 0:23 UTC (permalink / raw)
To: Juri Linkov; +Cc: Philip K., 41868
On 16.06.2020 01:49, Juri Linkov wrote:
>>> +(defcustom project-spare-buffers-regexps
>>> + '("\\*Help\\*")
>>
>> Perhaps also call this project-buffer-spare-conditions?
>
> I think the suffix ‘-regexps’ is fine. The problem is that
> the word “spare” has no reference to the related command name
> ‘project-kill-buffers’. Maybe better would be something like
> ‘project-kill-buffers-ignore-regexps’ or
"kill or spare", no? But it's not immediately obvious for non-native
speakers, sure.
>> Or something like that. Point is, no tie the name to regexps, for easy
>> extension into having functions in that list as well.
>
> For functions it's easy to add a separate variable like
> ‘project-kill-buffers-ignore-functions’.
I don't see why we wouldn't want to keep it on the same variable. It's
both easier to document, and to implement.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 21:50 ` Philip K.
@ 2020-06-16 10:19 ` Dmitry Gutov
2020-06-16 10:52 ` Basil L. Contovounesios
1 sibling, 0 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-16 10:19 UTC (permalink / raw)
To: Philip K.; +Cc: 41868
On 16.06.2020 00:50, Philip K. wrote:
> (naively) Hoping everything it ok this time.
Thanks! It's looking good.
Let's also hear what Juri thinks. To address one of his concerns, the
var could be renamed to project-kill-buffers-spare-conditions.
One added benefit of this is it would be immediately clear from the name
that it only affects a specific command.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-15 21:50 ` Philip K.
2020-06-16 10:19 ` Dmitry Gutov
@ 2020-06-16 10:52 ` Basil L. Contovounesios
2020-06-16 14:31 ` Eli Zaretskii
1 sibling, 1 reply; 31+ messages in thread
From: Basil L. Contovounesios @ 2020-06-16 10:52 UTC (permalink / raw)
To: Philip K.; +Cc: 41868, Dmitry Gutov
"Philip K." <philip@warpmail.net> writes:
> (naively) Hoping everything it ok this time.
Just one tiny detail from me. ;)
> +(defcustom project-spare-buffers-conditions
> + '("\\*Help\\*")
> + "List of conditions to be ignored by `project-kill-buffers'.
> +If a condition is a string, it will be interpreted as a regular
> +expression. If the buffer name matches the regular expresion, the
> +buffer will not be killed. If a contition is a function, it will
> +be called with the buffer object. If it returns a non-nil value,
> +the buffer will not be killed."
Some of the full stops aren't followed by two spaces here
(see sentence-end-double-space in Emacs' dir-locals-file).
Perhaps some of the common wording can be factored out as well
(feel free to adapt as you see fit):
"List of conditions to be ignored by `project-kill-buffers'.
Buffers under the current project that match any of these
conditions will not be killed by `project-kill-buffers'. Each
condition is either a regular expression matching a buffer name,
or a predicate function that takes a buffer object as argument
and returns non-nil if it matches."
> + (let* ((pr (project-current t)) bufs)
Nit: No need for let*.
Thanks,
--
Basil
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-16 10:52 ` Basil L. Contovounesios
@ 2020-06-16 14:31 ` Eli Zaretskii
2020-06-16 17:12 ` Philip K.
0 siblings, 1 reply; 31+ messages in thread
From: Eli Zaretskii @ 2020-06-16 14:31 UTC (permalink / raw)
To: Basil L. Contovounesios; +Cc: philip, 41868, dgutov
> From: "Basil L. Contovounesios" <contovob@tcd.ie>
> Date: Tue, 16 Jun 2020 11:52:26 +0100
> Cc: 41868@debbugs.gnu.org, Dmitry Gutov <dgutov@yandex.ru>
>
> Perhaps some of the common wording can be factored out as well
> (feel free to adapt as you see fit):
>
> "List of conditions to be ignored by `project-kill-buffers'.
The first line is too general, and could deceive. How about
Conditions for buffers `project-kill-buffers' should not kill.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-16 14:31 ` Eli Zaretskii
@ 2020-06-16 17:12 ` Philip K.
2020-06-18 1:05 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-16 17:12 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: contovob, 41868, dgutov
[-- Attachment #1: Type: text/plain, Size: 652 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
>> From: "Basil L. Contovounesios" <contovob@tcd.ie>
>> Date: Tue, 16 Jun 2020 11:52:26 +0100
>> Cc: 41868@debbugs.gnu.org, Dmitry Gutov <dgutov@yandex.ru>
>>
>> Perhaps some of the common wording can be factored out as well
>> (feel free to adapt as you see fit):
>>
>> "List of conditions to be ignored by `project-kill-buffers'.
>
> The first line is too general, and could deceive. How about
>
> Conditions for buffers `project-kill-buffers' should not kill.
It sounds good, so I used it in the revised patch below, together with a
few other minor improvments which Basil mentioned.
--
Philip K.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-project-kill-buffers-command.patch --]
[-- Type: text/x-diff, Size: 2324 bytes --]
From 2172f4d3d310d75dadf5ef0af297476e873349b8 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 12 Jun 2020 23:37:51 +0200
Subject: [PATCH] Add project-kill-buffers command
---
lisp/progmodes/project.el | 42 +++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index f3df44fa7b..04d3b324d6 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -744,6 +744,48 @@ project-compile
(default-directory (project-root pr)))
(compile command comint)))
+(defcustom project-spare-buffers-conditions
+ '("\\*Help\\*")
+ "Conditions for buffers `project-kill-buffers' should not kill.
+If a condition is a string, it will be interpreted as a regular
+expression, and matched against the buffer name. If a condition
+is a function, it will be called with the buffer object, and
+returns non-nil if it matches. Buffers that match any condition
+are \"spared\", and will hence not be killed by
+`project-kill-buffers'."
+ :type '(repeat (choice regexp function))
+ :version "28.1")
+
+(defun project--buffer-list (pr)
+ "Return a list of all buffers in project PR."
+ (let ((root (project-root pr)) bufs)
+ (dolist (buf (buffer-list))
+ (let ((filename (or (buffer-file-name buf)
+ (buffer-local-value 'default-directory buf))))
+ (when (and filename (file-in-directory-p filename root))
+ (push buf bufs))))
+ (nreverse bufs)))
+
+;;;###autoload
+(defun project-kill-buffers ()
+ "Kill all live buffers of a project.
+Certain buffers may be ignored, depending on the value of
+`project-spare-buffers-conditions'."
+ (interactive)
+ (let ((pr (project-current t)) bufs)
+ (dolist (buf (project--buffer-list pr))
+ (unless (seq-some
+ (lambda (c)
+ (cond ((stringp c)
+ (string-match-p c (buffer-name buf)))
+ ((functionp c)
+ (funcall c buf))))
+ project-spare-buffers-conditions)
+ (push buf bufs)))
+ (when (yes-or-no-p (format "Kill %d buffers in %s? "
+ (length bufs) (project-root pr)))
+ (mapc #'kill-buffer bufs))))
+
\f
;;; Project list
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-16 0:23 ` Dmitry Gutov
@ 2020-06-16 21:47 ` Juri Linkov
0 siblings, 0 replies; 31+ messages in thread
From: Juri Linkov @ 2020-06-16 21:47 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Philip K., 41868
>> I think the suffix ‘-regexps’ is fine. The problem is that
>> the word “spare” has no reference to the related command name
>> ‘project-kill-buffers’. Maybe better would be something like
>> ‘project-kill-buffers-ignore-regexps’ or
>
> "kill or spare", no? But it's not immediately obvious for non-native
> speakers, sure.
>
>> For functions it's easy to add a separate variable like
>> ‘project-kill-buffers-ignore-functions’.
>
> I don't see why we wouldn't want to keep it on the same variable. It's both
> easier to document, and to implement.
Then just ‘project-kill-buffers-ignore’ should be fine: short and clear.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-16 17:12 ` Philip K.
@ 2020-06-18 1:05 ` Dmitry Gutov
2020-06-18 6:46 ` Philip K.
2020-06-18 22:06 ` Juri Linkov
0 siblings, 2 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 1:05 UTC (permalink / raw)
To: Philip K., Eli Zaretskii; +Cc: contovob, 41868
On 16.06.2020 20:12, Philip K. wrote:
> It sounds good, so I used it in the revised patch below, together with a
> few other minor improvments which Basil mentioned.
Thank you, I pushed with some minor changes.
- Docstring further rephrased based on Basil's suggestion.
- The variable renamed to project-kill-buffers-skip-conditions, hope you
don't mind.
Should we add a key binding for it as well?
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 1:05 ` Dmitry Gutov
@ 2020-06-18 6:46 ` Philip K.
2020-06-18 13:04 ` Dmitry Gutov
2020-06-18 22:06 ` Juri Linkov
1 sibling, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-18 6:46 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: contovob, 41868
Dmitry Gutov <dgutov@yandex.ru> writes:
> On 16.06.2020 20:12, Philip K. wrote:
>> It sounds good, so I used it in the revised patch below, together with a
>> few other minor improvments which Basil mentioned.
>
> Thank you, I pushed with some minor changes.
>
> - Docstring further rephrased based on Basil's suggestion.
> - The variable renamed to project-kill-buffers-skip-conditions, hope you
> don't mind.
I don't mind, I just thought that I had sent a patch fixing that
already?
> Should we add a key binding for it as well?
I think 'k' in project-prefix-map would fit well, as soon as that gets
merged.
--
Philip K.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 6:46 ` Philip K.
@ 2020-06-18 13:04 ` Dmitry Gutov
2020-06-18 14:11 ` Philip K.
0 siblings, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 13:04 UTC (permalink / raw)
To: Philip K.; +Cc: contovob, 41868
On 18.06.2020 09:46, Philip K. wrote:
>> Thank you, I pushed with some minor changes.
>>
>> - Docstring further rephrased based on Basil's suggestion.
>> - The variable renamed to project-kill-buffers-skip-conditions, hope you
>> don't mind.
>
> I don't mind, I just thought that I had sent a patch fixing that
> already?
If you did, I couldn't find it. Sorry.
>> Should we add a key binding for it as well?
>
> I think 'k' in project-prefix-map would fit well, as soon as that gets
> merged.
Sounds good.
Unless we also wanted a project-scoped version of kill-buffer?
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 13:04 ` Dmitry Gutov
@ 2020-06-18 14:11 ` Philip K.
2020-06-18 15:36 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-18 14:11 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: contovob, 41868
Dmitry Gutov <dgutov@yandex.ru> writes:
> On 18.06.2020 09:46, Philip K. wrote:
>
>>> Thank you, I pushed with some minor changes.
>>>
>>> - Docstring further rephrased based on Basil's suggestion.
>>> - The variable renamed to project-kill-buffers-skip-conditions, hope you
>>> don't mind.
>>
>> I don't mind, I just thought that I had sent a patch fixing that
>> already?
>
> If you did, I couldn't find it. Sorry.
My mistake, it seems like I never sent the mail :/ But since it was
mostly the same, it's irrelevant.
>>> Should we add a key binding for it as well?
>>
>> I think 'k' in project-prefix-map would fit well, as soon as that gets
>> merged.
>
> Sounds good.
>
> Unless we also wanted a project-scoped version of kill-buffer?
I'm not sure how interesting that would be. Buf in that case, I think
'k' would be better for that command, and 'K' for kill all the buffers.
--
Philip K.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 14:11 ` Philip K.
@ 2020-06-18 15:36 ` Dmitry Gutov
0 siblings, 0 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 15:36 UTC (permalink / raw)
To: Philip K.; +Cc: contovob, 41868
On 18.06.2020 17:11, Philip K. wrote:
>>>> Should we add a key binding for it as well?
>>>
>>> I think 'k' in project-prefix-map would fit well, as soon as that gets
>>> merged.
>>
>> Sounds good.
>>
>> Unless we also wanted a project-scoped version of kill-buffer?
>
> I'm not sure how interesting that would be. Buf in that case, I think
> 'k' would be better for that command, and 'K' for kill all the buffers.
Right.
Ok, let's put it on 'k' for now.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 1:05 ` Dmitry Gutov
2020-06-18 6:46 ` Philip K.
@ 2020-06-18 22:06 ` Juri Linkov
2020-06-18 22:57 ` Dmitry Gutov
2020-06-19 6:20 ` Eli Zaretskii
1 sibling, 2 replies; 31+ messages in thread
From: Juri Linkov @ 2020-06-18 22:06 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: contovob, Philip K., 41868
> On 16.06.2020 20:12, Philip K. wrote:
>> It sounds good, so I used it in the revised patch below, together with a
>> few other minor improvments which Basil mentioned.
>
> Thank you, I pushed with some minor changes.
>
> - Docstring further rephrased based on Basil's suggestion.
Why none of recent changes were mentioned in etc/NEWS?
> - The variable renamed to project-kill-buffers-skip-conditions, hope you
> don't mind.
But we already agreed on a shorter name project-kill-buffers-ignore,
and Philip sent the patch that renames it.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 22:06 ` Juri Linkov
@ 2020-06-18 22:57 ` Dmitry Gutov
2020-06-18 23:02 ` Juri Linkov
2020-06-19 6:20 ` Eli Zaretskii
1 sibling, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 22:57 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, Philip K., 41868
On 19.06.2020 01:06, Juri Linkov wrote:
> Why none of recent changes were mentioned in etc/NEWS?
Would you like to go ahead and do that?
> But we already agreed on a shorter name project-kill-buffers-ignore,
> and Philip sent the patch that renames it.
Could you link to it?
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 22:57 ` Dmitry Gutov
@ 2020-06-18 23:02 ` Juri Linkov
2020-06-18 23:10 ` Dmitry Gutov
2020-06-19 6:28 ` Philip K.
0 siblings, 2 replies; 31+ messages in thread
From: Juri Linkov @ 2020-06-18 23:02 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: contovob, Philip K., 41868
>> But we already agreed on a shorter name project-kill-buffers-ignore,
>> and Philip sent the patch that renames it.
>
> Could you link to it?
I can't find it. Philip, could you please resend your patch
with project-kill-buffers-ignore.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 23:02 ` Juri Linkov
@ 2020-06-18 23:10 ` Dmitry Gutov
2020-06-18 23:18 ` Juri Linkov
2020-06-19 6:28 ` Philip K.
1 sibling, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 23:10 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, Philip K., 41868
On 19.06.2020 02:02, Juri Linkov wrote:
> I can't find it. Philip, could you please resend your patch
> with project-kill-buffers-ignore.
Neither could I. I only saw your suggestion.
If you really don't like the name I used, how about
'project-kill-buffers-ignores'?
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 23:10 ` Dmitry Gutov
@ 2020-06-18 23:18 ` Juri Linkov
2020-06-18 23:29 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Juri Linkov @ 2020-06-18 23:18 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: contovob, Philip K., 41868
>> I can't find it. Philip, could you please resend your patch
>> with project-kill-buffers-ignore.
>
> Neither could I. I only saw your suggestion.
>
> If you really don't like the name I used, how about
> 'project-kill-buffers-ignores'?
I thought "ignore" in project-kill-buffers-ignore
is an imperative verb, but a plural noun.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 23:18 ` Juri Linkov
@ 2020-06-18 23:29 ` Dmitry Gutov
2020-06-26 0:49 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-18 23:29 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, Philip K., 41868
On 19.06.2020 02:18, Juri Linkov wrote:
> I thought "ignore" in project-kill-buffers-ignore
> is an imperative verb, but a plural noun.
I think it's singular (and not a real word anyway, it's our made-up lingo).
And see "project-ignores". We shouldn't be inconsistent.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 22:06 ` Juri Linkov
2020-06-18 22:57 ` Dmitry Gutov
@ 2020-06-19 6:20 ` Eli Zaretskii
1 sibling, 0 replies; 31+ messages in thread
From: Eli Zaretskii @ 2020-06-19 6:20 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, philip, 41868, dgutov
> From: Juri Linkov <juri@linkov.net>
> Cc: "Philip K." <philip@warpmail.net>, Eli Zaretskii <eliz@gnu.org>,
> contovob@tcd.ie, 41868@debbugs.gnu.org
> Date: Fri, 19 Jun 2020 01:06:33 +0300
>
> Why none of recent changes were mentioned in etc/NEWS?
Why only in NEWS? If we aim for making project.el an important
general-purpose package, its features should be in the user manual as
well.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 23:02 ` Juri Linkov
2020-06-18 23:10 ` Dmitry Gutov
@ 2020-06-19 6:28 ` Philip K.
2020-08-14 17:05 ` Lars Ingebrigtsen
1 sibling, 1 reply; 31+ messages in thread
From: Philip K. @ 2020-06-19 6:28 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, 41868, dgutov
[-- Attachment #1: Type: text/plain, Size: 325 bytes --]
Juri Linkov <juri@linkov.net> writes:
>>> But we already agreed on a shorter name project-kill-buffers-ignore,
>>> and Philip sent the patch that renames it.
>>
>> Could you link to it?
>
> I can't find it. Philip, could you please resend your patch
> with project-kill-buffers-ignore.
Sure, added below.
--
Philip K.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-project-kill-buffers-command.patch --]
[-- Type: text/x-diff, Size: 2337 bytes --]
From 0c84b1097941b983738104b0756fd8db4a7eeac4 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 12 Jun 2020 23:37:51 +0200
Subject: [PATCH] Add project-kill-buffers command
---
lisp/progmodes/project.el | 41 +++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index f3df44fa7b..c5301dccd3 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -744,6 +744,47 @@ project-compile
(default-directory (project-root pr)))
(compile command comint)))
+(defcustom project-kill-buffers-ignore
+ '("\\*Help\\*")
+ "Conditions for buffers `project-kill-buffers' should not kill.
+If a condition is a string, it will be interpreted as a regular
+expression, and matched against the buffer name. If a condition
+is a function, it will be called with the buffer object, and
+returns non-nil if it matches. Buffers that match any condition
+are \"spared\", and will hence not be killed by
+`project-kill-buffers'"
+ :type '(repeat (choice regexp function))
+ :version "28.1")
+
+(defun project--buffer-list (pr)
+ "Return a list of all buffers in project PR."
+ (let ((root (project-root pr)) bufs)
+ (dolist (buf (buffer-list))
+ (let ((filename (or (buffer-file-name buf)
+ (buffer-local-value 'default-directory buf))))
+ (when (and filename (file-in-directory-p filename root))
+ (push buf bufs))))
+ (nreverse bufs)))
+
+;;;###autoload
+(defun project-kill-buffers ()
+ "Kill all live buffers of a project.
+Certain buffers may be ignored, depending on the value of
+`project-kill-buffers-ignore'."
+ (interactive)
+ (let ((pr (project-current t)) bufs)
+ (dolist (buf (project--buffer-list pr))
+ (unless (seq-some (lambda (c)
+ (cond ((stringp c)
+ (string-match-p c (buffer-name buf)))
+ ((functionp c)
+ (funcall c buf))))
+ project-kill-buffers-ignore)
+ (push buf bufs)))
+ (when (yes-or-no-p (format "Kill %d buffers in %s? "
+ (length bufs) (project-root pr)))
+ (mapc #'kill-buffer bufs))))
+
\f
;;; Project list
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-18 23:29 ` Dmitry Gutov
@ 2020-06-26 0:49 ` Dmitry Gutov
0 siblings, 0 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-06-26 0:49 UTC (permalink / raw)
To: Juri Linkov; +Cc: contovob, Philip K., 41868
On 19.06.2020 02:29, Dmitry Gutov wrote:
> On 19.06.2020 02:18, Juri Linkov wrote:
>> I thought "ignore" in project-kill-buffers-ignore
>> is an imperative verb, but a plural noun.
>
> I think it's singular (and not a real word anyway, it's our made-up lingo).
>
> And see "project-ignores". We shouldn't be inconsistent.
This has been bugging me, so I did the rename anyway.
You can consider "ignores" to be a verb in indicative mood.
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-06-19 6:28 ` Philip K.
@ 2020-08-14 17:05 ` Lars Ingebrigtsen
2020-08-14 20:36 ` Dmitry Gutov
0 siblings, 1 reply; 31+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-14 17:05 UTC (permalink / raw)
To: Philip K.; +Cc: contovob, Juri Linkov, 41868, dgutov
"Philip K." <philip@warpmail.net> writes:
> +(defcustom project-kill-buffers-ignore
> + '("\\*Help\\*")
(etc)
Looks like this was added some weeks ago, and then renamed? (I fixed up
a missing bit of the rename in maintainer.texi now.) But skimming this
thread, it seems like everything discussed was applied, so I'm closing
this bug report.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 31+ messages in thread
* bug#41868: [PATCH] Add project-clean-up command
2020-08-14 17:05 ` Lars Ingebrigtsen
@ 2020-08-14 20:36 ` Dmitry Gutov
0 siblings, 0 replies; 31+ messages in thread
From: Dmitry Gutov @ 2020-08-14 20:36 UTC (permalink / raw)
To: Lars Ingebrigtsen, Philip K.; +Cc: contovob, 41868, Juri Linkov
On 14.08.2020 20:05, Lars Ingebrigtsen wrote:
> Looks like this was added some weeks ago, and then renamed?
And then renamed again. :-)
> (I fixed up
> a missing bit of the rename in maintainer.texi now.) But skimming this
> thread, it seems like everything discussed was applied, so I'm closing
> this bug report.
Yes, thank you.
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2020-08-14 20:36 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-15 10:00 bug#41868: [PATCH] Add project-clean-up command Philip K.
2020-06-15 11:04 ` Basil L. Contovounesios
2020-06-15 11:32 ` Philip K.
2020-06-15 11:38 ` Basil L. Contovounesios
2020-06-15 12:28 ` Dmitry Gutov
2020-06-15 18:18 ` Philip K.
2020-06-15 20:50 ` Dmitry Gutov
2020-06-15 21:50 ` Philip K.
2020-06-16 10:19 ` Dmitry Gutov
2020-06-16 10:52 ` Basil L. Contovounesios
2020-06-16 14:31 ` Eli Zaretskii
2020-06-16 17:12 ` Philip K.
2020-06-18 1:05 ` Dmitry Gutov
2020-06-18 6:46 ` Philip K.
2020-06-18 13:04 ` Dmitry Gutov
2020-06-18 14:11 ` Philip K.
2020-06-18 15:36 ` Dmitry Gutov
2020-06-18 22:06 ` Juri Linkov
2020-06-18 22:57 ` Dmitry Gutov
2020-06-18 23:02 ` Juri Linkov
2020-06-18 23:10 ` Dmitry Gutov
2020-06-18 23:18 ` Juri Linkov
2020-06-18 23:29 ` Dmitry Gutov
2020-06-26 0:49 ` Dmitry Gutov
2020-06-19 6:28 ` Philip K.
2020-08-14 17:05 ` Lars Ingebrigtsen
2020-08-14 20:36 ` Dmitry Gutov
2020-06-19 6:20 ` Eli Zaretskii
2020-06-15 22:49 ` Juri Linkov
2020-06-16 0:23 ` Dmitry Gutov
2020-06-16 21:47 ` Juri Linkov
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.