changelog shortlog graph tags branches changeset files file revisions raw help

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

changeset 677: 585f14458a65
parent: ca09f470abb3
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 24 Sep 2024 22:19:05 -0400
permissions: -rw-r--r--
description: tweaks
587
Richard Westhaver <ellis@rwest.io>
parents: 580
diff changeset
1
 ;;; sk.el --- skel Emacs Mode -*- lexical-binding:t -*-
20
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
3
 ;; skel-mode, skel-minor-mode,skt-minor-mode, sk-classes
20
ellis <ellis@rwest.io>
parents:
diff changeset
4
 
39
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
5
 ;; Copyright (C) 2023  The Compiler Company
20
ellis <ellis@rwest.io>
parents:
diff changeset
6
 
ellis <ellis@rwest.io>
parents:
diff changeset
7
 ;; Author: ellis <ellis@rwest.io>
ellis <ellis@rwest.io>
parents:
diff changeset
8
 ;; Keywords: languages, lisp
ellis <ellis@rwest.io>
parents:
diff changeset
9
 
ellis <ellis@rwest.io>
parents:
diff changeset
10
 ;; This program is free software; you can redistribute it and/or modify
ellis <ellis@rwest.io>
parents:
diff changeset
11
 ;; it under the terms of the GNU General Public License as published by
ellis <ellis@rwest.io>
parents:
diff changeset
12
 ;; the Free Software Foundation, either version 3 of the License, or
ellis <ellis@rwest.io>
parents:
diff changeset
13
 ;; (at your option) any later version.
ellis <ellis@rwest.io>
parents:
diff changeset
14
 
ellis <ellis@rwest.io>
parents:
diff changeset
15
 ;; This program is distributed in the hope that it will be useful,
ellis <ellis@rwest.io>
parents:
diff changeset
16
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
ellis <ellis@rwest.io>
parents:
diff changeset
17
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ellis <ellis@rwest.io>
parents:
diff changeset
18
 ;; GNU General Public License for more details.
ellis <ellis@rwest.io>
parents:
diff changeset
19
 
ellis <ellis@rwest.io>
parents:
diff changeset
20
 ;; You should have received a copy of the GNU General Public License
ellis <ellis@rwest.io>
parents:
diff changeset
21
 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
ellis <ellis@rwest.io>
parents:
diff changeset
22
 
ellis <ellis@rwest.io>
parents:
diff changeset
23
 ;;; Commentary:
ellis <ellis@rwest.io>
parents:
diff changeset
24
 
421
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents: 406
diff changeset
25
 ;;
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents: 406
diff changeset
26
 
20
ellis <ellis@rwest.io>
parents:
diff changeset
27
 ;;; Code:
