Merge from emacs-24; up to 2012-12-29T12:57:49Z!fgallina@gnu.org
[bpt/emacs.git] / lisp / textmodes / texinfo.el
CommitLineData
e739cc85 1;;; texinfo.el --- major mode for editing Texinfo files -*- coding: utf-8 -*-
be010748 2
ab422c4d
PE
3;; Copyright (C) 1985, 1988-1993, 1996-1997, 2000-2013 Free Software
4;; 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\\)\\>")
8d43bd30
EZ
681(defvar texinfo-enable-quote-envs
682 '("example\\>" "smallexample\\>" "lisp\\>"))
eedd2812 683(defun texinfo-insert-quote (&optional arg)
887a2f77 684 "Insert the appropriate quote mark for Texinfo.
9768eaa7
EZ
685Usually inserts the value of `texinfo-open-quote' (normally ``) or
686`texinfo-close-quote' (normally ''), depending on the context.
687With prefix argument or inside @code or @example, inserts a plain \"."
eedd2812
SM
688 (interactive "*P")
689 (let ((top (or (save-excursion (re-search-backward "@node\\>" nil t))
690 (point-min))))
9768eaa7 691 (if (or arg
8fe6d67f
SM
692 (= (preceding-char) ?\\)
693 (save-excursion
78151cd5
GM
694 ;; Might be near the start of a (narrowed) buffer.
695 (ignore-errors (backward-char (length texinfo-open-quote)))
8fe6d67f
SM
696 (when (or (looking-at texinfo-open-quote)
697 (looking-at texinfo-close-quote))
698 (delete-char (length texinfo-open-quote))
699 t))
f412245b
SM
700 (texinfo-inside-macro-p texinfo-enable-quote-macros top)
701 (let ((in-env nil))
702 (dolist (env texinfo-enable-quote-envs in-env)
703 (if (texinfo-inside-env-p env top)
704 (setq in-env t)))))
eedd2812 705 (self-insert-command (prefix-numeric-value arg))
9768eaa7 706 (insert
083654ee
GM
707 (if (or (bobp)
708 (memq (char-syntax (preceding-char)) '(?\( ?> ?\s)))
8fe6d67f
SM
709 texinfo-open-quote
710 texinfo-close-quote)))))
db95369b 711
5ccb13ff
RS
712;; The following texinfo-insert-@end command not only inserts a SPC
713;; after the @end, but tries to find out what belongs there. It is
714;; not very smart: it does not understand nested lists.
c6cc04e9 715
8fe6d67f
SM
716(defun texinfo-last-unended-begin ()
717 (while (and (re-search-backward texinfo-environment-regexp)
718 (looking-at "@end"))
719 (texinfo-last-unended-begin)))
720
721(defun texinfo-next-unmatched-end ()
722 (while (and (re-search-forward texinfo-environment-regexp)
723 (save-excursion
724 (goto-char (match-beginning 0))
725 (not (looking-at "@end"))))
726 (texinfo-next-unmatched-end)))
727
61f91c04 728(define-skeleton texinfo-insert-@end
c6cc04e9 729 "Insert the matching `@end' for the last Texinfo command that needs one."
8fe6d67f
SM
730 (ignore-errors
731 (save-excursion
61f91c04 732 (backward-word 1)
8fe6d67f 733 (texinfo-last-unended-begin)
61f91c04
SM
734 (or (match-string 1) '-)))
735 \n "@end " str \n)
736
737(define-skeleton texinfo-insert-braces
c6cc04e9
RS
738 "Make a pair of braces and be poised to type inside of them.
739Use \\[up-list] to move forward out of the braces."
61f91c04
SM
740 nil
741 "{" _ "}")
c6cc04e9 742
61f91c04 743(define-skeleton texinfo-insert-@code
c6cc04e9
RS
744 "Insert a `@code{...}' command in a Texinfo buffer.
745A numeric argument says how many words the braces should surround.
746The default is not to surround any existing words with the braces."
61f91c04
SM
747 nil
748 "@code{" _ "}")
c6cc04e9 749
61f91c04 750(define-skeleton texinfo-insert-@dfn
c6cc04e9
RS
751 "Insert a `@dfn{...}' command in a Texinfo buffer.
752A numeric argument says how many words the braces should surround.
753The default is not to surround any existing words with the braces."
61f91c04
SM
754 nil
755 "@dfn{" _ "}")
952d72ff 756
61f91c04 757(define-skeleton texinfo-insert-@email
af9eaa5e
GM
758 "Insert a `@email{...}' command in a Texinfo buffer.
759A numeric argument says how many words the braces should surround.
760The default is not to surround any existing words with the braces."
61f91c04
SM
761 nil
762 "@email{" _ "}")
af9eaa5e 763
61f91c04 764(define-skeleton texinfo-insert-@emph
af9eaa5e
GM
765 "Insert a `@emph{...}' command in a Texinfo buffer.
766A numeric argument says how many words the braces should surround.
767The default is not to surround any existing words with the braces."
61f91c04
SM
768 nil
769 "@emph{" _ "}")
af9eaa5e 770
61f91c04 771(define-skeleton texinfo-insert-@example
c6cc04e9 772 "Insert the string `@example' in a Texinfo buffer."
61f91c04
SM
773 nil
774 \n "@example" \n)
c6cc04e9 775
61f91c04 776(define-skeleton texinfo-insert-@file
c6cc04e9
RS
777 "Insert a `@file{...}' command in a Texinfo buffer.
778A numeric argument says how many words the braces should surround.
779The default is not to surround any existing words with the braces."
61f91c04
SM
780 nil
781 "@file{" _ "}")
c6cc04e9 782
61f91c04 783(define-skeleton texinfo-insert-@item
235de372
EZ
784 "Insert the string `@item' in a Texinfo buffer.
785If in a table defined by @table, follow said string with a space.
786Otherwise, follow with a newline."
61f91c04
SM
787 nil
788 \n "@item"
235de372
EZ
789 (if (equal (ignore-errors
790 (save-excursion
791 (texinfo-last-unended-begin)
792 (match-string 1)))
793 "table")
61f91c04
SM
794 " " '\n)
795 _ \n)
c6cc04e9 796
61f91c04 797(define-skeleton texinfo-insert-@kbd
c6cc04e9
RS
798 "Insert a `@kbd{...}' command in a Texinfo buffer.
799A numeric argument says how many words the braces should surround.
800The default is not to surround any existing words with the braces."
61f91c04
SM
801 nil
802 "@kbd{" _ "}")
c6cc04e9 803
61f91c04 804(define-skeleton texinfo-insert-@node
c6cc04e9 805 "Insert the string `@node' in a Texinfo buffer.
481b0db7
RC
806Insert a comment on the following line indicating the order of
807arguments to @node. Insert a carriage return after the comment line.
808Leave point after `@node'."
61f91c04
SM
809 nil
810 \n "@node " _ \n)
c6cc04e9 811
61f91c04 812(define-skeleton texinfo-insert-@noindent
c6cc04e9 813 "Insert the string `@noindent' in a Texinfo buffer."
61f91c04
SM
814 nil
815 \n "@noindent" \n)
c6cc04e9 816
61f91c04 817(define-skeleton texinfo-insert-@quotation
af9eaa5e 818 "Insert the string `@quotation' in a Texinfo buffer."
61f91c04 819 \n "@quotation" \n)
af9eaa5e 820
61f91c04 821(define-skeleton texinfo-insert-@samp
c6cc04e9
RS
822 "Insert a `@samp{...}' command in a Texinfo buffer.
823A numeric argument says how many words the braces should surround.
824The default is not to surround any existing words with the braces."
61f91c04
SM
825 nil
826 "@samp{" _ "}")
c6cc04e9 827
61f91c04 828(define-skeleton texinfo-insert-@strong
af9eaa5e
GM
829 "Insert a `@strong{...}' command in a Texinfo buffer.
830A numeric argument says how many words the braces should surround.
831The default is not to surround any existing words with the braces."
61f91c04
SM
832 nil
833 "@strong{" _ "}")
af9eaa5e 834
61f91c04 835(define-skeleton texinfo-insert-@table
c6cc04e9 836 "Insert the string `@table' in a Texinfo buffer."
61f91c04
SM
837 nil
838 \n "@table " _ \n)
c6cc04e9 839
61f91c04 840(define-skeleton texinfo-insert-@var
c6cc04e9
RS
841 "Insert a `@var{}' command in a Texinfo buffer.
842A numeric argument says how many words the braces should surround.
843The default is not to surround any existing words with the braces."
61f91c04
SM
844 nil
845 "@var{" _ "}")
af9eaa5e 846
61f91c04 847(define-skeleton texinfo-insert-@uref
08f9e254 848 "Insert a `@uref{}' command in a Texinfo buffer.
af9eaa5e
GM
849A numeric argument says how many words the braces should surround.
850The default is not to surround any existing words with the braces."
61f91c04
SM
851 nil
852 "@uref{" _ "}")
4fb0a34c 853(defalias 'texinfo-insert-@url 'texinfo-insert-@uref)
c6cc04e9
RS
854\f
855;;; Texinfo file structure
952d72ff 856
5ccb13ff 857(defun texinfo-show-structure (&optional nodes-too)
952d72ff 858 "Show the structure of a Texinfo file.
d5aa8b02
RC
859List the lines in the file that begin with the @-sign commands for
860@chapter, @section, and the like.
861
862With optional argument (prefix if interactive), list both the lines
863with @-sign commands for @chapter, @section, and the like, and list
864@node lines.
952d72ff
RC
865
866Lines with structuring commands beginning in them are displayed in
c6cc04e9 867another buffer named `*Occur*'. In that buffer, you can move point to
db95369b 868one of those lines and then use
aae61ef3 869\\<occur-mode-map>\\[occur-mode-goto-occurrence],
c6cc04e9 870to jump to the corresponding spot in the Texinfo source file."
952d72ff
RC
871
872 (interactive "P")
aae61ef3 873 ;; First, remember current location
ffa5b3a3 874 (let (current-location)
aae61ef3
RC
875 (save-excursion
876 (end-of-line) ; so as to find section on current line
db95369b 877 (if (re-search-backward
aae61ef3
RC
878 ;; do not require `texinfo-section-types-regexp' in texnfo-upd.el
879 "^@\\(chapter \\|sect\\|subs\\|subh\\|unnum\\|major\\|chapheading \\|heading \\|appendix\\)"
880 nil t)
881 (setq current-location
882 (progn
883 (beginning-of-line)
884 (buffer-substring (point) (progn (end-of-line) (point)))))
ffa5b3a3 885 ;; else point is located before any section command.
aae61ef3
RC
886 (setq current-location "tex")))
887 ;; Second, create and format an *Occur* buffer
888 (save-excursion
889 (goto-char (point-min))
4ae1fdf6
SM
890 (occur (concat "^\\(?:" (if nodes-too "@node\\>\\|")
891 outline-regexp "\\)")))
aae61ef3 892 (pop-to-buffer "*Occur*")
952d72ff 893 (goto-char (point-min))
aae61ef3
RC
894 (let ((inhibit-read-only t))
895 (flush-lines "-----")
896 ;; Now format the "*Occur*" buffer to show the structure.
897 ;; Thanks to ceder@signum.se (Per Cederqvist)
898 (goto-char (point-max))
899 (let (level)
900 (while (re-search-backward "^ *[0-9]*:@\\(\\sw+\\)" nil 0)
901 (goto-char (1- (match-beginning 1)))
902 (setq level
903 (or (cadr (assoc (match-string 1) texinfo-section-list)) 2))
904 (indent-to-column (+ (current-column) (* 4 (- level 2))))
905 (beginning-of-line))))
906 ;; Third, go to line corresponding to location in source file
db95369b 907 ;; potential bug: two exactly similar `current-location' lines ...
aae61ef3
RC
908 (goto-char (point-min))
909 (re-search-forward current-location nil t)
910 (beginning-of-line)
911 ))
912
952d72ff
RC
913\f
914;;; The tex and print function definitions:
915
cd482e05 916(defcustom texinfo-texi2dvi-command "texi2dvi"
2db33a18 917 "Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer."
cd482e05
RS
918 :type 'string
919 :group 'texinfo)
bb946175 920
cd482e05 921(defcustom texinfo-tex-command "tex"
2db33a18 922 "Command used by `texinfo-tex-region' to run TeX on a region."
cd482e05
RS
923 :type 'string
924 :group 'texinfo)
952d72ff 925
cd482e05 926(defcustom texinfo-texindex-command "texindex"
2db33a18 927 "Command used by `texinfo-texindex' to sort unsorted index files."
cd482e05
RS
928 :type 'string
929 :group 'texinfo)
c6cc04e9 930
cd482e05 931(defcustom texinfo-delete-from-print-queue-command "lprm"
2db33a18 932 "Command string used to delete a job from the line printer queue.
c6cc04e9
RS
933Command is used by \\[texinfo-delete-from-print-queue] based on
934number provided by a previous \\[tex-show-print-queue]
cd482e05
RS
935command."
936 :type 'string
937 :group 'texinfo)
c6cc04e9
RS
938
939(defvar texinfo-tex-trailer "@bye"
940 "String appended after a region sent to TeX by `texinfo-tex-region'.")
952d72ff
RC
941
942(defun texinfo-tex-region (beg end)
c6cc04e9
RS
943 "Run TeX on the current region.
944This works by writing a temporary file (`tex-zap-file') in the directory
945that is the value of `tex-directory', then running TeX on that file.
946
947The first line of the buffer is copied to the
1433a222
CZ
948temporary file; and if the buffer has a header, it is written to the
949temporary file before the region itself. The buffer's header is all lines
950between the strings defined by `tex-start-of-header' and `tex-end-of-header'
c6cc04e9
RS
951inclusive. The header must start in the first 100 lines.
952
953The value of `texinfo-tex-trailer' is appended to the temporary file after the region."
952d72ff 954 (interactive "r")
e67adf46 955 (require 'tex-mode)
24e519d8 956 (let ((tex-command texinfo-tex-command)
3654a351 957 (tex-trailer texinfo-tex-trailer))
24e519d8 958 (tex-region beg end)))
952d72ff
RC
959
960(defun texinfo-tex-buffer ()
c6cc04e9
RS
961 "Run TeX on visited file, once or twice, to make a correct `.dvi' file."
962 (interactive)
97c6c316 963 (require 'tex-mode)
3654a351
AS
964 (let ((tex-command texinfo-texi2dvi-command)
965 ;; Disable tex-start-options-string. texi2dvi would not
966 ;; understand anything specified here.
967 (tex-start-options-string ""))
24e519d8 968 (tex-buffer)))
c6cc04e9
RS
969
970(defun texinfo-texindex ()
971 "Run `texindex' on unsorted index files.
972The index files are made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
973This runs the shell command defined by `texinfo-texindex-command'."
952d72ff 974 (interactive)
c6cc04e9 975 (require 'tex-mode)
79183f1a 976 (tex-send-command texinfo-texindex-command (concat tex-zap-file ".??"))
5ccb13ff
RS
977 ;; alternatively
978 ;; (send-string "tex-shell"
979 ;; (concat texinfo-texindex-command
980 ;; " " tex-zap-file ".??" "\n"))
c6cc04e9 981 (tex-recenter-output-buffer nil))
952d72ff
RC
982
983(defun texinfo-tex-print ()
c6cc04e9
RS
984 "Print `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
985This runs the shell command defined by `tex-dvi-print-command'."
952d72ff 986 (interactive)
e67adf46 987 (require 'tex-mode)
24e519d8
RS
988 (tex-print))
989
990(defun texinfo-tex-view ()
991 "View `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer].
992This runs the shell command defined by `tex-dvi-view-command'."
993 (interactive)
994 (require 'tex-mode)
995 (tex-view))
952d72ff 996
c6cc04e9
RS
997(defun texinfo-quit-job ()
998 "Quit currently running TeX job, by sending an `x' to it."
999 (interactive)
1000 (if (not (get-process "tex-shell"))
1001 (error "No TeX shell running"))
79183f1a 1002 (tex-send-command "x"))
5ccb13ff
RS
1003;; alternatively:
1004;; save-excursion
1005;; (set-buffer (get-buffer "*tex-shell*"))
1006;; (goto-char (point-max))
1007;; (insert "x")
1008;; (comint-send-input)
c6cc04e9
RS
1009
1010(defun texinfo-delete-from-print-queue (job-number)
1011 "Delete job from the line printer spooling queue.
1012You are prompted for the job number (use a number shown by a previous
5ccb13ff 1013\\[tex-show-print-queue] command)."
c6cc04e9 1014 (interactive "nPrinter job number for deletion: ")
97c6c316 1015 (require 'tex-mode)
c6cc04e9
RS
1016 (if (tex-shell-running)
1017 (tex-kill-job)
1018 (tex-start-shell))
79183f1a 1019 (tex-send-command texinfo-delete-from-print-queue-command job-number)
5ccb13ff
RS
1020 ;; alternatively
1021 ;; (send-string "tex-shell"
1022 ;; (concat
1023 ;; texinfo-delete-from-print-queue-command
1024 ;; " "
1025 ;; job-number"\n"))
c6cc04e9
RS
1026 (tex-recenter-output-buffer nil))
1027
49116ac0
JB
1028(provide 'texinfo)
1029
d501f516 1030;;; texinfo.el ends here