From: Rasmus <rasmus@gmx.us>
To: emacs-orgmode@gnu.org
Cc: eric@ericabrahamsen.net
Subject: [patch] structure snippet completions
Date: Mon, 04 Dec 2017 17:22:38 +0100 [thread overview]
Message-ID: <87mv2ya2ep.fsf@pank.eu> (raw)
[-- Attachment #1: Type: text/plain, Size: 427 bytes --]
Hi,
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.
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.
Thanks,
Rasmus
--
What will be next?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-tempo.el-New-file-for-expansion-of-templates.patch --]
[-- Type: text/x-patch, Size: 7717 bytes --]
From d5e3eacea38d3777f541f5abddebed04171650b6 Mon Sep 17 00:00:00 2001
From: Rasmus <rasmus@gmx.us>
Date: Thu, 9 Nov 2017 16:47:13 +0100
Subject: [PATCH 1/2] org-tempo.el: New file for expansion of templates
* lisp/org-tempo.el: New file.
* doc/org.texi (Structure templates):
* etc/ORG-NEWS: Document new library.
* lisp/org.el (org-modules): Add org-tempo.
---
doc/org.texi | 9 ++++
etc/ORG-NEWS | 4 +-
lisp/org-tempo.el | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
lisp/org.el | 1 +
4 files changed, 146 insertions(+), 1 deletion(-)
create mode 100644 lisp/org-tempo.el
diff --git a/doc/org.texi b/doc/org.texi
index 5becb0175..17092ecbe 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -17396,6 +17396,15 @@ the key is @key{TAB}, the user is prompted to enter a type.
Available structure types are defined in @code{org-structure-template-alist},
see the docstring for adding or changing values.
+@vindex org-tempo
+@vindex org-tempo-keywords-alist
+@code{org-tempo} can be used to expand snippets to structures defined in
+@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
+@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}}.
+
@multitable @columnfractions 0.2 0.8
@item @kbd{c} @tab @samp{#+BEGIN_CENTER}
@item @kbd{C} @tab @samp{#+BEGIN_COMMENT}
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 66865ffe1..9d6c91ef3 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -72,6 +72,8 @@ document, use =shrink= value instead, or in addition to align:
#+END_EXAMPLE
** New features
+*** ~org-tempo~ may used for snippet expansion of structure template.
+See manual and commentary in ~org-tempo.el~ for details.
*** Exclude unnumbered headlines from table of contents
Set their =UNNUMBERED= property to the special =notoc= value. See
manual for details.
@@ -167,7 +169,7 @@ See docstring for details.
** Removed functions
*** ~org-try-structure-completion~
-
+=org-tempo= may be used as a replacement.
** Removed variables
*** org-babel-use-quick-and-dirty-noweb-expansion
diff --git a/lisp/org-tempo.el b/lisp/org-tempo.el
new file mode 100644
index 000000000..666954e1b
--- /dev/null
+++ b/lisp/org-tempo.el
@@ -0,0 +1,133 @@
+;;; org-tempo.el --- template expansion for org structures -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2017 Free Software Foundation, Inc.
+;;
+;; Author: Rasmus Pank Roulund <emacs at pank dot eu>
+;; Keywords: outlines, hypermedia, calendar, wp
+;; Homepage: http://orgmode.org
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+;;
+;;; Commentary:
+;;
+;; org-tempo reimplements completions of structure template before
+;; point like `org-try-structure-completion' in Org v9.1 and earlier.
+;; For example, strings like "<e" at the beginning of the line will be
+;; expanded to an example block.
+;;
+;; All blocks defined in `org-structure-template-alist' are added as
+;; org-tempo shortcuts, in addition to keywords defined in
+;; `org-tempo-keywords-alist'.
+;;
+;; `tempo' can also be used to define more sophisticated keywords
+;; completions. See the section "Additional keywords" below for
+;; additional details.
+;;
+;;; Code:
+
+(require 'tempo)
+(require 'cl-lib)
+
+(defvar org-tempo-tags nil
+ "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'."
+ :group 'org-tempo
+ :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.
+
+Goes through `org-structure-template-alist' and
+`org-tempo-keywords-alist'."
+ (let ((keys (mapcar (apply-partially 'format "<%c")
+ (mapcar 'car (append org-structure-template-alist
+ org-tempo-keywords-alist)))))
+ (if (> (length keys)
+ (length (delete-dups keys)))
+ (user-error
+ "Duplicated keys in `org-structure-template-alist' and `org-tempo-keywords-alist'"))
+ (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)
+ (mapcar 'org-tempo-add-keyword org-tempo-keywords-alist)))
+
+(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 " ")))
+ >)
+ 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
+ (format "\"%s\" " (file-relative-name (read-file-name "Include file: "))))
+ p >)
+ "<I"
+ "Include keyword"
+ 'org-tempo-tags)
+
+(add-hook 'org-mode-hook 'org-tempo-setup)
+
+(with-eval-after-load 'org
+ (org-tempo-add-templates)
+ (add-hook 'org-tab-before-tab-emulation-hook
+ (lambda (&optional silent)
+ ;; 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))
+ (tempo-complete-tag silent))))
+
+(provide 'org-tempo)
+
+;;; org-tempo.el ends here
diff --git a/lisp/org.el b/lisp/org.el
index 611817b40..47ca283f2 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -706,6 +706,7 @@ For export specific modules, see also `org-export-backends'."
(const :tag " mouse: Additional mouse support" org-mouse)
(const :tag " protocol: Intercept calls from emacsclient" org-protocol)
(const :tag " rmail: Links to RMAIL folders/messages" org-rmail)
+ (const :tag " tempo: Fast completion for structures" org-tempo)
(const :tag " w3m: Special cut/paste from w3m to Org mode." org-w3m)
(const :tag "C annotate-file: Annotate a file with org syntax" org-annotate-file)
--
2.15.1
next reply other threads:[~2017-12-04 16:22 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-04 16:22 Rasmus [this message]
2017-12-04 20:55 ` [patch] structure snippet completions Nicolas Goaziou
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87mv2ya2ep.fsf@pank.eu \
--to=rasmus@gmx.us \
--cc=emacs-orgmode@gnu.org \
--cc=eric@ericabrahamsen.net \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.