X-Git-Url: https://git.distorted.org.uk/~mdw/skel/blobdiff_plain/441c920bb12f3a5c091383b8a7231511312b3479..0aece27bb1a3cc43d22fbcbb702595f6f2fc89f3:/skelrc diff --git a/skelrc b/skelrc index 4463427..00b4412 100644 --- a/skelrc +++ b/skelrc @@ -1,14 +1,44 @@ ;;; -*-emacs-lisp-*- +(defun skelrc-dribble (msg &rest args) + "Write MSG (a `format'-style string, with ARGS) to the debug buffer." + (let ((buffer (get-buffer "*skel-debug*"))) + (and buffer + (with-current-buffer buffer + (goto-char (point-max)) + (insert (apply #'format msg args) "\n"))))) + +(defun skelrc-strip-trailing-whitespace (string) + "Return STRING, but with trailing whitespace removed. + +Whitespace characters are those with space syntax." + (let ((i (1- (length string)))) + (while (and (>= i 0) (= (char-syntax (aref string i)) ? )) + (setq i (1- i))) + (substring string 0 (1+ i)))) + (defun skelrc-banner (title &optional block) + "Return a comment banner with the given TITLE, and maybe a BLOCK of text." (let* ((start (skel-lookup 'block-start)) (end (skel-lookup (if block 'block-banner-knob 'block-banner-end))) (barlen (- 77 (length (concat start end " ----- " title))))) - (concat start "----- " title " " (make-string barlen ?-) end))) + (skelrc-strip-trailing-whitespace (concat start + "----- " + title + " " + (make-string barlen ?-) + end)))) -(defvar skelrc-forced-major-mode 0) +(defvar skelrc-forced-major-mode 0 + "The priority of the currently forced major mode") (defun skelrc-force-mode (new-mode &optional priority) + "Force the use of major mode NEW-MODE. + +If the PRIORITY (defaults to 1) is strictly greater than +`skelrc-forced-major-mode' then the NEW-MODE takes precedence. A `skelrc' +file which wants to delegate settings to another file should therefore force +its chosen major-mode before calling `skel-include'." (or priority (setq priority 1)) (if (> priority skelrc-forced-major-mode) (progn @@ -21,83 +51,208 @@ (setq skelrc-forced-major-mode priority)))) (defun skelrc-decode-major-mode () + "Return the mode dropping to put in a local-variables line." (let* ((name (symbol-name major-mode)) (endind (string-match "-mode$" name))) (if endind (substring name 0 endind) (name)))) -(defun skelrc-assq (key list) - (let ((val (assq key list))) +(defun skelrc-assq (key alist) + "Pick out the value associated with KEY in ALIST (rather than the cons)." + (let ((val (assq key alist))) (and val (cdr val)))) +(defun skelrc-expand-text (text) + "Return the result of expanding TEXT in the current context. + +The context is extended with any new associations formed during +the expansion." + (let* ((alist skel-alist) + (expanded (with-temp-buffer + (let ((skel-alist alist)) + (insert text) + (goto-char (point-min)) + (skelrc-dribble "before: alist = `%s'" skel-alist) + (skel-do-fill-in) + (setq alist skel-alist) + (buffer-string))))) + (setq skel-alist alist) + expanded)) + +(defun skelrc-prefix-lines (prefix lines) + "Return LINES, each with PREFIX prepended to the beginning. + +If the LINES end with a newline character, there is not considered to be a +final empty line. When prepended to an empty line, trailing whitespace in +the PREFIX is removed." + (with-temp-buffer + (insert lines) + (goto-char (point-min)) + (while (< (point) (point-max)) + (insert prefix) + (and (looking-at "\n") + (delete-horizontal-space t)) + (forward-line)) + (buffer-string))) + +(defun skelrc-prefix-and-reflow (prefix text) + "Return LINES, reflowed to `fill-column', with PREFIX at the start." + (let ((expanded-prefix (skelrc-expand-text prefix)) + (expanded-text (skelrc-expand-text text)) + (col (string-to-number (skel-lookup 'fill-column)))) + (with-temp-buffer + (let* ((fill-prefix expanded-prefix) + (paragraph-start (concat (skelrc-strip-trailing-whitespace + (regexp-quote expanded-prefix)) + "[ \t\f]*$")) + (paragraph-separate paragraph-start) + (fill-column (+ col (length expanded-prefix)))) + + (insert (skelrc-prefix-lines expanded-prefix expanded-text)) + + (goto-char (point-min)) + (while (< (point) (point-max)) + (fill-paragraph) + (forward-paragraph)) + + (buffer-string))))) + (defun skelrc-component () + "Return a suitable a `This file is part of ...' line." (if (assq 'full-title skel-alist) "[[cont-comment]] This file is part of [[full-title]]. -[[cont-comment]]\n" +\[[cont-comment]]\n" "")) -(setq skelrc-gpl -"[[cont-comment]] [[Program-name]] is free software; you can redistribute it and/or modify -[[cont-comment]] it under the terms of the GNU General Public License as published by -[[cont-comment]] the Free Software Foundation; either version 2 of the License, or -[[cont-comment]] (at your option) any later version. -[[cont-comment]] -[[cont-comment]] [[Program-name]] is distributed in the hope that it will be useful, -[[cont-comment]] but WITHOUT ANY WARRANTY; without even the implied warranty of -[[cont-comment]] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -[[cont-comment]] GNU General Public License for more details. -[[cont-comment]] -[[cont-comment]] You should have received a copy of the GNU General Public License -[[cont-comment]] along with [[program-name]]; if not, write to the Free Software Foundation, -[[cont-comment]] Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.") - -(setq skelrc-lgpl -"[[cont-comment]] [[Library-name]] is free software; you can redistribute it and/or modify -[[cont-comment]] it under the terms of the GNU Library General Public License as -[[cont-comment]] published by the Free Software Foundation; either version 2 of the -[[cont-comment]] License, or (at your option) any later version. -[[cont-comment]] -[[cont-comment]] [[Library-name]] is distributed in the hope that it will be useful, -[[cont-comment]] but WITHOUT ANY WARRANTY; without even the implied warranty of -[[cont-comment]] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -[[cont-comment]] GNU Library General Public License for more details. -[[cont-comment]] -[[cont-comment]] You should have received a copy of the GNU Library General Public -[[cont-comment]] License along with [[library-name]]; if not, write to the Free Software -[[cont-comment]] Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.") +(defun skelrc-generic-gpl (&rest params) + (setq skel-alist (append params skel-alist)) + (skelrc-prefix-and-reflow "[[cont-comment]] " +"[[Short-name]] is free software: you can redistribute it and/or +modify it under the terms of the GNU \[[gpl-qualifiers]]General +Public License as published by the Free Software Foundation; +either version [[gpl-version]] of the License, or (at your +option) any later version. + +\[[Short-name]] 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 +\[[gpl-qualifiers]]General Public License for more details. + +You should have received a copy of the GNU +\[[gpl-qualifiers]]General Public License along with +\[[short-name]]. If not, [[gpl-find-licence]]")) + +(setq skelrc-bsd (skelrc-prefix-lines "[[cont-comment]] " +"Copyright (c) [[year]] [[author]] +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2, Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the authors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +\(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Instead of accepting the above terms, you may redistribute and/or modify +this software under the terms of either the GNU General Public License, +or the GNU Library General Public License, published by the Free +Software Foundation; either version 2 of the License, or (at your +option) any later version.")) (defun skel-basename () (file-name-sans-extension (file-name-nondirectory buffer-file-name))) (setq skel-alist (append - '((emacs-mode . (skelrc-decode-major-mode)) + `((first-line . "[[new-comment]] -*-[[emacs-mode]]-*-") + (emacs-mode . (skelrc-decode-major-mode)) (year . (substring (current-time-string) 20 24)) - (header . "[[licence]][[revisions]][[preamble]]") + (header . "[[licence]][[preamble]]") (basename . (skel-basename)) - (licence . "[[licence-banner]]\n[[cont-comment]]\n[[component]][[licence-text]][[block-end]]\n\n") + (licence . ,(concat "[[licence-banner]]\n" + "[[cont-comment]]\n" + "[[component]][[licence-text]]" + "[[block-end]]\n\n")) (licence-banner . (skelrc-banner "Licensing notice" t)) (component . (skelrc-component)) (licence-text . "[[gpl]]") - (Program-name . (or (skelrc-assq 'Program skel-alist) - (skelrc-assq 'program skel-alist) - "This program")) - (program-name . (or (skelrc-assq 'program skel-alist) - "this program")) - (Library-name . (or (skelrc-assq 'Library skel-alist) - (skelrc-assq 'library skel-alist) - (skelrc-assq 'Program skel-alist) - (skelrc-assq 'program skel-alist) - "This library")) - (library-name . (or (skelrc-assq 'library skel-alist) - (skelrc-assq 'program skel-alist) - "this library")) - (gpl . skelrc-gpl) - (lgpl . skelrc-lgpl) - (revisions . "[[revision-banner]]\n[[cont-comment]]\n[[cont-comment]] $Log$[[block-end]]\n\n") + (fill-column . "70") + (Short-name . (or (skelrc-assq 'Library skel-alist) + (skelrc-assq 'library skel-alist) + (skelrc-assq 'Program skel-alist) + (skelrc-assq 'program skel-alist) + "This [[thing]]")) + (short-name . (or (skelrc-assq 'library skel-alist) + (skelrc-assq 'program skel-alist) + "this [[thing]]")) + (generic-gpl . (skelrc-generic-gpl)) + (gnu-temple-place . (concat "write to the " + "Free Software Foundation, Inc., " + "59 Temple Place - Suite 330, " + "Boston, MA 02111-1307, USA.")) + (gnu-website . "see .") + (gpl-2 . (skelrc-generic-gpl '(gpl-version . "2") + '(gpl-qualifiers . "") + '(gpl-find-licence + . "[[gnu-temple-place]]") + '(thing . "program"))) + (gpl-3 . (skelrc-generic-gpl '(gpl-version . "3") + '(gpl-qualifiers . "") + '(gpl-find-licence + . "[[gnu-website]]") + '(thing . "program"))) + (lgpl-2 . (skelrc-generic-gpl '(gpl-version . "2") + '(gpl-qualifiers . "Library ") + '(gpl-find-licence + . "[[gnu-temple-place]]") + '(thing . "library"))) + (lgpl-2.1 . (skelrc-generic-gpl '(gpl-version . "2.1") + '(gpl-qualifiers . "Lesser ") + '(gpl-find-licence + . "[[gnu-temple-place]]") + '(thing . "library"))) + (lgpl-3 . (skelrc-generic-gpl '(gpl-version . "3") + '(gpl-qualifiers . "Lesser ") + '(gpl-find-licence + . "[[gnu-website]]") + '(thing . "library"))) + (agpl-3 . (skelrc-generic-gpl '(gpl-version . "3") + '(gpl-qualifiers . "Affero ") + '(gpl-find-licence + . "[[gnu-website]]") + '(thing . "program"))) + (gpl . "[[gpl-2]]") + (wide-gpl . "[[gpl-2]]") + (lgpl . "[[lgpl-2]]") + (agpl . "[[agpl-3]]") + (bsd . skelrc-bsd) + (revisions . ,(concat "[[revision-banner]]\n" + "[[cont-comment]]\n" + "[[cont-comment]] $Log$" + "[[block-end]]\n\n")) (revision-banner . (skelrc-banner "Revision history" t)) (preamble . "") - (trailer . "[[tag-line]][[postamble]]\n") + (trailer . "[[tag-line]]\n[[postamble]]") (postamble . "") (tag-line . (skelrc-banner "That's all, folks")) (block-start . (skel-lookup 'new-comment))