unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Changes to make in elpa-packages file for nongnu elpa
@ 2023-08-07  7:57 Thierry Volpiatto
  2023-08-07 13:30 ` Philip Kaludercic
  0 siblings, 1 reply; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-07  7:57 UTC (permalink / raw)
  To: emacs-devel

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


I see that Helm installation from nongnu elpa doesn't include
emacs-helm.sh script, would it be possible to modify this?

        diff --git a/elpa-packages b/elpa-packages
        index 77d7a5409e..0923724b62 100644
        --- a/elpa-packages
        +++ b/elpa-packages
        @@ -312,11 +312,11 @@
           :ignored-files "COPYING")
         
          (helm			:url "https://github.com/emacs-helm/helm"
        -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
        +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
         		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
         
          (helm-core		:url "https://github.com/emacs-helm/helm"
        -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
        +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
         		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
         		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
         		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"

Also I asked here about a new dependency for Helm called wfnames and had
no answer (2 times), so I ask again differently now:
When a package is available in Melpa do we have to add it in nongnu as
well to satisfy dependencies for a package already in nongnu?

Thanks.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07  7:57 Thierry Volpiatto
@ 2023-08-07 13:30 ` Philip Kaludercic
  2023-08-07 18:19   ` Thierry Volpiatto
  2023-08-09  3:47   ` Richard Stallman
  0 siblings, 2 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-07 13:30 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> I see that Helm installation from nongnu elpa doesn't include
