diff --git a/doc/contributing.texi b/doc/contributing.texi index 1dd3ea8e1d..01f8aad9fb 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi @@ -193,6 +193,34 @@ facilities to directly operate on the syntax tree, such as raising an s-expression or wrapping it, swallowing or rejecting the following s-expression, etc. +@cindex code snippets +@cindex templates +@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{http://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. + +@lisp +;; @r{Assuming the Guix checkout is in ~/src/guix.} +(with-eval-after-load 'yasnippet + (add-to-list 'yas-snippet-dirs "~/src/guix/etc/snippets")) +@end lisp + +The commit message snippets depend on @url{https://magit.vc/, Magit} to +display staged files. When editing a commit message type @code{add} +followed by @kbd{TAB} to insert a commit message template for adding a +package; type @code{update} followed by @kbd{TAB} to insert a template +for updating a package. + +The main snippet for @code{scheme-mode} is triggered by typing +@code{package...} followed by @kbd{TAB}. This snippet also inserts the +trigger string @code{origin...}, which can be expanded further. The +@code{origin} snippet in turn may insert other trigger strings ending on +@code{...}, which also can be expanded further. + @node Coding Style @section Coding Style diff --git a/etc/snippets/scheme-mode/guix-cvs-reference b/etc/snippets/scheme-mode/guix-cvs-reference new file mode 100644 index 0000000000..fbc5034b66 --- /dev/null +++ b/etc/snippets/scheme-mode/guix-cvs-reference @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# name: guix-cvs-reference +# key: cvs-reference... +# -- +(cvs-reference + (root-directory "${1:root-directory}") + (module "${2:module}") + (revision "${3:revision}")) \ No newline at end of file diff --git a/etc/snippets/scheme-mode/guix-git-reference b/etc/snippets/scheme-mode/guix-git-reference new file mode 100644 index 0000000000..29ca6a9c54 --- /dev/null +++ b/etc/snippets/scheme-mode/guix-git-reference @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: guix-git-reference +# key: git-reference... +# -- +(git-reference + (url "$1") + (commit ${2:commit})) \ No newline at end of file diff --git a/etc/snippets/scheme-mode/guix-hg-reference b/etc/snippets/scheme-mode/guix-hg-reference new file mode 100644 index 0000000000..95de16daae --- /dev/null +++ b/etc/snippets/scheme-mode/guix-hg-reference @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: guix-hg-reference +# key: hg-reference... +# -- +(hg-reference + (url "$1") + (changeset ${2:changeset})) \ No newline at end of file diff --git a/etc/snippets/scheme-mode/guix-origin b/etc/snippets/scheme-mode/guix-origin new file mode 100644 index 0000000000..68d47135db --- /dev/null +++ b/etc/snippets/scheme-mode/guix-origin @@ -0,0 +1,23 @@ +# -*- mode: snippet -*- +# name: guix-origin +# key: origin... +# -- +(origin + (method ${1:$$(yas-choose-value "url-fetch" + "url-fetch/tarbomb" + "url-fetch/zipbomb" + "cvs-fetch" + "git-fetch" + "hg-fetch" + "svn-fetch")}) + (uri ${1:$(cond ((equal yas-text "git-fetch") "git-reference...") + ((equal yas-text "svn-fetch") "svn-reference...") + ((equal yas-text "hg-fetch") "hg-reference...") + ((equal yas-text "cvs-fetch") "cvs-reference...") + (t "(string-append \\"https://\\" version \\".tar.gz\\")"))}$0) + ${1:$(cond ((member yas-text '("git-fetch" "svn-fetch" "hg-fetch" "cvs-fetch")) + "(file-name (string-append name \\"-\\" version \\"-checkout\\"))") + (t ""))} + (sha256 + (base32 + "$2"))) \ No newline at end of file diff --git a/etc/snippets/scheme-mode/guix-package b/etc/snippets/scheme-mode/guix-package new file mode 100644 index 0000000000..d392e82093 --- /dev/null +++ b/etc/snippets/scheme-mode/guix-package @@ -0,0 +1,34 @@ +# -*- mode: snippet -*- +# name: guix-package +# key: package... +# -- +(define-public $1 + (package + (name "$1") + (version "$2") + (source origin...$0) + (build-system ${3:$$(yas-choose-value "ant-build-system" + "asdf-build-system" + "cargo-build-system" + "cmake-build-system" + "dub-build-system" + "emacs-build-system" + "font-build-system" + "glib-or-gtk-build-system" + "gnu-build-system" + "go-build-system" + "haskell-build-system" + "meson-build-system" + "minify-build-system" + "ocaml-build-system" + "perl-build-system" + "python-build-system" + "r-build-system" + "ruby-build-system" + "texlive-build-system" + "trivial-build-system" + "waf-build-system")}) + (home-page "$4") + (synopsis "$5") + (description "$6") + (license $7))) \ No newline at end of file diff --git a/etc/snippets/scheme-mode/guix-svn-reference b/etc/snippets/scheme-mode/guix-svn-reference new file mode 100644 index 0000000000..7d897dc690 --- /dev/null +++ b/etc/snippets/scheme-mode/guix-svn-reference @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: guix-svn-reference +# key: svn-reference... +# -- +(svn-reference + (url "$1") + (revision ${2:svn-revision})) \ No newline at end of file diff --git a/etc/snippets/text-mode/guix-commit-message-add-package b/etc/snippets/text-mode/guix-commit-message-add-package new file mode 100644 index 0000000000..1aebe8a763 --- /dev/null +++ b/etc/snippets/text-mode/guix-commit-message-add-package @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# name: guix-commit-message-add-package +# key: add +# condition: git-commit-mode +# -- +gnu: Add $1. + +* `(car (magit-staged-files))` ($1): New variable. \ No newline at end of file diff --git a/etc/snippets/text-mode/guix-commit-message-update-package b/etc/snippets/text-mode/guix-commit-message-update-package new file mode 100644 index 0000000000..79fcf7c6e3 --- /dev/null +++ b/etc/snippets/text-mode/guix-commit-message-update-package @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: guix-commit-message-update-package +# key: update +# condition: git-commit-mode +# -- +gnu: $1: Update to $2. + +* `(car (magit-staged-files))` ($1): Update to $2.$0 +`(mapconcat (lambda (file) (concat "* " file)) (cdr (magit-staged-files)) "\n")` \ No newline at end of file