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