* admin/admin.el (make-manuals): Use a standard location for lispintro.
[bpt/emacs.git] / lisp / autoinsert.el
CommitLineData
c0274f38 1;;; autoinsert.el --- automatic mode-dependent insertion of text into new files
b578f267 2
ab422c4d
PE
3;; Copyright (C) 1985-1987, 1994-1995, 1998, 2000-2013 Free Software
4;; 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 38;; You can also customize the variable `auto-insert-mode' to load the
865fe16f 39;; package. Alternatively, add the following to your init file:
6c5b39e4
SE
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: "
0bfcf5c5 138 ".\\\" Copyright (C), " (format-time-string "%Y") " "
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.
d2c32364 143.TH " (file-name-base)
bf9f5c17
DL
144 " " (file-name-extension (buffer-file-name))
145 " " (format-time-string "%Y-%m-%d ")
146 "\n.SH NAME\n"
d2c32364 147 (file-name-base)
bf9f5c17
DL
148 " \\- " str
149 "\n.SH SYNOPSIS
d2c32364 150.B " (file-name-base)
bf9f5c17
DL
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
0bfcf5c5 169;; Copyright (C) " (format-time-string "%Y") " "
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 209\(provide '"
d2c32364 210 (file-name-base)
3c98b2e9 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 "
d2c32364 218 (file-name-base) ".info\n"
1caf5f96
GM
219 "@settitle " str "
220@c %**end of header
221@copying\n"
222 (setq short-description (read-string "Short description: "))
223 ".\n\n"
0bfcf5c5 224 "Copyright @copyright{} " (format-time-string "%Y") " "
1caf5f96
GM
225 (getenv "ORGANIZATION") | (progn user-full-name) "
226
227@quotation
228Permission is granted to copy, distribute and/or modify this document
d5259d01 229under the terms of the GNU Free Documentation License, Version 1.3
af8b50d1 230or any later version published by the Free Software Foundation;
d5259d01
GM
231with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
232A copy of the license is included in the section entitled ``GNU
af8b50d1 233Free Documentation License''.
1caf5f96
GM
234
235A copy of the license is also available from the Free Software
236Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
237
238@end quotation
239
240The document was typeset with
241@uref{http://www.texinfo.org/, GNU Texinfo}.
242
243@end copying
244
245@titlepage
246@title " str "
247@subtitle " short-description "
248@author " (getenv "ORGANIZATION") | (progn user-full-name)
249 " <" (progn user-mail-address) ">
250@page
251@vskip 0pt plus 1filll
252@insertcopying
253@end titlepage
254
255@c Output the table of the contents at the beginning.
256@contents
257
258@ifnottex
259@node Top
260@top " str "
261
262@insertcopying
263@end ifnottex
264
265@c Generate the nodes for this menu with `C-c C-u C-m'.
266@menu
267@end menu
268
269@c Update all node entries with `C-c C-u C-n'.
270@c Insert new nodes with `C-c C-c n'.
271@node Chapter One
272@chapter Chapter One
273
274" _ "
275
276@node Copying This Manual
277@appendix Copying This Manual
278
279@menu
280* GNU Free Documentation License:: License for copying this manual.
281@end menu
282
283@c Get fdl.texi from http://www.gnu.org/licenses/fdl.html
284@include fdl.texi
285
286@node Index
287@unnumbered Index
288
289@printindex cp
290
291@bye
292
293@c " (file-name-nondirectory (buffer-file-name)) " ends here\n"))
b1d6ae0b 294 "A list specifying text to insert by default into a new file.
c11af8a5 295Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION).
2a575769 296CONDITION may be a regexp that must match the new file's name, or it may be
c11af8a5
KH
297a symbol that must match the major mode for this element to apply.
298Only the first matching element is effective.
299Optional DESCRIPTION is a string for filling `auto-insert-prompt'.
300ACTION may be a skeleton to insert (see `skeleton-insert'), an absolute
301file-name or one relative to `auto-insert-directory' or a function to call.
302ACTION may also be a vector containing several successive single actions as
6c5b39e4
SE
303described above, e.g. [\"header.insert\" date-and-author-update]."
304 :type 'sexp
305 :group 'auto-insert)
b1d6ae0b 306
c11af8a5
KH
307
308;; Establish a default value for auto-insert-directory
6c5b39e4 309(defcustom auto-insert-directory "~/insert/"
9201cc28 310 "Directory from which auto-inserted files are taken.
87810ca9
RS
311The value must be an absolute directory name;
312thus, on a GNU or Unix system, it must end in a slash."
6c5b39e4
SE
313 :type 'directory
314 :group 'auto-insert)
b1d6ae0b 315
c11af8a5
KH
316
317;;;###autoload
318(defun auto-insert ()
a461758e 319 "Insert default contents into new files if variable `auto-insert' is non-nil.
b1d6ae0b 320Matches the visited file name against the elements of `auto-insert-alist'."
c11af8a5
KH
321 (interactive)
322 (and (not buffer-read-only)
323 (or (eq this-command 'auto-insert)
324 (and auto-insert
325 (bobp) (eobp)))
326 (let ((alist auto-insert-alist)
327 case-fold-search cond desc action)
328 (goto-char 1)
329 ;; find first matching alist entry
330 (while alist
331 (if (atom (setq cond (car (car alist))))
332 (setq desc cond)
333 (setq desc (cdr cond)
334 cond (car cond)))
335 (if (if (symbolp cond)
336 (eq cond major-mode)
a461758e
DL
337 (and buffer-file-name
338 (string-match cond buffer-file-name)))
c11af8a5
KH
339 (setq action (cdr (car alist))
340 alist nil)
341 (setq alist (cdr alist))))
342
343 ;; Now, if we found something, do it
344 (and action
bdaf166c
SM
345 (or (not (stringp action))
346 (file-readable-p (expand-file-name
347 action auto-insert-directory)))
348 (or (not auto-insert-query)
349 (if (eq auto-insert-query 'function)
350 (eq this-command 'auto-insert))
351 (y-or-n-p (format auto-insert-prompt desc)))
6fd09e19 352 (mapc
c11af8a5
KH
353 (lambda (action)
354 (if (stringp action)
355 (if (file-readable-p
bdaf166c
SM
356 (setq action (expand-file-name
357 action auto-insert-directory)))
c11af8a5
KH
358 (insert-file-contents action))
359 (save-window-excursion
360 ;; make buffer visible before skeleton or function
361 ;; which might ask the user for something
c3313451 362 (switch-to-buffer (current-buffer))
c11af8a5
KH
363 (if (and (consp action)
364 (not (eq (car action) 'lambda)))
365 (skeleton-insert action)
366 (funcall action)))))
367 (if (vectorp action)
368 action
369 (vector action))))
370 (and (buffer-modified-p)
371 (not (eq this-command 'auto-insert))
12394086
DL
372 (set-buffer-modified-p (eq auto-insert t)))))
373 ;; Return nil so that it could be used in
374 ;; `find-file-not-found-hooks', though that's probably inadvisable.
375 nil)
c11af8a5
KH
376
377
378;;;###autoload
4605a50d 379(defun define-auto-insert (condition action &optional after)
c11af8a5
KH
380 "Associate CONDITION with (additional) ACTION in `auto-insert-alist'.
381Optional AFTER means to insert action after all existing actions for CONDITION,
382or if CONDITION had no actions, after all other CONDITIONs."
4605a50d 383 (let ((elt (assoc condition auto-insert-alist)))
c11af8a5
KH
384 (if elt
385 (setcdr elt
386 (if (vectorp (cdr elt))
387 (vconcat (if after (cdr elt))
388 (if (vectorp action) action (vector action))
389 (if after () (cdr elt)))
390 (if after
391 (vector (cdr elt) action)
392 (vector action (cdr elt)))))
393 (if after
4605a50d 394 (nconc auto-insert-alist (list (cons condition action)))
bdaf166c 395 (push (cons condition action) auto-insert-alist)))))
c0274f38 396
6c5b39e4 397;;;###autoload
bff6da3d 398(define-minor-mode auto-insert-mode
06e21633
CY
399 "Toggle Auto-insert mode, a global minor mode.
400With a prefix argument ARG, enable Auto-insert mode if ARG is
401positive, and disable it otherwise. If called from Lisp, enable
402the mode if ARG is omitted or nil.
6c5b39e4 403
12394086 404When Auto-insert mode is enabled, when new files are created you can
6c5b39e4 405insert a template for the file depending on the mode of the buffer."
44e70da2 406 :global t :group 'auto-insert
bff6da3d 407 (if auto-insert-mode
a702ffbb
SM
408 (add-hook 'find-file-hook 'auto-insert)
409 (remove-hook 'find-file-hook 'auto-insert)))
6c5b39e4 410
896546cd
RS
411(provide 'autoinsert)
412
c0274f38 413;;; autoinsert.el ends here