From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
To: Rasmus <rasmus@gmx.us>
Cc: eric@ericabrahamsen.net, emacs-orgmode@gnu.org
Subject: Re: [patch] structure snippet completions
Date: Mon, 04 Dec 2017 21:55:39 +0100 [thread overview]
Message-ID: <87d13u6ws3.fsf@nicolasgoaziou.fr> (raw)
In-Reply-To: <87mv2ya2ep.fsf@pank.eu> (rasmus@gmx.us's message of "Mon, 04 Dec 2017 17:22:38 +0100")
Hello,
Rasmus <rasmus@gmx.us> writes:
> The attached patch adds expansions of "<s"-like snippets to Org v9.2. I
> would like to include this in the next version of Org in anticipation of
> the changes to the template system.
Thank you. Some, mostly cosmetics, comments follow.
>
> In at least emacs-git it "just works" after requiring org-tempo.
>
> Since it currently uses with-eval-after-load it would require Emacs 24.4,
> but this could be changed to eval-after-load if necessary.
We officially support Emacs 24.3, even though some tests fail. IOW, you
need to use `eval-after-load'.
> * lisp/org-tempo.el: New file.
> * doc/org.texi (Structure templates):
> * etc/ORG-NEWS: Document new library.
No need to document ORG-NEWS changes.
> +@vindex org-tempo
Is it worth mentioning the _variable_ `org-tempo'?
Also,
@cindex Tempo
@cindex Template expansion
@cindex ... whatever ...
> +@vindex org-tempo-keywords-alist
Is
@vindex org-structure-template-alist
missing?
> +@code{org-tempo} can be used to expand snippets to structures defined
> in
Org Tempo expands snippets...
> +@code{org-structure-template-alist} and @code{org-tempo-keywords-alist}. For
> +example, @code{org-tempo} makes @kbd{<} @kbd{s} @kbd{@key{TAB}}
> expand to a
For example, Org Tempo makes @kbd(< s @key{TAB}) expand to a code block.
> +@samp{src} code block. Enable it by customizing @code{org-modules} or add
> +@code{(require 'org-tempo)} to your Emacs init file@footnote{For more
> +information, please refer to the commentary section in
> @code{org-tempo.el}}.
... @file{org-tempo.el}.}.
> +;;; org-tempo.el --- template expansion for org structures -*- lexical-binding: t; -*-
Template expansion for Org structures
> +;; org-tempo reimplements completions of structure template before
Org Tempo implements...
> +(defvar org-tempo-tags nil
> + "Tempo tags for org-mode")
"Tempo tags for Org mode."
> +(defcustom org-tempo-keywords-alist
> + '((?L . "latex")
> + (?H . "html")
> + (?A . "ascii")
> + (?i . "index"))
> + "Keyword templates like `org-structure-template-alist'."
IMO, the docstring doesn't say much for someone discovering the feature.
> + :group 'org-tempo
You didn't define the `org-tempo' group, did you?
> + :type '(repeat
> + (cons (character :tag "Key")
> + (string :tag "Template")))
> + :package-version '(Org . "9.2"))
> +
> +(defun org-tempo-setup ()
> + (org-tempo-add-templates)
> + (tempo-use-tag-list 'org-tempo-tags)
> + (setq-local tempo-match-finder "^ *\\(<[[:word:]]\\)\\="))
> +
> +(defun org-tempo-add-templates ()
> + "Update all org-tempo templates.
"Update all Org Tempo templates."
> +Goes through `org-structure-template-alist' and
> +`org-tempo-keywords-alist'."
> + (let ((keys (mapcar (apply-partially 'format "<%c")
#'format
> + (mapcar 'car (append org-structure-template-alist
> + org-tempo-keywords-alist)))))
#'car
but I think the following is simpler:
(mapcar (lambda (pair) (format "<%s" (car pair)))
(append org-structure-template-alist
org-tempo-keywords-alist))
> + (if (> (length keys)
> + (length (delete-dups keys)))
`when'
> + (user-error
> + "Duplicated keys in `org-structure-template-alist' and
> `org-tempo-keywords-alist'"))
Is is an issue?
> + (mapcar (lambda (key)
> + (if (assoc-string key org-tempo-tags)
> + (setq org-tempo-tags
> + (delete (assoc-string key org-tempo-tags)
> + org-tempo-tags))))
> + keys)
> + (mapcar 'org-tempo-add-block org-structure-template-alist)
#'org-tempo-add-block
> + (mapcar 'org-tempo-add-keyword org-tempo-keywords-alist)))
#'org-tempo-add-keyword
> +
> +(defun org-tempo-add-block (entry)
> + "Add block entry from `org-structure-template-alist'."
> + (let* ((key (format "<%c" (car entry)))
> + (name (cdr entry)))
> + (tempo-define-template (format "org-%s" (replace-regexp-in-string " " "-" name))
> + `(,(format "#+begin_%s " name) p '> n n
> + ,(format "#+end_%s" (car (org-split-string name " ")))
> + >)
`org-split-string' -> `split-string'
> + key
> + (format "Insert a %s block" name)
> + 'org-tempo-tags)))
> +
> +(defun org-tempo-add-keyword (entry)
> + "Add keyword entry from `org-tempo-keywords-alist'."
> + (let* ((key (format "<%c" (car entry)))
> + (name (cdr entry)))
> + (tempo-define-template (format "org-%s" (replace-regexp-in-string " " "-" name))
> + `(,(format "#+%s: " name) p '>)
> + key
> + (format "Insert a %s keyword" name)
> + 'org-tempo-tags)))
> +
> +;;; Additional keywords
> +
> +(tempo-define-template "org-include"
> + '("#+include: "
> + (ignore-errors
Why `ignore-errors'?
> + ;; Simple test if `org-tempo-setup' has been run.
> + ;; May not be the case if `org-tempo' was loaded
> + ;; after Org.
> + (unless (cl-member "<I" tempo-collection :key 'car :test 'equal)
> + (org-tempo-setup))
(unless (assoc "<I" tempos-collection) (org-tempo-setup))
But wouldn't calling
(org-tempo-setup)
at top level in "org-tempo.el" solve the issue?
Regards,
--
Nicolas Goaziou
next prev parent reply other threads:[~2017-12-04 20:55 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-04 16:22 [patch] structure snippet completions Rasmus
2017-12-04 20:55 ` Nicolas Goaziou [this message]
2017-12-05 10:22 ` Rasmus
2017-12-05 20:29 ` Nicolas Goaziou
2017-12-07 23:37 ` Rasmus
2017-12-07 23:49 ` Rasmus
2017-12-08 2:38 ` Kaushal Modi
2017-12-08 20:16 ` Rasmus
2017-12-08 21:07 ` Berry, Charles
2017-12-08 21:20 ` Rasmus
2017-12-09 13:42 ` numbchild
2017-12-09 16:22 ` Rasmus
2017-12-09 17:23 ` Berry, Charles
2017-12-10 11:09 ` Rasmus
2017-12-04 21:37 ` Eric Abrahamsen
2017-12-05 10:24 ` Rasmus
2017-12-05 19:14 ` Eric Abrahamsen
-- strict thread matches above, loose matches on Subject: below --
2017-12-04 16:20 Rasmus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87d13u6ws3.fsf@nicolasgoaziou.fr \
--to=mail@nicolasgoaziou.fr \
--cc=emacs-orgmode@gnu.org \
--cc=eric@ericabrahamsen.net \
--cc=rasmus@gmx.us \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.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).