(blackbox-mode-map): Move init into declaration.
[bpt/emacs.git] / lisp / textmodes / texinfo.el
CommitLineData
bc6785f3 1;;; texinfo.el --- major mode for editing Texinfo files -*- coding: iso-2022-7bit -*-
be010748 2
98a864f0 3;; Copyright (C) 1985, 1988, 1989, 1990, 1991, 1992, 1993, 1996, 1997,
3731a850 4;; 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
e926e412 5
5ccb13ff 6;; Author: Robert J. Chassell
07e77e36 7;; Date: [See date below for texinfo-version]
630dd250 8;; Maintainer: FSF
5ccb13ff 9;; Keywords: maint, tex, docs
eea8d4ef 10
be010748 11;; This file is part of GNU Emacs.
952d72ff
RC
12
13;; GNU Emacs is free software; you can redistribute it and/or modify
14;; it under the terms of the GNU General Public License as published by
e5167999 15;; the Free Software Foundation; either version 2, or (at your option)
952d72ff
RC
16;; any later version.
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
b578f267 24;; along with GNU Emacs; see the file COPYING. If not, write to the
4fc5845f
LK
25;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26;; Boston, MA 02110-1301, USA.
952d72ff 27
8fe6d67f
SM
28;;; Todo:
29
30;; - facemenu support.
76b7c637 31;; - command completion.
8fe6d67f 32
e8af40ee
PJ
33;;; Commentary:
34
5ccb13ff
RS
35;;; Code:
36
80216a47
RS
37(or (fboundp 'defgroup)
38 (defmacro defgroup (&rest ignore) nil))
39
40(or (fboundp 'defcustom)
41 (defmacro defcustom (var value doc &rest ignore)
42 `(defvar ,var ,value ,doc)))
43
a11609d8 44(eval-when-compile (require 'tex-mode) (require 'cl))
366fb0ab 45(defvar outline-heading-alist)
08f9e254 46
cd482e05 47(defgroup texinfo nil
dbc868a1 48 "Texinfo Mode."
cd482e05
RS
49 :group 'docs)
50
9768eaa7
EZ
51;;;###autoload
52(defcustom texinfo-open-quote "``"
53 "*String inserted by typing \\[texinfo-insert-quote] to open a quotation."
54 :type 'string
55 :group 'texinfo)
56
57;;;###autoload
58(defcustom texinfo-close-quote "''"
59 "*String inserted by typing \\[texinfo-insert-quote] to close a quotation."
60 :type 'string
61 :group 'texinfo)
62
630dd250
SJ
63(defcustom texinfo-mode-hook nil
64 "Normal hook run when entering Texinfo mode."
65 :type 'hook
66 :options '(turn-on-auto-fill flyspell-mode)
67 :group 'texinfo)
68
c6cc04e9
RS
69\f
70;;; Autoloads:
71
72(autoload 'makeinfo-region
5ccb13ff 73 "makeinfo"
c6cc04e9
RS
74 "Make Info file from region of current Texinfo file, and switch to it.
75
76This command does not offer the `next-error' feature since it would
77apply to a temporary file, not the original; use the `makeinfo-buffer'
78command to gain use of `next-error'."
5ccb13ff 79 t nil)
c6cc04e9
RS
80
81(autoload 'makeinfo-buffer
5ccb13ff 82 "makeinfo"
c6cc04e9
RS
83 "Make Info file from current buffer.
84
5ccb13ff 85Use the \\[next-error] command to move to the next error
c6cc04e9 86\(if there are errors\)."
5ccb13ff 87 t nil)
c6cc04e9
RS
88
89(autoload 'kill-compilation
5ccb13ff 90 "compile"
c6cc04e9 91 "Kill the process made by the \\[compile] command."
5ccb13ff 92 t nil)
c6cc04e9
RS
93
94(autoload 'makeinfo-recenter-compilation-buffer
5ccb13ff 95 "makeinfo"
c6cc04e9
RS
96 "Redisplay `*compilation*' buffer so most recent output can be seen.
97The last line of the buffer is displayed on
98line LINE of the window, or centered if LINE is nil."
5ccb13ff
RS
99 t nil)
100
101(autoload 'texinfo-update-node
102 "texnfo-upd"
103 "Without any prefix argument, update the node in which point is located.
104Non-nil argument (prefix, if interactive) means update the nodes in the
105marked region.
106
107The functions for creating or updating nodes and menus, and their
108keybindings, are:
109
08f9e254
DL
110 `texinfo-update-node' (&optional region-p) \\[texinfo-update-node]
111 `texinfo-every-node-update' () \\[texinfo-every-node-update]
112 `texinfo-sequential-node-update' (&optional region-p)
5ccb13ff 113
08f9e254
DL
114 `texinfo-make-menu' (&optional region-p) \\[texinfo-make-menu]
115 `texinfo-all-menus-update' () \\[texinfo-all-menus-update]
116 `texinfo-master-menu' ()
5ccb13ff 117
08f9e254 118 `texinfo-indent-menu-description' (column &optional region-p)
5ccb13ff
RS
119
120The `texinfo-column-for-description' variable specifies the column to
121which menu descriptions are indented. Its default value is 32."
122 t nil)
123
124(autoload 'texinfo-every-node-update
125 "texnfo-upd"
126 "Update every node in a Texinfo file."
127 t nil)
128
129(autoload 'texinfo-sequential-node-update
130 "texnfo-upd"
131 "Update one node (or many) in a Texinfo file with sequential pointers.
132
133This function causes the `Next' or `Previous' pointer to point to the
134immediately preceding or following node, even if it is at a higher or
135lower hierarchical level in the document. Continually pressing `n' or
136`p' takes you straight through the file.
137
138Without any prefix argument, update the node in which point is located.
139Non-nil argument (prefix, if interactive) means update the nodes in the
140marked region.
141
142This command makes it awkward to navigate among sections and
143subsections; it should be used only for those documents that are meant
144to be read like a novel rather than a reference, and for which the
145Info `g*' command is inadequate."
146 t nil)
c6cc04e9
RS
147
148(autoload 'texinfo-make-menu
5ccb13ff 149 "texnfo-upd"
c6cc04e9
RS
150 "Without any prefix argument, make or update a menu.
151Make the menu for the section enclosing the node found following point.
152
153Non-nil argument (prefix, if interactive) means make or update menus
154for nodes within or part of the marked region.
155
156Whenever a menu exists, and is being updated, the descriptions that
157are associated with node names in the pre-existing menu are
158incorporated into the new menu. Otherwise, the nodes' section titles
159are inserted as descriptions."
5ccb13ff 160 t nil)
c6cc04e9
RS
161
162(autoload 'texinfo-all-menus-update
5ccb13ff 163 "texnfo-upd"
c6cc04e9
RS
164 "Update every regular menu in a Texinfo file.
165Remove pre-existing master menu, if there is one.
166
167If called with a non-nil argument, this function first updates all the
168nodes in the buffer before updating the menus."
5ccb13ff 169 t nil)
c6cc04e9
RS
170
171(autoload 'texinfo-master-menu
5ccb13ff 172 "texnfo-upd"
c6cc04e9
RS
173 "Make a master menu for a whole Texinfo file.
174Non-nil argument (prefix, if interactive) means first update all
175existing nodes and menus. Remove pre-existing master menu, if there is one.
176
177This function creates a master menu that follows the top node. The
178master menu includes every entry from all the other menus. It
179replaces any existing ordinary menu that follows the top node.
180
181If called with a non-nil argument, this function first updates all the
182menus in the buffer (incorporating descriptions from pre-existing
183menus) before it constructs the master menu.
184
185The function removes the detailed part of an already existing master
9687a051 186menu. This action depends on the pre-existing master menu using the
c6cc04e9
RS
187standard `texinfo-master-menu-header'.
188
189The master menu has the following format, which is adapted from the
190recommendation in the Texinfo Manual:
191
192 * The first part contains the major nodes in the Texinfo file: the
193 nodes for the chapters, chapter-like sections, and the major
194 appendices. This includes the indices, so long as they are in
195 chapter-like sections, such as unnumbered sections.
196
197 * The second and subsequent parts contain a listing of the other,
198 lower level menus, in order. This way, an inquirer can go
199 directly to a particular node if he or she is searching for
200 specific information.
201
202Each of the menus in the detailed node listing is introduced by the
203title of the section containing the menu."
5ccb13ff 204 t nil)
c6cc04e9
RS
205
206(autoload 'texinfo-indent-menu-description
5ccb13ff
RS
207 "texnfo-upd"
208 "Indent every description in menu following point to COLUMN.
c6cc04e9
RS
209Non-nil argument (prefix, if interactive) means indent every
210description in every menu in the region. Does not indent second and
211subsequent lines of a multi-line description."
5ccb13ff 212 t nil)
c6cc04e9
RS
213
214(autoload 'texinfo-insert-node-lines
5ccb13ff 215 "texnfo-upd"
c6cc04e9
RS
216 "Insert missing `@node' lines in region of Texinfo file.
217Non-nil argument (prefix, if interactive) means also to insert the
218section titles as node names; and also to insert the section titles as
219node names in pre-existing @node lines that lack names."
5ccb13ff 220 t nil)
c6cc04e9
RS
221
222(autoload 'texinfo-start-menu-description
5ccb13ff
RS
223 "texnfo-upd"
224 "In this menu entry, insert the node's section title as a description.
c6cc04e9
RS
225Position point at beginning of description ready for editing.
226Do not insert a title if the line contains an existing description.
227
228You will need to edit the inserted text since a useful description
229complements the node name rather than repeats it as a title does."
5ccb13ff 230 t nil)
c6cc04e9
RS
231
232(autoload 'texinfo-multiple-files-update
5ccb13ff 233 "texnfo-upd"
c6cc04e9 234 "Update first node pointers in each file included in OUTER-FILE;
5ccb13ff 235create or update main menu in the outer file that refers to such nodes.
c6cc04e9
RS
236This does not create or update menus or pointers within the included files.
237
238With optional MAKE-MASTER-MENU argument (prefix arg, if interactive),
239insert a master menu in OUTER-FILE. This does not create or update
240menus or pointers within the included files.
241
242With optional UPDATE-EVERYTHING argument (numeric prefix arg, if
243interactive), update all the menus and all the `Next', `Previous', and
244`Up' pointers of all the files included in OUTER-FILE before inserting
245a master menu in OUTER-FILE.
246
247The command also updates the `Top' level node pointers of OUTER-FILE.
248
5ccb13ff 249Notes:
c6cc04e9
RS
250
251 * this command does NOT save any files--you must save the
252 outer file and any modified, included files.
253
254 * except for the `Top' node, this command does NOT handle any
255 pre-existing nodes in the outer file; hence, indices must be
256 enclosed in an included file.
257
258Requirements:
259
260 * each of the included files must contain exactly one highest
5ccb13ff 261 hierarchical level node,
c6cc04e9
RS
262 * this highest node must be the first node in the included file,
263 * each highest hierarchical level node must be of the same type.
264
265Thus, normally, each included file contains one, and only one,
266chapter."
5ccb13ff 267 t nil)
c6cc04e9
RS
268
269\f
e5167999
ER
270;;; Code:
271
c678a343 272;;; Don't you dare insert any `require' calls at top level in this file--rms.
e67adf46 273
eedd2812
SM
274(defvar texinfo-section-list
275 '(("top" 1)
eedd2812 276 ("chapter" 2)
eedd2812 277 ("section" 3)
eedd2812 278 ("subsection" 4)
eedd2812 279 ("subsubsection" 5)
f412245b
SM
280 ("unnumbered" 2)
281 ("unnumberedsec" 3)
282 ("unnumberedsubsec" 4)
eedd2812 283 ("unnumberedsubsubsec" 5)
f412245b
SM
284 ("appendix" 2)
285 ("appendixsec" 3)
76b7c637 286 ("appendixsection" 3)
f412245b 287 ("appendixsubsec" 4)
eedd2812 288 ("appendixsubsubsec" 5)
f412245b
SM
289 ("majorheading" 2)
290 ("chapheading" 2)
291 ("heading" 3)
292 ("subheading" 4)
eedd2812
SM
293 ("subsubheading" 5))
294 "Alist of sectioning commands and their relative level.")
295
c6cc04e9 296;;; Syntax table
1de2ada0 297
952d72ff
RC
298(defvar texinfo-mode-syntax-table nil)
299
300(if texinfo-mode-syntax-table
301 nil
302 (setq texinfo-mode-syntax-table (make-syntax-table))
21ae6d3b
MB
303 (modify-syntax-entry ?\" "." texinfo-mode-syntax-table)
304 (modify-syntax-entry ?\\ "." texinfo-mode-syntax-table)
952d72ff
RC
305 (modify-syntax-entry ?@ "\\" texinfo-mode-syntax-table)
306 (modify-syntax-entry ?\^q "\\" texinfo-mode-syntax-table)
307 (modify-syntax-entry ?\[ "(]" texinfo-mode-syntax-table)
308 (modify-syntax-entry ?\] ")[" texinfo-mode-syntax-table)
309 (modify-syntax-entry ?{ "(}" texinfo-mode-syntax-table)
310 (modify-syntax-entry ?} "){" texinfo-mode-syntax-table)
e3721db1 311 (modify-syntax-entry ?\n ">" texinfo-mode-syntax-table)
952d72ff
RC
312 (modify-syntax-entry ?\' "w" texinfo-mode-syntax-table))
313
e4cfb70d 314;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
9687a051 315;; To override this example, set either `imenu-generic-expression'
e4cfb70d
KH
316;; or `imenu-create-index-function'.
317(defvar texinfo-imenu-generic-expression
08f9e254 318 '((nil "^@\\(node\\|anchor\\)[ \t]+\\([^,\n]*\\)" 2)
e4cfb70d 319 ("Chapters" "^@chapter[ \t]+\\(.*\\)$" 1))
887a2f77 320 "Imenu generic expression for Texinfo mode. See `imenu-generic-expression'.")
e4cfb70d 321
e3721db1 322(defvar texinfo-font-lock-syntactic-keywords
92819e90
SM
323 '(("\\(@\\)c\\(omment\\)?\\>" (1 "<"))
324 ("^\\(@\\)ignore\\>" (1 "< b"))
325 ("^@end ignore\\(\n\\)" (1 "> b")))
e3721db1
SM
326 "Syntactic keywords to catch comment delimiters in `texinfo-mode'.")
327
8fe6d67f 328(defconst texinfo-environments
db95369b 329 '("cartouche" "copying" "defcv" "deffn" "defivar" "defmac"
e1a68e89
JB
330 "defmethod" "defop" "defopt" "defspec" "deftp" "deftypefn"
331 "deftypefun" "deftypevar" "deftypevr" "defun" "defvar"
332 "defvr" "description" "detailmenu" "direntry" "display"
333 "documentdescription" "enumerate" "example" "flushleft"
334 "flushright" "format" "ftable" "group" "ifclear" "ifset"
335 "ifhtml" "ifinfo" "ifnothtml" "ifnotinfo" "ifnotplaintext"
336 "ifnottex" "ifplaintext" "iftex" "ignore" "itemize" "lisp"
337 "macro" "menu" "multitable" "quotation" "smalldisplay"
338 "smallexample" "smallformat" "smalllisp" "table" "tex"
339 "titlepage" "verbatim" "vtable")
887a2f77 340 "List of Texinfo environments.")
8fe6d67f
SM
341
342(defconst texinfo-environment-regexp
343 (concat "^@" (regexp-opt (cons "end" texinfo-environments) t) "\\>")
887a2f77 344 "Regexp for environment-like Texinfo list commands.
8fe6d67f
SM
345Subexpression 1 is what goes into the corresponding `@end' statement.")
346
e639491a 347(defface texinfo-heading
eedd2812 348 '((t (:inherit font-lock-function-name-face)))
3ec0e903
LK
349 "Face used for section headings in `texinfo-mode'."
350 :group 'texinfo)
e639491a
MB
351;; backward-compatibility alias
352(put 'texinfo-heading-face 'face-alias 'texinfo-heading)
353(defvar texinfo-heading-face 'texinfo-heading)
eedd2812 354
0ece5f43 355(defvar texinfo-font-lock-keywords
eedd2812 356 `(;; All but the first had an OVERRIDE of t.
dd7366bf 357 ;; It didn't seem to be any better, and it's slower--simon.
5762abec 358 ;; Robert J. Chassell <bob@gnu.org> says remove this line.
5ccb13ff
RS
359 ;;("\\$\\([^$]*\\)\\$" 1 font-lock-string-face t)
360 ("@\\([a-zA-Z]+\\|[^ \t\n]\\)" 1 font-lock-keyword-face) ;commands
8fe6d67f
SM
361 ("^\\*\\([^\n:]*\\)" 1 font-lock-function-name-face t) ;menu items
362 ("@\\(emph\\|i\\|sc\\){\\([^}]+\\)" 2 'italic)
363 ("@\\(strong\\|b\\){\\([^}]+\\)" 2 'bold)
364 ("@\\(kbd\\|key\\|url\\|uref\\){\\([^}]+\\)" 2 font-lock-string-face)
e38af9bd
EZ
365 ;; The following two groups have an OVERRIDE of `keep' because
366 ;; their arguments frequently include a @@, and we don't want that
367 ;; to overwrite the normal fontification of the argument.
368 ("@\\(file\\|email\\){\\([^}]+\\)" 2 font-lock-string-face keep)
0cf452f3 369 ("@\\(samp\\|code\\|var\\|math\\|env\\|command\\|option\\){\\([^}]+\\)"
e38af9bd
EZ
370 2 font-lock-variable-name-face keep)
371 ("@\\(cite\\|x?ref\\|pxref\\|dfn\\|inforef\\){\\([^}]+\\)"
372 2 font-lock-constant-face)
373 ("@\\(anchor\\){\\([^}]+\\)" 2 font-lock-type-face)
374 ("@\\(dmn\\|acronym\\|value\\){\\([^}]+\\)" 2 font-lock-builtin-face)
8fe6d67f 375 ("@\\(end\\|itemx?\\) +\\(.+\\)" 2 font-lock-keyword-face keep)
28736082
SM
376 ;; (,texinfo-environment-regexp
377 ;; 1 (texinfo-clone-environment (match-beginning 1) (match-end 1)) keep)
eedd2812 378 (,(concat "^@" (regexp-opt (mapcar 'car texinfo-section-list) t)
08f9e254 379 ".*\n") 0 texinfo-heading-face t))
887a2f77 380 "Additional expressions to highlight in Texinfo mode.")
491f6f0f 381
8fe6d67f
SM
382(defun texinfo-clone-environment (start end)
383 (let ((endp nil))
384 (save-excursion
385 (ignore-errors
386 (goto-char start)
387 (when (looking-at "end\\Sw+\\(\\sw+\\)")
388 (setq endp t start (match-beginning 1) end (match-end 1)))
389 (unless (get-char-property start 'text-clones)
390 (if endp
391 (texinfo-last-unended-begin)
392 (forward-word 1)
393 (texinfo-next-unmatched-end))
394 (skip-syntax-forward "^w")
28736082
SM
395 (when (looking-at
396 (concat (regexp-quote (buffer-substring start end)) "\\>"))
8fe6d67f
SM
397 (text-clone-create start end 'spread "\\w*")))))))
398
c6cc04e9
RS
399\f
400;;; Keybindings
952d72ff
RC
401(defvar texinfo-mode-map nil)
402
c6cc04e9
RS
403;;; Keys common both to Texinfo mode and to TeX shell.
404
405(defun texinfo-define-common-keys (keymap)
406 "Define the keys both in Texinfo mode and in the texinfo-tex-shell."
407 (define-key keymap "\C-c\C-t\C-k" 'tex-kill-job)
408 (define-key keymap "\C-c\C-t\C-x" 'texinfo-quit-job)
409 (define-key keymap "\C-c\C-t\C-l" 'tex-recenter-output-buffer)
410 (define-key keymap "\C-c\C-t\C-d" 'texinfo-delete-from-print-queue)
411 (define-key keymap "\C-c\C-t\C-q" 'tex-show-print-queue)
412 (define-key keymap "\C-c\C-t\C-p" 'texinfo-tex-print)
24e519d8 413 (define-key keymap "\C-c\C-t\C-v" 'texinfo-tex-view)
c6cc04e9
RS
414 (define-key keymap "\C-c\C-t\C-i" 'texinfo-texindex)
415
416 (define-key keymap "\C-c\C-t\C-r" 'texinfo-tex-region)
417 (define-key keymap "\C-c\C-t\C-b" 'texinfo-tex-buffer))
418
5ccb13ff 419;; Mode documentation displays commands in reverse order
952d72ff 420;; from how they are listed in the texinfo-mode-map.
c6cc04e9 421
952d72ff
RC
422(if texinfo-mode-map
423 nil
424 (setq texinfo-mode-map (make-sparse-keymap))
425
c6cc04e9
RS
426 ;; bindings for `texnfo-tex.el'
427 (texinfo-define-common-keys texinfo-mode-map)
428
eedd2812 429 (define-key texinfo-mode-map "\"" 'texinfo-insert-quote)
e3721db1 430
c6cc04e9
RS
431 ;; bindings for `makeinfo.el'
432 (define-key texinfo-mode-map "\C-c\C-m\C-k" 'kill-compilation)
5ccb13ff 433 (define-key texinfo-mode-map "\C-c\C-m\C-l"
c6cc04e9
RS
434 'makeinfo-recenter-compilation-buffer)
435 (define-key texinfo-mode-map "\C-c\C-m\C-r" 'makeinfo-region)
436 (define-key texinfo-mode-map "\C-c\C-m\C-b" 'makeinfo-buffer)
437
5ccb13ff 438 ;; bindings for `texinfmt.el'
25f91a1e
RS
439 (define-key texinfo-mode-map "\C-c\C-e\C-r" 'texinfo-format-region)
440 (define-key texinfo-mode-map "\C-c\C-e\C-b" 'texinfo-format-buffer)
441
eedd2812
SM
442 ;; AUCTeX-like bindings
443 (define-key texinfo-mode-map "\e\r" 'texinfo-insert-@item)
444
c6cc04e9 445 ;; bindings for updating nodes and menus
952d72ff 446
c6cc04e9 447 (define-key texinfo-mode-map "\C-c\C-um" 'texinfo-master-menu)
952d72ff 448
0b7da9ad
RC
449 (define-key texinfo-mode-map "\C-c\C-u\C-m" 'texinfo-make-menu)
450 (define-key texinfo-mode-map "\C-c\C-u\C-n" 'texinfo-update-node)
451 (define-key texinfo-mode-map "\C-c\C-u\C-e" 'texinfo-every-node-update)
452 (define-key texinfo-mode-map "\C-c\C-u\C-a" 'texinfo-all-menus-update)
952d72ff
RC
453
454 (define-key texinfo-mode-map "\C-c\C-s" 'texinfo-show-structure)
455
5ccb13ff
RS
456 (define-key texinfo-mode-map "\C-c}" 'up-list)
457 (define-key texinfo-mode-map "\C-c]" 'up-list)
eedd2812 458 (define-key texinfo-mode-map "\C-c{" 'texinfo-insert-braces)
c6cc04e9
RS
459
460 ;; bindings for inserting strings
e3721db1 461 (define-key texinfo-mode-map "\C-c\C-o" 'texinfo-insert-block)
c6cc04e9 462 (define-key texinfo-mode-map "\C-c\C-c\C-d" 'texinfo-start-menu-description)
af9eaa5e
GM
463 (define-key texinfo-mode-map "\C-c\C-c\C-s" 'texinfo-insert-@strong)
464 (define-key texinfo-mode-map "\C-c\C-c\C-e" 'texinfo-insert-@emph)
952d72ff
RC
465
466 (define-key texinfo-mode-map "\C-c\C-cv" 'texinfo-insert-@var)
4fb0a34c 467 (define-key texinfo-mode-map "\C-c\C-cu" 'texinfo-insert-@uref)
c6cc04e9 468 (define-key texinfo-mode-map "\C-c\C-ct" 'texinfo-insert-@table)
952d72ff 469 (define-key texinfo-mode-map "\C-c\C-cs" 'texinfo-insert-@samp)
af9eaa5e 470 (define-key texinfo-mode-map "\C-c\C-cq" 'texinfo-insert-@quotation)
952d72ff
RC
471 (define-key texinfo-mode-map "\C-c\C-co" 'texinfo-insert-@noindent)
472 (define-key texinfo-mode-map "\C-c\C-cn" 'texinfo-insert-@node)
af9eaa5e 473 (define-key texinfo-mode-map "\C-c\C-cm" 'texinfo-insert-@email)
952d72ff
RC
474 (define-key texinfo-mode-map "\C-c\C-ck" 'texinfo-insert-@kbd)
475 (define-key texinfo-mode-map "\C-c\C-ci" 'texinfo-insert-@item)
c6cc04e9 476 (define-key texinfo-mode-map "\C-c\C-cf" 'texinfo-insert-@file)
952d72ff 477 (define-key texinfo-mode-map "\C-c\C-cx" 'texinfo-insert-@example)
c6cc04e9 478 (define-key texinfo-mode-map "\C-c\C-ce" 'texinfo-insert-@end)
952d72ff
RC
479 (define-key texinfo-mode-map "\C-c\C-cd" 'texinfo-insert-@dfn)
480 (define-key texinfo-mode-map "\C-c\C-cc" 'texinfo-insert-@code))
481
eedd2812
SM
482(easy-menu-define texinfo-mode-menu
483 texinfo-mode-map
484 "Menu used for `texinfo-mode'."
485 '("Texinfo"
486 ["Insert block" texinfo-insert-block t]
487 ;; ["Insert node" texinfo-insert-@node t]
488 "----"
003dd635
SM
489 ["Update All" (lambda () (interactive) (texinfo-master-menu t))
490 :keys "\\[universal-argument] \\[texinfo-master-menu]"]
eedd2812
SM
491 ["Update every node" texinfo-every-node-update t]
492 ["Update node" texinfo-update-node t]
493 ["Make Master menu" texinfo-master-menu t]
494 ["Make menu" texinfo-make-menu t]
495 ["Update all menus" texinfo-all-menus-update t]
496 "----"
497 ["Show structure" texinfo-show-structure t]
498 ["Format region" texinfo-format-region t]
499 ["Format buffer" texinfo-format-buffer t]
500 ["Makeinfo region" makeinfo-region t]
501 ["Makeinfo buffer" makeinfo-buffer t]))
502
c6cc04e9 503\f
a11609d8
SM
504(defun texinfo-filter (section list)
505 (let (res)
506 (dolist (x list) (if (eq section (cadr x)) (push (car x) res)))
507 res))
508
509(defvar texinfo-chapter-level-regexp
510 (regexp-opt (texinfo-filter 2 texinfo-section-list))
511 "Regular expression matching just the Texinfo chapter level headings.")
512
c6cc04e9 513;;; Texinfo mode
952d72ff 514
f9f9507e 515;;;###autoload
e3721db1 516(define-derived-mode texinfo-mode text-mode "Texinfo"
d5aa8b02 517 "Major mode for editing Texinfo files.
952d72ff
RC
518
519 It has these extra commands:
520\\{texinfo-mode-map}
521
d5aa8b02 522 These are files that are used as input for TeX to make printed manuals
c6cc04e9
RS
523and also to be turned into Info files with \\[makeinfo-buffer] or
524the `makeinfo' program. These files must be written in a very restricted and
d5aa8b02 525modified version of TeX input format.
952d72ff
RC
526
527 Editing commands are like text-mode except that the syntax table is
d5aa8b02
RC
528set up so expression commands skip Texinfo bracket groups. To see
529what the Info version of a region of the Texinfo file will look like,
c6cc04e9 530use \\[makeinfo-region], which runs `makeinfo' on the current region.
952d72ff 531
d5aa8b02
RC
532 You can show the structure of a Texinfo file with \\[texinfo-show-structure].
533This command shows the structure of a Texinfo file by listing the
534lines with the @-sign commands for @chapter, @section, and the like.
535These lines are displayed in another window called the *Occur* window.
536In that window, you can position the cursor over one of the lines and
537use \\[occur-mode-goto-occurrence], to jump to the corresponding spot
538in the Texinfo file.
952d72ff 539
d5aa8b02 540 In addition, Texinfo mode provides commands that insert various
952d72ff
RC
541frequently used @-sign commands into the buffer. You can use these
542commands to save keystrokes. And you can insert balanced braces with
543\\[texinfo-insert-braces] and later use the command \\[up-list] to
544move forward past the closing brace.
545
d5aa8b02 546Also, Texinfo mode provides functions for automatically creating or
952d72ff
RC
547updating menus and node pointers. These functions
548
549 * insert the `Next', `Previous' and `Up' pointers of a node,
550 * insert or update the menu for a section, and
d5aa8b02 551 * create a master menu for a Texinfo source file.
952d72ff
RC
552
553Here are the functions:
554
555 texinfo-update-node \\[texinfo-update-node]
556 texinfo-every-node-update \\[texinfo-every-node-update]
5ccb13ff 557 texinfo-sequential-node-update
952d72ff
RC
558
559 texinfo-make-menu \\[texinfo-make-menu]
560 texinfo-all-menus-update \\[texinfo-all-menus-update]
561 texinfo-master-menu
562
563 texinfo-indent-menu-description (column &optional region-p)
564
565The `texinfo-column-for-description' variable specifies the column to
5ccb13ff 566which menu descriptions are indented.
952d72ff
RC
567
568Passed an argument (a prefix argument, if interactive), the
569`texinfo-update-node' and `texinfo-make-menu' functions do their jobs
570in the region.
571
d5aa8b02 572To use the updating commands, you must structure your Texinfo file
952d72ff 573hierarchically, such that each `@node' line, with the exception of the
d5aa8b02 574Top node, is accompanied by some kind of section line, such as an
952d72ff
RC
575`@chapter' or `@section' line.
576
577If the file has a `top' node, it must be called `top' or `Top' and
578be the first node in the file.
579
e3721db1
SM
580Entering Texinfo mode calls the value of `text-mode-hook', and then the
581value of `texinfo-mode-hook'."
a11609d8
SM
582 (set (make-local-variable 'page-delimiter)
583 (concat
584 "^@node [ \t]*[Tt]op\\|^@\\("
585 texinfo-chapter-level-regexp
586 "\\)\\>"))
952d72ff 587 (make-local-variable 'require-final-newline)
7e630648 588 (setq require-final-newline mode-require-final-newline)
c6cc04e9
RS
589 (make-local-variable 'indent-tabs-mode)
590 (setq indent-tabs-mode nil)
952d72ff 591 (make-local-variable 'paragraph-separate)
5ccb13ff
RS
592 (setq paragraph-separate
593 (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-separate))
952d72ff 594 (make-local-variable 'paragraph-start)
6e9f6940 595 (setq paragraph-start (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-start))
bb66398d
RS
596 (make-local-variable 'sentence-end-base)
597 (setq sentence-end-base
bc6785f3 598 "\\(@\\(end\\)?dots{}\\|[.?!]\\)[]\"'\e$,1r}r}\e(B)}]*")
5ed14933
RS
599 (make-local-variable 'adaptive-fill-mode)
600 (setq adaptive-fill-mode nil)
952d72ff 601 (make-local-variable 'fill-column)
14ec09d7 602 (setq fill-column 70)
952d72ff
RC
603 (make-local-variable 'comment-start)
604 (setq comment-start "@c ")
605 (make-local-variable 'comment-start-skip)
e3721db1 606 (setq comment-start-skip "@c +\\|@comment +")
952d72ff
RC
607 (make-local-variable 'words-include-escapes)
608 (setq words-include-escapes t)
e4cfb70d
KH
609 (make-local-variable 'imenu-generic-expression)
610 (setq imenu-generic-expression texinfo-imenu-generic-expression)
c0b08eb0 611 (setq imenu-case-fold-search nil)
2ab3bf87 612 (make-local-variable 'font-lock-defaults)
e3721db1 613 (setq font-lock-defaults
48bb9196 614 '(texinfo-font-lock-keywords nil nil nil backward-paragraph
e3721db1
SM
615 (font-lock-syntactic-keywords
616 . texinfo-font-lock-syntactic-keywords)))
617 (set (make-local-variable 'parse-sexp-lookup-properties) t)
f412245b
SM
618
619 ;; Outline settings.
620 (set (make-local-variable 'outline-heading-alist)
621 ;; We should merge outline-heading-alist and texinfo-section-list
622 ;; but in the mean time, let's just generate one from the other.
623 (mapcar (lambda (x) (cons (concat "@" (car x)) (cadr x)))
624 texinfo-section-list))
625 (set (make-local-variable 'outline-regexp)
4ae1fdf6 626 (concat (regexp-opt (mapcar 'car outline-heading-alist) t)
f412245b
SM
627 "\\>"))
628
d78fc315 629 (make-local-variable 'tex-start-of-header)
24e519d8 630 (setq tex-start-of-header "%\\*\\*start")
d78fc315 631 (make-local-variable 'tex-end-of-header)
24e519d8
RS
632 (setq tex-end-of-header "%\\*\\*end")
633 (make-local-variable 'tex-first-line-header-regexp)
634 (setq tex-first-line-header-regexp "^\\\\input")
635 (make-local-variable 'tex-trailer)
8bd88d54
GM
636 (setq tex-trailer "@bye\n")
637
638 ;; Prevent filling certain lines, in addition to ones specified
639 ;; by the user.
640 (let ((prevent-filling "^@\\(def\\|multitable\\)"))
a11609d8
SM
641 (set (make-local-variable 'auto-fill-inhibit-regexp)
642 (if (null auto-fill-inhibit-regexp)
643 prevent-filling
8fe6d67f 644 (concat auto-fill-inhibit-regexp "\\|" prevent-filling)))))
db95369b 645
952d72ff
RC
646
647\f
c6cc04e9
RS
648;;; Insert string commands
649
d7fa3319
SM
650(defvar texinfo-block-default "example")
651
e3721db1
SM
652(define-skeleton texinfo-insert-block
653 "Create a matching pair @<cmd> .. @end <cmd> at point.
654Puts point on a blank line between them."
d7fa3319
SM
655 (setq texinfo-block-default
656 (completing-read (format "Block name [%s]: " texinfo-block-default)
f412245b 657 texinfo-environments
d7fa3319 658 nil nil nil nil texinfo-block-default))
8fe6d67f 659 \n "@" str \n _ \n "@end " str \n)
e3721db1 660
eedd2812
SM
661(defun texinfo-inside-macro-p (macro &optional bound)
662 "Non-nil if inside a macro matching the regexp MACRO."
08f9e254
DL
663 (condition-case nil
664 (save-excursion
665 (save-restriction
666 (narrow-to-region bound (point))
667 (while (progn
668 (up-list -1)
669 (not (condition-case nil
670 (save-excursion
671 (backward-sexp 1)
672 (looking-at macro))
a11609d8 673 (scan-error nil)))))
08f9e254 674 t))
a11609d8 675 (scan-error nil)))
eedd2812
SM
676
677(defun texinfo-inside-env-p (env &optional bound)
678 "Non-nil if inside an environment matching the regexp @ENV."
679 (save-excursion
680 (and (re-search-backward (concat "@\\(end\\s +\\)?" env) bound t)
a11609d8 681 (not (match-end 1)))))
eedd2812 682
ffa5b3a3 683(defvar texinfo-enable-quote-macros "@\\(code\\|samp\\|kbd\\)\\>")
f412245b 684(defvar texinfo-enable-quote-envs '("example\\>" "lisp\\>"))
eedd2812 685(defun texinfo-insert-quote (&optional arg)
887a2f77 686 "Insert the appropriate quote mark for Texinfo.
9768eaa7
EZ
687Usually inserts the value of `texinfo-open-quote' (normally ``) or
688`texinfo-close-quote' (normally ''), depending on the context.
689With prefix argument or inside @code or @example, inserts a plain \"."
eedd2812
SM
690 (interactive "*P")
691 (let ((top (or (save-excursion (re-search-backward "@node\\>" nil t))
692 (point-min))))
9768eaa7 693 (if (or arg
8fe6d67f
SM
694 (= (preceding-char) ?\\)
695 (save-excursion
696 (backward-char (length texinfo-open-quote))
697 (when (or (looking-at texinfo-open-quote)
698 (looking-at texinfo-close-quote))
699 (delete-char (length texinfo-open-quote))
700 t))
f412245b
SM
701 (texinfo-inside-macro-p texinfo-enable-quote-macros top)
702 (let ((in-env nil))
703 (dolist (env texinfo-enable-quote-envs in-env)
704 (if (texinfo-inside-env-p env top)
705 (setq in-env t)))))
eedd2812 706 (self-insert-command (prefix-numeric-value arg))
9768eaa7 707 (insert
dbc868a1 708 (if (memq (char-syntax (preceding-char)) '(?\( ?> ?\s))
8fe6d67f
SM
709 texinfo-open-quote
710 texinfo-close-quote)))))
db95369b 711
5ccb13ff
RS
712;; The following texinfo-insert-@end command not only inserts a SPC
713;; after the @end, but tries to find out what belongs there. It is
714;; not very smart: it does not understand nested lists.
c6cc04e9 715
8fe6d67f
SM
716(defun texinfo-last-unended-begin ()
717 (while (and (re-search-backward texinfo-environment-regexp)
718 (looking-at "@end"))
719 (texinfo-last-unended-begin)))
720
721(defun texinfo-next-unmatched-end ()
722 (while (and (re-search-forward texinfo-environment-regexp)
723 (save-excursion
724 (goto-char (match-beginning 0))
725 (not (looking-at "@end"))))
726 (texinfo-next-unmatched-end)))
727
c6cc04e9
RS
728(defun texinfo-insert-@end ()
729 "Insert the matching `@end' for the last Texinfo command that needs one."
730 (interactive)
8fe6d67f
SM
731 (let ((string
732 (ignore-errors
733 (save-excursion
734 (texinfo-last-unended-begin)
735 (match-string 1)))))
62993ed6
EZ
736 (insert "@end ")
737 (if string (insert string "\n"))))
c6cc04e9
RS
738
739;; The following insert commands accept a prefix arg N, which is the
740;; number of words (actually s-exprs) that should be surrounded by
741;; braces. Thus you can first paste a variable name into a .texinfo
742;; buffer, then say C-u 1 C-c C-c v at the beginning of the just
743;; pasted variable name to put @var{...} *around* the variable name.
744;; Operate on previous word or words with negative arg.
745
746;; These commands use texinfo-insert-@-with-arg
747(defun texinfo-insert-@-with-arg (string &optional arg)
5ccb13ff 748 (if arg
c6cc04e9
RS
749 (progn
750 (setq arg (prefix-numeric-value arg))
751 (if (< arg 0)
752 (progn
753 (skip-chars-backward " \t\n\r\f")
754 (save-excursion
755 (forward-sexp arg)
756 (insert "@" string "{"))
757 (insert "}"))
758 (skip-chars-forward " \t\n\r\f")
759 (insert "@" string "{")
760 (forward-sexp arg)
761 (insert "}")))
762 (insert "@" string "{}")
763 (backward-char)))
764
765(defun texinfo-insert-braces ()
766 "Make a pair of braces and be poised to type inside of them.
767Use \\[up-list] to move forward out of the braces."
768 (interactive)
769 (insert "{}")
770 (backward-char))
771
772(defun texinfo-insert-@code (&optional arg)
773 "Insert a `@code{...}' command in a Texinfo buffer.
774A numeric argument says how many words the braces should surround.
775The default is not to surround any existing words with the braces."
776 (interactive "P")
777 (texinfo-insert-@-with-arg "code" arg))
778
779(defun texinfo-insert-@dfn (&optional arg)
780 "Insert a `@dfn{...}' command in a Texinfo buffer.
781A numeric argument says how many words the braces should surround.
782The default is not to surround any existing words with the braces."
783 (interactive "P")
784 (texinfo-insert-@-with-arg "dfn" arg))
952d72ff 785
af9eaa5e
GM
786(defun texinfo-insert-@email (&optional arg)
787 "Insert a `@email{...}' command in a Texinfo buffer.
788A numeric argument says how many words the braces should surround.
789The default is not to surround any existing words with the braces."
790 (interactive "P")
791 (texinfo-insert-@-with-arg "email" arg))
792
793(defun texinfo-insert-@emph (&optional arg)
794 "Insert a `@emph{...}' command in a Texinfo buffer.
795A numeric argument says how many words the braces should surround.
796The default is not to surround any existing words with the braces."
797 (interactive "P")
798 (texinfo-insert-@-with-arg "emph" arg))
799
c6cc04e9
RS
800(defun texinfo-insert-@example ()
801 "Insert the string `@example' in a Texinfo buffer."
802 (interactive)
803 (insert "@example\n"))
804
805(defun texinfo-insert-@file (&optional arg)
806 "Insert a `@file{...}' command in a Texinfo buffer.
807A numeric argument says how many words the braces should surround.
808The default is not to surround any existing words with the braces."
809 (interactive "P")
810 (texinfo-insert-@-with-arg "file" arg))
811
812(defun texinfo-insert-@item ()
235de372
EZ
813 "Insert the string `@item' in a Texinfo buffer.
814If in a table defined by @table, follow said string with a space.
815Otherwise, follow with a newline."
c6cc04e9 816 (interactive)
235de372
EZ
817 (insert "@item"
818 (if (equal (ignore-errors
819 (save-excursion
820 (texinfo-last-unended-begin)
821 (match-string 1)))
822 "table")
16f43910 823 ?\s
235de372 824 ?\n)))
c6cc04e9
RS
825
826(defun texinfo-insert-@kbd (&optional arg)
827 "Insert a `@kbd{...}' command in a Texinfo buffer.
828A numeric argument says how many words the braces should surround.
829The default is not to surround any existing words with the braces."
830 (interactive "P")
831 (texinfo-insert-@-with-arg "kbd" arg))
832
833(defun texinfo-insert-@node ()
834 "Insert the string `@node' in a Texinfo buffer.
481b0db7
RC
835Insert a comment on the following line indicating the order of
836arguments to @node. Insert a carriage return after the comment line.
837Leave point after `@node'."
c6cc04e9 838 (interactive)
481b0db7
RC
839 (insert "@node \n@comment node-name, next, previous, up\n")
840 (forward-line -2)
c6cc04e9
RS
841 (forward-char 6))
842
843(defun texinfo-insert-@noindent ()
844 "Insert the string `@noindent' in a Texinfo buffer."
845 (interactive)
846 (insert "@noindent\n"))
847
af9eaa5e
GM
848(defun texinfo-insert-@quotation ()
849 "Insert the string `@quotation' in a Texinfo buffer."
850 (interactive)
851 (insert "@quotation\n"))
852
c6cc04e9
RS
853(defun texinfo-insert-@samp (&optional arg)
854 "Insert a `@samp{...}' command in a Texinfo buffer.
855A numeric argument says how many words the braces should surround.
856The default is not to surround any existing words with the braces."
857 (interactive "P")
858 (texinfo-insert-@-with-arg "samp" arg))
859
af9eaa5e
GM
860(defun texinfo-insert-@strong (&optional arg)
861 "Insert a `@strong{...}' command in a Texinfo buffer.
862A numeric argument says how many words the braces should surround.
863The default is not to surround any existing words with the braces."
864 (interactive "P")
865 (texinfo-insert-@-with-arg "strong" arg))
866
ffa5b3a3 867(defun texinfo-insert-@table ()
c6cc04e9 868 "Insert the string `@table' in a Texinfo buffer."
ffa5b3a3 869 (interactive)
c6cc04e9
RS
870 (insert "@table "))
871
872(defun texinfo-insert-@var (&optional arg)
873 "Insert a `@var{}' command in a Texinfo buffer.
874A numeric argument says how many words the braces should surround.
875The default is not to surround any existing words with the braces."
876 (interactive "P")
877 (texinfo-insert-@-with-arg "var" arg))
af9eaa5e 878
4fb0a34c 879(defun texinfo-insert-@uref (&optional arg)
08f9e254 880 "Insert a `@uref{}' command in a Texinfo buffer.
af9eaa5e
GM
881A numeric argument says how many words the braces should surround.
882The default is not to surround any existing words with the braces."
883 (interactive "P")
4fb0a34c
EZ
884 (texinfo-insert-@-with-arg "uref" arg))
885(defalias 'texinfo-insert-@url 'texinfo-insert-@uref)
c6cc04e9
RS
886\f
887;;; Texinfo file structure
952d72ff 888
5ccb13ff 889(defun texinfo-show-structure (&optional nodes-too)
952d72ff 890 "Show the structure of a Texinfo file.
d5aa8b02
RC
891List the lines in the file that begin with the @-sign commands for
892@chapter, @section, and the like.
893
894With optional argument (prefix if interactive), list both the lines
895with @-sign commands for @chapter, @section, and the like, and list
896@node lines.
952d72ff
RC
897
898Lines with structuring commands beginning in them are displayed in
c6cc04e9 899another buffer named `*Occur*'. In that buffer, you can move point to
db95369b 900one of those lines and then use
aae61ef3 901\\<occur-mode-map>\\[occur-mode-goto-occurrence],
c6cc04e9 902to jump to the corresponding spot in the Texinfo source file."
952d72ff
RC
903
904 (interactive "P")
aae61ef3 905 ;; First, remember current location
ffa5b3a3 906 (let (current-location)
aae61ef3
RC
907 (save-excursion
908 (end-of-line) ; so as to find section on current line
db95369b 909 (if (re-search-backward
aae61ef3
RC
910 ;; do not require `texinfo-section-types-regexp' in texnfo-upd.el
911 "^@\\(chapter \\|sect\\|subs\\|subh\\|unnum\\|major\\|chapheading \\|heading \\|appendix\\)"
912 nil t)
913 (setq current-location
914 (progn
915 (beginning-of-line)
916 (buffer-substring (point) (progn (end-of-line) (point)))))
ffa5b3a3 917 ;; else point is located before any section command.
aae61ef3
RC
918 (setq current-location "tex")))
919 ;; Second, create and format an *Occur* buffer
920 (save-excursion
921 (goto-char (point-min))
4ae1fdf6
SM
922 (occur (concat "^\\(?:" (if nodes-too "@node\\>\\|")
923 outline-regexp "\\)")))
aae61ef3 924 (pop-to-buffer "*Occur*")
952d72ff 925 (goto-char (point-min))
aae61ef3
RC
926 (let ((inhibit-read-only t))
927 (flush-lines "-----")
928 ;; Now format the "*Occur*" buffer to show the structure.
929 ;; Thanks to ceder@signum.se (Per Cederqvist)
930 (goto-char (point-max))
931 (let (level)
932 (while (re-search-backward "^ *[0-9]*:@\\(\\sw+\\)" nil 0)
933 (goto-char (1- (match-beginning 1)))
934 (setq level
935 (or (cadr (assoc (match-string 1) texinfo-section-list)) 2))
936 (indent-to-column (+ (current-column) (* 4 (- level 2))))
937 (beginning-of-line))))
938 ;; Third, go to line corresponding to location in source file
db95369b 939 ;; potential bug: two exactly similar `current-location' lines ...
aae61ef3
RC
940 (goto-char (point-min))
941 (re-search-forward current-location nil t)
942 (beginning-of-line)
943 ))
944
952d72ff
RC
945\f
946;;; The tex and print function definitions:
947
cd482e05
RS
948(defcustom texinfo-texi2dvi-command "texi2dvi"
949 "*Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer."
950 :type 'string
951 :group 'texinfo)
bb946175 952
cd482e05
RS
953(defcustom texinfo-tex-command "tex"
954 "*Command used by `texinfo-tex-region' to run TeX on a region."
955 :type 'string
956 :group 'texinfo)
952d72ff 957
cd482e05
RS
958(defcustom texinfo-texindex-command "texindex"
959 "*Command used by `texinfo-texindex' to sort unsorted index files."
960 :type 'string
961 :group 'texinfo)
c6cc04e9 962
cd482e05 963(defcustom texinfo-delete-from-print-queue-command "lprm"
c6cc04e9
RS
964 "*Command string used to delete a job from the line printer queue.
965Command is used by \\[texinfo-delete-from-print-queue] based on
966number provided by a previous \\[tex-show-print-queue]
cd482e05
RS
967command."
968 :type 'string
969 :group 'texinfo)
c6cc04e9
RS
970
971(defvar texinfo-tex-trailer "@bye"
972 "String appended after a region sent to TeX by `texinfo-tex-region'.")
952d72ff
RC
973
974(defun texinfo-tex-region (beg end)
c6cc04e9
RS
975 "Run TeX on the current region.
976This works by writing a temporary file (`tex-zap-file') in the directory
977that is the value of `tex-directory', then running TeX on that file.
978
979The first line of the buffer is copied to the
1433a222
CZ
980temporary file; and if the buffer has a header, it is written to the
981temporary file before the region itself. The buffer's header is all lines
982between the strings defined by `tex-start-of-header' and `tex-end-of-header'
c6cc04e9
RS
983inclusive. The header must start in the first 100 lines.
984
985The value of `texinfo-tex-trailer' is appended to the temporary file after the region."
952d72ff 986 (interactive "r")
e67adf46 987 (require 'tex-mode)
24e519d8 988 (let ((tex-command texinfo-tex-command)
3654a351 989 (tex-trailer texinfo-tex-trailer))
24e519d8 990 (tex-region beg end)))
952d72ff
RC
991
992(defun texinfo-tex-buffer ()
c6cc04e9
RS
993 "Run TeX on visited file, once or twice, to make a correct `.dvi' file."
994 (interactive)
97c6c316 995 (require 'tex-mode)
3654a351
AS
996 (let ((tex-command texinfo-texi2dvi-command)
997 ;; Disable tex-start-options-string. texi2dvi would not
998 ;; understand anything specified here.
999 (tex-start-options-string ""))
24e519d8 1000 (tex-buffer)))
c6cc04e9
RS
1001
1002(defun texinfo-texindex ()
1003 "Run `texindex' on unsorted index files.
1004The index files are made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
1005This runs the shell command defined by `texinfo-texindex-command'."
952d72ff 1006 (interactive)
c6cc04e9 1007 (require 'tex-mode)
79183f1a 1008 (tex-send-command texinfo-texindex-command (concat tex-zap-file ".??"))
5ccb13ff
RS
1009 ;; alternatively
1010 ;; (send-string "tex-shell"
1011 ;; (concat texinfo-texindex-command
1012 ;; " " tex-zap-file ".??" "\n"))
c6cc04e9 1013 (tex-recenter-output-buffer nil))
952d72ff
RC
1014
1015(defun texinfo-tex-print ()
c6cc04e9
RS
1016 "Print `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
1017This runs the shell command defined by `tex-dvi-print-command'."
952d72ff 1018 (interactive)
e67adf46 1019 (require 'tex-mode)
24e519d8
RS
1020 (tex-print))
1021
1022(defun texinfo-tex-view ()
1023 "View `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
1024This runs the shell command defined by `tex-dvi-view-command'."
1025 (interactive)
1026 (require 'tex-mode)
1027 (tex-view))
952d72ff 1028
c6cc04e9
RS
1029(defun texinfo-quit-job ()
1030 "Quit currently running TeX job, by sending an `x' to it."
1031 (interactive)
1032 (if (not (get-process "tex-shell"))
1033 (error "No TeX shell running"))
79183f1a 1034 (tex-send-command "x"))
5ccb13ff
RS
1035;; alternatively:
1036;; save-excursion
1037;; (set-buffer (get-buffer "*tex-shell*"))
1038;; (goto-char (point-max))
1039;; (insert "x")
1040;; (comint-send-input)
c6cc04e9
RS
1041
1042(defun texinfo-delete-from-print-queue (job-number)
1043 "Delete job from the line printer spooling queue.
1044You are prompted for the job number (use a number shown by a previous
5ccb13ff 1045\\[tex-show-print-queue] command)."
c6cc04e9 1046 (interactive "nPrinter job number for deletion: ")
97c6c316 1047 (require 'tex-mode)
c6cc04e9
RS
1048 (if (tex-shell-running)
1049 (tex-kill-job)
1050 (tex-start-shell))
79183f1a 1051 (tex-send-command texinfo-delete-from-print-queue-command job-number)
5ccb13ff
RS
1052 ;; alternatively
1053 ;; (send-string "tex-shell"
1054 ;; (concat
1055 ;; texinfo-delete-from-print-queue-command
1056 ;; " "
1057 ;; job-number"\n"))
c6cc04e9
RS
1058 (tex-recenter-output-buffer nil))
1059
49116ac0
JB
1060(provide 'texinfo)
1061
bc6785f3 1062;; arch-tag: 005d7c38-43b9-4b7d-aa1d-aea69bae73e1
d501f516 1063;;; texinfo.el ends here