changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate emacs/lib/skt.el

changeset 698: 96958d3eb5b0
parent: 7efdeaebaf22
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
587
Richard Westhaver <ellis@rwest.io>
parents: 422
diff changeset
1
 ;;; skt.el --- Skel Templates -*- lexical-binding:t -*-
421
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Copyright (C) 2024  The Compiler Company
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;; Author: Richard Westhaver <richard.westhaver@gmail.com>
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 ;; Keywords: convenience
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;; This program is free software; you can redistribute it and/or modify
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 ;; it under the terms of the GNU General Public License as published by
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 ;; the Free Software Foundation, either version 3 of the License, or
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 ;; (at your option) any later version.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 ;; This program is distributed in the hope that it will be useful,
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;; GNU General Public License for more details.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 ;; You should have received a copy of the GNU General Public License
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 ;;; Commentary:
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 ;; 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 ;;; Code:
422
3e0a434b0c56 init alik installer example, more emacs-lisp
Richard Westhaver <ellis@rwest.io>
parents: 421
diff changeset
26
 (require 'sk)
421
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 ;; ref: https://raw.githubusercontent.com/xFA25E/skempo/master/skempo.el
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
 ;; (defun modify-lisp-syntax-tables ()
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 ;;   (modify-syntax-entry ?* "w" (syntax-table))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 ;;   (modify-syntax-entry ?- "w" (syntax-table)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
 ;; (dolist (hook '(lisp-mode-hook emacs-lisp-mode-hook))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
 ;;   (add-hook hook #'modify-lisp-syntax-tables))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 (defun skt--tags-variable (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
   "Return a tempo tags variable's symbol for MODE."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
   (when mode
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
     (intern (replace-regexp-in-string
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
              (rx "-mode" eos) "-skt-tags"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
              (symbol-name mode)))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 (defun skt--remove-tag-list (tag-list)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
   "Remove TAG-LIST from `tempo-local-tags'."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
   (setf (alist-get tag-list tempo-local-tags nil t) nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
 (defun skt--insert-mark (marker)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
   "Insert a MARKER to `tempo-marks' while keeping it sorted.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 Remove duplicate marks from `tempo-marks'.  Set to nil removed
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 markers.  This function is used as an :override advice to
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 `tempo-insert-mark', because the original function does not
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
 remove duplicate elements.  Duplicate markers appear when the
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
 buffer gets smaller, markers start pointing to the same location.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
 We don't want that, because a lot of useless markers can slow
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
 down Emacs."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
   (if (not tempo-marks)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
       (setq tempo-marks (list marker))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
     (let ((markers tempo-marks))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
       (cond
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
        ((< marker (car markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
         (setq tempo-marks (cons marker tempo-marks)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
        (t
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
         (while (and (cdr markers) (<= (cadr markers) marker))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
           (if (/= (car markers) (cadr markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
               (setq markers (cdr markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
             (when (markerp (cadr markers)) (set-marker (cadr markers) nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
             (setcdr markers (cddr markers))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
         (if (= marker (car markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
             (when (markerp marker) (set-marker marker nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
           (setcdr markers (cons marker (cdr markers))))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
       (while (cdr markers)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
         (if (/= (car markers) (cadr markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
             (setq markers (cdr markers))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
           (when (markerp (cadr markers)) (set-marker (cadr markers) nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
           (setcdr markers (cddr markers)))))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
 (defun skt-add-tag (tag template &optional tag-list)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
   "Add a TEMPLATE TAG to TAG-LIST or to `tempo-tags'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
 It is an :override function for `tempo-add-tag'.  The original
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
 function does not update identical tags."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
   (interactive "sTag: \nCTemplate: ")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
   (let ((tag-list (or tag-list 'tempo-tags)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
     (if-let ((value (assoc tag (symbol-value tag-list))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
         (setcdr value template)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
       (set tag-list (cons (cons tag template) (symbol-value tag-list))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
     (tempo-invalidate-collection)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
 (defun skt--list-derived-modes (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
   "List all derived modes of MODE + MODE itself."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
   (let ((modes nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
     (while mode
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
       (when-let ((alias (symbol-function mode)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
         (when (symbolp alias)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
           (setq mode alias)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
97
       (push mode modes)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
98
       (setq mode (get mode 'derived-mode-parent))  )
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
99
     (nreverse modes)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
100
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
101
 ;;; Commands
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
102
 (defvar-keymap skt-minor-mode-map
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
103
   :doc "skt-minor-mode keymap."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
104
   :repeat (:enter)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
105
   :prefix 'skt-minor-mode-map
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
106
   "a" #'edit-abbrevs)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
107
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
108
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
109
 (define-minor-mode skt-minor-mode
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
110
   "Minor mode for skt-templates."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
111
   :init-value nil
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
112
   :lighter " Skt"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
113
   :keymap skt-minor-mode-map
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
114
   (let* ((modes (skt--list-derived-modes major-mode))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
115
          (tag-vars (mapcar #'skt--tags-variable modes))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
116
          (bound-tag-vars (cl-delete-if-not #'boundp tag-vars)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
117
     (if skt-minor-mode
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
118
         (mapc #'tempo-use-tag-list bound-tag-vars)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
119
       (mapc #'skt--remove-tag-list bound-tag-vars))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
120
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
121
 (defun skt-register-auto-insert (rx template)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
122
   "Associate a template with a file regexp and insert into `auto-insert-alist'."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
123
   (cl-pushnew (cons rx template) auto-insert-alist))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
124
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
125
 (defun skt--define-template (function-symbol body &optional docstring)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
126
   "Define a tempo template with BODY.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
127
 This will generate a function with FUNCTION-SYMBOL and
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
128
 DOCSTRING.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
129
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
130
 The main purpose of this function is to have a better controlled
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
131
 alternative to `tempo-define-template'."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
132
   (let ((template-symbol (gensym (symbol-name function-symbol))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
133
     (set template-symbol body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
134
     (defalias function-symbol
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
135
       (lambda (&optional arg)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
136
         (interactive "*P")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
137
         (tempo-insert-template template-symbol (xor tempo-insert-region arg)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
138
       docstring)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
139
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
140
 (defun skt--define-skeleton (function-symbol body &optional docstring)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
141
   "Define a skeleton template with BODY.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
142
 This will generate a function with FUNCTION-SYMBOL and
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
143
 DOCSTRING.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
144
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
145
 The main purpose of this function is to have a better controlled
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
146
 alternative to `define-skeleton', especially because it is a
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
147
 function instead of a macro."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
148
   (defalias function-symbol
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
149
     (lambda (&optional str arg)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
150
       (interactive "*P\nP")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
151
       (skeleton-proxy-new body str arg))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
152
     docstring))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
153
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
154
 (defun skt--define-function (function-symbol function &optional docstring)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
155
   "This will generate an alias to FUNCTION with FUNCTION-SYMBOL.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
156
 DOCSTRING is used as a docstring to FUNCTION-SYMBOL."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
157
   (defalias function-symbol function docstring))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
158
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
159
 (defun skt--mode-name (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
160
   "Get MODE name without a -mode suffix."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
161
   (string-trim-right (symbol-name mode) (rx "-mode" eos)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
162
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
163
 (defun skt--function-name (name modes)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
164
   "Generate a name for a skt template function.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
165
 NAME and MODES are used to generate unique, but consistent
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
166
 names."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
167
   (concat "skt-template-"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
168
           (mapconcat (lambda (mode) (concat (skt--mode-name mode) "-"))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
169
                      (sort modes #'string<) "")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
170
           name))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
171
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
172
 (defun skt--mode-abbrev-table (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
173
   "Get abbrev table for MODE or `global-abbrev-table' if nil."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
174
   (if mode
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
175
       (derived-mode-abbrev-table-name mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
176
     'global-abbrev-table))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
177
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
178
 (defun skt--abbrev-table (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
179
   "Get skt abbrev table for MODE."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
180
   (intern (concat "skt-" (symbol-name (skt--mode-abbrev-table mode)))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
181
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
182
 (defun skt--abbrev-table-names (table)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
183
   "Return abbrev TABLE names."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
184
   (let ((names nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
185
     (mapatoms (lambda (abbrev)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
186
                 (when (symbol-value abbrev)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
187
                   (push (symbol-name abbrev) names)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
188
               (symbol-value table))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
189
     names))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
190
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
191
 (defun skt--modes (mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
192
   "Normalize MODE argument."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
193
   (cond ((consp mode) mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
194
         ((null mode) nil)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
195
         ((symbolp mode) (list mode))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
196
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
197
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
198
 (defun skt--define (define-function name modes tag abbrev docstring body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
199
   "Define a skt template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
200
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
201
 DEFINE-FUNCTION is a function that takes a function symbol, BODY
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
202
 and DOCSTRING as its arguments.  It must define a new function
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
203
 with that symbol and that docstring.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
204
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
205
 NAME is a string used in generating a function symbol, TAG and
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
206
 ABBREV.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
207
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
208
 MODES is a list of modes for which TAG and ABBREV will be
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
209
 created.  If it's nil, TAG and ABBREV will be generated
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
210
 globally.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
211
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
212
 TAG/ABBREV is a boolean, which indicates whether a tag/abbrev
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
213
 must be created for this template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
214
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
215
 DOCSTRING is a string (or nil) which will be supplied to
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
216
 DEFINE-FUNCTION.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
217
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
218
 BODY is an arbitrary argument passed to DEFINE-FUNCTION."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
219
   (let* ((function-symbol (intern (skt--function-name name modes)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
220
          (modes (or modes '(nil))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
221
     (funcall define-function function-symbol body docstring)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
222
     (put function-symbol 'no-self-insert t)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
223
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
224
     (when tag
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
225
       (let ((tag-symbol (gensym (symbol-name function-symbol))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
226
         (if (eq #'skt--define-template define-function)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
227
             (set tag-symbol body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
228
           (set tag-symbol `((ignore (,function-symbol)))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
229
         (dolist (mode modes)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
230
           (let ((var (skt--tags-variable mode)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
231
             (unless (boundp var)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
232
               (set var nil))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
233
             (tempo-add-tag name tag-symbol var)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
234
         (dolist (buffer (buffer-list))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
235
           (with-current-buffer buffer
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
236
             (when (and (or (equal '(nil) modes) (apply #'derived-mode-p modes))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
237
                        skt-minor-mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
238
               (skt-minor-mode -1)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
239
               (skt-minor-mode 1))))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
240
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
241
     (when abbrev
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
242
       (dolist (mode modes)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
243
         (let ((mode-table (skt--mode-abbrev-table mode))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
244
               (table (skt--abbrev-table mode)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
245
           (define-abbrev-table mode-table nil)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
246
           (define-abbrev-table table nil :case-fixed t :skt t)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
247
           (define-abbrev (symbol-value table) name "" function-symbol
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
248
             :case-fixed t :system t :skt t)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
249
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
250
           (let* ((names (skt--abbrev-table-names table))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
251
                  (regexp (concat (regexp-opt names "\\_<\\(") " *")))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
252
             (abbrev-table-put (symbol-value table) :regexp regexp))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
253
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
254
           (let ((parents (abbrev-table-get (symbol-value mode-table) :parents)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
255
             (cl-pushnew (symbol-value table) parents :test #'eq)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
256
             (abbrev-table-put (symbol-value mode-table) :parents parents)))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
257
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
258
     function-symbol))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
259
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
260
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
261
 (cl-defmacro skt-define-template (name (&key mode tag abbrev docstring) &body body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
262
   "Define a tempo template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
263
 This macro defines a new tempo template or updates the old one.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
264
 NAME is a symbol.  ARGS is a list of the form ([KEY VALUE]...)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
265
 where each KEY can be one of :tag, :abbrev, :docstring or :mode.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
266
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
267
 If KEY is :tag, VALUE should be a boolean.  If VALUE is non-nil,
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
268
 then a tempo tag with NAME will be created for this template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
269
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
270
 If KEY is :abbrev, VALUE should be a boolean.  If VALUE is
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
271
 non-nil, then a NAME abbrev will be created for this template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
272
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
273
 If KEY is :docstring, VALUE should be a string.  It will be a
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
274
 docstring of the generated function.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
275
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
276
 If KEY is :mode, VALUE should be a list of modes or single mode.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
277
 If this option is provided, than a tempo tag and an abbrev will
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
278
 be created for these modes, otherwise they will be global (if
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
279
 :tag and :abbrev options were provided, of course).
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
280
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
281
 BODY is a sequence of tempo elements that will be passed as a
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
282
 list directly to `tempo-define-template's second argument.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
283
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
284
 Example:
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
285
 \(skt-define-template defvar (:mode emacs-lisp-mode :tag t :abbrev t
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
286
                              :docstring \"defvar template\")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
287
   \"(defvar \" (string-trim-right (buffer-name) (rx \".el\" eos)) \"-\" p n>
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
288
   r> \")\")"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
289
   `(skt--define 'skt--define-template ,(symbol-name name)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
290
                ',(skt--modes mode) ,tag ,abbrev ,docstring ',body))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
291
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
292
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
293
 (cl-defmacro skt-define-skeleton (name (&key mode tag abbrev docstring) &rest body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
294
   "Define skeleton template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
295
 See `skt-define-template' for explanation of NAME, MODE, TAG,
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
296
 ABBREV and DOCSTRING.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
297
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
298
 BODY is a sequence of skeleton elements that will be passed
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
299
 directly to `define-skeleton'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
300
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
301
 Example:
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
302
 \(skt-define-skeleton defun (:mode (emacs-lisp-mode lisp-interaction-mode)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
303
                                :tag t :abbrev t
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
304
                                :docstring \"defun template\")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
305
   \"(defun \" str \" (\" @ - \")\" \n
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
306
   @ _ \")\" \n)"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
307
   `(skt--define #'skt--define-skeleton ,(symbol-name name)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
308
                   ',(skt--modes mode) ,tag ,abbrev ,docstring ',body))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
309
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
310
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
311
 (cl-defmacro skt-define-function (name (&key mode tag abbrev docstring) function)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
312
   "Define FUNCTION template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
313
 See `skt-define-template' for explanation of NAME, MODE, TAG,
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
314
 ABBREV and DOCSTRING.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
315
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
316
 The main purpose of this macro, is to create tempo tags and
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
317
 abbrevs for existing skeleton templates, such as `sh-case'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
318
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
319
 Example:
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
320
 \(skt-define-function shcase (:tag t :abbrev t :mode `sh-mode') `sh-case')"
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
321
   `(skt--define #'skt--define-function ,(symbol-name name)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
322
                   ',(skt--modes mode) ,tag ,abbrev ,docstring ',function))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
323
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
324
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
325
 (defun skt--complete-template (string tag-list)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
326
   "An :override advice function for `tempo-display-completions'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
327
 Show completion for STRING in a TAG-LIST.  After selection
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
328
 expand template.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
329
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
330
 Rewritten because the original function uses an old way of
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
331
 displaying completions in a separate buffer, which is not
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
332
 clickable anyway.  Now it uses new (compared to the originial
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
333
 tempo package) and shiny `completing-read' interface."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
334
   (let* ((tags (mapcar #'car tag-list))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
335
          (tag (completing-read "Skt: " tags nil t string)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
336
     (delete-char (- (length string)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
337
     (tempo-insert-template (cdr (assoc tag tag-list)) nil)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
338
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
339
 ;;;###autoload
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
340
 (defcustom skt-enable-tempo-elements nil
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
341
   "Enable extra tempo elements.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
342
 These elements add conditionals and looping support for tempo
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
343
 like those in skeleton, making skeleton pretty much obsolete.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
344
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
345
 If you want to set this option from ELisp, you have to remove
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
346
 `skt-tempo-user-elements' from `tempo-user-elements' on nil
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
347
 and add it on non-nil."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
348
   :type '(boolean :tag "Enable tempo elements?")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
349
   :set (lambda (variable value)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
350
          (if value
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
351
              (add-hook 'tempo-user-functions #'skt-tempo-user-elements)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
352
            (remove-hook 'tempo-user-functions #'skt-tempo-user-elements))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
353
          (set-default variable value))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
354
   :group 'skel)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
355
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
356
 (defcustom skt-completing-read nil
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
357
   "Override default `tempo-display-completions'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
358
 By default it uses a completion buffer to show completions.  This
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
359
 option overrides this function to use `completing-read' to select
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
360
 partial skt tag or complete tag on region.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
361
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
362
 If you wish to set this variable from ELisp code, you have to
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
363
 remove `skt--complete-template' advice from
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
364
 `tempo-display-completions' on nil and add it as on :override
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
365
 advice on non-nil."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
366
   :type '(boolean :tag "Override?")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
367
   :set (lambda (variable value)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
368
          (if value
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
369
              (advice-add 'tempo-display-completions :override #'skt--complete-template)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
370
            (advice-remove 'tempo-display-completions #'skt--complete-template))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
371
          (set-default variable value))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
372
   :group 'skel)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
373
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
374
 (defcustom skt-delete-duplicate-marks nil
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
375
   "Override default `tempo-insert-mark'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
376
 Marks are used to jump on points of interest in a template.  By
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
377
 default `tempo-insert-mark' does not remove duplicate marks.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
378
 Duplicate marks might appear when the buffer shrinks and some of
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
379
 the marks start pointing to the same location.  This option tries
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
380
 to fix this by checking for duplicate marks every time the
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
381
 function is called.  Emacs might get slower with a lot of
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
382
 marks.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
383
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
384
 If you want to set this option from ELisp, you have to remove
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
385
 `skt--insert-mark' advice from `tempo-insert-mark' on nil and
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
386
 add it as on :override advice on non-nil."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
387
   :type '(boolean :tag "Override?")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
388
   :set (lambda (variable value)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
389
          (if value
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
390
              (advice-add 'tempo-insert-mark :override #'skt--insert-mark)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
391
            (advice-remove 'tempo-insert-mark #'skt--insert-mark))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
392
          (set-default variable value))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
393
   :group 'skel)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
394
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
395
 (progn
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
396
   (put 'tempo-define-template 'lisp-indent-function 1)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
397
   (put 'skt-define-template 'lisp-indent-function 2)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
398
   (put 'skt-define-skeleton 'lisp-indent-function 2)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
399
   (put 'skt-define-function 'lisp-indent-function 2))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
400
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
401
 ;;; Tempo Elements
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
402
 (defvar skt-tempo-else-key (kbd "C-M-g")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
403
   "Key used to execute else branch in tempo conditional.")
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
404
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
405
 (defun skt-tempo--prompt (prompt)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
406
   "Make prompt for tempo conditional.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
407
 PROMPT is preceded with `skt-tempo-else-key'."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
408
   (concat "(" (key-description skt-tempo-else-key) " to quit) " prompt))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
409
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
410
 (defun skt-tempo-user-elements (element)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
411
   "Support for conditional and looping tempo elements.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
412
 The following forms are supported for ELEMENT:
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
413
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
414
 \(:if (PROMPT VAR) THEN ELSE)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
415
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
416
 \(:when (PROMPT VAR) BODY...)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
417
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
418
 \(:while (PROMPT VAR) BODY...)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
419
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
420
 PROMPT is a string used to read value for VAR.  VAR is a tempo
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
421
 variable symbol.  Its value can be read with s, as usual.  BODY,
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
422
 THEN and ELSE are tempo elements.  To abort the execution of
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
423
 these elements, user must press `skt-tempo-else-key'.
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
424
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
425
 The main purpose of this extension is to mimic skeleton conditionals."
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
426
   (pcase element
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
427
     (`(:if (,(and (pred stringp) prompt) ,(and (pred symbolp) var)) ,then ,else)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
428
      (let ((prompt (skt-tempo--prompt prompt))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
429
            (map (make-sparse-keymap)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
430
        (set-keymap-parent map minibuffer-local-map)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
431
        (define-key map skt-tempo-else-key
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
432
          (lambda () (interactive) (throw 'else else)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
433
        (catch 'else
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
434
          (tempo-save-named var (read-from-minibuffer prompt nil map))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
435
          then)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
436
     (`(:when (,(and (pred stringp) prompt) ,(and (pred symbolp) var)) . ,body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
437
      `(:if (,prompt ,var) (l ,@body) (l)))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
438
     (`(:while (,(and (pred stringp) prompt) ,(and (pred symbolp) var)) . ,body)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
439
      `(:when (,prompt ,var) ,@body ,element))))
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
440
 
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
441
 (provide 'skt)
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
442
 ;;; skt.el ends here