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