Subject: Re: [PATCH v2] etc: Add tempel snippets.

From: Liliana Marie Prikler <[email-masked]>
Date: Thu, 11 Aug 2022 18:21:07 +0200

Am Donnerstag, dem 11.08.2022 um 08:07 +0200 schrieb Nicolas Graves:
> * doc/contributing.texi:
>   - adding configuration description for tempel snippets.
>   - adapting yasnippet configuration to directory move.
Write full sentences, don't use pseudo-lists.
> * etc/snippets/tempel/*.eld: adding alternative to current
> yasnippets.
* etc/snippets/tempel/scheme-mode.eld: New file.
* etc/snippets/tempel/text-mode.eld: New file.

I'm not too sure about the suffix here.  I'd personally prefer a
suffix-less file with a mode-line.
> * etc/snippets*-mode: moved to /etc/snippets/yas/*-mode not to
Again, spell out both directories, as in:
* etc/snippets/scheme-mode: Moved from here...
* etc/snippets/yas/scheme-mode: ... to here.
> conflit with
Should be conflict, but I don't think this needs to be stated when
using the ChangeLog style as above.
> tempel snippets.
> ---
>  doc/contributing.texi                         |  17 ++-
>  etc/snippets/tempel/scheme-mode.eld           | 113
> ++++++++++++++++++
>  etc/snippets/tempel/text-mode.eld             | 101 ++++++++++++++++
>  .../{ => yas}/scheme-mode/guix-bzr-reference  |   0
>  .../{ => yas}/scheme-mode/guix-cvs-reference  |   0
>  .../{ => yas}/scheme-mode/guix-git-reference  |   0
>  .../{ => yas}/scheme-mode/guix-hg-reference   |   0
>  .../{ => yas}/scheme-mode/guix-origin         |   0
>  .../{ => yas}/scheme-mode/guix-package        |   0
>  .../{ => yas}/scheme-mode/guix-svn-reference  |   0
>  .../guix-commit-message-add-cl-package        |   0
>  .../text-mode/guix-commit-message-add-package |   0
>  .../guix-commit-message-remove-package        |   0
>  .../guix-commit-message-rename-package        |   0
>  .../guix-commit-message-update-package        |   0
>  .../guix-commit-message-use-https-home-page   |   0
>  16 files changed, 226 insertions(+), 5 deletions(-)
>  create mode 100644 etc/snippets/tempel/scheme-mode.eld
>  create mode 100644 etc/snippets/tempel/text-mode.eld
>  rename etc/snippets/{ => yas}/scheme-mode/guix-bzr-reference (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-cvs-reference (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-git-reference (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-hg-reference (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-origin (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-package (100%)
>  rename etc/snippets/{ => yas}/scheme-mode/guix-svn-reference (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-add-cl-
> package (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-add-
> package (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-remove-
> package (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-rename-
> package (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-update-
> package (100%)
>  rename etc/snippets/{ => yas}/text-mode/guix-commit-message-use-
> https-home-page (100%)
> 
> diff --git a/doc/contributing.texi b/doc/contributing.texi
> index 02c7c5ae59..808d71e40a 100644
> --- a/doc/contributing.texi
> +++ b/doc/contributing.texi
> @@ -320,15 +320,22 @@ s-expression, etc.
>  @cindex reducing boilerplate
>  We also provide templates for common git commit messages and package
>  definitions in the @file{etc/snippets} directory.  These templates
> can
> -be used with @url{https://joaotavora.github.io/yasnippet/,
> YASnippet} to
> -expand short trigger strings to interactive text snippets.  You may
> want
> -to add the snippets directory to the @var{yas-snippet-dirs} variable
> in
> -Emacs.
> +be used to expand short trigger strings to interactive text
> snippets,
> +with either @url{https://joaotavora.github.io/yasnippet/, YASnippet}
> or
> +@url{https://github.com/minad/tempel/, Tempel}.  You may want to add
> the
> +@file{etc/snippets/yas} (respectively
> @file{etc/snippets/tempel/*.eld}
> +or selected files) snippets directory to the @var{yas-snippet-dirs}
> +(@var{tempel-path} resp.) variable in Emacs.
You probably want to reorganize this a little.

"We also provide templates for common git commit messages and package
definitions in the @file{etc/snippets} directory.  If you use 
YASnippet, you may want to <yasnippet configuration>.  If you use
Tempel, you may want to <tempel configuration>."

>  
>  @lisp
>  ;; @r{Assuming the Guix checkout is in ~/src/guix.}
> +;; @r{Yasnippet}
>  (with-eval-after-load 'yasnippet
> -  (add-to-list 'yas-snippet-dirs "~/src/guix/etc/snippets"))
> +  (add-to-list 'yas-snippet-dirs "~/src/guix/etc/snippets/yas"))
> +;;@r{Tempel}
> +(with-eval-after-load 'tempel
> +         (add-to-list 'tempel-path
> +         "~/src/guix/etc/snippets/tempel/*.eld"))
>  @end lisp
>  
>  The commit message snippets depend on @url{https://magit.vc/, Magit}
> to
> diff --git a/etc/snippets/tempel/scheme-mode.eld
> b/etc/snippets/tempel/scheme-mode.eld
> new file mode 100644
> index 0000000000..5fcd7030b8
> --- /dev/null
> +++ b/etc/snippets/tempel/scheme-mode.eld
> @@ -0,0 +1,113 @@
> +-*- mode: lisp-data -*-
> +
> +scheme-mode
> +
> +(package...
> + "(define-public " (s name) n>
> + "(package" n>
Style-wise, I think n> "(package" is better than the other way round.
You can also n  > and n    > on subsequent lines for clarity.

> + "(name \"" (s name) "\")" n>
> + "(version \"" p "\")" n>
> + "(source origin..." p ")" n>
I don't think you want that p here.
> + "(build-system \""
> + (p (completing-read "build-system:"
> +                     '("android-ndk"
> +                       "ant"
> +                       "asdf"
> +                       "cargo"
> +                       "chicken"
> +                       "clojure"
> +                       "cmake"
> +                       "copy"
> +                       "dub"
> +                       "dune"
> +                       "emacs"
> +                       "font"
> +                       "glib-or-gtk"
> +                       "gnu"
> +                       "go"
> +                       "guile"
> +                       "haskell"
> +                       "julia"
> +                       "linux-module"
> +                       "maven"
> +                       "meson"
> +                       "minetest"
> +                       "minify"
> +                       "node"
> +                       "ocaml"
> +                       "perl"
> +                       "python"
> +                       "qt"
> +                       "r"
> +                       "rakudo"
> +                       "rebar"
> +                       "renpy"
> +                       "ruby"
> +                       "scons"
> +                       "texlive"
> +                       "trivial"
> +                       "waf")
> +                     nil t) "-build-system")
I'd suggest skipping the completing-read and just (p "gnu").  Most
build systems should be easy enough to type without autocompletion.
> + "\")" n>
> + "(home-page \"" p "\")" n>
> + "(synopsis \"" p "\")" n>
> + "(description \"" p "\")" n>
> + "(license " p ")))" n)
> +
> +(origin...
> + "(origin" n>
> + "(method \""
> + (p (completing-read "method:"
> +                     '("url-fetch"
> +                       "url-fetch/tarbomb"
> +                       "url-fetch/zipbomb"
> +                       "cvs-fetch"
> +                       "git-fetch"
> +                       "hg-fetch"
> +                       "svn-fetch"
> +                       "bzr-fetch")
> +                     nil t) method) "\")" n>
Here, I think (p "url-fetch"), but (s "method") might also work.
> + "(uri " (cl-case (intern method)
> +           ('git-fetch "git-reference...")
> +           ('svn-fetch "svn-reference...")
> +           ('hg-fetch  "hg-reference...")
> +           ('cvs-fetch "cvs-reference...")
> +           ('bzr-fetch "bzr-reference...")
> +           (t          "(string-append \"https://"))
Will this cl-case be dynamically recomputed?  I wonder if we can get
the result of the previous p/s here...
> + p
> + (if (equal (substring method 0 9)  "url-fetch") "\")")
> + ")" n>
> + (cl-case (intern method)
> +   ('git-fetch "(file-name (git-file-name name version))\n")
> +   ('hg-fetch "(file-name (hg-file-name name version))\n")
> +   ('svn-fetch "(file-name (string-append name \"-\" version \"-
> checkout\"))\n")
> +   ('cvs-fetch "(file-name (string-append name \"-\" version \"-
> checkout\"))\n")
> +   ('bzr-fetch "(file-name (string-append name \"-\" version \"-
> checkout\"))\n")
> +   (t          "")) >
Rather than that I think adding a template (git-file-name...) which
expands to (file-name (git-file-name (p "name") (p "version")) and
variants for the others is a better idea.
> + "(sha256" n> "(base32 \"" p "\")))")
> +
> +(git-reference...
> + "(git-reference" n>
> + "(url \"" p "\")" n>
> + "(commit \"" p "\"))")
> +
> +(svn-reference...
> + "(svn-reference" n>
> + "(url \"" p "\")" n>
> + "(revision \"" p "\"))")
> +
> +(cvs-reference...
> + "(cvs-reference" n>
> + "(root-directory \"" p "\")" n>
> + "(module \"" p "\")" n>
> + "(revision \"" p "\"))")
> +
> +(hg-reference...
> + "(hg-reference" n>
> + "(url \"" p "\")" n>
> + "(changeset \"" p "\"))")
> +
> +(bzr-reference...
> + "(bzr-reference" n>
> + "(url \"" p "\")" n>
> + "(revision \"" p "\"))")
> diff --git a/etc/snippets/tempel/text-mode.eld
> b/etc/snippets/tempel/text-mode.eld
> new file mode 100644
> index 0000000000..a51a6719d7
> --- /dev/null
> +++ b/etc/snippets/tempel/text-mode.eld
> @@ -0,0 +1,101 @@
> +-*- mode: lisp-data -*-
> +
> +text-mode :when (git-commit-mode)
> +
> +(add
> + "gnu: Add "
> + (p
> +  (with-temp-buffer
> +    (magit-git-wash #'magit-diff-wash-diffs
> +      "diff" "--staged")
> +    (goto-char (point-min))
> +    (when (re-search-forward "\\+(define-public \\(\\S-+\\)" nil
> 'noerror)
> +      (match-string-no-properties 1)))
> +  var ) "." n n
> + "* " (car (magit-staged-files)) " (" (s var ) "): New variable.")
Pro tip: add a space after add (i.e. add\ ) or use add... as the name.
This way, you guard against premature expansion in corfu and other
packages likely to be used in combination with tempel.

> +(remove
> + "gnu: Remove "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (goto-char (point-min))
> +      (when (re-search-forward "\\-(define-public \\(\\S-+\\)" nil
> 'noerror)
> +        (match-string-no-properties 1)))
> +    var) "." n n
> + "* " (car (magit-staged-files)) " (" (s var) "): Delete variable.")
> +
> +(rename
> + "gnu: "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (beginning-of-buffer)
> +      (when (search-forward "-(define-public " nil 'noerror)
> +        (thing-at-point 'sexp 'no-properties)))
> +    prev-var)
> + ": Rename package to "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (beginning-of-buffer)
> +      (when (search-forward "+(define-public " nil 'noerror)
> +        (thing-at-point 'sexp 'no-properties)))
> +    new-var) "." n n
> + "* " (car (magit-staged-files)) " (" (s prev-var) "): Define in
> terms of" n
> + "'deprecated-package'." n
> + "(" (s new-var) "): New variable, formerly known as \"" (s prev-
> var) "\".")
> +
> +(update
> + "gnu: "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (goto-char (point-min))
> +      (when (re-search-forward "^[ ]*(define-public \\(\\S-+\\)" nil
> 'noerror)
> +        (match-string-no-properties 1)))
> +    var)
> + ": Update to "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (goto-char (point-min))
> +      (search-forward "name" nil 'noerror)
> +      (search-forward "+" nil 'noerror)   ; first change
> +      (when (and (search-forward "version " nil 'noerror)
> +                 (looking-at-p "\""))
> +        (let ((end (save-excursion (search-forward "\")" nil
> 'noerror))))
> +          (when end
> +            (forward-char)
> +            (buffer-substring-no-properties (point) (- end 2))))))
> +    version) "." n n
> + "* " (car (magit-staged-files)) " (" (s var) "): Update to " (s
> version) "."
> + (mapconcat (lambda (file) (concat "* " file)) (cdr (magit-staged-
> files))) n)
> +
> +(addcl
> + "gnu: Add cl-"
> + (p (replace-regexp-in-string
> +     "^cl-" "" (with-temp-buffer
> +                 (magit-git-wash #'magit-diff-wash-diffs
> +                   "diff" "--staged")
> +                 (beginning-of-buffer)
> +                 (when (search-forward "+(define-public " nil
> 'noerror)
> +                   (replace-regexp-in-string
> +                    "^sbcl-" ""
> +                    (thing-at-point 'sexp 'no-properties)))))
> +    var) "." n n
> + "* " (car (magit-staged-files))
> + " (cl-" (s var)  ", ecl-" (s var) ", sbcl-" (s var) "): New
> variables.")
> +
> +(https
> + "gnu: "
> + (p (with-temp-buffer
> +      (magit-git-wash #'magit-diff-wash-diffs
> +        "diff" "--staged")
> +      (goto-char (point-min))
> +      (when (re-search-forward "^[ ]*(define-public \\(\\S-+\\)" nil
> 'noerror)
> +        (match-string-no-properties 1)))
> +    var)
> + ": Use HTTPS home page." n n
> + "* " (car (magit-staged-files)) " (" (s var) ")[home-page]: Use
> HTTPS." n
> + (mapconcat (lambda (file) (concat "* " file)) (cdr (magit-staged-
> files))) n)

Cheers