emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
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

  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).