From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: Re: [patch] structure snippet completions Date: Mon, 04 Dec 2017 21:55:39 +0100 Message-ID: <87d13u6ws3.fsf@nicolasgoaziou.fr> References: <87mv2ya2ep.fsf@pank.eu> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:43343) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eLxmB-000654-Ug for emacs-orgmode@gnu.org; Mon, 04 Dec 2017 15:55:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eLxmA-0002eI-S6 for emacs-orgmode@gnu.org; Mon, 04 Dec 2017 15:55:44 -0500 Received: from relay2-d.mail.gandi.net ([2001:4b98:c:538::194]:51485) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eLxmA-0002cU-JF for emacs-orgmode@gnu.org; Mon, 04 Dec 2017 15:55:42 -0500 In-Reply-To: <87mv2ya2ep.fsf@pank.eu> (rasmus@gmx.us's message of "Mon, 04 Dec 2017 17:22:38 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Rasmus Cc: eric@ericabrahamsen.net, emacs-orgmode@gnu.org Hello, Rasmus writes: > The attached patch adds expansions of " 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 " + (org-tempo-setup)) (unless (assoc "