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