+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The following defines an association list for text to be
+;; automatically inserted when a new file is created, and a function
+;; which automatically inserts these files; the idea is to insert
+;; default text much as the mode is automatically set using
+;; auto-mode-alist.
+;;
+;; To use:
+;; (add-hook 'find-file-hook 'auto-insert)
+;; setq auto-insert-directory to an appropriate slash-terminated value
+;;
+;; You can also customize the variable `auto-insert-mode' to load the
+;; package. Alternatively, add the following to your .emacs file:
+;; (auto-insert-mode 1)
+;;
+;; Author: Charlie Martin
+;; Department of Computer Science and
+;; National Biomedical Simulation Resource
+;; Box 3709
+;; Duke University Medical Center
+;; Durham, NC 27710
+;; (crm@cs.duke.edu,mcnc!duke!crm)
+
+;;; Code:
+
+(defgroup auto-insert nil
+ "Automatic mode-dependent insertion of text into new files."
+ :prefix "auto-insert-"
+ :group 'files
+ :group 'convenience)
+
+
+(defcustom auto-insert 'not-modified
+ "*Controls automatic insertion into newly found empty files.
+Possible values:
+ nil do nothing
+ t insert if possible
+ other insert if possible, but mark as unmodified.
+Insertion is possible when something appropriate is found in
+`auto-insert-alist'. When the insertion is marked as unmodified, you can
+save it with \\[write-file] RET.
+This variable is used when the function `auto-insert' is called, e.g.
+when you do (add-hook 'find-file-hook 'auto-insert).
+With \\[auto-insert], this is always treated as if it were t."
+ :type '(choice (const :tag "Insert if possible" t)
+ (const :tag "Do nothing" nil)
+ (other :tag "insert if possible, mark as unmodified."
+ not-modified))
+ :group 'auto-insert)
+
+(defcustom auto-insert-query 'function
+ "*Non-nil means ask user before auto-inserting.
+When this is `function', only ask when called non-interactively."
+ :type '(choice (const :tag "Don't ask" nil)
+ (const :tag "Ask if called non-interactively" function)
+ (other :tag "Ask" t))
+ :group 'auto-insert)
+
+(defcustom auto-insert-prompt "Perform %s auto-insertion? "
+ "*Prompt to use when querying whether to auto-insert.
+If this contains a %s, that will be replaced by the matching rule."
+ :type 'string
+ :group 'auto-insert)
+
+
+(defcustom auto-insert-alist
+ '((("\\.\\([Hh]\\|hh\\|hpp\\)\\'" . "C / C++ header")
+ (upcase (concat (file-name-nondirectory
+ (substring buffer-file-name 0 (match-beginning 0)))
+ "_"
+ (substring buffer-file-name (1+ (match-beginning 0)))))
+ "#ifndef " str \n
+ "#define " str "\n\n"
+ _ "\n\n#endif")
+
+ (("\\.\\([Cc]\\|cc\\|cpp\\)\\'" . "C / C++ program")
+ nil
+ "#include \""
+ (let ((stem (file-name-sans-extension buffer-file-name)))
+ (cond ((file-exists-p (concat stem ".h"))
+ (file-name-nondirectory (concat stem ".h")))
+ ((file-exists-p (concat stem ".hh"))
+ (file-name-nondirectory (concat stem ".hh")))))
+ & ?\" | -10)
+
+ (("[Mm]akefile\\'" . "Makefile") . "makefile.inc")
+
+ (html-mode . (lambda () (sgml-tag "html")))
+
+ (plain-tex-mode . "tex-insert.tex")
+ (bibtex-mode . "tex-insert.tex")
+ (latex-mode
+ ;; should try to offer completing read for these
+ "options, RET: "
+ "\\documentclass[" str & ?\] | -1
+ ?{ (read-string "class: ") "}\n"
+ ("package, %s: "
+ "\\usepackage[" (read-string "options, RET: ") & ?\] | -1 ?{ str "}\n")
+ _ "\n\\begin{document}\n" _
+ "\n\\end{document}")
+
+ (("/bin/.*[^/]\\'" . "Shell-Script mode magic number")
+ lambda ()
+ (if (eq major-mode default-major-mode)
+ (sh-mode)))
+
+ (ada-mode . ada-header)
+
+ (("\\.[1-9]\\'" . "Man page skeleton")
+ "Short description: "
+ ".\\\" Copyright (C), " (substring (current-time-string) -4) " "
+ (getenv "ORGANIZATION") | (progn user-full-name)
+ "
+.\\\" You may distribute this file under the terms of the GNU Free
+.\\\" Documentation License.
+.TH " (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
+ " " (file-name-extension (buffer-file-name))
+ " " (format-time-string "%Y-%m-%d ")
+ "\n.SH NAME\n"
+ (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
+ " \\- " str
+ "\n.SH SYNOPSIS
+.B " (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
+ "\n"
+ _
+ "
+.SH DESCRIPTION
+.SH OPTIONS
+.SH FILES
+.SH \"SEE ALSO\"
+.SH BUGS
+.SH AUTHOR
+" (user-full-name)
+ '(if (search-backward "&" (line-beginning-position) t)
+ (replace-match (capitalize (user-login-name)) t t))
+ '(end-of-line 1) " <" (progn user-mail-address) ">\n")
+
+ (("\\.el\\'" . "Emacs Lisp header")
+ "Short description: "
+ ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str "
+
+;; Copyright (C) " (substring (current-time-string) -4) " "
+ (getenv "ORGANIZATION") | (progn user-full-name) "
+
+;; Author: " (user-full-name)
+'(if (search-backward "&" (line-beginning-position) t)
+ (replace-match (capitalize (user-login-name)) t t))
+'(end-of-line 1) " <" (progn user-mail-address) ">
+;; Keywords: "
+ '(require 'finder)
+ ;;'(setq v1 (apply 'vector (mapcar 'car finder-known-keywords)))
+ '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x))))
+ finder-known-keywords)
+ v2 (mapconcat (lambda (x) (format "%10.0s: %s" (car x) (cdr x)))
+ finder-known-keywords
+ "\n"))
+ ((let ((minibuffer-help-form v2))
+ (completing-read "Keyword, C-h: " v1 nil t))
+ str ", ") & -2 "
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file 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.
+