X-Git-Url: https://git.distorted.org.uk/~mdw/skel/blobdiff_plain/7fb0878b62328fd3bf80e2142a5d68b314105eb1..0aece27bb1a3cc43d22fbcbb702595f6f2fc89f3:/skel.el.in diff --git a/skel.el.in b/skel.el.in index d409011..b56afe0 100644 --- a/skel.el.in +++ b/skel.el.in @@ -1,7 +1,5 @@ ;;; -*-emacs-lisp-*- ;;; -;;; $Id: skel.el.in,v 1.1 1999/04/05 13:44:59 mdw Exp $ -;;; ;;; Filling in skeletons ;;; ;;; (c) 1998 Mark Wooding @@ -13,43 +11,37 @@ ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2 of the License, or ;;; (at your option) any later version. -;;; +;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. -;;; +;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program; if not, write to the Free Software Foundation, ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -;;;----- Revision history --------------------------------------------------- -;;; -;;; $Log: skel.el.in,v $ -;;; Revision 1.1 1999/04/05 13:44:59 mdw -;;; Initial revision -;;; - ;;;----- Variables (largely tweakable) -------------------------------------- (defvar skel-directory-list '(".skel" "") "*List of directory names which contain skeleton files.") -(defvar skel-skeleton-path '("@skeldir@" "~/skel" "~/src/skel") +(defvar skel-skeleton-path '("/etc/skel" "@skeldir@" "~/skel" "~/src/skel") "*List of directories to search for skeleton data anyway.") (defvar skel-skelrc '(".skelrc" "skelrc") "*File containing skeleton substitution data, looked up using the standard -skeleton search mathod.") + skeleton search mathod.") (defvar skel-alist '() "Alist of values to substitute into a skeleton. It is filled in by skelrc -files and user interaction. + files and user interaction. -The alist's keys are symbols, interned from the placeholder strings in the -skeleton file. The values are forms to be evaluated. In the simplest case, -the form is a string added as a result of user interaction; however, it could -just as easily be a function call or something similarly complicated.") + The alist's keys are symbols, interned from the placeholder strings in the + skeleton file. The values are forms to be evaluated. In the simplest + case, the form is a string added as a result of user interaction; however, + it could just as easily be a function call or something similarly + complicated.") ;;;----- Finding skeleton files --------------------------------------------- @@ -65,8 +57,8 @@ just as easily be a function call or something similarly complicated.") (defun skel-join (jfun base &rest ll) "Return a list built from joining elements from the given lists in order, -left to right. JFUN is a function of two arguments which can join items -together. BASE is the initial item." + left to right. JFUN is a function of two arguments which can join items + together. BASE is the initial item." (nreverse (skel-do-join nil jfun ll base))) (defun skel-do-parents (dir acc) @@ -79,7 +71,7 @@ together. BASE is the initial item." (defun skel-parents (dir) "Returns a list of DIR, DIR's parent directory, etc., all the way up to the -root." + root." (setq dir (expand-file-name dir)) (nreverse (skel-do-parents dir nil))) @@ -88,29 +80,32 @@ root." (let ((n (car l))) (if (and (file-readable-p n) (file-regular-p n)) (if all - (skel-do-find (cdr l) all (cons (abbreviate-file-name n) acc)) + (skel-do-find (cdr l) + all + (cons (abbreviate-file-name n) acc)) (abbreviate-file-name n)) (skel-do-find (cdr l) all acc))) acc)) (defun skel-find-skeleton (name &optional all acc) - "Searches for skeleton files. NAME is the name of the file to find, or -a list of possible names. + "Searches for skeleton files. NAME is the name of the file to find, or a + list of possible names. -If ALL is nil, or omitted, return only the first matching filename -encountered. Otherwise, return a list of all matching names, most `global' -first. ACC is a base list to which the matching filenames are prepended." + If ALL is nil, or omitted, return only the first matching filename + encountered. Otherwise, return a list of all matching names, most + `global' first. ACC is a base list to which the matching filenames are + prepended." ;; --- Build one big list of all the possible names --- - (let ((l (skel-join (lambda (x y) (if (string= y "") - x - (expand-file-name y x))) + (let ((l (skel-join #'(lambda (x y) (if (string= y "") + x + (expand-file-name y x))) nil (append (skel-parents default-directory) skel-skeleton-path) skel-directory-list - (if (listp name) name (cons name nil))))) + (if (consp name) name (cons name nil))))) ;; --- Now filter out any which aren't interesting --- @@ -128,7 +123,7 @@ first. ACC is a base list to which the matching filenames are prepended." (defun skel-lookup (name) "Reads the value of symbol NAME in skel-alist. If there is no currrent -value, the user is prompted for one." + value, the user is prompted for one." ;; --- Resolve NAME into a symbol --- @@ -143,20 +138,22 @@ value, the user is prompted for one." (let ((pair (assq name skel-alist)) value) (if pair - (save-match-data (setq value (eval (cdr pair)))) + (setq value (eval (cdr pair))) (setq value (read-string (format "Value for %s: " name))) (setq skel-alist (cons (cons name value) skel-alist))) value)) (defun skel-do-fill-in () "Does the actual donkey-work of filling in a file. For each fill-in area -in the current buffer, the function looks to see if the item in question has -been entered into ALIST: if so, it is replaced automatically; otherwise the -user is promted to enter a string to substitute into the buffer at this -point." + in the current buffer, the function looks to see if the item in question + has been entered into ALIST: if so, it is replaced automatically; + otherwise the user is promted to enter a string to substitute into the + buffer at this point." (if (re-search-forward "\\[\\[\\([^]]*\\)\\]\\]" nil t) (progn - (replace-match (skel-lookup (match-string 1)) t t nil) + (replace-match (save-match-data + (skel-lookup (match-string 1))) + t t nil) (goto-char (match-beginning 0)) (skel-do-fill-in)))) @@ -165,13 +162,13 @@ point." (defun skel-do-create-file (name switch &optional skel) "Does the main work of creating a file based on a skeleton. The SWITCH -argument is called to display the buffer." + argument is called to display the buffer." ;; --- Some local variables --- ;; ;; This is a little bit of a hack, but do I look like someone who cares? - (let (ext rc) + (let (ext) ;; --- Find out if the file's there already --- @@ -201,7 +198,7 @@ argument is called to display the buffer." (funcall switch (find-file-noselect name)) (kill-region (point-min) (point-max)) - (insert-file skel) + (insert-file-contents skel) ;; --- Mangle the skeleton data in the file --- @@ -215,7 +212,7 @@ argument is called to display the buffer." (and ext (skel-find-skeleton (if (listp skel-skelrc) - (mapcar (lambda (x) (concat x ext)) skel-skelrc) + (mapcar #'(lambda (x) (concat x ext)) skel-skelrc) (concat skel-skelrc ext)) t))))) (while rc @@ -231,9 +228,9 @@ argument is called to display the buffer." (defun skel-create-file (name &optional skel) "Creates a new file called NAME and visits it. If SKEL is non-`nil', it is -the name of a skeleton file to insert and substitute. Otherwise the skeleton -file's name is derived from NAME by taking NAME's extension and appending it -to `skel'." + the name of a skeleton file to insert and substitute. Otherwise the + skeleton file's name is derived from NAME by taking NAME's extension and + appending it to `skel'." (interactive "FSkeleton create file: \nP") (skel-do-create-file name 'switch-to-buffer skel)) @@ -241,7 +238,7 @@ to `skel'." "Like skel-create-file, but in another window." (interactive "FSkeleton create file in other window: \nP") (skel-do-create-file name 'switch-to-buffer-other-window skel)) - + (defun skel-create-file-other-frame (name &optional skel) "Like skel-create-file, but in another frame." (interactive "FSkeleton create file in other frame: \nP")