> emacs-helm.sh script, would it be possible to modify this?
>
>         diff --git a/elpa-packages b/elpa-packages
>         index 77d7a5409e..0923724b62 100644
>         --- a/elpa-packages
>         +++ b/elpa-packages
>         @@ -312,11 +312,11 @@
>            :ignored-files "COPYING")
>          
>           (helm			:url "https://github.com/emacs-helm/helm"
>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>          
>           (helm-core		:url "https://github.com/emacs-helm/helm"
>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"

There shouldn't be any issue in applying this patch, but could you
explain the propose of this script?  I see something involving
straight.el, which is a package.el-incompatible package manager, at
which point I am confused why this should be distributed along with a
"package.el"-package.

> Also I asked here about a new dependency for Helm called wfnames and had
> no answer (2 times), 

Sorry about that, you can always feel free to CC me if you have specific
questions that might get lost on the mailing list.  I suppose Stefan
Monnier wouldn't object to be mentioned either.

>                      so I ask again differently now:
>
> When a package is available in Melpa do we have to add it in nongnu as
> well to satisfy dependencies for a package already in nongnu?

Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
ELPA wouldn't be able to install the package due to a missing dependency
and that is obviously not intended.

> Thanks.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 13:30 ` Philip Kaludercic
@ 2023-08-07 18:19   ` Thierry Volpiatto
  2023-08-07 20:33     ` Philip Kaludercic
  2023-08-09  3:47   ` Richard Stallman
  1 sibling, 1 reply; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-07 18:19 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel

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


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> I see that Helm installation from nongnu elpa doesn't include
>> emacs-helm.sh script, would it be possible to modify this?
>>
>>         diff --git a/elpa-packages b/elpa-packages
>>         index 77d7a5409e..0923724b62 100644
>>         --- a/elpa-packages
>>         +++ b/elpa-packages
>>         @@ -312,11 +312,11 @@
>>            :ignored-files "COPYING")
>>          
>>           (helm			:url "https://github.com/emacs-helm/helm"
>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>          
>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>
> There shouldn't be any issue in applying this patch, but could you
> explain the propose of this script?

It is used specially for reproducing bugs in a clean environment, see it
as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
with only Helm loaded, this ensure the bug if one comes from Helm and
not another package. This is important especially nowaday people are
using "Emacs distribution" with the world list of packages installed.
Apart that the script is useful to quickly launch Emacs with helm, one
can use it from the Helm directory or symlinked to e.g. ~/bin. 

> I see something involving straight.el, which is a
> package.el-incompatible package manager, at which point I am confused
> why this should be distributed along with a "package.el"-package.

The script doesn't need straight, but it ensures the script is usable for
somebody using straight (to find package directory etc...).

>> Also I asked here about a new dependency for Helm called wfnames and had
>> no answer (2 times), 
>
> Sorry about that, you can always feel free to CC me if you have specific
> questions that might get lost on the mailing list.  I suppose Stefan
> Monnier wouldn't object to be mentioned either.

Ok thanks, I will next time now I know you and Stefan are in charge of
this.

>>                      so I ask again differently now:
>>
>> When a package is available in Melpa do we have to add it in nongnu as
>> well to satisfy dependencies for a package already in nongnu?
>
> Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
> ELPA wouldn't be able to install the package due to a missing dependency
> and that is obviously not intended.

Ok, it's what I thought, so yes it would be nice to install wfnames
package in Nongnu.
Here is the link: https://github.com/thierryvolpiatto/wfnames

Thanks.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 18:19   ` Thierry Volpiatto
@ 2023-08-07 20:33     ` Philip Kaludercic
  2023-08-08  4:33       ` Thierry Volpiatto
                         ` (2 more replies)
  0 siblings, 3 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-07 20:33 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

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

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> I see that Helm installation from nongnu elpa doesn't include
>>> emacs-helm.sh script, would it be possible to modify this?
>>>
>>>         diff --git a/elpa-packages b/elpa-packages
>>>         index 77d7a5409e..0923724b62 100644
>>>         --- a/elpa-packages
>>>         +++ b/elpa-packages
>>>         @@ -312,11 +312,11 @@
>>>            :ignored-files "COPYING")
>>>          
>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>          
>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>
>> There shouldn't be any issue in applying this patch, but could you
>> explain the propose of this script?
>
> It is used specially for reproducing bugs in a clean environment, see it
> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
> with only Helm loaded, this ensure the bug if one comes from Helm and
> not another package. This is important especially nowaday people are
> using "Emacs distribution" with the world list of packages installed.
> Apart that the script is useful to quickly launch Emacs with helm, one
> can use it from the Helm directory or symlinked to e.g. ~/bin. 

I see.  In that case is there any reason you implement this as a shell
script?  (It might be interesting to provide something like this for
package.el, to test packages in a generic way.)

>> I see something involving straight.el, which is a
>> package.el-incompatible package manager, at which point I am confused
>> why this should be distributed along with a "package.el"-package.
>
> The script doesn't need straight, but it ensures the script is usable for
> somebody using straight (to find package directory etc...).

Ah OK my bad.

>>> Also I asked here about a new dependency for Helm called wfnames and had
>>> no answer (2 times), 
>>
>> Sorry about that, you can always feel free to CC me if you have specific
>> questions that might get lost on the mailing list.  I suppose Stefan
>> Monnier wouldn't object to be mentioned either.
>
> Ok thanks, I will next time now I know you and Stefan are in charge of
> this.

I am sort of an unofficial co-maintainer, without access to any
server-side infrastructure, but other than that I'm glad to help within
my possibilities.

>>>                      so I ask again differently now:
>>>
>>> When a package is available in Melpa do we have to add it in nongnu as
>>> well to satisfy dependencies for a package already in nongnu?
>>
>> Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
>> ELPA wouldn't be able to install the package due to a missing dependency
>> and that is obviously not intended.
>
> Ok, it's what I thought, so yes it would be nice to install wfnames
> package in Nongnu.
> Here is the link: https://github.com/thierryvolpiatto/wfnames

Sure, but could you first take a look at these comments, suggestions and
questions I have made while skimming over the source?


[-- Attachment #2: Type: text/plain, Size: 6559 bytes --]

diff --git a/wfnames.el b/wfnames.el
index e5a83b5..a61a18d 100644
--- a/wfnames.el
+++ b/wfnames.el
@@ -34,20 +34,20 @@
 
 ;; Usage:
 ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
-;; save your changes. You have completion on filenames and directories
+;; save your changes.  You have completion on filenames and directories
 ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=.
 
 ;;; Code:
 
-(require 'cl-lib)
+(eval-when-compile (require 'cl-lib))	;you are only using macros, so this should be OK
 
 ;; Internal.
-(defvar wfnames-buffer "*Wfnames*")
-(defvar wfnames--modified nil)
+(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
+(defvar-local wfnames--modified nil)
 \f
 (defgroup wfnames nil
   "A mode to edit filenames."
-  :group 'wfnames)
+  :group 'wfnames)			;watch out, this is a recursive group
 
 (defcustom wfnames-create-parent-directories t
   "Create parent directories when non nil."
@@ -57,16 +57,21 @@
   "Ask confirmation when overwriting."
   :type 'boolean)
 
-(defvar wfnames-after-commit-hook nil)
+(defcustom wfnames-after-commit-hook nil
+  "Hook to run after `wfnames-commit-buffer'." ;rephrase this
+  :type 'hook)
 
 (defcustom wfnames-after-commit-function #'kill-buffer
   "A function to call on `wfnames-buffer' when done."
   :type 'function)
 
 (defcustom wfnames-make-backup nil
-  "Backup files before overwriting when non nil."
+  "Non-nil means files are backed up before overwriting."
   :type 'boolean)
 \f
+;; instead of defining new faces and colours, do you think it would be
+;; possible to inherit from existing faces?
+
 (defface wfnames-modified
     '((t :background "LightBlue" :foreground "black"))
   "Face used when filename is modified.")
@@ -104,27 +109,27 @@
   "Provide filename completion in wfnames buffer."
   (let ((beg (line-beginning-position))
         (end (point)))
+    ;; Does it make sense to extend beyond END to allow completing
+    ;; file names mid-string?
     (list beg end #'completion-file-name-table
           :exit-function (lambda (str _status)
                              (when (and (stringp str)
                                         (eq (char-after) ?/))
                                (delete-char -1))))))
 
-(define-derived-mode wfnames-mode
-    text-mode "wfnames"
+(define-derived-mode wfnames-mode text-mode "wfnames"
     "Major mode to edit filenames.
 
 Special commands:
 \\{wfnames-mode-map}"
   (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
-  (make-local-variable 'wfnames--modified)
-  (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf)
-  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes))
+  (setq-local completion-at-point-functions #'wfnames-capf)
+  (setq-local revert-buffer-function #'wfnames-revert-changes))
 
 (defun wfnames-abort ()
   "Quit and kill wfnames buffer."
   (interactive)
-  (quit-window t))
+  (quit-window t))			;isn't this `kill-buffer-and-window'
 
 (defun wfnames-after-change-hook (beg end _len)
   "Put overlay on current line when modified.
@@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
                (eol (line-end-position))
                (old (get-text-property bol 'old-name))
                (new (buffer-substring-no-properties bol eol))
-               ov face)
-          (setq face (if (file-exists-p new)
-                         'wfnames-modified-exists 'wfnames-modified))
+               (face (if (file-exists-p new)
+                         'wfnames-modified-exists
+		       'wfnames-modified))
+	       ov)
           (setq-local wfnames--modified
                       (cons old (delete old wfnames--modified)))
           (cl-loop for o in (overlays-in bol eol)
@@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
                                          "* "
                                          'face 'wfnames-prefix))
                           "\n"))
-      (when append (delete-duplicate-lines (point-min) (point-max))))
+      (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4
     (unless append
       ;; Go to beginning of basename on first line.
-      (while (re-search-forward "/" (line-end-position) t))
+      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)
       (wfnames-mode)
       (funcall display-fn wfnames-buffer))))
 \f
@@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
   "Backup FILE."
   (when wfnames-make-backup
     (with-current-buffer (find-file-noselect file)
-      (let ((backup-by-copying t))
+      (let ((backup-by-copying t))	;why is this bound?  isn't this a user preference?
         (backup-buffer))
       (kill-buffer))))
 
@@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
                                    (let ((basedir (file-name-directory
                                                    (directory-file-name new))))
                                      (unless (file-directory-p basedir)
-                                       (mkdir basedir 'parents))))
+                                       (make-directory basedir 'parents))))
                                  (if (and ow (wfnames-ask-for-overwrite new))
                                      ;; Direct overwrite i.e. first loop.
                                      (progn
@@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines."
     (wfnames-revert-current-line-1)
     (when (eobp) (forward-line -1))
     (goto-char (line-beginning-position))
-    (while (re-search-forward "/" (line-end-position) t))))
+    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
 
 (defun wfnames-revert-changes (_ignore-auto _no-confirm)
   "Revert wfnames buffer to its initial state.
 
 This is used as `revert-buffer-function' for `wfnames-mode'."
   (with-current-buffer wfnames-buffer
-    (cl-loop for o in (overlays-in (point-min) (point-max))
-             when (overlay-get o 'hff-changed)
-             do (delete-overlay o))
+    (dolist (o (overlays-in (point-min) (point-max)))
+      (when (overlay-get o 'hff-changed)
+	(delete-overlay o)))
     (goto-char (point-min))
     (save-excursion
       (while (not (eobp))
         (wfnames-revert-current-line-1)))
-    (while (re-search-forward "/" (line-end-position) t))))
+    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
+
 
 (provide 'wfnames)
 

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


> Thanks.

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 20:33     ` Philip Kaludercic
@ 2023-08-08  4:33       ` Thierry Volpiatto
  2023-08-08  5:52         ` Philip Kaludercic
  2023-08-08  6:01       ` Thierry Volpiatto
  2023-08-08  6:34       ` Michael Albinus
  2 siblings, 1 reply; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-08  4:33 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel

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


Hello Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> I see that Helm installation from nongnu elpa doesn't include
>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>
>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>         index 77d7a5409e..0923724b62 100644
>>>>         --- a/elpa-packages
>>>>         +++ b/elpa-packages
>>>>         @@ -312,11 +312,11 @@
>>>>            :ignored-files "COPYING")
>>>>          
>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>          
>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>>
>>> There shouldn't be any issue in applying this patch, but could you
>>> explain the propose of this script?
>>
>> It is used specially for reproducing bugs in a clean environment, see it
>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>> with only Helm loaded, this ensure the bug if one comes from Helm and
>> not another package. This is important especially nowaday people are
>> using "Emacs distribution" with the world list of packages installed.
>> Apart that the script is useful to quickly launch Emacs with helm, one
>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>
> I see.  In that case is there any reason you implement this as a shell
> script?

Well when I wrote the script, packages where not existing and from
outside emacs it is actually the only way to run a package isolated.

> (It might be interesting to provide something like this for
> package.el, to test packages in a generic way.)

Yes, this would be interesting, it would be something like this:

Emacs -Q
M-x <A command that run a package alone, isolated from other
packages nuisances>

> I am sort of an unofficial co-maintainer, without access to any
> server-side infrastructure, but other than that I'm glad to help within
> my possibilities.

Ok thanks.

>> Ok, it's what I thought, so yes it would be nice to install wfnames
>> package in Nongnu.
>> Here is the link: https://github.com/thierryvolpiatto/wfnames
>
> Sure, but could you first take a look at these comments, suggestions and
> questions I have made while skimming over the source?
>
> diff --git a/wfnames.el b/wfnames.el
> index e5a83b5..a61a18d 100644
> --- a/wfnames.el
> +++ b/wfnames.el
> @@ -34,20 +34,20 @@
>  
>  ;; Usage:
>  ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
> -;; save your changes. You have completion on filenames and directories
> +;; save your changes.  You have completion on filenames and directories
>  ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=.
>  
>  ;;; Code:
>  
> -(require 'cl-lib)
> +(eval-when-compile (require 'cl-lib))	;you are only using macros, so this should be OK

Ok done.
  
>  ;; Internal.
> -(defvar wfnames-buffer "*Wfnames*")
> -(defvar wfnames--modified nil)
> +(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
> +(defvar-local wfnames--modified nil)

Ok done.

>  \f
>  (defgroup wfnames nil
>    "A mode to edit filenames."
> -  :group 'wfnames)
> +  :group 'wfnames)			;watch out, this is a recursive group

Good catch, done.

>  (defcustom wfnames-create-parent-directories t
>    "Create parent directories when non nil."
> @@ -57,16 +57,21 @@
>    "Ask confirmation when overwriting."
>    :type 'boolean)
>  
> -(defvar wfnames-after-commit-hook nil)
> +(defcustom wfnames-after-commit-hook nil
> +  "Hook to run after `wfnames-commit-buffer'." ;rephrase this

Not sure how to rephrase this:

"Hook that run after `wfnames-commit-buffer'."?

> 
> + :type 'hook)

Othewise defcustom make sense, done.

>  (defcustom wfnames-after-commit-function #'kill-buffer
>    "A function to call on `wfnames-buffer' when done."
>    :type 'function)
>  
>  (defcustom wfnames-make-backup nil
> -  "Backup files before overwriting when non nil."
> +  "Non-nil means files are backed up before overwriting."

Ok done.

> 
>    :type 'boolean)
>  \f
> +;; instead of defining new faces and colours, do you think it would be
> +;; possible to inherit from existing faces?

Apart requiring a package just for the faces no, font-lock family
doesn't provide :background faces.

>  (defface wfnames-modified
>      '((t :background "LightBlue" :foreground "black"))
>    "Face used when filename is modified.")
> @@ -104,27 +109,27 @@
>    "Provide filename completion in wfnames buffer."
>    (let ((beg (line-beginning-position))
>          (end (point)))
> +    ;; Does it make sense to extend beyond END to allow completing
> +    ;; file names mid-string?

This one for now I don't know, I transformed your comment with a FIXME.

> 
>      (list beg end #'completion-file-name-table :exit-function (lambda
> (str _status) (when (and (stringp str) (eq (char-after) ?/))
> (delete-char -1))))))
>  
> -(define-derived-mode wfnames-mode
> -    text-mode "wfnames"
> +(define-derived-mode wfnames-mode text-mode "wfnames"
>      "Major mode to edit filenames.

Ok.

>  Special commands:
>  \\{wfnames-mode-map}"
>    (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
> -  (make-local-variable 'wfnames--modified)
> -  (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf)
> -  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes))
> +  (setq-local completion-at-point-functions #'wfnames-capf)
> +  (setq-local revert-buffer-function #'wfnames-revert-changes))

Yes done.
  
>  (defun wfnames-abort ()
>    "Quit and kill wfnames buffer."
>    (interactive)
> -  (quit-window t))
> +  (quit-window t))			;isn't this `kill-buffer-and-window'

Yes, but quit-window is fine as well (I am used to it).
  
>  (defun wfnames-after-change-hook (beg end _len)
>    "Put overlay on current line when modified.
> @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
>                 (eol (line-end-position))
>                 (old (get-text-property bol 'old-name))
>                 (new (buffer-substring-no-properties bol eol))
> -               ov face)
> -          (setq face (if (file-exists-p new)
> -                         'wfnames-modified-exists 'wfnames-modified))
> +               (face (if (file-exists-p new)
> +                         'wfnames-modified-exists
> +		       'wfnames-modified))
> +	       ov)

Ok.

>            (setq-local wfnames--modified
>                        (cons old (delete old wfnames--modified)))
>            (cl-loop for o in (overlays-in bol eol)
> @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>                                           "* "
>                                           'face 'wfnames-prefix))
>                            "\n"))
> -      (when append (delete-duplicate-lines (point-min) (point-max))))
> +      (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4
>      (unless append
>        ;; Go to beginning of basename on first line.
> -      (while (re-search-forward "/" (line-end-position) t))
> +      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)

Ok.

>        (wfnames-mode)
>        (funcall display-fn wfnames-buffer))))
>  \f
> @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>    "Backup FILE."
>    (when wfnames-make-backup
>      (with-current-buffer (find-file-noselect file)
> -      (let ((backup-by-copying t))
> +      (let ((backup-by-copying t))	;why is this bound?  isn't this
>        a user preference?

Yes removed.

> 
>          (backup-buffer)) (kill-buffer))))
>  
> @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>                                     (let ((basedir (file-name-directory
>                                                     (directory-file-name new))))
>                                       (unless (file-directory-p basedir)
> -                                       (mkdir basedir 'parents))))
> +                                       (make-directory basedir
> 'parents))))

Ok, make sense.

>                                   (if (and ow (wfnames-ask-for-overwrite new))
>                                       ;; Direct overwrite i.e. first loop.
>                                       (progn
> @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines."
>      (wfnames-revert-current-line-1)
>      (when (eobp) (forward-line -1))
>      (goto-char (line-beginning-position))
> -    (while (re-search-forward "/" (line-end-position) t))))
> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))

Ok, same as above.
  
>  (defun wfnames-revert-changes (_ignore-auto _no-confirm)
>    "Revert wfnames buffer to its initial state.
>  
>  This is used as `revert-buffer-function' for `wfnames-mode'."
>    (with-current-buffer wfnames-buffer
> -    (cl-loop for o in (overlays-in (point-min) (point-max))
> -             when (overlay-get o 'hff-changed)
> -             do (delete-overlay o))
> +    (dolist (o (overlays-in (point-min) (point-max)))
> +      (when (overlay-get o 'hff-changed)
> +	(delete-overlay o)))

If you want ;-) done.

>      (goto-char (point-min))
>      (save-excursion
>        (while (not (eobp))
>          (wfnames-revert-current-line-1)))
> -    (while (re-search-forward "/" (line-end-position) t))))
> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
> +

Ok same as above.
  
>  (provide 'wfnames)
>  
>
>
>> Thanks.

Thanks.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08  4:33       ` Thierry Volpiatto
@ 2023-08-08  5:52         ` Philip Kaludercic
  2023-08-08  6:17           ` Thierry Volpiatto
  2023-08-15 16:55           ` Philip Kaludercic
  0 siblings, 2 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-08  5:52 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Hello Philip,
>
> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>>
>>>>> I see that Helm installation from nongnu elpa doesn't include
>>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>>
>>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>>         index 77d7a5409e..0923724b62 100644
>>>>>         --- a/elpa-packages
>>>>>         +++ b/elpa-packages
>>>>>         @@ -312,11 +312,11 @@
>>>>>            :ignored-files "COPYING")
>>>>>          
>>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>>          
>>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>>>
>>>> There shouldn't be any issue in applying this patch, but could you
>>>> explain the propose of this script?
>>>
>>> It is used specially for reproducing bugs in a clean environment, see it
>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>> not another package. This is important especially nowaday people are
>>> using "Emacs distribution" with the world list of packages installed.
>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>
>> I see.  In that case is there any reason you implement this as a shell
>> script?
>
> Well when I wrote the script, packages where not existing and from
> outside emacs it is actually the only way to run a package isolated.
>
>> (It might be interesting to provide something like this for
>> package.el, to test packages in a generic way.)
>
> Yes, this would be interesting, it would be something like this:
>
> Emacs -Q
> M-x <A command that run a package alone, isolated from other
> packages nuisances>

I was actually thinking of a command like

M-x package-isolate RET foo,bar,baz RET

and a new instance of Emacs using -Q is spun up, with all the packages
you have listed loaded, and nothing else... Sounds like a fun little
weekend project ;^)

>> I am sort of an unofficial co-maintainer, without access to any
>> server-side infrastructure, but other than that I'm glad to help within
>> my possibilities.
>
> Ok thanks.
>
>>> Ok, it's what I thought, so yes it would be nice to install wfnames
>>> package in Nongnu.
>>> Here is the link: https://github.com/thierryvolpiatto/wfnames
>>
>> Sure, but could you first take a look at these comments, suggestions and
>> questions I have made while skimming over the source?
>>
>> diff --git a/wfnames.el b/wfnames.el
>> index e5a83b5..a61a18d 100644
>> --- a/wfnames.el
>> +++ b/wfnames.el
>> @@ -34,20 +34,20 @@
>>  
>>  ;; Usage:
>>  ;; Once in the Wfnames buffer, edit your filenames and hit C-c C-c to
>> -;; save your changes. You have completion on filenames and directories
>> +;; save your changes.  You have completion on filenames and directories
>>  ;; with TAB but if you are using Iedit package and it is in action use =M-TAB=.
>>  
>>  ;;; Code:
>>  
>> -(require 'cl-lib)
>> +(eval-when-compile (require 'cl-lib))	;you are only using macros, so this should be OK
>
> Ok done.
>   
>>  ;; Internal.
>> -(defvar wfnames-buffer "*Wfnames*")
>> -(defvar wfnames--modified nil)
>> +(defvar wfnames-buffer "*Wfnames*")	;perhaps `defconst'
>> +(defvar-local wfnames--modified nil)
>
> Ok done.
>
>>  \f
>>  (defgroup wfnames nil
>>    "A mode to edit filenames."
>> -  :group 'wfnames)
>> +  :group 'wfnames)			;watch out, this is a recursive group
>
> Good catch, done.
>
>>  (defcustom wfnames-create-parent-directories t
>>    "Create parent directories when non nil."
>> @@ -57,16 +57,21 @@
>>    "Ask confirmation when overwriting."
>>    :type 'boolean)
>>  
>> -(defvar wfnames-after-commit-hook nil)
>> +(defcustom wfnames-after-commit-hook nil
>> +  "Hook to run after `wfnames-commit-buffer'." ;rephrase this
>
> Not sure how to rephrase this:
>
> "Hook that run after `wfnames-commit-buffer'."?

If it is OK the way it is, then you can keep it, I just wasn't sure if
you would have a more descriptive name for it.

>> + :type 'hook)
>
> Othewise defcustom make sense, done.
>
>>  (defcustom wfnames-after-commit-function #'kill-buffer
>>    "A function to call on `wfnames-buffer' when done."
>>    :type 'function)
>>  
>>  (defcustom wfnames-make-backup nil
>> -  "Backup files before overwriting when non nil."
>> +  "Non-nil means files are backed up before overwriting."
>
> Ok done.
>
>> 
>>    :type 'boolean)
>>  \f
>> +;; instead of defining new faces and colours, do you think it would be
>> +;; possible to inherit from existing faces?
>
> Apart requiring a package just for the faces no, font-lock family
> doesn't provide :background faces.

I wasn't thinking just of font-lock, you could pick any face,
eg. wfnames-modified could inherit from diff-refine-changed.  That way
themes don't have to add extra support, and the package looks more
"native" without any additional effort.

>>  (defface wfnames-modified
>>      '((t :background "LightBlue" :foreground "black"))
>>    "Face used when filename is modified.")
>> @@ -104,27 +109,27 @@
>>    "Provide filename completion in wfnames buffer."
>>    (let ((beg (line-beginning-position))
>>          (end (point)))
>> +    ;; Does it make sense to extend beyond END to allow completing
>> +    ;; file names mid-string?
>
> This one for now I don't know, I transformed your comment with a FIXME.

That is fine, this is just a general thing I wonder about with CAP
functions.

>> 
>>      (list beg end #'completion-file-name-table :exit-function (lambda
>> (str _status) (when (and (stringp str) (eq (char-after) ?/))
>> (delete-char -1))))))
>>  
>> -(define-derived-mode wfnames-mode
>> -    text-mode "wfnames"
>> +(define-derived-mode wfnames-mode text-mode "wfnames"
>>      "Major mode to edit filenames.
>
> Ok.
>
>>  Special commands:
>>  \\{wfnames-mode-map}"
>>    (add-hook 'after-change-functions #'wfnames-after-change-hook nil t)
>> -  (make-local-variable 'wfnames--modified)
>> -  (set (make-local-variable 'completion-at-point-functions) #'wfnames-capf)
>> -  (set (make-local-variable 'revert-buffer-function) #'wfnames-revert-changes))
>> +  (setq-local completion-at-point-functions #'wfnames-capf)
>> +  (setq-local revert-buffer-function #'wfnames-revert-changes))
>
> Yes done.
>   
>>  (defun wfnames-abort ()
>>    "Quit and kill wfnames buffer."
>>    (interactive)
>> -  (quit-window t))
>> +  (quit-window t))			;isn't this `kill-buffer-and-window'
>
> Yes, but quit-window is fine as well (I am used to it).
>   
>>  (defun wfnames-after-change-hook (beg end _len)
>>    "Put overlay on current line when modified.
>> @@ -137,9 +142,10 @@ Args BEG and END delimit changes on line."
>>                 (eol (line-end-position))
>>                 (old (get-text-property bol 'old-name))
>>                 (new (buffer-substring-no-properties bol eol))
>> -               ov face)
>> -          (setq face (if (file-exists-p new)
>> -                         'wfnames-modified-exists 'wfnames-modified))
>> +               (face (if (file-exists-p new)
>> +                         'wfnames-modified-exists
>> +		       'wfnames-modified))
>> +	       ov)
>
> Ok.
>
>>            (setq-local wfnames--modified
>>                        (cons old (delete old wfnames--modified)))
>>            (cl-loop for o in (overlays-in bol eol)
>> @@ -184,10 +190,10 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>                                           "* "
>>                                           'face 'wfnames-prefix))
>>                            "\n"))
>> -      (when append (delete-duplicate-lines (point-min) (point-max))))
>> +      (when append (delete-duplicate-lines (point-min) (point-max)))) ;this requires Emacs 24.4
>>      (unless append
>>        ;; Go to beginning of basename on first line.
>> -      (while (re-search-forward "/" (line-end-position) t))
>> +      (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)
>
> Ok.
>
>>        (wfnames-mode)
>>        (funcall display-fn wfnames-buffer))))
>>  \f
>> @@ -202,7 +208,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>    "Backup FILE."
>>    (when wfnames-make-backup
>>      (with-current-buffer (find-file-noselect file)
>> -      (let ((backup-by-copying t))
>> +      (let ((backup-by-copying t))	;why is this bound?  isn't this
>>        a user preference?
>
> Yes removed.
>
>> 
>>          (backup-buffer)) (kill-buffer))))
>>  
>> @@ -252,7 +258,7 @@ When APPEND is specified, append FILES to existing `wfnames-buffer'."
>>                                     (let ((basedir (file-name-directory
>>                                                     (directory-file-name new))))
>>                                       (unless (file-directory-p basedir)
>> -                                       (mkdir basedir 'parents))))
>> +                                       (make-directory basedir
>> 'parents))))
>
> Ok, make sense.
>
>>                                   (if (and ow (wfnames-ask-for-overwrite new))
>>                                       ;; Direct overwrite i.e. first loop.
>>                                       (progn
>> @@ -300,21 +306,22 @@ With a numeric prefix ARG, revert the ARG next lines."
>>      (wfnames-revert-current-line-1)
>>      (when (eobp) (forward-line -1))
>>      (goto-char (line-beginning-position))
>> -    (while (re-search-forward "/" (line-end-position) t))))
>> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
>
> Ok, same as above.
>   
>>  (defun wfnames-revert-changes (_ignore-auto _no-confirm)
>>    "Revert wfnames buffer to its initial state.
>>  
>>  This is used as `revert-buffer-function' for `wfnames-mode'."
>>    (with-current-buffer wfnames-buffer
>> -    (cl-loop for o in (overlays-in (point-min) (point-max))
>> -             when (overlay-get o 'hff-changed)
>> -             do (delete-overlay o))
>> +    (dolist (o (overlays-in (point-min) (point-max)))
>> +      (when (overlay-get o 'hff-changed)
>> +	(delete-overlay o)))
>
> If you want ;-) done.

I am totally indifferent, they expand to almost the same code anyway:

--8<---------------cut here---------------start------------->8---
(disassemble
 (byte-compile
  '(cl-loop for o in olist
	    when (foo)
	    do (bar))))

byte code:
  args: nil
0	varref	  olist
1	constant  nil
2:1	stack-ref 1
3	consp	  
4	goto-if-nil 3
7	discard	  
8	dup	  
9	car	  
10	constant  foo
11	call	  0
12	goto-if-nil 2
15	constant  bar
16	call	  0
17	discard	  
18:2	stack-ref 1
19	cdr	  
20	stack-set 2
22	goto	  1
25:3	constant  nil
26	return	  


(disassemble
 (byte-compile
  '(dolist (o olist)
     (when (foo)
       (bar)))))

byte code:
  args: nil
0	varref	  olist
1:1	dup	  
2	goto-if-nil-else-pop 3
5	dup	  
6	car	  
7	discard	  
8	constant  nil
9	constant  foo
10	call	  0
11	goto-if-nil 2
14	constant  bar
15	call	  0
16	discard	  
17:2	discard	  
18	cdr	  
19	goto	  1
22:3	return	  
--8<---------------cut here---------------end--------------->8---


>>      (goto-char (point-min))
>>      (save-excursion
>>        (while (not (eobp))
>>          (wfnames-revert-current-line-1)))
>> -    (while (re-search-forward "/" (line-end-position) t))))
>> +    (re-search-forward "\\(?:/[^/]*\\)*/" (line-end-position) t)))
>> +
>
> Ok same as above.
>   
>>  (provide 'wfnames)
>>  
>>
>>
>>> Thanks.
>
> Thanks.

Great, I'll add the package then.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 20:33     ` Philip Kaludercic
  2023-08-08  4:33       ` Thierry Volpiatto
@ 2023-08-08  6:01       ` Thierry Volpiatto
  2023-08-08  6:34       ` Michael Albinus
  2 siblings, 0 replies; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-08  6:01 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel

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


Ok I commited your changes with some corrections from my previous post,
see below.

Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>    (let ((beg (line-beginning-position))
>          (end (point)))
> +    ;; Does it make sense to extend beyond END to allow completing
> +    ;; file names mid-string?
>      (list beg end #'completion-file-name-table
>            :exit-function (lambda (str _status)
>                               (when (and (stringp str)
>                                          (eq (char-after) ?/))
>                                 (delete-char -1))))))

Yes, we want to complete from bol to point:

     START and END delimit the text to complete (which should enclose
     point).  COLLECTION is a completion table for completing that text,

> -      (let ((backup-by-copying t))
> +      (let ((backup-by-copying t))	;why is this bound?

We want to backup by copying, not renaming, so ensure it is done by copying.

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08  5:52         ` Philip Kaludercic
@ 2023-08-08  6:17           ` Thierry Volpiatto
  2023-08-15 16:55           ` Philip Kaludercic
  1 sibling, 0 replies; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-08  6:17 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel

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


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Hello Philip,
>>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>>>
>>>>>> I see that Helm installation from nongnu elpa doesn't include
>>>>>> emacs-helm.sh script, would it be possible to modify this?
>>>>>>
>>>>>>         diff --git a/elpa-packages b/elpa-packages
>>>>>>         index 77d7a5409e..0923724b62 100644
>>>>>>         --- a/elpa-packages
>>>>>>         +++ b/elpa-packages
>>>>>>         @@ -312,11 +312,11 @@
>>>>>>            :ignored-files "COPYING")
>>>>>>          
>>>>>>           (helm			:url "https://github.com/emacs-helm/helm"
>>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-core.el" "helm.el"
>>>>>>         +  :ignored-files ("images" "Makefile" "helm-core.el" "helm.el"
>>>>>>          		  "helm-lib.el" "helm-source.el" "helm-multi-match.el"))
>>>>>>          
>>>>>>           (helm-core		:url "https://github.com/emacs-helm/helm"
>>>>>>         -  :ignored-files ("images" "Cask" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>>         +  :ignored-files ("images" "Makefile" "emacs-helm.sh" "helm-adaptive.el"
>>>>>>          		  "helm-bookmark.el" "helm-buffers.el" "helm-color.el" "helm-comint.el"
>>>>>>          		  "helm-command.el" "helm-config.el" "helm-dabbrev.el" "helm-easymenu.el"
>>>>>>          		  "helm-elisp.el" "helm-elisp-package.el" "helm-epa.el" "helm-eshell.el"
>>>>>
>>>>> There shouldn't be any issue in applying this patch, but could you
>>>>> explain the propose of this script?
>>>>
>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>> not another package. This is important especially nowaday people are
>>>> using "Emacs distribution" with the world list of packages installed.
>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>
>>> I see.  In that case is there any reason you implement this as a shell
>>> script?
>>
>> Well when I wrote the script, packages where not existing and from
>> outside emacs it is actually the only way to run a package isolated.
>>
>>> (It might be interesting to provide something like this for
>>> package.el, to test packages in a generic way.)
>>
>> Yes, this would be interesting, it would be something like this:
>>
>> Emacs -Q
>> M-x <A command that run a package alone, isolated from other
>> packages nuisances>
>
> I was actually thinking of a command like
>
> M-x package-isolate RET foo,bar,baz RET

Then you want completion on packages and return a list of packages, you
can involve helm without requiring it by using completing-read if
helm-mode is enabled otherwise fallback to completing-read-multiple.
You will have to let-bound (and declare it on top of your file)
helm-comp-read-use-marked.

Example from mu4e:

    (cond
       ((bound-and-true-p helm-mode)
        ;; tweaks for "helm"; it's not nice to have to special-case for
        ;; completion frameworks, but this has been supported for while.
        ;; basically, with helm, helm-comp-read-use-marked + completing-read
        ;; is preferred over completing-read-multiple
        (let ((helm-comp-read-use-marked t))
          (completing-read prompt candidates)))
       (multi
        (completing-read-multiple prompt candidates))
       (t
        (completing-read prompt candidates)))


> and a new instance of Emacs using -Q is spun up,

Yes much better.

> with all the packages you have listed loaded, and nothing
> else... Sounds like a fun little weekend project ;^)

Yes, nice.

>> Apart requiring a package just for the faces no, font-lock family
>> doesn't provide :background faces.
>
> I wasn't thinking just of font-lock, you could pick any face,
> eg. wfnames-modified could inherit from diff-refine-changed.

Yes, but I will have to require diff, right?

> That way themes don't have to add extra support, and the package looks
> more "native" without any additional effort.

Of course that would be nice.

>>>    "Provide filename completion in wfnames buffer."
>>>    (let ((beg (line-beginning-position))
>>>          (end (point)))
>>> +    ;; Does it make sense to extend beyond END to allow completing
>>> +    ;; file names mid-string?
>>
>> This one for now I don't know, I transformed your comment with a FIXME.
>
> That is fine, this is just a general thing I wonder about with CAP
> functions.

So yes, as explained in previous post it is what we want, i.e. get the
completion of the part of the line from bol to point.

> I am totally indifferent, they expand to almost the same code anyway:

Yes, I have no problems either to use dolist here.

> Great, I'll add the package then.

Great thanks!

-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 20:33     ` Philip Kaludercic
  2023-08-08  4:33       ` Thierry Volpiatto
  2023-08-08  6:01       ` Thierry Volpiatto
@ 2023-08-08  6:34       ` Michael Albinus
  2023-08-08 16:37         ` Philip Kaludercic
  2 siblings, 1 reply; 29+ messages in thread
From: Michael Albinus @ 2023-08-08  6:34 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: Thierry Volpiatto, emacs-devel

Philip Kaludercic <philipk@posteo.net> writes:

Hi Philip,

>>> Sorry about that, you can always feel free to CC me if you have specific
>>> questions that might get lost on the mailing list.  I suppose Stefan
>>> Monnier wouldn't object to be mentioned either.
>>
>> Ok thanks, I will next time now I know you and Stefan are in charge of
>> this.
>
> I am sort of an unofficial co-maintainer, without access to any
> server-side infrastructure, but other than that I'm glad to help within
> my possibilities.

Perhaps it is worth to mention this in admin/MAINTAINERS?

Best regards, Michael.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08  6:34       ` Michael Albinus
@ 2023-08-08 16:37         ` Philip Kaludercic
  2023-08-08 16:41           ` Michael Albinus
  0 siblings, 1 reply; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-08 16:37 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Thierry Volpiatto, emacs-devel

Michael Albinus <michael.albinus@gmx.de> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
> Hi Philip,
>
>>>> Sorry about that, you can always feel free to CC me if you have specific
>>>> questions that might get lost on the mailing list.  I suppose Stefan
>>>> Monnier wouldn't object to be mentioned either.
>>>
>>> Ok thanks, I will next time now I know you and Stefan are in charge of
>>> this.
>>
>> I am sort of an unofficial co-maintainer, without access to any
>> server-side infrastructure, but other than that I'm glad to help within
>> my possibilities.
>
> Perhaps it is worth to mention this in admin/MAINTAINERS?

There seems to be no information on ELPA in admin/MAINTAINERS.

> Best regards, Michael.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08 16:37         ` Philip Kaludercic
@ 2023-08-08 16:41           ` Michael Albinus
  2023-08-09  7:06             ` Philip Kaludercic
  0 siblings, 1 reply; 29+ messages in thread
From: Michael Albinus @ 2023-08-08 16:41 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: Thierry Volpiatto, emacs-devel

Philip Kaludercic <philipk@posteo.net> writes:

Hi Philip,

>>> I am sort of an unofficial co-maintainer, without access to any
>>> server-side infrastructure, but other than that I'm glad to help within
>>> my possibilities.
>>
>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>
> There seems to be no information on ELPA in admin/MAINTAINERS.

Yes, the file is incomplete. So it is time to say something about GNU
ELPA, IMHO.

Best regards, Michael.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-07 13:30 ` Philip Kaludercic
  2023-08-07 18:19   ` Thierry Volpiatto
@ 2023-08-09  3:47   ` Richard Stallman
  1 sibling, 0 replies; 29+ messages in thread
From: Richard Stallman @ 2023-08-09  3:47 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: thievol, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > When a package is available in Melpa do we have to add it in nongnu as
  > > well to satisfy dependencies for a package already in nongnu?

  > Yes, if the dependency is missing someone only using GNU ELPA and NonGNU
  > ELPA wouldn't be able to install the package due to a missing dependency
  > and that is obviously not intended.

Our policy for Emacs is that we do not refer to MELPA for any reason.
That is because MELPA does not follow our policies about promoting
only free sofware.


-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08 16:41           ` Michael Albinus
@ 2023-08-09  7:06             ` Philip Kaludercic
  2023-08-09 11:53               ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-09  7:06 UTC (permalink / raw)
  To: Michael Albinus; +Cc: emacs-devel, 'Eli Zaretskii', Stefan Monnier

Michael Albinus <michael.albinus@gmx.de> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
> Hi Philip,
>
>>>> I am sort of an unofficial co-maintainer, without access to any
>>>> server-side infrastructure, but other than that I'm glad to help within
>>>> my possibilities.
>>>
>>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>>
>> There seems to be no information on ELPA in admin/MAINTAINERS.
>
> Yes, the file is incomplete. So it is time to say something about GNU
> ELPA, IMHO.

In that case I'd like to request access to elpa.gnu.org, and ideally
also the list of users who have signed the CA.

I've CC'ed Eli and Stefan.

> Best regards, Michael.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-09  7:06             ` Philip Kaludercic
@ 2023-08-09 11:53               ` Eli Zaretskii
  2023-08-09 14:53                 ` Philip Kaludercic
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-08-09 11:53 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: michael.albinus, emacs-devel, monnier

> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier
>  <monnier@iro.umontreal.ca>
> Date: Wed, 09 Aug 2023 07:06:30 +0000
> 
> >>> Perhaps it is worth to mention this in admin/MAINTAINERS?
> >>
> >> There seems to be no information on ELPA in admin/MAINTAINERS.
> >
> > Yes, the file is incomplete. So it is time to say something about GNU
> > ELPA, IMHO.
> 
> In that case I'd like to request access to elpa.gnu.org

You mean you cannot access it now?

> and ideally also the list of users who have signed the CA.

No can do, for privacy reasons.  You can always ask me or Stefan to
check a name for you, though.

Thanks.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-09 11:53               ` Eli Zaretskii
@ 2023-08-09 14:53                 ` Philip Kaludercic
  2023-08-09 14:55                   ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-09 14:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: michael.albinus, emacs-devel, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: emacs-devel@gnu.org, "'Eli Zaretskii'" <eliz@gnu.org>, Stefan Monnier
>>  <monnier@iro.umontreal.ca>
>> Date: Wed, 09 Aug 2023 07:06:30 +0000
>> 
>> >>> Perhaps it is worth to mention this in admin/MAINTAINERS?
>> >>
>> >> There seems to be no information on ELPA in admin/MAINTAINERS.
>> >
>> > Yes, the file is incomplete. So it is time to say something about GNU
>> > ELPA, IMHO.
>> 
>> In that case I'd like to request access to elpa.gnu.org
>
> You mean you cannot access it now?

I can access it as a user, but I cannot access it to fix something.

>> and ideally also the list of users who have signed the CA.
>
> No can do, for privacy reasons.  You can always ask me or Stefan to
> check a name for you, though.

OK, but most of the time I don't have to check a single user but would
like to see check a set of names to see how many have or haven't signed
the CA.  Is that still a manageable effort on your end?

> Thanks.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-09 14:53                 ` Philip Kaludercic
@ 2023-08-09 14:55                   ` Eli Zaretskii
  2023-08-09 15:24                     ` Philip Kaludercic
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-08-09 14:55 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: michael.albinus, emacs-devel, monnier

> From: Philip Kaludercic <philipk@posteo.net>
> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
> Date: Wed, 09 Aug 2023 14:53:12 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> In that case I'd like to request access to elpa.gnu.org
> >
> > You mean you cannot access it now?
> 
> I can access it as a user, but I cannot access it to fix something.

Maybe I'm misremembering, but AFAIR if you have write access to the
Emacs Git repository, you also have write access to the ELPA Git
repository.

> >> and ideally also the list of users who have signed the CA.
> >
> > No can do, for privacy reasons.  You can always ask me or Stefan to
> > check a name for you, though.
> 
> OK, but most of the time I don't have to check a single user but would
> like to see check a set of names to see how many have or haven't signed
> the CA.  Is that still a manageable effort on your end?

Yes, feel free.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-09 14:55                   ` Eli Zaretskii
@ 2023-08-09 15:24                     ` Philip Kaludercic
  2023-08-09 16:23                       ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-09 15:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: michael.albinus, emacs-devel, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
>> Date: Wed, 09 Aug 2023 14:53:12 +0000
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> >> In that case I'd like to request access to elpa.gnu.org
>> >
>> > You mean you cannot access it now?
>> 
>> I can access it as a user, but I cannot access it to fix something.
>
> Maybe I'm misremembering, but AFAIR if you have write access to the
> Emacs Git repository, you also have write access to the ELPA Git
> repository.

No I have access to emacs.git, elpa.git and nongnu.git, what I was
referent to was the server associated with elpa.gnu.org.

>> >> and ideally also the list of users who have signed the CA.
>> >
>> > No can do, for privacy reasons.  You can always ask me or Stefan to
>> > check a name for you, though.
>> 
>> OK, but most of the time I don't have to check a single user but would
>> like to see check a set of names to see how many have or haven't signed
>> the CA.  Is that still a manageable effort on your end?
>
> Yes, feel free.

OK, thank you for the clarification.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-09 15:24                     ` Philip Kaludercic
@ 2023-08-09 16:23                       ` Eli Zaretskii
  0 siblings, 0 replies; 29+ messages in thread
From: Eli Zaretskii @ 2023-08-09 16:23 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: michael.albinus, emacs-devel, monnier

> From: Philip Kaludercic <philipk@posteo.net>
> Cc: michael.albinus@gmx.de,  emacs-devel@gnu.org,  monnier@iro.umontreal.ca
> Date: Wed, 09 Aug 2023 15:24:30 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Maybe I'm misremembering, but AFAIR if you have write access to the
> > Emacs Git repository, you also have write access to the ELPA Git
> > repository.
> 
> No I have access to emacs.git, elpa.git and nongnu.git, what I was
> referent to was the server associated with elpa.gnu.org.

Oh, you mean the server itself?  Then I think only Stefan can help
you.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
@ 2023-08-09 21:55 No Wayman
  0 siblings, 0 replies; 29+ messages in thread
From: No Wayman @ 2023-08-09 21:55 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Philip Kaludercic, emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

>>> It is used specially for reproducing bugs in a clean 
>>> environment, see it
>
>> (It might be interesting to provide something like this for
>> package.el, to test packages in a generic way.)
>
> Yes, this would be interesting, it would be something like this:
>
> Emacs -Q
> M-x <A command that run a package alone, isolated from other
> packages nuisances>

I've written various macros that do as much.
See:

- straight.el's straight-bug-report macro 

https://github.com/radian-software/straight.el/blob/ff63b154bef1ef8d92c141bd189001bff74f6982/straight.el#L7049

- Elpaca's elpaca-test macro

https://github.com/progfolio/elpaca/blob/master/elpaca-test.el

- yodel

https://github.com/progfolio/yodel

All three are variations on the idea that it's useful to have a 
declarative form that can be shared to install packages in a clean 
environment, perform some testing, and report the results. Test 
environments can be run interactively or in batch mode.
e.g.


(elpaca-test
  :init
  (elpaca helm
    (require 'helm)
    (do-something-with-helm))
  (elpaca-wait))

Yodel was my attempt at providing something that could be 
package-manager agnostic and can be made to easily reformat the 
output of the report. Evaluating the following test:

(yodel :packages* helm
       :formatter yodel-format-as-mailing-list-message
       :post*
       (require 'helm)
       (message "good bye"))

Produces the following report:

Yodel[1] Report 2023-08-09 20:25:25
===================================

--8<---------------cut here---------------start------------->8---
(yodel
  :packages*
  helm
  :formatter yodel-format-as-mailing-list-message
  :post*
  (require 'helm) (message "good bye"))
--8<---------------cut here---------------end--------------->8---

STDOUT
======

> INFO     Scraping files for loaddefs... 
>   INFO     Scraping files for loaddefs...done
>   GEN      ../elpaca-autoloads.el
> Cloning into '/tmp/yodel-KSS7te/elpaca/repos/elpaca'...
> Your branch is up to date with 'origin/master'.
> Checking /tmp/yodel-KSS7te/elpaca/repos/elpaca...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-info.el...
> Compiling /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-log.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-manager.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-menu-elpa.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-menu-melpa.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-menu-org.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-process.el...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-test.el...
> Compiling /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca-ui.el...
> Compiling /tmp/yodel-KSS7te/elpaca/repos/elpaca/elpaca.el...
> Checking /tmp/yodel-KSS7te/elpaca/repos/elpaca/doc...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/doc/early-init.el...
> Compiling /tmp/yodel-KSS7te/elpaca/repos/elpaca/doc/init.el...
> Checking /tmp/yodel-KSS7te/elpaca/repos/elpaca/extensions...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/extensions/elpaca-use-package.el...
> Checking /tmp/yodel-KSS7te/elpaca/repos/elpaca/images...
> Checking /tmp/yodel-KSS7te/elpaca/repos/elpaca/test...
> Compiling 
> /tmp/yodel-KSS7te/elpaca/repos/elpaca/test/elpaca-test.el...
> Done (Total of 11 files compiled, 3 skipped in 4 directories)

> Downloading MELPA recipes...
> Downloading MELPA recipes...100%
> Downloading NonGNU-devel ELPA...
> Downloading GNU-devel ELPA...
> Downloading NonGNU ELPA...
> Downloading GNU ELPA...
> good bye

Environment
===========

- emacs version: GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, 
  GTK+ Version 3.24.38, cairo version 1.17.8)
 of 2023-08-09
- system type: gnu/linux

Packages
========

- async 
  https://github.com/jwiegley/emacs-async/commit/bb0509060ddc9c94bc7db7bddb12995acb3b53e4
- elpaca 
  https://github.com/progfolio/elpaca/commit/48da538b084870ef2126ca607af521eeee890fa7
- helm 
  https://github.com/emacs-helm/helm/commit/a968b9bdd243f9d8d9d572656268421cb1ea8b39
- helm-core 
  https://github.com/emacs-helm/helm/commit/a968b9bdd243f9d8d9d572656268421cb1ea8b39
- popup 
  https://github.com/auto-complete/popup-el/commit/707bb336c6eb25743f1516b6a2165b40659a9d02
- wfnames 
  https://github.com/thierryvolpiatto/wfnames/commit/e4d60978921b8a52693aebae988717261c89ed38

[1] https://www.github.com/progfolio/yodel

I pitched the idea a couple years ago on a bug report. The 
following message gives more of the rationale for the package:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50842#35

Eli and Lars didn't seem too impressed at the time, but it clearly 
inspired "erts-mode", which Lars implemented shortly after. That's 
a step in the right direction, but not enough.
Having a declarative testing macro has saved me many hours in 
debugging and confirming elisp bugs across packages I maintain.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-08  5:52         ` Philip Kaludercic
  2023-08-08  6:17           ` Thierry Volpiatto
@ 2023-08-15 16:55           ` Philip Kaludercic
  2023-08-15 17:34             ` Eshel Yaron
                               ` (2 more replies)
  1 sibling, 3 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-15 16:55 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

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

Philip Kaludercic <philipk@posteo.net> writes:

>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>> not another package. This is important especially nowaday people are
>>>> using "Emacs distribution" with the world list of packages installed.
>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>
>>> I see.  In that case is there any reason you implement this as a shell
>>> script?
>>
>> Well when I wrote the script, packages where not existing and from
>> outside emacs it is actually the only way to run a package isolated.
>>
>>> (It might be interesting to provide something like this for
>>> package.el, to test packages in a generic way.)
>>
>> Yes, this would be interesting, it would be something like this:
>>
>> Emacs -Q
>> M-x <A command that run a package alone, isolated from other
>> packages nuisances>
>
> I was actually thinking of a command like
>
> M-x package-isolate RET foo,bar,baz RET
>
> and a new instance of Emacs using -Q is spun up, with all the packages
> you have listed loaded, and nothing else... Sounds like a fun little
> weekend project ;^)

Here is my first attempt at providing this kind of a command.  Any
comments?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-Add-command-to-start-Emacs-with-specific-packages.patch --]
[-- Type: text/x-diff, Size: 4095 bytes --]

From ae254f69f789ab4fa2b83bcf2cdc64291ae8aff6 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH 2/2] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package-isolate): Add command.
* etc/NEWS: Announce it.
---
 etc/NEWS                   |  6 +++++
 lisp/emacs-lisp/package.el | 50 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..c374695a571 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start Emacs only with specific packages
+The command 'package-isolate' is equivalent to starting Emacs with the
+-Q flag and loading specific packages (and their dependencies)
+manually.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..c0bbdacec84 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2625,6 +2625,56 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start a new instance of Emacs and load only PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=))
+                  current-prefix-arg)))
+  (cl-assert (cl-every #'package-desc-p packages))
+  (let* ((name (concat "package-isolate-" (mapconcat #'package-desc-full-name
+                                                     packages ",")))
+         (tmp-init (make-temp-file name t))
+         (elpa (expand-file-name "elpa" tmp-init))
+         args)
+    (make-directory elpa)
+    (dolist (package packages)
+      ;; We need to recursively expand all the dependencies of the
+      ;; requested packages and all of them to `load-path'.
+      (dolist (package (named-let loop ((pkg-desc package))
+                         (let (deps)
+                           (dolist (req (package-desc-reqs pkg-desc))
+                             (setq deps (nconc
+                                         (catch 'found
+                                           (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                             (when (and (string= (car req) (package-desc-name p))
+                                                        (version-list-<= (cadr req) (package-desc-version p)))
+                                               (throw 'found (loop p)))))
+                                         deps)))
+                           (cons pkg-desc deps))))
+        (let* ((real (package-desc-dir package))
+               (link (expand-file-name (file-name-nondirectory real) elpa)))
+          (make-symbolic-link real link t)
+          (push (format "--directory=%s" link) args))
+        (let* ((load-suffixes '(".el" ".elc"))
+               (autoload (locate-library (package--autoloads-file-name package))))
+          (push (format "--load=%s" autoload) args))))
+    (apply #'start-process (concat "*" name "*") nil
+           (append (list (or (emacs-executable) "emacs")
+                         (format "--eval=%S"
+                                 '(progn
+                                    (require 'warnings)
+                                    (add-to-list 'warning-suppress-log-types 'initialization)))
+                         "--quick" "--debug-init"
+                         "--init-directory" tmp-init)
+                   args))))
+
 \f
 ;;;; Package description buffer.
 
-- 
2.39.2


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-Add-a-function-to-query-the-Emacs-executable.patch --]
[-- Type: text/x-diff, Size: 1330 bytes --]

From bc9ee566cb9fee337f94870aa718d9b5e57c007b Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:37:59 +0200
Subject: [PATCH 1/2] Add a function to query the Emacs executable

* src/emacs.c (Femacs_executable): Add new function.
(syms_of_emacs): Announce it.
---
 src/emacs.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/emacs.c b/src/emacs.c
index 687b8c7f81f..4869093ce09 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -3039,6 +3039,18 @@ DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 2, "P",
   exit (exit_code);
 }
 
+DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
+       doc: /* Return a string with the file name of the Emacs executable.
+If this is not known, nil will be returned instead. */)
+  (void)
+{
+  static Lisp_Object *string;
+  if (string)
+    return string;
+  if (initial_emacs_executable)
+    return string = build_string(initial_emacs_executable);
+  return Qnil;
+}
 
 /* Perform an orderly shutdown of Emacs.  Autosave any modified
    buffers, kill any child processes, clean up the terminal modes (if
@@ -3566,6 +3578,7 @@ syms_of_emacs (void)
 #endif
 
   defsubr (&Skill_emacs);
+  defsubr (&Semacs_executable);
 
   defsubr (&Sinvocation_name);
   defsubr (&Sinvocation_directory);
-- 
2.39.2


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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-15 16:55           ` Philip Kaludercic
@ 2023-08-15 17:34             ` Eshel Yaron
  2023-08-15 18:56             ` Eli Zaretskii
  2023-08-16  6:51             ` Thierry Volpiatto
  2 siblings, 0 replies; 29+ messages in thread
From: Eshel Yaron @ 2023-08-15 17:34 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: Thierry Volpiatto, emacs-devel

Hi Philip,

Philip Kaludercic <philipk@posteo.net> writes:

> Here is my first attempt at providing this kind of a command.  Any
> comments?

I haven't followed the thread very closely, but this looks quite useful!
A few minor suggestions:

> diff --git a/etc/NEWS b/etc/NEWS
> index 57f04609679..c374695a571 100644
> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
>  When non-nil, package specifications with side-effects for building
>  software will be used when building a package.
>  
> +---
> +*** New command to start Emacs only with specific packages

This should probably end with a period.

> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

I'd rephrase this as: "The command 'package-isolate' starts a new Emacs
instance with minimum customizations (similar to 'emacs -Q') and a given
set of packages (with their dependencies)."

> +(defun package-isolate (packages)
> +  "Start a new instance of Emacs and load only PACKAGES."

I'd clarify that the new instance disregards the user's
config/customizations, how about "Start a new Emacs instance with
minimum customizations and load PACKAGES."

> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
> +       doc: /* Return a string with the file name of the Emacs executable.
> +If this is not known, nil will be returned instead. */)

Maybe say "Return the file name of the Emacs executable, or nil if
unknown." to steer clear of the passive voice.


Best,

Eshel



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-15 16:55           ` Philip Kaludercic
  2023-08-15 17:34             ` Eshel Yaron
@ 2023-08-15 18:56             ` Eli Zaretskii
  2023-08-16  6:51             ` Thierry Volpiatto
  2 siblings, 0 replies; 29+ messages in thread
From: Eli Zaretskii @ 2023-08-15 18:56 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: thievol, emacs-devel

> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org
> Date: Tue, 15 Aug 2023 16:55:03 +0000
> 
> +*** New command to start Emacs only with specific packages
> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

Seems strange to me to have a command to start another Emacs.  Why not
implement this as a command-line option instead?  That would be
consistent with the several options we already have, like -q, -Q, -D,
which already contrl what happens at startup.

> +        (let* ((real (package-desc-dir package))
> +               (link (expand-file-name (file-name-nondirectory real) elpa)))
> +          (make-symbolic-link real link t)

Using symbolic links makes the program less portable, so it is best to
avoid them.

> +    (apply #'start-process (concat "*" name "*") nil
> +           (append (list (or (emacs-executable) "emacs")

I don't think it's a good idea to invoke just "emacs", it could be a
completely different version of Emacs.

> +DEFUN ("emacs-executable", Femacs_executable, Semacs_executable, 0, 0, "",
> +       doc: /* Return a string with the file name of the Emacs executable.
> +If this is not known, nil will be returned instead. */)
> +  (void)

I don't understand why you need this primitive.  What's wrong with the
usual paradigm we use everywhere else:

  (expand-file-name invocation-name invocation-directory)



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-15 16:55           ` Philip Kaludercic
  2023-08-15 17:34             ` Eshel Yaron
  2023-08-15 18:56             ` Eli Zaretskii
@ 2023-08-16  6:51             ` Thierry Volpiatto
  2023-08-16 10:10               ` Philip Kaludercic
  2 siblings, 1 reply; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-16  6:51 UTC (permalink / raw)
  To: Thierry Volpiatto, Philip Kaludercic; +Cc: emacs-devel

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


Philip Kaludercic <philipk@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>> not another package. This is important especially nowaday people are
>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>
>>>> I see.  In that case is there any reason you implement this as a shell
>>>> script?
>>>
>>> Well when I wrote the script, packages where not existing and from
>>> outside emacs it is actually the only way to run a package isolated.
>>>
>>>> (It might be interesting to provide something like this for
>>>> package.el, to test packages in a generic way.)
>>>
>>> Yes, this would be interesting, it would be something like this:
>>>
>>> Emacs -Q
>>> M-x <A command that run a package alone, isolated from other
>>> packages nuisances>
>>
>> I was actually thinking of a command like
>>
>> M-x package-isolate RET foo,bar,baz RET
>>
>> and a new instance of Emacs using -Q is spun up, with all the packages
>> you have listed loaded, and nothing else... Sounds like a fun little
>> weekend project ;^)
>
> Here is my first attempt at providing this kind of a command.  Any
> comments?

Why not reusing package.el functions?
Why do you want to start in an isolated elpa directory?
Isn't something like this suffice? (just missing to fallback to CRM when
helm is not available)

    (defun package-isolate (packages)
      "Start an uncustomised Emacs and only load a set of PACKAGES."
      (interactive
       (list (let ((helm-comp-read-use-marked t))
               (completing-read "Packages: " (mapcar #'car (package--alist))))))
      (let* ((name (concat "package-isolate-" (mapconcat #'identity
                                                         packages ",")))
             (deps (cl-loop for p in packages
                            for sym = (intern p)
                            append (package--dependencies sym))))
        (apply #'start-process (concat "*" name "*") nil
               (list (file-truename (expand-file-name invocation-name invocation-directory))
                     "--quick" "--debug-init"
                     (format "--eval=%S"
                             `(progn
                               (require 'warnings)
                               (add-to-list 'warning-suppress-log-types 'initialization)
                               (require 'package)
                               (setq package-load-list
                                ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
                                          (mapcar (lambda (p) (list p t)) deps)))
                               (package-initialize)))))))

> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>
> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16  6:51             ` Thierry Volpiatto
@ 2023-08-16 10:10               ` Philip Kaludercic
  2023-08-16 10:14                 ` Thierry Volpiatto
  2023-08-16 14:10                 ` Eli Zaretskii
  0 siblings, 2 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-16 10:10 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

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

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>> not another package. This is important especially nowaday people are
>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>
>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>> script?
>>>>
>>>> Well when I wrote the script, packages where not existing and from
>>>> outside emacs it is actually the only way to run a package isolated.
>>>>
>>>>> (It might be interesting to provide something like this for
>>>>> package.el, to test packages in a generic way.)
>>>>
>>>> Yes, this would be interesting, it would be something like this:
>>>>
>>>> Emacs -Q
>>>> M-x <A command that run a package alone, isolated from other
>>>> packages nuisances>
>>>
>>> I was actually thinking of a command like
>>>
>>> M-x package-isolate RET foo,bar,baz RET
>>>
>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>> you have listed loaded, and nothing else... Sounds like a fun little
>>> weekend project ;^)
>>
>> Here is my first attempt at providing this kind of a command.  Any
>> comments?
>
> Why not reusing package.el functions?
> Why do you want to start in an isolated elpa directory?
> Isn't something like this suffice? (just missing to fallback to CRM when
> helm is not available)

I don't know much about Helm, but does it not support CRM?

>     (defun package-isolate (packages)
>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>       (interactive
>        (list (let ((helm-comp-read-use-marked t))
>                (completing-read "Packages: " (mapcar #'car (package--alist))))))

This doesn't allow selecting specific package versions, in case multiple
are installed (which might easily happen if you use package-vc).  I
stole the code in my patch from package-delete, and I guess it would be
possible to generalise it into a utility function.

>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>                                                          packages ",")))

This doesn't work, because the above returns a string, not a list of strings.

>              (deps (cl-loop for p in packages
>                             for sym = (intern p)
>                             append (package--dependencies sym))))
>         (apply #'start-process (concat "*" name "*") nil
>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>                      "--quick" "--debug-init"
>                      (format "--eval=%S"
>                              `(progn
>                                (require 'warnings)
>                                (add-to-list 'warning-suppress-log-types 'initialization)
>                                (require 'package)
>                                (setq package-load-list
>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>                                           (mapcar (lambda (p) (list p t)) deps)))
>                                (package-initialize)))))))

This is actually a good idea, assuming there are no issues with lexical
scoping that might arise from --eval.  I didn't think of using
package-load-list here, but it seems that this only works if we don't
add --init-directory, because otherwise the elpa/ directory is not
populated.  It seems to me, that for a proper isolated environment, we
should add a --init-directory option.  This is easy to fix though, we
just need to specify `package-user-dir' at startup.  Here is my updated
patch, merging our approaches:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-command-to-start-Emacs-with-specific-packages.patch --]
[-- Type: text/x-diff, Size: 4878 bytes --]

From 6ae48d6d28112d487ea09ca905814da47c2a26cf Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 15 Aug 2023 18:39:14 +0200
Subject: [PATCH] Add command to start Emacs with specific packages

* lisp/emacs-lisp/package.el (package--dependencies): Extend function
to handle and return package descriptors.
(package-isolate): Add new command.
* etc/NEWS: Announce new command.
---
 etc/NEWS                   |  6 ++++
 lisp/emacs-lisp/package.el | 57 ++++++++++++++++++++++++++++++++++----
 2 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 57f04609679..c374695a571 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -505,6 +505,12 @@ project, that you can quickly select using 'project-switch-project'
 When non-nil, package specifications with side-effects for building
 software will be used when building a package.
 
+---
+*** New command to start Emacs only with specific packages
+The command 'package-isolate' is equivalent to starting Emacs with the
+-Q flag and loading specific packages (and their dependencies)
+manually.
+
 ** Flymake
 
 +++
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index b3062d2608b..9e969ce1024 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -2330,12 +2330,26 @@ package-upgrade-all
       (mapc #'package-upgrade upgradeable))))
 
 (defun package--dependencies (pkg)
-  "Return a list of all dependencies PKG has.
-This is done recursively."
-  ;; Can we have circular dependencies?  Assume "nope".
-  (when-let* ((desc (cadr (assq pkg package-archive-contents)))
-              (deps (mapcar #'car (package-desc-reqs desc))))
-    (delete-dups (apply #'nconc deps (mapcar #'package--dependencies deps)))))
+  "Return a list of all recursive dependencies of PKG.
+If PKG is a package descriptor, the return value will consist of
+a list of package descriptors.  If PKG is a symbol, designating a
+package, the return value will be a list of symbols designating
+packages."
+  (when-let* ((desc (if (package-desc-p pkg) pkg
+                      (cadr (assq pkg package-archive-contents)))))
+    ;; Can we have circular dependencies?  Assume "nope".
+    (let ((all (named-let more ((pkg-desc desc))
+                 (let (deps)
+                   (dolist (req (package-desc-reqs pkg-desc))
+                     (setq deps (nconc
+                                 (catch 'found
+                                   (dolist (p (apply #'append (mapcar #'cdr (package--alist))))
+                                     (when (and (string= (car req) (package-desc-name p))
+                                                (version-list-<= (cadr req) (package-desc-version p)))
+                                       (throw 'found (more p)))))
+                                 deps)))
+                   (delete-dups (cons pkg-desc deps))))))
+      (remq pkg (mapcar (if (package-desc-p pkg) #'identity #'package-desc-name) all)))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.
@@ -2625,6 +2639,37 @@ package-autoremove
                   removable))
         (message "Nothing to autoremove")))))
 
+(defun package-isolate (packages)
+  "Start an uncustomised Emacs and only load a set of PACKAGES."
+  (interactive
+   (cl-loop for p in (cl-loop for p in (package--alist) append (cdr p))
+	    unless (package-built-in-p p)
+	    collect (cons (package-desc-full-name p) p) into table
+	    finally return
+	    (list (cl-loop for c in (completing-read-multiple
+                                     "Isolate packages: " table
+                                     nil t)
+		           collect (alist-get c table nil nil #'string=)))))
+  (let* ((name (concat "package-isolate-"
+                       (mapconcat #'package-desc-full-name packages ",")))
+         package-load-list)
+    (dolist (package (append packages (mapcan #'package--dependencies packages)))
+      (push (list (package-desc-name package)
+                  (package-version-join (package-desc-version package)))
+              package-load-list))
+    (apply #'start-process (concat "*" name "*") nil
+           (list (expand-file-name invocation-name invocation-directory)
+                 "--quick" "--debug-init"
+                 "--init-directory" (make-temp-file name t)
+                 (format "--eval=%S"
+                         `(progn
+                            (require 'warnings)
+                            (add-to-list 'warning-suppress-log-types 'initialization)
+                            (require 'package)
+                            (setq package-user-dir ,(expand-file-name package-user-dir)
+                                  package-load-list ',package-load-list)
+                            (package-initialize)))))))
+
 \f
 ;;;; Package description buffer.
 
-- 
2.39.2


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


>> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>
>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...

I have slightly modified your version, fixing issues I had, in case
anyone else wants to try it out:

        (defun package-isolate (packages)
          "Start an uncustomised Emacs and only load a set of PACKAGES."
          (interactive
           (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
          (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
                 (deps (mapcan #'package--dependencies packages)))
            (apply #'start-process (concat "*" name "*") nil
                   (list (file-truename (expand-file-name invocation-name invocation-directory))
                         "--quick" "--debug-init"
                         (format "--eval=%S"
                                 `(progn
                                    (require 'warnings)
                                    (add-to-list 'warning-suppress-log-types 'initialization)
                                    (require 'package)
                                    (setq package-load-list
                                          ',(mapcar (lambda (p) (list p t)) (append packages deps)))
                                    (package-initialize)))))))

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16 10:10               ` Philip Kaludercic
@ 2023-08-16 10:14                 ` Thierry Volpiatto
  2023-08-16 11:03                   ` Philip Kaludercic
  2023-08-16 14:10                 ` Eli Zaretskii
  1 sibling, 1 reply; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-16 10:14 UTC (permalink / raw)
  To: Thierry Volpiatto, Philip Kaludercic; +Cc: emacs-devel

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


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>> not another package. This is important especially nowaday people are
>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>>
>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>> script?
>>>>>
>>>>> Well when I wrote the script, packages where not existing and from
>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>
>>>>>> (It might be interesting to provide something like this for
>>>>>> package.el, to test packages in a generic way.)
>>>>>
>>>>> Yes, this would be interesting, it would be something like this:
>>>>>
>>>>> Emacs -Q
>>>>> M-x <A command that run a package alone, isolated from other
>>>>> packages nuisances>
>>>>
>>>> I was actually thinking of a command like
>>>>
>>>> M-x package-isolate RET foo,bar,baz RET
>>>>
>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>> weekend project ;^)
>>>
>>> Here is my first attempt at providing this kind of a command.  Any
>>> comments?
>>
>> Why not reusing package.el functions?
>> Why do you want to start in an isolated elpa directory?
>> Isn't something like this suffice? (just missing to fallback to CRM when
>> helm is not available)
>
> I don't know much about Helm, but does it not support CRM?

It does, but this is a much better interface than CRM.

>>     (defun package-isolate (packages)
>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>       (interactive
>>        (list (let ((helm-comp-read-use-marked t))
>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>
> This doesn't allow selecting specific package versions, in case multiple
> are installed (which might easily happen if you use package-vc).  I
> stole the code in my patch from package-delete, and I guess it would be
> possible to generalise it into a utility function.

Ok, I don't know much how package-vc works.

>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>                                                          packages ",")))
>
> This doesn't work, because the above returns a string, not a list of strings.

No, it works, the above returns a list of strings (the completing-read
allows marking and returns always a list).

>>              (deps (cl-loop for p in packages
>>                             for sym = (intern p)
>>                             append (package--dependencies sym))))
>>         (apply #'start-process (concat "*" name "*") nil
>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>                      "--quick" "--debug-init"
>>                      (format "--eval=%S"
>>                              `(progn
>>                                (require 'warnings)
>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>                                (require 'package)
>>                                (setq package-load-list
>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>                                (package-initialize)))))))
>
> This is actually a good idea, assuming there are no issues with lexical
> scoping that might arise from --eval.  I didn't think of using
> package-load-list here, but it seems that this only works if we don't
> add --init-directory, because otherwise the elpa/ directory is not
> populated.

Yes of course.

> It seems to me, that for a proper isolated environment, we should add
> a --init-directory option.

Why as long as other directories in elpa are not in load-path?

> This is easy to fix though, we just need to specify `package-user-dir'
> at startup.  Here is my updated patch, merging our approaches:
>
> [2. text/x-diff; 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>
>
>>> [2. text/x-diff; 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>
>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>
> I have slightly modified your version, fixing issues I had, in case
> anyone else wants to try it out:

Thanks, sorry to not provide the CRM, I quickly wrote this.

>         (defun package-isolate (packages)
>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>           (interactive
>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>                  (deps (mapcan #'package--dependencies packages)))
>             (apply #'start-process (concat "*" name "*") nil
>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>                          "--quick" "--debug-init"
>                          (format "--eval=%S"
>                                  `(progn
>                                     (require 'warnings)
>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>                                     (require 'package)
>                                     (setq package-load-list
>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>                                     (package-initialize)))))))


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16 10:14                 ` Thierry Volpiatto
@ 2023-08-16 11:03                   ` Philip Kaludercic
  2023-08-16 11:55                     ` Thierry Volpiatto
  0 siblings, 1 reply; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-16 11:03 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: emacs-devel

Thierry Volpiatto <thievol@posteo.net> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Thierry Volpiatto <thievol@posteo.net> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>>> not another package. This is important especially nowaday people are
>>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>>>
>>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>>> script?
>>>>>>
>>>>>> Well when I wrote the script, packages where not existing and from
>>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>>
>>>>>>> (It might be interesting to provide something like this for
>>>>>>> package.el, to test packages in a generic way.)
>>>>>>
>>>>>> Yes, this would be interesting, it would be something like this:
>>>>>>
>>>>>> Emacs -Q
>>>>>> M-x <A command that run a package alone, isolated from other
>>>>>> packages nuisances>
>>>>>
>>>>> I was actually thinking of a command like
>>>>>
>>>>> M-x package-isolate RET foo,bar,baz RET
>>>>>
>>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>>> weekend project ;^)
>>>>
>>>> Here is my first attempt at providing this kind of a command.  Any
>>>> comments?
>>>
>>> Why not reusing package.el functions?
>>> Why do you want to start in an isolated elpa directory?
>>> Isn't something like this suffice? (just missing to fallback to CRM when
>>> helm is not available)
>>
>> I don't know much about Helm, but does it not support CRM?
>
> It does, but this is a much better interface than CRM.

I don't think it makes sense to add support like this in the core, but
is there something we should keep in mind to not hinder integration with
Helm?

>>>     (defun package-isolate (packages)
>>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>       (interactive
>>>        (list (let ((helm-comp-read-use-marked t))
>>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>>
>> This doesn't allow selecting specific package versions, in case multiple
>> are installed (which might easily happen if you use package-vc).  I
>> stole the code in my patch from package-delete, and I guess it would be
>> possible to generalise it into a utility function.
>
> Ok, I don't know much how package-vc works.

I can have a classical tarball package installed next to a VC package,
just like you can have a built-in package or a system package, and it
makes sense to be able to decide which one to isolate.

>>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>>                                                          packages ",")))
>>
>> This doesn't work, because the above returns a string, not a list of strings.
>
> No, it works, the above returns a list of strings (the completing-read
> allows marking and returns always a list).

Not in my case, I got a type error.

>>>              (deps (cl-loop for p in packages
>>>                             for sym = (intern p)
>>>                             append (package--dependencies sym))))
>>>         (apply #'start-process (concat "*" name "*") nil
>>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>                      "--quick" "--debug-init"
>>>                      (format "--eval=%S"
>>>                              `(progn
>>>                                (require 'warnings)
>>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>>                                (require 'package)
>>>                                (setq package-load-list
>>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>>                                (package-initialize)))))))
>>
>> This is actually a good idea, assuming there are no issues with lexical
>> scoping that might arise from --eval.  I didn't think of using
>> package-load-list here, but it seems that this only works if we don't
>> add --init-directory, because otherwise the elpa/ directory is not
>> populated.
>
> Yes of course.
>
>> It seems to me, that for a proper isolated environment, we should add
>> a --init-directory option.
>
> Why as long as other directories in elpa are not in load-path?

Mainly to avoid issues with packages that might place files in the
configuration directory, which might hinder the reproduction of bugs.

Upon reflection, my approach might have an issue if the user wishes to
install a package, for the sake of testing within the isolated
environment.  Perhaps it would be better to set `package-directory-list'
instead?

Also, would it make sense to have some visual/textual indication that
this is a testing environment?  Perhaps the *scratch* buffer string
could be modified or the default background colour could be set to
something else.

>> This is easy to fix though, we just need to specify `package-user-dir'
>> at startup.  Here is my updated patch, merging our approaches:
>>
>> [2. text/x-diff;
>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>
>>
>>>> [2. text/x-diff;
>>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>>
>>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>>
>> I have slightly modified your version, fixing issues I had, in case
>> anyone else wants to try it out:
>
> Thanks, sorry to not provide the CRM, I quickly wrote this.

np.

>>         (defun package-isolate (packages)
>>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>>           (interactive
>>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>>                  (deps (mapcan #'package--dependencies packages)))
>>             (apply #'start-process (concat "*" name "*") nil
>>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>>                          "--quick" "--debug-init"
>>                          (format "--eval=%S"
>>                                  `(progn
>>                                     (require 'warnings)
>>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>>                                     (require 'package)
>>                                     (setq package-load-list
>>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>>                                     (package-initialize)))))))



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16 11:03                   ` Philip Kaludercic
@ 2023-08-16 11:55                     ` Thierry Volpiatto
  0 siblings, 0 replies; 29+ messages in thread
From: Thierry Volpiatto @ 2023-08-16 11:55 UTC (permalink / raw)
  To: Thierry Volpiatto, Philip Kaludercic; +Cc: emacs-devel

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


Philip Kaludercic <philipk@posteo.net> writes:

> Thierry Volpiatto <thievol@posteo.net> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> Thierry Volpiatto <thievol@posteo.net> writes:
>>>
>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>
>>>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>>>
>>>>>>>>> It is used specially for reproducing bugs in a clean environment, see it
>>>>>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q
>>>>>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and
>>>>>>>>> not another package. This is important especially nowaday people are
>>>>>>>>> using "Emacs distribution" with the world list of packages installed.
>>>>>>>>> Apart that the script is useful to quickly launch Emacs with helm, one
>>>>>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. 
>>>>>>>>
>>>>>>>> I see.  In that case is there any reason you implement this as a shell
>>>>>>>> script?
>>>>>>>
>>>>>>> Well when I wrote the script, packages where not existing and from
>>>>>>> outside emacs it is actually the only way to run a package isolated.
>>>>>>>
>>>>>>>> (It might be interesting to provide something like this for
>>>>>>>> package.el, to test packages in a generic way.)
>>>>>>>
>>>>>>> Yes, this would be interesting, it would be something like this:
>>>>>>>
>>>>>>> Emacs -Q
>>>>>>> M-x <A command that run a package alone, isolated from other
>>>>>>> packages nuisances>
>>>>>>
>>>>>> I was actually thinking of a command like
>>>>>>
>>>>>> M-x package-isolate RET foo,bar,baz RET
>>>>>>
>>>>>> and a new instance of Emacs using -Q is spun up, with all the packages
>>>>>> you have listed loaded, and nothing else... Sounds like a fun little
>>>>>> weekend project ;^)
>>>>>
>>>>> Here is my first attempt at providing this kind of a command.  Any
>>>>> comments?
>>>>
>>>> Why not reusing package.el functions?
>>>> Why do you want to start in an isolated elpa directory?
>>>> Isn't something like this suffice? (just missing to fallback to CRM when
>>>> helm is not available)
>>>
>>> I don't know much about Helm, but does it not support CRM?
>>
>> It does, but this is a much better interface than CRM.
>
> I don't think it makes sense to add support like this in the core,

Perhaps yes. However it doesn't requires helm:

     (let ((helm-comp-read-use-marked t))
        (if (and (boundp 'helm-mode) helm-mode)
            (completing-read ...)
          (completing-read-multiple ...)

> but is there something we should keep in mind to not hinder
> integration with Helm?

No don't worry, helm will work in any cases, thanks.

>>>>     (defun package-isolate (packages)
>>>>       "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>>       (interactive
>>>>        (list (let ((helm-comp-read-use-marked t))
>>>>                (completing-read "Packages: " (mapcar #'car (package--alist))))))
>>>
>>> This doesn't allow selecting specific package versions, in case multiple
>>> are installed (which might easily happen if you use package-vc).  I
>>> stole the code in my patch from package-delete, and I guess it would be
>>> possible to generalise it into a utility function.
>>
>> Ok, I don't know much how package-vc works.
>
> I can have a classical tarball package installed next to a VC package,
> just like you can have a built-in package or a system package, and it
> makes sense to be able to decide which one to isolate.

Ok, I understand.

>>>>       (let* ((name (concat "package-isolate-" (mapconcat #'identity
>>>>                                                          packages ",")))
>>>
>>> This doesn't work, because the above returns a string, not a list of strings.
>>
>> No, it works, the above returns a list of strings (the completing-read
>> allows marking and returns always a list).
>
> Not in my case, I got a type error.

Yes, because the let-bounded var had no effect in your case, otherwise
when helm is installed and helm-mode enabled the completing-read will
always return a list.

>>>>              (deps (cl-loop for p in packages
>>>>                             for sym = (intern p)
>>>>                             append (package--dependencies sym))))
>>>>         (apply #'start-process (concat "*" name "*") nil
>>>>                (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>>                      "--quick" "--debug-init"
>>>>                      (format "--eval=%S"
>>>>                              `(progn
>>>>                                (require 'warnings)
>>>>                                (add-to-list 'warning-suppress-log-types 'initialization)
>>>>                                (require 'package)
>>>>                                (setq package-load-list
>>>>                                 ',(append (mapcar (lambda (p) (list (intern p) t)) packages)
>>>>                                           (mapcar (lambda (p) (list p t)) deps)))
>>>>                                (package-initialize)))))))
>>>
>>> This is actually a good idea, assuming there are no issues with lexical
>>> scoping that might arise from --eval.  I didn't think of using
>>> package-load-list here, but it seems that this only works if we don't
>>> add --init-directory, because otherwise the elpa/ directory is not
>>> populated.
>>
>> Yes of course.
>>
>>> It seems to me, that for a proper isolated environment, we should add
>>> a --init-directory option.
>>
>> Why as long as other directories in elpa are not in load-path?
>
> Mainly to avoid issues with packages that might place files in the
> configuration directory, which might hinder the reproduction of bugs.

Hmm, maybe, I don't have an example in mind though.

> Upon reflection, my approach might have an issue if the user wishes to
> install a package, for the sake of testing within the isolated
> environment.

Yes, one more reason to use the original elpa dir ;-)

> Perhaps it would be better to set `package-directory-list' instead?

Don't know yet.

> Also, would it make sense to have some visual/textual indication that
> this is a testing environment?  Perhaps the *scratch* buffer string
> could be modified or the default background colour could be set to
> something else.

No particular opinions about this.

>>> This is easy to fix though, we just need to specify `package-user-dir'
>>> at startup.  Here is my updated patch, merging our approaches:
>>>
>>> [2. text/x-diff;
>>> 0001-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>
>>>
>>>>> [2. text/x-diff;
>>>>> 0002-Add-command-to-start-Emacs-with-specific-packages.patch]...
>>>>>
>>>>> [3. text/x-diff; 0001-Add-a-function-to-query-the-Emacs-executable.patch]...
>>>
>>> I have slightly modified your version, fixing issues I had, in case
>>> anyone else wants to try it out:
>>
>> Thanks, sorry to not provide the CRM, I quickly wrote this.
>
> np.
>
>>>         (defun package-isolate (packages)
>>>           "Start an uncustomised Emacs and only load a set of PACKAGES."
>>>           (interactive
>>>            (list (mapcar #'intern (completing-read-multiple "Packages: " (mapcar #'car (package--alist))))))
>>>           (let* ((name (concat "package-isolate-" (mapconcat #'symbol-name packages ",")))
>>>                  (deps (mapcan #'package--dependencies packages)))
>>>             (apply #'start-process (concat "*" name "*") nil
>>>                    (list (file-truename (expand-file-name invocation-name invocation-directory))
>>>                          "--quick" "--debug-init"
>>>                          (format "--eval=%S"
>>>                                  `(progn
>>>                                     (require 'warnings)
>>>                                     (add-to-list 'warning-suppress-log-types 'initialization)
>>>                                     (require 'package)
>>>                                     (setq package-load-list
>>>                                           ',(mapcar (lambda (p) (list p t)) (append packages deps)))
>>>                                     (package-initialize)))))))


-- 
Thierry

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 686 bytes --]

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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16 10:10               ` Philip Kaludercic
  2023-08-16 10:14                 ` Thierry Volpiatto
@ 2023-08-16 14:10                 ` Eli Zaretskii
  2023-08-16 18:52                   ` Philip Kaludercic
  1 sibling, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-08-16 14:10 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: thievol, emacs-devel

> From: Philip Kaludercic <philipk@posteo.net>
> Cc: emacs-devel@gnu.org
> Date: Wed, 16 Aug 2023 10:10:46 +0000
> 
> +---
> +*** New command to start Emacs only with specific packages
> +The command 'package-isolate' is equivalent to starting Emacs with the
> +-Q flag and loading specific packages (and their dependencies)
> +manually.

If this is how this feature is going to be implemented, I suggest to
reword this NEWS entry to make the intent and the feature easier to
understand:

  *** New command to start an inferior Emacs loading only specific packages.
  The new command 'package-isolate' will start a new Emacs process, as
  a sub-process of Emacs where you invoke the command, in a way that
  causes the new process to load only some of the installed packages.
  The command prompts for the packages to activate in this
  sub-process, and is intended for testing Emacs and/or the packages
  in a clean environment.



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

* Re: Changes to make in elpa-packages file for nongnu elpa
  2023-08-16 14:10                 ` Eli Zaretskii
@ 2023-08-16 18:52                   ` Philip Kaludercic
  0 siblings, 0 replies; 29+ messages in thread
From: Philip Kaludercic @ 2023-08-16 18:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: thievol, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: emacs-devel@gnu.org
>> Date: Wed, 16 Aug 2023 10:10:46 +0000
>> 
>> +---
>> +*** New command to start Emacs only with specific packages
>> +The command 'package-isolate' is equivalent to starting Emacs with the
>> +-Q flag and loading specific packages (and their dependencies)
>> +manually.
>
> If this is how this feature is going to be implemented, I suggest to
> reword this NEWS entry to make the intent and the feature easier to
> understand:
>
>   *** New command to start an inferior Emacs loading only specific packages.
>   The new command 'package-isolate' will start a new Emacs process, as
>   a sub-process of Emacs where you invoke the command, in a way that
>   causes the new process to load only some of the installed packages.
>   The command prompts for the packages to activate in this
>   sub-process, and is intended for testing Emacs and/or the packages
>   in a clean environment.

As usual, I prefer your phrasing.  Will update the patch.



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

end of thread, other threads:[~2023-08-16 18:52 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-09 21:55 Changes to make in elpa-packages file for nongnu elpa No Wayman
  -- strict thread matches above, loose matches on Subject: below --
2023-08-07  7:57 Thierry Volpiatto
2023-08-07 13:30 ` Philip Kaludercic
2023-08-07 18:19   ` Thierry Volpiatto
2023-08-07 20:33     ` Philip Kaludercic
2023-08-08  4:33       ` Thierry Volpiatto
2023-08-08  5:52         ` Philip Kaludercic
2023-08-08  6:17           ` Thierry Volpiatto
2023-08-15 16:55           ` Philip Kaludercic
2023-08-15 17:34             ` Eshel Yaron
2023-08-15 18:56             ` Eli Zaretskii
2023-08-16  6:51             ` Thierry Volpiatto
2023-08-16 10:10               ` Philip Kaludercic
2023-08-16 10:14                 ` Thierry Volpiatto
2023-08-16 11:03                   ` Philip Kaludercic
2023-08-16 11:55                     ` Thierry Volpiatto
2023-08-16 14:10                 ` Eli Zaretskii
2023-08-16 18:52                   ` Philip Kaludercic
2023-08-08  6:01       ` Thierry Volpiatto
2023-08-08  6:34       ` Michael Albinus
2023-08-08 16:37         ` Philip Kaludercic
2023-08-08 16:41           ` Michael Albinus
2023-08-09  7:06             ` Philip Kaludercic
2023-08-09 11:53               ` Eli Zaretskii
2023-08-09 14:53                 ` Philip Kaludercic
2023-08-09 14:55                   ` Eli Zaretskii
2023-08-09 15:24                     ` Philip Kaludercic
2023-08-09 16:23                       ` Eli Zaretskii
2023-08-09  3:47   ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).