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