ellis <ellis@rwest.io>
parents:
diff changeset
28
 (eval-and-compile (require 'eieio)
ellis <ellis@rwest.io>
parents:
diff changeset
29
 		  (require 'cl-lib)
39
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
30
 		  (require 'sxp (expand-file-name "sxp.el" (join-paths user-emacs-directory "lib/")))
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
31
                   (require 'skeleton)
677
Richard Westhaver <ellis@rwest.io>
parents: 676
diff changeset
32
                   (require 'project)
580
571685ae64f1 queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents: 516
diff changeset
33
                   (require 'org)
39
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
34
                   (require 'tempo)
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
35
                   (require 'autoinsert)
20
ellis <ellis@rwest.io>
parents:
diff changeset
36
 		  (defvar skel-debug nil)
ellis <ellis@rwest.io>
parents:
diff changeset
37
 		  (when skel-debug (require 'ede)))
ellis <ellis@rwest.io>
parents:
diff changeset
38
 
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
39
 (defvar skel-version "0.1.0")
20
ellis <ellis@rwest.io>
parents:
diff changeset
40
 
ellis <ellis@rwest.io>
parents:
diff changeset
41
 (defgroup skel nil
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
42
   "skel customization group."
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
43
   :group 'local)
20
ellis <ellis@rwest.io>
parents:
diff changeset
44
 
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
45
 (defcustom skel-minor-mode-map-prefix "C-c C-."
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
46
   "Prefix for `skel-minor-mode' keymap."
20
ellis <ellis@rwest.io>
parents:
diff changeset
47
   :type 'string
ellis <ellis@rwest.io>
parents:
diff changeset
48
   :group 'skel)
ellis <ellis@rwest.io>
parents:
diff changeset
49
 
ellis <ellis@rwest.io>
parents:
diff changeset
50
 (defcustom skel-triggers nil
ellis <ellis@rwest.io>
parents:
diff changeset
51
   "Association of symbols to a specific condition which can be used
ellis <ellis@rwest.io>
parents:
diff changeset
52
 to trigger `skel-actions' based on the `skel-behavior' value."
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
53
   :type '(list function)
20
ellis <ellis@rwest.io>
parents:
diff changeset
54
   :group 'skel)
ellis <ellis@rwest.io>
parents:
diff changeset
55
 
ellis <ellis@rwest.io>
parents:
diff changeset
56
 (defcustom skel-actions nil
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
57
   "Array of actions which may be performed on skeletons."
20
ellis <ellis@rwest.io>
parents:
diff changeset
58
   :type 'obarray
ellis <ellis@rwest.io>
parents:
diff changeset
59
   :group 'skel)
ellis <ellis@rwest.io>
parents:
diff changeset
60
 
ellis <ellis@rwest.io>
parents:
diff changeset
61
 (defcustom skel-id-prefix "sk"
ellis <ellis@rwest.io>
parents:
diff changeset
62
   "Default prefix for `make-id'."
ellis <ellis@rwest.io>
parents:
diff changeset
63
   :type 'string
ellis <ellis@rwest.io>
parents:
diff changeset
64
   :group 'skel)
ellis <ellis@rwest.io>
parents:
diff changeset
65
 
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
66
 (defvar-keymap skel-minor-mode-map
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
67
   :doc "skel-minor-mode keymap."
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
68
   :repeat (:enter)
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
69
   :prefix 'skel-minor-mode-map)
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
70
 
20
ellis <ellis@rwest.io>
parents:
diff changeset
71
 (define-minor-mode skel-minor-mode
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
72
   "skel-minor-mode"
20
ellis <ellis@rwest.io>
parents:
diff changeset
73
   :global t
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
74
   :lighter " Sk"
20
ellis <ellis@rwest.io>
parents:
diff changeset
75
   :group 'skel
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
76
   :keymap skel-minor-mode-map
421
05e9cbc641dd break out templates from sk.el to skt.el
Richard Westhaver <ellis@rwest.io>
parents: 406
diff changeset
77
   :version skel-version)
20
ellis <ellis@rwest.io>
parents:
diff changeset
78
 
ellis <ellis@rwest.io>
parents:
diff changeset
79
 ;; TODO 2023-09-06: 
365
49c3f3d11432 bug fixes and more tweaks for test macros
Richard Westhaver <ellis@rwest.io>
parents: 314
diff changeset
80
 (define-derived-mode skel-mode lisp-mode "SKEL"
405
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
81
   :group 'skel
1816f9c53453 work on sk.el
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
82
   (skel-minor-mode 1))
20
ellis <ellis@rwest.io>
parents:
diff changeset
83
 
516
f68a5996a2b1 skel updates, sketch of sk-path parser
Richard Westhaver <ellis@rwest.io>
parents: 421
diff changeset
84
 (org-babel-make-language-alias "skel" "lisp")
f68a5996a2b1 skel updates, sketch of sk-path parser
Richard Westhaver <ellis@rwest.io>
parents: 421
diff changeset
85
 
20
ellis <ellis@rwest.io>
parents:
diff changeset
86
 (defun maybe-skel-minor-mode ()
ellis <ellis@rwest.io>
parents:
diff changeset
87
   "Check the current environment and determine if `skel-minor-mode' should
ellis <ellis@rwest.io>
parents:
diff changeset
88
 be enabled. This function is added as a hook to
ellis <ellis@rwest.io>
parents:
diff changeset
89
 `lisp-data-mode-hook'.")
ellis <ellis@rwest.io>
parents:
diff changeset
90
 
ellis <ellis@rwest.io>
parents:
diff changeset
91
 (defvar skel-hashtable (make-hash-table :test #'equal)
ellis <ellis@rwest.io>
parents:
diff changeset
92
   "Internal table of available skeletons.")
ellis <ellis@rwest.io>
parents:
diff changeset
93
 
ellis <ellis@rwest.io>
parents:
diff changeset
94
 (defvar skel-stack nil "Internal stack of skeletons.")
ellis <ellis@rwest.io>
parents:
diff changeset
95
 
ellis <ellis@rwest.io>
parents:
diff changeset
96
 (defcustom skel-state 'passive
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
97
   "State toggle for the `skel' system. Base states are passive and
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
98
 active."
20
ellis <ellis@rwest.io>
parents:
diff changeset
99
   :type 'symbol
ellis <ellis@rwest.io>
parents:
diff changeset
100
   :group 'skel)
ellis <ellis@rwest.io>
parents:
diff changeset
101
 
ellis <ellis@rwest.io>
parents:
diff changeset
102
 (defvar skel-active-map nil
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
103
   "List of cons cells of the form (SYM . BODY...) where SYM is a member of
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
104
 `skel-triggers'.")
20
ellis <ellis@rwest.io>
parents:
diff changeset
105
 
ellis <ellis@rwest.io>
parents:
diff changeset
106
 (defvar skel-passive-map nil
314
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
107
   "list of cons cells of the form (SYM . BODY...) where SYM is a member of
5ff2542d5f38 expose compaction pri: #[12604]
Richard Westhaver <ellis@rwest.io>
parents: 40
diff changeset
108
 `skel-triggers'.")
20
ellis <ellis@rwest.io>
parents:
diff changeset
109
 
ellis <ellis@rwest.io>
parents:
diff changeset
110
 (defmacro make-id (&optional pre)
ellis <ellis@rwest.io>
parents:
diff changeset
111
   `(let ((pre ,(if-let (pre) (concat skel-id-prefix "-" pre "-") (concat skel-id-prefix "-")))
ellis <ellis@rwest.io>
parents:
diff changeset
112
 	 (current-time-list nil))
ellis <ellis@rwest.io>
parents:
diff changeset
113
      (symb pre (prog1 gensym-counter (setq gensym-counter (1+ gensym-counter))) (format "%x" (car (current-time))))))
ellis <ellis@rwest.io>
parents:
diff changeset
114
 
ellis <ellis@rwest.io>
parents:
diff changeset
115
 (defmacro defcmd (name &rest body) `(defun ,name nil (interactive) ,@body))
ellis <ellis@rwest.io>
parents:
diff changeset
116
 
ellis <ellis@rwest.io>
parents:
diff changeset
117
 (defclass sk (sxp)
ellis <ellis@rwest.io>
parents:
diff changeset
118
   ((id :initarg :id :initform (make-id)))
ellis <ellis@rwest.io>
parents:
diff changeset
119
   :documentation "Base class for skeleton objects. Inherits from `sxp'."
ellis <ellis@rwest.io>
parents:
diff changeset
120
   :abstract t)
ellis <ellis@rwest.io>
parents:
diff changeset
121
 
ellis <ellis@rwest.io>
parents:
diff changeset
122
 (defcmd sk-classes (eieio-class-children 'sk))
ellis <ellis@rwest.io>
parents:
diff changeset
123
 
ellis <ellis@rwest.io>
parents:
diff changeset
124
 (defmacro def-sk-class (name doc &optional slots superclasses)
ellis <ellis@rwest.io>
parents:
diff changeset
125
   "Define a new class with superclass of `skel'+SUPERCLASSES, SLOTS,
ellis <ellis@rwest.io>
parents:
diff changeset
126
 DOC, and NAME."
ellis <ellis@rwest.io>
parents:
diff changeset
127
   (declare (indent 1))
ellis <ellis@rwest.io>
parents:
diff changeset
128
   `(defclass ,(symb "sk-" name)
ellis <ellis@rwest.io>
parents:
diff changeset
129
      ,(if superclasses `(sk ,@superclasses) '(sk))
ellis <ellis@rwest.io>
parents:
diff changeset
130
      ,(if slots
ellis <ellis@rwest.io>
parents:
diff changeset
131
 	  `(,@slots
ellis <ellis@rwest.io>
parents:
diff changeset
132
 	    (:id :initarg :id :initform (make-id ,(symbol-name name)) :accessor id))
ellis <ellis@rwest.io>
parents:
diff changeset
133
 	`((:id :initarg :id :initform (make-id ,(symbol-name name)) :accessor id)))
ellis <ellis@rwest.io>
parents:
diff changeset
134
      :documentation ,doc))
ellis <ellis@rwest.io>
parents:
diff changeset
135
 
ellis <ellis@rwest.io>
parents:
diff changeset
136
 (def-sk-class target "Target skeleton class.")
ellis <ellis@rwest.io>
parents:
diff changeset
137
 (def-sk-class source "Source skeleton class.")
ellis <ellis@rwest.io>
parents:
diff changeset
138
 (def-sk-class rule
ellis <ellis@rwest.io>
parents:
diff changeset
139
   "Config skeleton class."
ellis <ellis@rwest.io>
parents:
diff changeset
140
   ((target :initarg :target :initform nil :type (or null sk-target))
ellis <ellis@rwest.io>
parents:
diff changeset
141
    (rules :initarg :source :initform nil :type (or null sk-source))))
ellis <ellis@rwest.io>
parents:
diff changeset
142
 
ellis <ellis@rwest.io>
parents:
diff changeset
143
 (def-sk-class project
ellis <ellis@rwest.io>
parents:
diff changeset
144
   "Project skeleton class."
ellis <ellis@rwest.io>
parents:
diff changeset
145
   ((type :initarg :type :initform nil :accessor sk-project-type :type (or null symbol))
ellis <ellis@rwest.io>
parents:
diff changeset
146
    (rules :initarg :rules :initform nil :accessor sk-project-rules :type list)))
ellis <ellis@rwest.io>
parents:
diff changeset
147
 
ellis <ellis@rwest.io>
parents:
diff changeset
148
 (defun skel-init ()
ellis <ellis@rwest.io>
parents:
diff changeset
149
   "Initialize the skel library."
ellis <ellis@rwest.io>
parents:
diff changeset
150
   (interactive)
ellis <ellis@rwest.io>
parents:
diff changeset
151
   (add-to-list 'auto-mode-alist '("skelfile" . skel-mode))
670
6856c021d084 add dir-locals to skel, fix package lock violation in castable, move .sk files
Richard Westhaver <ellis@rwest.io>
parents: 587
diff changeset
152
   (add-to-list 'auto-mode-alist '("\\.sk" . skel-mode)))
20
ellis <ellis@rwest.io>
parents:
diff changeset
153
 
676
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
154
 (defun project-skelfile-path (&optional project)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
155
   "Find skelfile associated with PROJECT. Defaults to current
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
156
 directory and returns name of skelfile. When PROJECT is T uses
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
157
 `project-current'."
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
158
   (let* ((dir (unless (eql t project) (expand-file-name (or project default-directory))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
159
          (project-root (project-root (project-current nil dir))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
160
     (or
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
161
      (when dir
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
162
        (cl-find-if 
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
163
         (lambda (x)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
164
           (when (string-match
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
165
                  (rx (or "skelfile" (and (* any) ".sk")))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
166
                  (file-name-nondirectory x))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
167
             x))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
168
         (directory-files dir t)))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
169
      (when project
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
170
        (cl-find-if (lambda (x)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
171
                      (when (string-match (rx (or "skelfile" (and (* any) ".sk")))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
172
                                          (file-name-nondirectory x))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
173
                        x))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
174
                    (directory-files project-root t))))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
175
 
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
176
 (defun read-skelfile-bind (&optional project)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
177
   (let ((buffer (find-file-noselect (project-skelfile-path project))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
178
     (with-current-buffer buffer
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
179
       (goto-char (point-min))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
180
       (goto-char (search-forward-regexp (rx bol ":bind" (* space))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
181
       (read buffer))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
182
 
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
183
 (defun project-skelfile-dir-locals (&optional project)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
184
   "Return a list of dir-local bindings from a skelfile."
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
185
   (let ((form (read-skelfile-bind project)))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
186
     (cl-loop for f in form
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
187
              do (cond
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
188
                  ((eql (car f) :dir-locals) (cl-return (cdr f)))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
189
                  ;; when used as second element, the first is the name
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
190
                  ;; of the CL-local binding, here we discard it and
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
191
                  ;; just take the CDDR.
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
192
                  ((eql (cadr f) :dir-locals) (cl-return (cddr f)))))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
193
 
673
e052bac27cec prep for hacking dir-locals
Richard Westhaver <ellis@rwest.io>
parents: 670
diff changeset
194
 (defun skel-dir-local--get-variables ()
e052bac27cec prep for hacking dir-locals
Richard Westhaver <ellis@rwest.io>
parents: 670
diff changeset
195
   "Compute and return the list of :DIR-LOCAL bindings found in the current
e052bac27cec prep for hacking dir-locals
Richard Westhaver <ellis@rwest.io>
parents: 670
diff changeset
196
 project's skelfile, if any. Typically added to
e052bac27cec prep for hacking dir-locals
Richard Westhaver <ellis@rwest.io>
parents: 670
diff changeset
197
 `hack-dir-local--get-variables'."
676
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
198
   (let ((root (project-root (project-current))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
199
     (cons (expand-file-name root) (project-skelfile-dir-locals root))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
200
 
677
Richard Westhaver <ellis@rwest.io>
parents: 676
diff changeset
201
 (defun skel-dir-local-get-variables ()
676
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
202
   (let ((root (expand-file-name (project-root (project-current)))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
203
     (unless (assoc-string root dir-locals-class-alist)
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
204
       (push (skel-dir-local--get-variables) dir-locals-class-alist))))
ca09f470abb3 rm dir-locals and makefile, added dir-locals hacks in sk.el
Richard Westhaver <ellis@rwest.io>
parents: 673
diff changeset
205
 
677
Richard Westhaver <ellis@rwest.io>
parents: 676
diff changeset
206
 ;; (add-hook 'skel-minor-mode-hook '%skel-dir-local--get-variables)
673
e052bac27cec prep for hacking dir-locals
Richard Westhaver <ellis@rwest.io>
parents: 670
diff changeset
207
 
20
ellis <ellis@rwest.io>
parents:
diff changeset
208
 (provide 'skel)
39
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
209
 (provide 'sk)
e87c995efea1 emacs config
ellis <ellis@rwest.io>
parents: 20
diff changeset
210
 ;;; sk.el ends here