all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* 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.