crm@duke.cs.duke.edu (Charlie Martin) (07/02/88)
I don't know about you, but I find that I usually have an idiosyncratic collection of things that I ALWAYS (well, nearly always, close enough) include in certain files. For example, my makefiles always include something like # # $Header$ # $Log$ # # Local Variables: # mode: fundamental # fill-column: 75 # comment-start: "# " # comment-end: "\n" # End: Similarly, my C files always have the same old stuff in them, prologues etc. I keep these things in an include directory, and have been inserting them in the file with C-Xi. This small elisp brick eliminates the necessity; it provides a function "include-auto-include-files" which can be made part of the find-file-not-found-hooks list. When an "auto-include-alist" is set up, and include-auto-include-files is in the find-file-not-found-hooks list, then the appropriate file is included automatically. Setup: in .emacs (load "autoinclude") (setq find-file-not-found-hooks '(include-auto-include-files)) (setq auto-include-directory "/usr/nbsr/crm/include/") This works for me; let me know if you-all find any bugs. Also, this is one of my first serious LISPs; if any wizards want to tell me what is stylistically wrong, I'd be glad to listen. ------------------------------ cut here ------------------------------ ;;; Make this -*-emacs-lisp-*- mode, please. ;;; autoinclude.el ;;;+ ------------------------------------------------------------ ;;; Abstract: ;;; ;;; The following defines an association list for files to be ;;; automatically included when a new file is created, and a function ;;; which automatically inserts these files; the idea is to include ;;; default files much as the mode is automatically set using ;;; auto-mode-alist. ;;; ;;; The auto-include-alist consists of dotted pairs of ;;; ( REGEXP . FILENAME ) where REGEXP is a regular expression, and ;;; FILENAME is the file name of a file which is to be included into ;;; all new files matching the regular expression with which it is ;;; paired. ;;; ;;; To use: ;;; load autoinclude.el ;;; setq auto-include-directory to an appropriate value, which ;;; must end in "/" ;;; set the find-file-not-found-hooks list to include ;;; (include-auto-include-files) ;;; ;;; Author: Charlie Martin ;;; Department of Computer Science and ;;; National Biomedical Simulation Resource ;;; Box 3709 ;;; Duke University Medical Center ;;; Durham, NC 27710 ;;; ;;; Date: Fri Jul 1 16:15:31 EDT 1988 ;;; ;;; Copyright (c) 1988 Charles R. Martin ;;; ;;; Copying is permitted under those conditions described by the GNU ;;; Emacs General Public License as clarified 11 February 1988, which ;;; is incorporated here by reference. ;;; ;;;- ------------------------------------------------------------ ;;; Define the auto-include-alist (defvar auto-include-alist nil "\ Alist of file name patterns and corresponding include files for creation of new files. The include files are standard file headers or trailers found at \"auto-include-file-path\". Each element looks like (REGEXP . FILENAME). Creating a file whose name matches REGEXP causes FILENAME to be included.") (setq auto-include-alist (mapcar 'purecopy '(("\\.tex$" . "tex-include.tex") ("\\.c$" . "c-include.c") ("\\.h$" . "h-include.c") ("[Mm]akefile" . "makefile.inc") ("\\.bib$" . "tex-include.tex")))) ;;; Establish a default value for auto-include-directory (defvar auto-include-directory nil "\ Directory from which auto-included files are taken.") (setq auto-include-directory ".") ;;; Include the file if name match found in auto-include-alist. ;;; Uses buffer-file-name, searches auto-include-alist for a matching ;;; REGEXP, then does 'insert-file' to include that file. ;;; (defun include-auto-include-files () "Include the file from the include directory if regexp match found in auto-include-alist. Silently terminates if the file name matches none of the regular expressions." (let ((alist auto-include-alist) (name buffer-file-name) (include-file nil)) ;; remove backup suffixes from file name (setq name (file-name-sans-versions name)) ;; find first matching alist entry (while (and (not include-file) alist) (if (string-match (car (car alist)) name) (setq include-file (cdr (car alist))) (setq alist (cdr alist)))) ;; Now, if we found an appropriate include file, include it (if include-file (let ((file (concat auto-include-directory include-file))) (if (file-readable-p file) (insert-file file) (message "Auto-include: file %s not found")))))) ;;; ;;; End of file ;;; ------------------------------------------------------------ -- Charlie Martin (crm@cs.duke.edu,mcnc!duke!crm)