Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / lisp / autoinsert.el
CommitLineData
c0274f38 1;;; autoinsert.el --- automatic mode-dependent insertion of text into new files
b578f267 2
acaf905b 3;; Copyright (C) 1985-1987, 1994-1995, 1998, 2000-2012
95df8112 4;; Free Software Foundation, Inc.
9750e079 5
e5167999 6;; Author: Charlie Martin <crm@cs.duke.edu>
3e910376 7;; Adapted-By: Daniel Pfeiffer <occitan@esperanto.org>
f5f727f8 8;; Keywords: convenience
4228277d 9;; Maintainer: FSF
b1d6ae0b
JB
10
11;; This file is part of GNU Emacs.
12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
b1d6ae0b 14;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
b1d6ae0b
JB
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
eb3fa2cf 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
b1d6ae0b 25
e5167999 26;;; Commentary:
b1d6ae0b 27
c11af8a5
KH
28;; The following defines an association list for text to be
29;; automatically inserted when a new file is created, and a function
30;; which automatically inserts these files; the idea is to insert
31;; default text much as the mode is automatically set using
32;; auto-mode-alist.
33;;
12394086 34;; To use:
a702ffbb 35;; (add-hook 'find-file-hook 'auto-insert)
c11af8a5
KH
36;; setq auto-insert-directory to an appropriate slash-terminated value
37;;
6c5b39e4
SE
38;; You can also customize the variable `auto-insert-mode' to load the
39;; package. Alternatively, add the following to your .emacs file:
40;; (auto-insert-mode 1)
41;;
c11af8a5
KH
42;; Author: Charlie Martin
43;; Department of Computer Science and
44;; National Biomedical Simulation Resource
45;; Box 3709
46;; Duke University Medical Center
47;; Durham, NC 27710
12394086 48;; (crm@cs.duke.edu,mcnc!duke!crm)
b1d6ae0b 49
e5167999
ER
50;;; Code:
51
6c5b39e4
SE
52(defgroup auto-insert nil
53 "Automatic mode-dependent insertion of text into new files."
54 :prefix "auto-insert-"
f5f727f8 55 :group 'files
b1d4664a
JB
56 :group 'convenience
57 :link '(custom-manual "(autotype) Autoinserting"))
6c5b39e4
SE
58
59
6c5b39e4 60(defcustom auto-insert 'not-modified
9201cc28 61 "Controls automatic insertion into newly found empty files.
12394086 62Possible values:
c11af8a5
KH
63 nil do nothing
64 t insert if possible
65 other insert if possible, but mark as unmodified.
66Insertion is possible when something appropriate is found in
67`auto-insert-alist'. When the insertion is marked as unmodified, you can
68save it with \\[write-file] RET.
a461758e 69This variable is used when the function `auto-insert' is called, e.g.
a702ffbb 70when you do (add-hook 'find-file-hook 'auto-insert).
12394086 71With \\[auto-insert], this is always treated as if it were t."
4605a50d
DL
72 :type '(choice (const :tag "Insert if possible" t)
73 (const :tag "Do nothing" nil)
12394086 74 (other :tag "insert if possible, mark as unmodified."
4605a50d 75 not-modified))
6c5b39e4 76 :group 'auto-insert)
c11af8a5 77
6c5b39e4 78(defcustom auto-insert-query 'function
9201cc28 79 "Non-nil means ask user before auto-inserting.
6c5b39e4 80When this is `function', only ask when called non-interactively."
5c213454
AS
81 :type '(choice (const :tag "Don't ask" nil)
82 (const :tag "Ask if called non-interactively" function)
83 (other :tag "Ask" t))
6c5b39e4 84 :group 'auto-insert)
c11af8a5 85
6c5b39e4 86(defcustom auto-insert-prompt "Perform %s auto-insertion? "
9201cc28 87 "Prompt to use when querying whether to auto-insert.
6c5b39e4
SE
88If this contains a %s, that will be replaced by the matching rule."
89 :type 'string
90 :group 'auto-insert)
c11af8a5
KH
91
92
6c5b39e4 93(defcustom auto-insert-alist
c11af8a5
KH
94 '((("\\.\\([Hh]\\|hh\\|hpp\\)\\'" . "C / C++ header")
95 (upcase (concat (file-name-nondirectory
a3610f0c 96 (file-name-sans-extension buffer-file-name))
c11af8a5 97 "_"
a3610f0c 98 (file-name-extension buffer-file-name)))
c11af8a5
KH
99 "#ifndef " str \n
100 "#define " str "\n\n"
101 _ "\n\n#endif")
102
103 (("\\.\\([Cc]\\|cc\\|cpp\\)\\'" . "C / C++ program")
104 nil
105 "#include \""
f6ec1532
RS
106 (let ((stem (file-name-sans-extension buffer-file-name)))
107 (cond ((file-exists-p (concat stem ".h"))
108 (file-name-nondirectory (concat stem ".h")))
109 ((file-exists-p (concat stem ".hh"))
110 (file-name-nondirectory (concat stem ".hh")))))
111 & ?\" | -10)
112
113 (("[Mm]akefile\\'" . "Makefile") . "makefile.inc")
c11af8a5 114
d60ae75c 115 (html-mode . (lambda () (sgml-tag "html")))
71296446 116
c11af8a5
KH
117 (plain-tex-mode . "tex-insert.tex")
118 (bibtex-mode . "tex-insert.tex")
119 (latex-mode
120 ;; should try to offer completing read for these
121 "options, RET: "
47e58cf5 122 "\\documentclass[" str & ?\] | -1
c11af8a5
KH
123 ?{ (read-string "class: ") "}\n"
124 ("package, %s: "
125 "\\usepackage[" (read-string "options, RET: ") & ?\] | -1 ?{ str "}\n")
126 _ "\n\\begin{document}\n" _
127 "\n\\end{document}")
128
a6ed0e28
JL
129 (("/bin/.*[^/]\\'" . "Shell-Script mode magic number") .
130 (lambda ()
14acf2f5 131 (if (eq major-mode (default-value 'major-mode))
a6ed0e28 132 (sh-mode))))
71296446 133
c11af8a5
KH
134 (ada-mode . ada-header)
135
bf9f5c17
DL
136 (("\\.[1-9]\\'" . "Man page skeleton")
137 "Short description: "
138 ".\\\" Copyright (C), " (substring (current-time-string) -4) " "
12148b0e 139 (getenv "ORGANIZATION") | (progn user-full-name)
bf9f5c17
DL
140 "
141.\\\" You may distribute this file under the terms of the GNU Free
2201b59a 142.\\\" Documentation License.
bf9f5c17
DL
143.TH " (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
144 " " (file-name-extension (buffer-file-name))
145 " " (format-time-string "%Y-%m-%d ")
146 "\n.SH NAME\n"
147 (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
148 " \\- " str
149 "\n.SH SYNOPSIS
150.B " (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
151 "\n"
152 _
153 "
154.SH DESCRIPTION
155.SH OPTIONS
156.SH FILES
157.SH \"SEE ALSO\"
158.SH BUGS
159.SH AUTHOR
160" (user-full-name)
161 '(if (search-backward "&" (line-beginning-position) t)
162 (replace-match (capitalize (user-login-name)) t t))
163 '(end-of-line 1) " <" (progn user-mail-address) ">\n")
164
c11af8a5
KH
165 (("\\.el\\'" . "Emacs Lisp header")
166 "Short description: "
167 ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str "
168
2103c9fb 169;; Copyright (C) " (substring (current-time-string) -4) " "
fbee29e6 170 (getenv "ORGANIZATION") | (progn user-full-name) "
c11af8a5
KH
171
172;; Author: " (user-full-name)
a461758e 173'(if (search-backward "&" (line-beginning-position) t)
c11af8a5 174 (replace-match (capitalize (user-login-name)) t t))
c5f7d536 175'(end-of-line 1) " <" (progn user-mail-address) ">
c11af8a5
KH
176;; Keywords: "
177 '(require 'finder)
178 ;;'(setq v1 (apply 'vector (mapcar 'car finder-known-keywords)))
179 '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x))))
180 finder-known-keywords)
8ed6049f 181 v2 (mapconcat (lambda (x) (format "%12s: %s" (car x) (cdr x)))
c11af8a5
KH
182 finder-known-keywords
183 "\n"))
184 ((let ((minibuffer-help-form v2))
185 (completing-read "Keyword, C-h: " v1 nil t))
186 str ", ") & -2 "
187
88ddede6 188\;; This program is free software; you can redistribute it and/or modify
31b6b8cd 189\;; it under the terms of the GNU General Public License as published by
88ddede6
GM
190\;; the Free Software Foundation, either version 3 of the License, or
191\;; (at your option) any later version.
c11af8a5 192
88ddede6 193\;; This program is distributed in the hope that it will be useful,
31b6b8cd
SM
194\;; but WITHOUT ANY WARRANTY; without even the implied warranty of
195\;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
196\;; GNU General Public License for more details.
c11af8a5 197
31b6b8cd 198\;; You should have received a copy of the GNU General Public License
88ddede6 199\;; along with this program. If not, see <http://www.gnu.org/licenses/>.
c11af8a5 200
31b6b8cd 201\;;; Commentary:
c11af8a5 202
31b6b8cd 203\;; " _ "
c11af8a5 204
31b6b8cd 205\;;; Code:
c11af8a5
KH
206
207
208
3c98b2e9
SM
209\(provide '"
210 (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
211 ")
1caf5f96
GM
212\;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")
213 (("\\.texi\\(nfo\\)?\\'" . "Texinfo file skeleton")
214 "Title: "
215 "\\input texinfo @c -*-texinfo-*-
216@c %**start of header
217@setfilename "
218 (file-name-sans-extension
219 (file-name-nondirectory (buffer-file-name))) ".info\n"
220 "@settitle " str "
221@c %**end of header
222@copying\n"
223 (setq short-description (read-string "Short description: "))
224 ".\n\n"
225 "Copyright @copyright{} " (substring (current-time-string) -4) " "
226 (getenv "ORGANIZATION") | (progn user-full-name) "
227
228@quotation
229Permission is granted to copy, distribute and/or modify this document
d5259d01 230under the terms of the GNU Free Documentation License, Version 1.3
af8b50d1 231or any later version published by the Free Software Foundation;
d5259d01
GM
232with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
233A copy of the license is included in the section entitled ``GNU
af8b50d1 234Free Documentation License''.
1caf5f96
GM
235
236A copy of the license is also available from the Free Software
237Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
238
239@end quotation
240
241The document was typeset with
242@uref{http://www.texinfo.org/, GNU Texinfo}.
243
244@end copying
245
246@titlepage
247@title " str "
248@subtitle " short-description "
249@author " (getenv "ORGANIZATION") | (progn user-full-name)
250 " <" (progn user-mail-address) ">
251@page
252@vskip 0pt plus 1filll
253@insertcopying
254@end titlepage
255
256@c Output the table of the contents at the beginning.
257@contents
258
259@ifnottex
260@node Top
261@top " str "
262
263@insertcopying
264@end ifnottex
265
266@c Generate the nodes for this menu with `C-c C-u C-m'.
267@menu
268@end menu
269
270@c Update all node entries with `C-c C-u C-n'.
271@c Insert new nodes with `C-c C-c n'.
272@node Chapter One
273@chapter Chapter One
274
275" _ "
276
277@node Copying This Manual
278@appendix Copying This Manual
279
280@menu
281* GNU Free Documentation License:: License for copying this manual.
282@end menu
283
284@c Get fdl.texi from http://www.gnu.org/licenses/fdl.html
285@include fdl.texi
286
287@node Index
288@unnumbered Index
289
290@printindex cp
291
292@bye
293
294@c " (file-name-nondirectory (buffer-file-name)) " ends here\n"))
b1d6ae0b 295 "A list specifying text to insert by default into a new file.
c11af8a5 296Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION).
2a575769 297CONDITION may be a regexp that must match the new file's name, or it may be
c11af8a5
KH
298a symbol that must match the major mode for this element to apply.
299Only the first matching element is effective.
300Optional DESCRIPTION is a string for filling `auto-insert-prompt'.
301ACTION may be a skeleton to insert (see `skeleton-insert'), an absolute
302file-name or one relative to `auto-insert-directory' or a function to call.
303ACTION may also be a vector containing several successive single actions as
6c5b39e4
SE
304described above, e.g. [\"header.insert\" date-and-author-update]."
305 :type 'sexp
306 :group 'auto-insert)
b1d6ae0b 307
c11af8a5
KH
308
309;; Establish a default value for auto-insert-directory
6c5b39e4 310(defcustom auto-insert-directory "~/insert/"
9201cc28 311 "Directory from which auto-inserted files are taken.
87810ca9
RS
312The value must be an absolute directory name;
313thus, on a GNU or Unix system, it must end in a slash."
6c5b39e4
SE
314 :type 'directory
315 :group 'auto-insert)
b1d6ae0b 316
c11af8a5
KH
317
318;;;###autoload
319(defun auto-insert ()
a461758e 320 "Insert default contents into new files if variable `auto-insert' is non-nil.
b1d6ae0b 321Matches the visited file name against the elements of `auto-insert-alist'."
c11af8a5
KH
322 (interactive)
323 (and (not buffer-read-only)
324 (or (eq this-command 'auto-insert)
325 (and auto-insert
326 (bobp) (eobp)))
327 (let ((alist auto-insert-alist)
328 case-fold-search cond desc action)
329 (goto-char 1)
330 ;; find first matching alist entry
331 (while alist
332 (if (atom (setq cond (car (car alist))))
333 (setq desc cond)
334 (setq desc (cdr cond)
335 cond (car cond)))
336 (if (if (symbolp cond)
337 (eq cond major-mode)
a461758e
DL
338 (and buffer-file-name
339 (string-match cond buffer-file-name)))
c11af8a5
KH
340 (setq action (cdr (car alist))
341 alist nil)
342 (setq alist (cdr alist))))
343
344 ;; Now, if we found something, do it
345 (and action
bdaf166c
SM
346 (or (not (stringp action))
347 (file-readable-p (expand-file-name
348 action auto-insert-directory)))
349 (or (not auto-insert-query)
350 (if (eq auto-insert-query 'function)
351 (eq this-command 'auto-insert))
352 (y-or-n-p (format auto-insert-prompt desc)))
6fd09e19 353 (mapc
c11af8a5
KH
354 (lambda (action)
355 (if (stringp action)
356 (if (file-readable-p
bdaf166c
SM
357 (setq action (expand-file-name
358 action auto-insert-directory)))
c11af8a5
KH
359 (insert-file-contents action))
360 (save-window-excursion
361 ;; make buffer visible before skeleton or function
362 ;; which might ask the user for something
c3313451 363 (switch-to-buffer (current-buffer))
c11af8a5
KH
364 (if (and (consp action)
365 (not (eq (car action) 'lambda)))
366 (skeleton-insert action)
367 (funcall action)))))
368 (if (vectorp action)
369 action
370 (vector action))))
371 (and (buffer-modified-p)
372 (not (eq this-command 'auto-insert))
12394086
DL
373 (set-buffer-modified-p (eq auto-insert t)))))
374 ;; Return nil so that it could be used in
375 ;; `find-file-not-found-hooks', though that's probably inadvisable.
376 nil)
c11af8a5
KH
377
378
379;;;###autoload
4605a50d 380(defun define-auto-insert (condition action &optional after)
c11af8a5
KH
381 "Associate CONDITION with (additional) ACTION in `auto-insert-alist'.
382Optional AFTER means to insert action after all existing actions for CONDITION,
383or if CONDITION had no actions, after all other CONDITIONs."
4605a50d 384 (let ((elt (assoc condition auto-insert-alist)))
c11af8a5
KH
385 (if elt
386 (setcdr elt
387 (if (vectorp (cdr elt))
388 (vconcat (if after (cdr elt))
389 (if (vectorp action) action (vector action))
390 (if after () (cdr elt)))
391 (if after
392 (vector (cdr elt) action)
393 (vector action (cdr elt)))))
394 (if after
4605a50d 395 (nconc auto-insert-alist (list (cons condition action)))
bdaf166c 396 (push (cons condition action) auto-insert-alist)))))
c0274f38 397
6c5b39e4 398;;;###autoload
bff6da3d 399(define-minor-mode auto-insert-mode
06e21633
CY
400 "Toggle Auto-insert mode, a global minor mode.
401With a prefix argument ARG, enable Auto-insert mode if ARG is
402positive, and disable it otherwise. If called from Lisp, enable
403the mode if ARG is omitted or nil.
6c5b39e4 404
12394086 405When Auto-insert mode is enabled, when new files are created you can
6c5b39e4 406insert a template for the file depending on the mode of the buffer."
44e70da2 407 :global t :group 'auto-insert
bff6da3d 408 (if auto-insert-mode
a702ffbb
SM
409 (add-hook 'find-file-hook 'auto-insert)
410 (remove-hook 'find-file-hook 'auto-insert)))
6c5b39e4 411
896546cd
RS
412(provide 'autoinsert)
413
c0274f38 414;;; autoinsert.el ends here