;;; +tempo.el --- easier tempo definition -*- lexical-binding: t -*- (require 'tempo) (declare-function derived-mode-abbrev-table-name "tempo") ;; TODO: I need to figure out where this function goes. (defun delete2 (list &rest elems) "Delete each element of ELEMS, and the next item, from LIST." (let ((r nil)) (while (consp list) (if (member (car list) elems) (setf list (cdr list)) (setf r (cons (car list) r))) (setf list (cdr list))) (reverse r))) (defmacro define-tempo (tag doc &rest elements) "Define a template and add its tag to MODE's abbrev-table. TAG, DOC, and ELEMENTS are passed to `tempo-define-template', which see. ABBREV, if given, is the abbrev string to use for template expansion under MODE's abbrev-table. If ABBREV isn't given, TAG will be used." (declare (indent 1)) (let* ((template (gensym)) (tag (cond ((stringp tag) tag) ((symbolp tag) (symbol-name tag)) (t (user-error "TAG must be a string or symbol: %S" tag)))) (mode (or (plist-get elements :mode) nil)) (abbrev (or (plist-get elements :abbrev) tag)) (taglist (or (plist-get elements :taglist) nil)) (table (let ((tname (and mode (derived-mode-abbrev-table-name mode)))) (while (and tname (not (memq tname abbrev-table-name-list))) (setq tname (and (get mode 'derived-mode-parent) (derived-mode-abbrev-table-name (get mode 'derived-mode-parent))))) (or tname 'global-abbrev-table))) (elements (delete2 elements :mode :abbrev :taglist))) `(let ((,template (tempo-define-template ,tag ',elements ,(or abbrev tag) ,doc ,taglist))) (define-abbrev ,table ,tag "" ,template :system t) (put ,template 'no-self-insert t)))) (provide '+tempo)