diff mbox series

[bug#61434] gnu: Add emacs-pasp-mode.

Message ID 602f2c0db9881fdd663c9919b5783db950ac900b.camel@gmail.com
State New
Headers show
Series [bug#61434] gnu: Add emacs-pasp-mode. | expand

Commit Message

Liliana Marie Prikler Feb. 11, 2023, 3:15 p.m. UTC
* gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch: New file.
* gnu/local.mk: Register it here.
* gnu/packages/emacs-xyz.scm (emacs-pasp-mode): New variable.
---
 gnu/local.mk                                  |  1 +
 gnu/packages/emacs-xyz.scm                    | 47 +++++++++++++++++++
 .../emacs-pasp-mode-quote-file-names.patch    | 20 ++++++++
 3 files changed, 68 insertions(+)
 create mode 100644 gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch

Comments

Nicolas Goaziou Feb. 11, 2023, 4:59 p.m. UTC | #1
Hello,

Liliana Marie Prikler <liliana.prikler@gmail.com> writes:

> * gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch: New file.
> * gnu/local.mk: Register it here.
> * gnu/packages/emacs-xyz.scm (emacs-pasp-mode): New variable.

Thank you. Some comments follow.

> +     (source (origin
> +              (method git-fetch)
> +              (uri (git-reference
> +                    (url "https://github.com/santifa/pasp-mode.git")

You can remove the ".git" suffix.

> +           (add-after 'unpack 'defconst-version
> +             (lambda _
> +               (emacs-batch-edit-file "pasp-mode.el"
> +                 '(progn
> +                   (search-forward-regexp
> +                           "(defcustom pasp-mode-version \"[^\"]*\"[
> + ]*\\(\"[^\"]*\"\\)[^()]*)")
> +                   (let ((docstring (match-string 1)))
> +                     (backward-sexp)
> +                     (kill-sexp)
> +                     (insert (format "(defconst emacs-pasp-version \"%s\" %s)"
> +                                     #$version docstring))
> +                     (basic-save-buffer))))))

This dance is not necessary. You can simply use
`emacs-substitute-variables', change the value, and keep the defcustom.
A defconst is not a constant in Elisp anyway.

> +     (synopsis "Major mode for editing Answer Set Programs.")

You can remove the final full stop.

It may be clearer to also mention "Potassco" so as to understand better
the PASP acronym.

> +     (description
> +      "This package provides a major mode for editing answer set programs,
> +in particular ones that can be solved by @command{clingo}.")

I suggest "Answer Set Programs", since this seems to be a very specific thing.

I didn't build it, but LGTM.

Regards,
Liliana Marie Prikler Feb. 11, 2023, 5:24 p.m. UTC | #2
Am Samstag, dem 11.02.2023 um 17:59 +0100 schrieb Nicolas Goaziou:
> > +     (source (origin
> > +              (method git-fetch)
> > +              (uri (git-reference
> > +                    (url
> > "https://github.com/santifa/pasp-mode.git")
> 
> You can remove the ".git" suffix.
Will do.

> > +           (add-after 'unpack 'defconst-version
> > +             (lambda _
> > +               (emacs-batch-edit-file "pasp-mode.el"
> > +                 '(progn
> > +                   (search-forward-regexp
> > +                           "(defcustom pasp-mode-version
> > \"[^\"]*\"[
> > + ]*\\(\"[^\"]*\"\\)[^()]*)")
> > +                   (let ((docstring (match-string 1)))
> > +                     (backward-sexp)
> > +                     (kill-sexp)
> > +                     (insert (format "(defconst emacs-pasp-version
> > \"%s\" %s)"
> > +                                     #$version docstring))
> > +                     (basic-save-buffer))))))
> 
> This dance is not necessary. You can simply use
> `emacs-substitute-variables', change the value, and keep the
> defcustom.  A defconst is not a constant in Elisp anyway.
A defconst does raise a warning if it's changed, so I'd rather do that.

> > +     (synopsis "Major mode for editing Answer Set Programs.")
> 
> You can remove the final full stop.
Will do that.

> It may be clearer to also mention "Potassco" so as to understand
> better the PASP acronym.
Somewhat unsure about this.

> > +     (description
> > +      "This package provides a major mode for editing answer set
> > programs,
> > +in particular ones that can be solved by @command{clingo}.")
> 
> I suggest "Answer Set Programs", since this seems to be a very
> specific thing.
Also unsure about this, since there doesn't seem to be a coherent term
shared among the clingo packages and if we do that, I think it should
be applied across the board.

Cheers
Nicolas Goaziou Feb. 11, 2023, 6:55 p.m. UTC | #3
Liliana Marie Prikler <liliana.prikler@gmail.com> writes:

>> This dance is not necessary. You can simply use
>> `emacs-substitute-variables', change the value, and keep the
>> defcustom.  A defconst is not a constant in Elisp anyway.
> A defconst does raise a warning if it's changed, so I'd rather do
> that.

It seems that you are trying to fix a design issue without any serious
usability consequence (who is going to set this variable anyway? Why
would it matter to us?). I believe this kind of fix is out of the scope
of a package definition.

Besides, it makes the definition less readable, to say the least. The
regexp itself is appalling (not that you can do much about it, of
course).

If you really insist of changing this defcustom, maybe 1. search forward
for "defcustom pasp-mode-version" 2. kill next regexp 3. insert
"#$version" 4. search backward for "defcustom", 5. replace match with
"defconst". It would still be awful (no serious regexp), but possibly
slightly less so.
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index bf4b20577d..0548fc4e3d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1070,6 +1070,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/emacs-highlight-stages-add-gexp.patch	\
   %D%/packages/patches/emacs-lispy-fix-thread-last-test.patch   \
   %D%/packages/patches/emacs-native-comp-driver-options.patch   \
+  %D%/packages/patches/emacs-emacs-pasp-mode-quote-file-names.patch  \
   %D%/packages/patches/emacs-polymode-fix-lexical-variable-error.patch  \
   %D%/packages/patches/emacs-source-date-epoch.patch		\
   %D%/packages/patches/emacs-telega-path-placeholder.patch	\
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index bbaafcc730..b6780ace02 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -4387,6 +4387,53 @@  (define-public emacs-pabbrev
 during idle time, while Emacs is doing nothing else.")
     (license license:gpl3+)))
 
+(define-public emacs-pasp-mode
+  (let ((commit "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92")
+        (revision "1"))
+    (package
+     (name "emacs-pasp-mode")
+     (version (git-version "0.1.0" revision commit))
+     (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/santifa/pasp-mode.git")
+                    (commit commit)))
+              (patches
+               (search-patches "emacs-pasp-mode-quote-file-names.patch"))
+              (sha256
+               (base32
+                "1ar4vws3izzmir7m870mccci620ns3c5j26dcmwaxavhgw45wcmf"))))
+     (build-system emacs-build-system)
+     (arguments
+      (list
+       #:phases
+       #~(modify-phases %standard-phases
+           (add-after 'unpack 'defconst-version
+             (lambda _
+               (emacs-batch-edit-file "pasp-mode.el"
+                 '(progn
+                   (search-forward-regexp
+                           "(defcustom pasp-mode-version \"[^\"]*\"[
+ ]*\\(\"[^\"]*\"\\)[^()]*)")
+                   (let ((docstring (match-string 1)))
+                     (backward-sexp)
+                     (kill-sexp)
+                     (insert (format "(defconst emacs-pasp-version \"%s\" %s)"
+                                     #$version docstring))
+                     (basic-save-buffer))))))
+           (add-after 'unpack 'hardcode-clingo
+             (lambda* (#:key inputs #:allow-other-keys)
+               (emacs-substitute-variables "pasp-mode.el"
+                 ("pasp-clingo-path"
+                  (search-input-file inputs "/bin/clingo"))))))))
+     (inputs (list clingo))
+     (home-page "https://github.com/santifa/pasp-mode")
+     (synopsis "Major mode for editing Answer Set Programs.")
+     (description
+      "This package provides a major mode for editing answer set programs,
+in particular ones that can be solved by @command{clingo}.")
+     (license license:gpl3+))))
+
 (define-public emacs-pdf-tools
   (package
     (name "emacs-pdf-tools")
diff --git a/gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch b/gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch
new file mode 100644
index 0000000000..39dc5d0253
--- /dev/null
+++ b/gnu/packages/patches/emacs-pasp-mode-quote-file-names.patch
@@ -0,0 +1,20 @@ 
+diff --git a/pasp-mode.el b/pasp-mode.el
+index 7f83645..5daf08e 100644
+--- a/pasp-mode.el
++++ b/pasp-mode.el
+@@ -199,9 +199,12 @@
+ Argument ENCODING The current buffer which holds the problem encoding.
+ Optional argument INSTANCE The problem instance which is solved by the encoding.
+   If no instance it is assumed to be also in the encoding file."
+-  (if 'instance
+-      (concat pasp-clingo-path " " pasp-clingo-options " " encoding " " instance)
+-    (concat pasp-clingo-path " " pasp-clingo-options " " encoding)))
++  (if instance
++      (concat pasp-clingo-path " " pasp-clingo-options " "
++              (shell-quote-argument encoding) " "
++              (shell-quote-argument instance))
++    (concat pasp-clingo-path " " pasp-clingo-options " "
++            (shell-quote-argument encoding))))
+ 
+ (defun pasp-run-clingo (encoding &optional instance)
+   "Run Clingo with some ASP input files.