1;;; texinfo.el --- major mode for editing Texinfo files -*- coding: iso-2022-7bit -*- 2 3;; Copyright (C) 1985, 1988, 1989, 1990, 1991, 1992, 1993, 1996, 1997, 4;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. 5 6;; Author: Robert J. Chassell 7;; Date: [See date below for texinfo-version] 8;; Maintainer: FSF 9;; Keywords: maint, tex, docs 10 11;; This file is part of GNU Emacs. 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 15;; the Free Software Foundation; either version 2, or (at your option) 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 24;; along with GNU Emacs; see the file COPYING. If not, write to the 25;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 26;; Boston, MA 02110-1301, USA. 27 28;;; Todo: 29 30;; - facemenu support. 31;; - command completion. 32 33;;; Commentary: 34 35;;; Code: 36 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 44(eval-when-compile (require 'tex-mode) (require 'cl)) 45(defvar outline-heading-alist) 46 47(defgroup texinfo nil 48 "Texinfo Mode." 49 :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) 50 :group 'docs) 51 52;;;###autoload 53(defcustom texinfo-open-quote "``" 54 "*String inserted by typing \\[texinfo-insert-quote] to open a quotation." 55 :type 'string 56 :group 'texinfo) 57 58;;;###autoload 59(defcustom texinfo-close-quote "''" 60 "*String inserted by typing \\[texinfo-insert-quote] to close a quotation." 61 :type 'string 62 :group 'texinfo) 63 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 70 71;;; Autoloads: 72 73(autoload 'makeinfo-region 74 "makeinfo" 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'." 80 t nil) 81 82(autoload 'makeinfo-buffer 83 "makeinfo" 84 "Make Info file from current buffer. 85 86Use the \\[next-error] command to move to the next error 87\(if there are errors\)." 88 t nil) 89 90(autoload 'kill-compilation 91 "compile" 92 "Kill the process made by the \\[compile] command." 93 t nil) 94 95(autoload 'makeinfo-recenter-compilation-buffer 96 "makeinfo" 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." 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 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) 114 115 `texinfo-make-menu' (&optional region-p) \\[texinfo-make-menu] 116 `texinfo-all-menus-update' () \\[texinfo-all-menus-update] 117 `texinfo-master-menu' () 118 119 `texinfo-indent-menu-description' (column &optional region-p) 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) 148 149(autoload 'texinfo-make-menu 150 "texnfo-upd" 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." 161 t nil) 162 163(autoload 'texinfo-all-menus-update 164 "texnfo-upd" 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." 170 t nil) 171 172(autoload 'texinfo-master-menu 173 "texnfo-upd" 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 187menu. This action depends on the pre-existing master menu using the 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." 205 t nil) 206 207(autoload 'texinfo-indent-menu-description 208 "texnfo-upd" 209 "Indent every description in menu following point to COLUMN. 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." 213 t nil) 214 215(autoload 'texinfo-insert-node-lines 216 "texnfo-upd" 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." 221 t nil) 222 223(autoload 'texinfo-start-menu-description 224 "texnfo-upd" 225 "In this menu entry, insert the node's section title as a description. 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." 231 t nil) 232 233(autoload 'texinfo-multiple-files-update 234 "texnfo-upd" 235 "Update first node pointers in each file included in OUTER-FILE; 236create or update main menu in the outer file that refers to such nodes. 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 250Notes: 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 262 hierarchical level node, 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." 268 t nil) 269 270 271;;; Code: 272 273;;; Don't you dare insert any `require' calls at top level in this file--rms. 274 275(defvar texinfo-section-list 276 '(("top" 1) 277 ("chapter" 2) 278 ("section" 3) 279 ("subsection" 4) 280 ("subsubsection" 5) 281 ("unnumbered" 2) 282 ("unnumberedsec" 3) 283 ("unnumberedsubsec" 4) 284 ("unnumberedsubsubsec" 5) 285 ("appendix" 2) 286 ("appendixsec" 3) 287 ("appendixsection" 3) 288 ("appendixsubsec" 4) 289 ("appendixsubsubsec" 5) 290 ("majorheading" 2) 291 ("chapheading" 2) 292 ("heading" 3) 293 ("subheading" 4) 294 ("subsubheading" 5)) 295 "Alist of sectioning commands and their relative level.") 296 297;;; Syntax table 298 299(defvar texinfo-mode-syntax-table nil) 300 301(if texinfo-mode-syntax-table 302 nil 303 (setq texinfo-mode-syntax-table (make-syntax-table)) 304 (modify-syntax-entry ?\" "." texinfo-mode-syntax-table) 305 (modify-syntax-entry ?\\ "." texinfo-mode-syntax-table) 306 (modify-syntax-entry ?@ "\\" texinfo-mode-syntax-table) 307 (modify-syntax-entry ?\^q "\\" texinfo-mode-syntax-table) 308 (modify-syntax-entry ?\[ "(]" texinfo-mode-syntax-table) 309 (modify-syntax-entry ?\] ")[" texinfo-mode-syntax-table) 310 (modify-syntax-entry ?{ "(}" texinfo-mode-syntax-table) 311 (modify-syntax-entry ?} "){" texinfo-mode-syntax-table) 312 (modify-syntax-entry ?\n ">" texinfo-mode-syntax-table) 313 (modify-syntax-entry ?\' "w" texinfo-mode-syntax-table)) 314 315;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de> 316;; To override this example, set either `imenu-generic-expression' 317;; or `imenu-create-index-function'. 318(defvar texinfo-imenu-generic-expression 319 '((nil "^@\\(node\\|anchor\\)[ \t]+\\([^,\n]*\\)" 2) 320 ("Chapters" "^@chapter[ \t]+\\(.*\\)$" 1)) 321 "Imenu generic expression for Texinfo mode. See `imenu-generic-expression'.") 322 323(defvar texinfo-font-lock-syntactic-keywords 324 '(("\\(@\\)c\\(omment\\)?\\>" (1 "<")) 325 ("^\\(@\\)ignore\\>" (1 "< b")) 326 ("^@end ignore\\(\n\\)" (1 "> b"))) 327 "Syntactic keywords to catch comment delimiters in `texinfo-mode'.") 328 329(defconst texinfo-environments 330 '("cartouche" "copying" "defcv" "deffn" "defivar" "defmac" 331 "defmethod" "defop" "defopt" "defspec" "deftp" "deftypefn" 332 "deftypefun" "deftypevar" "deftypevr" "defun" "defvar" 333 "defvr" "description" "detailmenu" "direntry" "display" 334 "documentdescription" "enumerate" "example" "flushleft" 335 "flushright" "format" "ftable" "group" "ifclear" "ifset" 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") 341 "List of Texinfo environments.") 342 343(defconst texinfo-environment-regexp 344 (concat "^@" (regexp-opt (cons "end" texinfo-environments) t) "\\>") 345 "Regexp for environment-like Texinfo list commands. 346Subexpression 1 is what goes into the corresponding `@end' statement.") 347 348(defface texinfo-heading 349 '((t (:inherit font-lock-function-name-face))) 350 "Face used for section headings in `texinfo-mode'." 351 :group 'texinfo) 352;; backward-compatibility alias 353(put 'texinfo-heading-face 'face-alias 'texinfo-heading) 354(defvar texinfo-heading-face 'texinfo-heading) 355 356(defvar texinfo-font-lock-keywords 357 `(;; All but the first had an OVERRIDE of t. 358 ;; It didn't seem to be any better, and it's slower--simon. 359 ;; Robert J. Chassell <bob@gnu.org> says remove this line. 360 ;;("\\$\\([^$]*\\)\\$" 1 font-lock-string-face t) 361 ("@\\([a-zA-Z]+\\|[^ \t\n]\\)" 1 font-lock-keyword-face) ;commands 362 ("^\\*\\([^\n:]*\\)" 1 font-lock-function-name-face t) ;menu items 363 ("@\\(emph\\|i\\|sc\\){\\([^}]+\\)" 2 'italic) 364 ("@\\(strong\\|b\\){\\([^}]+\\)" 2 'bold) 365 ("@\\(kbd\\|key\\|url\\|uref\\){\\([^}]+\\)" 2 font-lock-string-face) 366 ;; The following two groups have an OVERRIDE of `keep' because 367 ;; their arguments frequently include a @@, and we don't want that 368 ;; to overwrite the normal fontification of the argument. 369 ("@\\(file\\|email\\){\\([^}]+\\)" 2 font-lock-string-face keep) 370 ("@\\(samp\\|code\\|var\\|math\\|env\\|command\\|option\\){\\([^}]+\\)" 371 2 font-lock-variable-name-face keep) 372 ("@\\(cite\\|x?ref\\|pxref\\|dfn\\|inforef\\){\\([^}]+\\)" 373 2 font-lock-constant-face) 374 ("@\\(anchor\\){\\([^}]+\\)" 2 font-lock-type-face) 375 ("@\\(dmn\\|acronym\\|value\\){\\([^}]+\\)" 2 font-lock-builtin-face) 376 ("@\\(end\\|itemx?\\) +\\(.+\\)" 2 font-lock-keyword-face keep) 377 ;; (,texinfo-environment-regexp 378 ;; 1 (texinfo-clone-environment (match-beginning 1) (match-end 1)) keep) 379 (,(concat "^@" (regexp-opt (mapcar 'car texinfo-section-list) t) 380 ".*\n") 0 texinfo-heading-face t)) 381 "Additional expressions to highlight in Texinfo mode.") 382 383(defun texinfo-clone-environment (start end) 384 (let ((endp nil)) 385 (save-excursion 386 (ignore-errors 387 (goto-char start) 388 (when (looking-at "end\\Sw+\\(\\sw+\\)") 389 (setq endp t start (match-beginning 1) end (match-end 1))) 390 (unless (get-char-property start 'text-clones) 391 (if endp 392 (texinfo-last-unended-begin) 393 (forward-word 1) 394 (texinfo-next-unmatched-end)) 395 (skip-syntax-forward "^w") 396 (when (looking-at 397 (concat (regexp-quote (buffer-substring start end)) "\\>")) 398 (text-clone-create start end 'spread "\\w*"))))))) 399 400 401;;; Keybindings 402(defvar texinfo-mode-map nil) 403 404;;; Keys common both to Texinfo mode and to TeX shell. 405 406(defun texinfo-define-common-keys (keymap) 407 "Define the keys both in Texinfo mode and in the texinfo-tex-shell." 408 (define-key keymap "\C-c\C-t\C-k" 'tex-kill-job) 409 (define-key keymap "\C-c\C-t\C-x" 'texinfo-quit-job) 410 (define-key keymap "\C-c\C-t\C-l" 'tex-recenter-output-buffer) 411 (define-key keymap "\C-c\C-t\C-d" 'texinfo-delete-from-print-queue) 412 (define-key keymap "\C-c\C-t\C-q" 'tex-show-print-queue) 413 (define-key keymap "\C-c\C-t\C-p" 'texinfo-tex-print) 414 (define-key keymap "\C-c\C-t\C-v" 'texinfo-tex-view) 415 (define-key keymap "\C-c\C-t\C-i" 'texinfo-texindex) 416 417 (define-key keymap "\C-c\C-t\C-r" 'texinfo-tex-region) 418 (define-key keymap "\C-c\C-t\C-b" 'texinfo-tex-buffer)) 419 420;; Mode documentation displays commands in reverse order 421;; from how they are listed in the texinfo-mode-map. 422 423(if texinfo-mode-map 424 nil 425 (setq texinfo-mode-map (make-sparse-keymap)) 426 427 ;; bindings for `texnfo-tex.el' 428 (texinfo-define-common-keys texinfo-mode-map) 429 430 (define-key texinfo-mode-map "\"" 'texinfo-insert-quote) 431 432 ;; bindings for `makeinfo.el' 433 (define-key texinfo-mode-map "\C-c\C-m\C-k" 'kill-compilation) 434 (define-key texinfo-mode-map "\C-c\C-m\C-l" 435 'makeinfo-recenter-compilation-buffer) 436 (define-key texinfo-mode-map "\C-c\C-m\C-r" 'makeinfo-region) 437 (define-key texinfo-mode-map "\C-c\C-m\C-b" 'makeinfo-buffer) 438 439 ;; bindings for `texinfmt.el' 440 (define-key texinfo-mode-map "\C-c\C-e\C-r" 'texinfo-format-region) 441 (define-key texinfo-mode-map "\C-c\C-e\C-b" 'texinfo-format-buffer) 442 443 ;; AUCTeX-like bindings 444 (define-key texinfo-mode-map "\e\r" 'texinfo-insert-@item) 445 446 ;; bindings for updating nodes and menus 447 448 (define-key texinfo-mode-map "\C-c\C-um" 'texinfo-master-menu) 449 450 (define-key texinfo-mode-map "\C-c\C-u\C-m" 'texinfo-make-menu) 451 (define-key texinfo-mode-map "\C-c\C-u\C-n" 'texinfo-update-node) 452 (define-key texinfo-mode-map "\C-c\C-u\C-e" 'texinfo-every-node-update) 453 (define-key texinfo-mode-map "\C-c\C-u\C-a" 'texinfo-all-menus-update) 454 455 (define-key texinfo-mode-map "\C-c\C-s" 'texinfo-show-structure) 456 457 (define-key texinfo-mode-map "\C-c}" 'up-list) 458 (define-key texinfo-mode-map "\C-c]" 'up-list) 459 (define-key texinfo-mode-map "\C-c{" 'texinfo-insert-braces) 460 461 ;; bindings for inserting strings 462 (define-key texinfo-mode-map "\C-c\C-o" 'texinfo-insert-block) 463 (define-key texinfo-mode-map "\C-c\C-c\C-d" 'texinfo-start-menu-description) 464 (define-key texinfo-mode-map "\C-c\C-c\C-s" 'texinfo-insert-@strong) 465 (define-key texinfo-mode-map "\C-c\C-c\C-e" 'texinfo-insert-@emph) 466 467 (define-key texinfo-mode-map "\C-c\C-cv" 'texinfo-insert-@var) 468 (define-key texinfo-mode-map "\C-c\C-cu" 'texinfo-insert-@uref) 469 (define-key texinfo-mode-map "\C-c\C-ct" 'texinfo-insert-@table) 470 (define-key texinfo-mode-map "\C-c\C-cs" 'texinfo-insert-@samp) 471 (define-key texinfo-mode-map "\C-c\C-cq" 'texinfo-insert-@quotation) 472 (define-key texinfo-mode-map "\C-c\C-co" 'texinfo-insert-@noindent) 473 (define-key texinfo-mode-map "\C-c\C-cn" 'texinfo-insert-@node) 474 (define-key texinfo-mode-map "\C-c\C-cm" 'texinfo-insert-@email) 475 (define-key texinfo-mode-map "\C-c\C-ck" 'texinfo-insert-@kbd) 476 (define-key texinfo-mode-map "\C-c\C-ci" 'texinfo-insert-@item) 477 (define-key texinfo-mode-map "\C-c\C-cf" 'texinfo-insert-@file) 478 (define-key texinfo-mode-map "\C-c\C-cx" 'texinfo-insert-@example) 479 (define-key texinfo-mode-map "\C-c\C-ce" 'texinfo-insert-@end) 480 (define-key texinfo-mode-map "\C-c\C-cd" 'texinfo-insert-@dfn) 481 (define-key texinfo-mode-map "\C-c\C-cc" 'texinfo-insert-@code)) 482 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 "----" 490 ["Update All" (lambda () (interactive) (texinfo-master-menu t)) 491 :keys "\\[universal-argument] \\[texinfo-master-menu]"] 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 504 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 514;;; Texinfo mode 515 516;;;###autoload 517(define-derived-mode texinfo-mode text-mode "Texinfo" 518 "Major mode for editing Texinfo files. 519 520 It has these extra commands: 521\\{texinfo-mode-map} 522 523 These are files that are used as input for TeX to make printed manuals 524and also to be turned into Info files with \\[makeinfo-buffer] or 525the `makeinfo' program. These files must be written in a very restricted and 526modified version of TeX input format. 527 528 Editing commands are like text-mode except that the syntax table is 529set up so expression commands skip Texinfo bracket groups. To see 530what the Info version of a region of the Texinfo file will look like, 531use \\[makeinfo-region], which runs `makeinfo' on the current region. 532 533 You can show the structure of a Texinfo file with \\[texinfo-show-structure]. 534This command shows the structure of a Texinfo file by listing the 535lines with the @-sign commands for @chapter, @section, and the like. 536These lines are displayed in another window called the *Occur* window. 537In that window, you can position the cursor over one of the lines and 538use \\[occur-mode-goto-occurrence], to jump to the corresponding spot 539in the Texinfo file. 540 541 In addition, Texinfo mode provides commands that insert various 542frequently used @-sign commands into the buffer. You can use these 543commands to save keystrokes. And you can insert balanced braces with 544\\[texinfo-insert-braces] and later use the command \\[up-list] to 545move forward past the closing brace. 546 547Also, Texinfo mode provides functions for automatically creating or 548updating menus and node pointers. These functions 549 550 * insert the `Next', `Previous' and `Up' pointers of a node, 551 * insert or update the menu for a section, and 552 * create a master menu for a Texinfo source file. 553 554Here are the functions: 555 556 texinfo-update-node \\[texinfo-update-node] 557 texinfo-every-node-update \\[texinfo-every-node-update] 558 texinfo-sequential-node-update 559 560 texinfo-make-menu \\[texinfo-make-menu] 561 texinfo-all-menus-update \\[texinfo-all-menus-update] 562 texinfo-master-menu 563 564 texinfo-indent-menu-description (column &optional region-p) 565 566The `texinfo-column-for-description' variable specifies the column to 567which menu descriptions are indented. 568 569Passed an argument (a prefix argument, if interactive), the 570`texinfo-update-node' and `texinfo-make-menu' functions do their jobs 571in the region. 572 573To use the updating commands, you must structure your Texinfo file 574hierarchically, such that each `@node' line, with the exception of the 575Top node, is accompanied by some kind of section line, such as an 576`@chapter' or `@section' line. 577 578If the file has a `top' node, it must be called `top' or `Top' and 579be the first node in the file. 580 581Entering Texinfo mode calls the value of `text-mode-hook', and then the 582value of `texinfo-mode-hook'." 583 (set (make-local-variable 'page-delimiter) 584 (concat 585 "^@node [ \t]*[Tt]op\\|^@\\(" 586 texinfo-chapter-level-regexp 587 "\\)\\>")) 588 (make-local-variable 'require-final-newline) 589 (setq require-final-newline mode-require-final-newline) 590 (make-local-variable 'indent-tabs-mode) 591 (setq indent-tabs-mode nil) 592 (make-local-variable 'paragraph-separate) 593 (setq paragraph-separate 594 (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-separate)) 595 (make-local-variable 'paragraph-start) 596 (setq paragraph-start (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-start)) 597 (make-local-variable 'sentence-end-base) 598 (setq sentence-end-base 599 "\\(@\\(end\\)?dots{}\\|[.?!]\\)[]\"'$B!I$,1r}(B)}]*") 600 (make-local-variable 'adaptive-fill-mode) 601 (setq adaptive-fill-mode nil) 602 (make-local-variable 'fill-column) 603 (setq fill-column 70) 604 (make-local-variable 'comment-start) 605 (setq comment-start "@c ") 606 (make-local-variable 'comment-start-skip) 607 (setq comment-start-skip "@c +\\|@comment +") 608 (make-local-variable 'words-include-escapes) 609 (setq words-include-escapes t) 610 (make-local-variable 'imenu-generic-expression) 611 (setq imenu-generic-expression texinfo-imenu-generic-expression) 612 (setq imenu-case-fold-search nil) 613 (make-local-variable 'font-lock-defaults) 614 (setq font-lock-defaults 615 '(texinfo-font-lock-keywords nil nil nil backward-paragraph 616 (font-lock-syntactic-keywords 617 . texinfo-font-lock-syntactic-keywords))) 618 (set (make-local-variable 'parse-sexp-lookup-properties) t) 619 620 ;; Outline settings. 621 (set (make-local-variable 'outline-heading-alist) 622 ;; We should merge outline-heading-alist and texinfo-section-list 623 ;; but in the mean time, let's just generate one from the other. 624 (mapcar (lambda (x) (cons (concat "@" (car x)) (cadr x))) 625 texinfo-section-list)) 626 (set (make-local-variable 'outline-regexp) 627 (concat (regexp-opt (mapcar 'car outline-heading-alist) t) 628 "\\>")) 629 630 (make-local-variable 'tex-start-of-header) 631 (setq tex-start-of-header "%\\*\\*start") 632 (make-local-variable 'tex-end-of-header) 633 (setq tex-end-of-header "%\\*\\*end") 634 (make-local-variable 'tex-first-line-header-regexp) 635 (setq tex-first-line-header-regexp "^\\\\input") 636 (make-local-variable 'tex-trailer) 637 (setq tex-trailer "@bye\n") 638 639 ;; Prevent filling certain lines, in addition to ones specified 640 ;; by the user. 641 (let ((prevent-filling "^@\\(def\\|multitable\\)")) 642 (set (make-local-variable 'auto-fill-inhibit-regexp) 643 (if (null auto-fill-inhibit-regexp) 644 prevent-filling 645 (concat auto-fill-inhibit-regexp "\\|" prevent-filling))))) 646 647 648 649;;; Insert string commands 650 651(defvar texinfo-block-default "example") 652 653(define-skeleton texinfo-insert-block 654 "Create a matching pair @<cmd> .. @end <cmd> at point. 655Puts point on a blank line between them." 656 (setq texinfo-block-default 657 (completing-read (format "Block name [%s]: " texinfo-block-default) 658 texinfo-environments 659 nil nil nil nil texinfo-block-default)) 660 \n "@" str \n _ \n "@end " str \n) 661 662(defun texinfo-inside-macro-p (macro &optional bound) 663 "Non-nil if inside a macro matching the regexp MACRO." 664 (condition-case nil 665 (save-excursion 666 (save-restriction 667 (narrow-to-region bound (point)) 668 (while (progn 669 (up-list -1) 670 (not (condition-case nil 671 (save-excursion 672 (backward-sexp 1) 673 (looking-at macro)) 674 (scan-error nil))))) 675 t)) 676 (scan-error nil))) 677 678(defun texinfo-inside-env-p (env &optional bound) 679 "Non-nil if inside an environment matching the regexp @ENV." 680 (save-excursion 681 (and (re-search-backward (concat "@\\(end\\s +\\)?" env) bound t) 682 (not (match-end 1))))) 683 684(defvar texinfo-enable-quote-macros "@\\(code\\|samp\\|kbd\\)\\>") 685(defvar texinfo-enable-quote-envs '("example\\>" "lisp\\>")) 686(defun texinfo-insert-quote (&optional arg) 687 "Insert the appropriate quote mark for Texinfo. 688Usually inserts the value of `texinfo-open-quote' (normally ``) or 689`texinfo-close-quote' (normally ''), depending on the context. 690With prefix argument or inside @code or @example, inserts a plain \"." 691 (interactive "*P") 692 (let ((top (or (save-excursion (re-search-backward "@node\\>" nil t)) 693 (point-min)))) 694 (if (or arg 695 (= (preceding-char) ?\\) 696 (save-excursion 697 (backward-char (length texinfo-open-quote)) 698 (when (or (looking-at texinfo-open-quote) 699 (looking-at texinfo-close-quote)) 700 (delete-char (length texinfo-open-quote)) 701 t)) 702 (texinfo-inside-macro-p texinfo-enable-quote-macros top) 703 (let ((in-env nil)) 704 (dolist (env texinfo-enable-quote-envs in-env) 705 (if (texinfo-inside-env-p env top) 706 (setq in-env t))))) 707 (self-insert-command (prefix-numeric-value arg)) 708 (insert 709 (if (memq (char-syntax (preceding-char)) '(?\( ?> ?\s)) 710 texinfo-open-quote 711 texinfo-close-quote))))) 712 713;; The following texinfo-insert-@end command not only inserts a SPC 714;; after the @end, but tries to find out what belongs there. It is 715;; not very smart: it does not understand nested lists. 716 717(defun texinfo-last-unended-begin () 718 (while (and (re-search-backward texinfo-environment-regexp) 719 (looking-at "@end")) 720 (texinfo-last-unended-begin))) 721 722(defun texinfo-next-unmatched-end () 723 (while (and (re-search-forward texinfo-environment-regexp) 724 (save-excursion 725 (goto-char (match-beginning 0)) 726 (not (looking-at "@end")))) 727 (texinfo-next-unmatched-end))) 728 729(defun texinfo-insert-@end () 730 "Insert the matching `@end' for the last Texinfo command that needs one." 731 (interactive) 732 (let ((string 733 (ignore-errors 734 (save-excursion 735 (texinfo-last-unended-begin) 736 (match-string 1))))) 737 (insert "@end ") 738 (if string (insert string "\n")))) 739 740;; The following insert commands accept a prefix arg N, which is the 741;; number of words (actually s-exprs) that should be surrounded by 742;; braces. Thus you can first paste a variable name into a .texinfo 743;; buffer, then say C-u 1 C-c C-c v at the beginning of the just 744;; pasted variable name to put @var{...} *around* the variable name. 745;; Operate on previous word or words with negative arg. 746 747;; These commands use texinfo-insert-@-with-arg 748(defun texinfo-insert-@-with-arg (string &optional arg) 749 (if arg 750 (progn 751 (setq arg (prefix-numeric-value arg)) 752 (if (< arg 0) 753 (progn 754 (skip-chars-backward " \t\n\r\f") 755 (save-excursion 756 (forward-sexp arg) 757 (insert "@" string "{")) 758 (insert "}")) 759 (skip-chars-forward " \t\n\r\f") 760 (insert "@" string "{") 761 (forward-sexp arg) 762 (insert "}"))) 763 (insert "@" string "{}") 764 (backward-char))) 765 766(defun texinfo-insert-braces () 767 "Make a pair of braces and be poised to type inside of them. 768Use \\[up-list] to move forward out of the braces." 769 (interactive) 770 (insert "{}") 771 (backward-char)) 772 773(defun texinfo-insert-@code (&optional arg) 774 "Insert a `@code{...}' 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 "code" arg)) 779 780(defun texinfo-insert-@dfn (&optional arg) 781 "Insert a `@dfn{...}' 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 "dfn" arg)) 786 787(defun texinfo-insert-@email (&optional arg) 788 "Insert a `@email{...}' command in a Texinfo buffer. 789A numeric argument says how many words the braces should surround. 790The default is not to surround any existing words with the braces." 791 (interactive "P") 792 (texinfo-insert-@-with-arg "email" arg)) 793 794(defun texinfo-insert-@emph (&optional arg) 795 "Insert a `@emph{...}' command in a Texinfo buffer. 796A numeric argument says how many words the braces should surround. 797The default is not to surround any existing words with the braces." 798 (interactive "P") 799 (texinfo-insert-@-with-arg "emph" arg)) 800 801(defun texinfo-insert-@example () 802 "Insert the string `@example' in a Texinfo buffer." 803 (interactive) 804 (insert "@example\n")) 805 806(defun texinfo-insert-@file (&optional arg) 807 "Insert a `@file{...}' command in a Texinfo buffer. 808A numeric argument says how many words the braces should surround. 809The default is not to surround any existing words with the braces." 810 (interactive "P") 811 (texinfo-insert-@-with-arg "file" arg)) 812 813(defun texinfo-insert-@item () 814 "Insert the string `@item' in a Texinfo buffer. 815If in a table defined by @table, follow said string with a space. 816Otherwise, follow with a newline." 817 (interactive) 818 (insert "@item" 819 (if (equal (ignore-errors 820 (save-excursion 821 (texinfo-last-unended-begin) 822 (match-string 1))) 823 "table") 824 ?\s 825 ?\n))) 826 827(defun texinfo-insert-@kbd (&optional arg) 828 "Insert a `@kbd{...}' 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." 831 (interactive "P") 832 (texinfo-insert-@-with-arg "kbd" arg)) 833 834(defun texinfo-insert-@node () 835 "Insert the string `@node' in a Texinfo buffer. 836Insert a comment on the following line indicating the order of 837arguments to @node. Insert a carriage return after the comment line. 838Leave point after `@node'." 839 (interactive) 840 (insert "@node \n@comment node-name, next, previous, up\n") 841 (forward-line -2) 842 (forward-char 6)) 843 844(defun texinfo-insert-@noindent () 845 "Insert the string `@noindent' in a Texinfo buffer." 846 (interactive) 847 (insert "@noindent\n")) 848 849(defun texinfo-insert-@quotation () 850 "Insert the string `@quotation' in a Texinfo buffer." 851 (interactive) 852 (insert "@quotation\n")) 853 854(defun texinfo-insert-@samp (&optional arg) 855 "Insert a `@samp{...}' command in a Texinfo buffer. 856A numeric argument says how many words the braces should surround. 857The default is not to surround any existing words with the braces." 858 (interactive "P") 859 (texinfo-insert-@-with-arg "samp" arg)) 860 861(defun texinfo-insert-@strong (&optional arg) 862 "Insert a `@strong{...}' command in a Texinfo buffer. 863A numeric argument says how many words the braces should surround. 864The default is not to surround any existing words with the braces." 865 (interactive "P") 866 (texinfo-insert-@-with-arg "strong" arg)) 867 868(defun texinfo-insert-@table () 869 "Insert the string `@table' in a Texinfo buffer." 870 (interactive) 871 (insert "@table ")) 872 873(defun texinfo-insert-@var (&optional arg) 874 "Insert a `@var{}' command in a Texinfo buffer. 875A numeric argument says how many words the braces should surround. 876The default is not to surround any existing words with the braces." 877 (interactive "P") 878 (texinfo-insert-@-with-arg "var" arg)) 879 880(defun texinfo-insert-@uref (&optional arg) 881 "Insert a `@uref{}' command in a Texinfo buffer. 882A numeric argument says how many words the braces should surround. 883The default is not to surround any existing words with the braces." 884 (interactive "P") 885 (texinfo-insert-@-with-arg "uref" arg)) 886(defalias 'texinfo-insert-@url 'texinfo-insert-@uref) 887 888;;; Texinfo file structure 889 890(defun texinfo-show-structure (&optional nodes-too) 891 "Show the structure of a Texinfo file. 892List the lines in the file that begin with the @-sign commands for 893@chapter, @section, and the like. 894 895With optional argument (prefix if interactive), list both the lines 896with @-sign commands for @chapter, @section, and the like, and list 897@node lines. 898 899Lines with structuring commands beginning in them are displayed in 900another buffer named `*Occur*'. In that buffer, you can move point to 901one of those lines and then use 902\\<occur-mode-map>\\[occur-mode-goto-occurrence], 903to jump to the corresponding spot in the Texinfo source file." 904 905 (interactive "P") 906 ;; First, remember current location 907 (let (current-location) 908 (save-excursion 909 (end-of-line) ; so as to find section on current line 910 (if (re-search-backward 911 ;; do not require `texinfo-section-types-regexp' in texnfo-upd.el 912 "^@\\(chapter \\|sect\\|subs\\|subh\\|unnum\\|major\\|chapheading \\|heading \\|appendix\\)" 913 nil t) 914 (setq current-location 915 (progn 916 (beginning-of-line) 917 (buffer-substring (point) (progn (end-of-line) (point))))) 918 ;; else point is located before any section command. 919 (setq current-location "tex"))) 920 ;; Second, create and format an *Occur* buffer 921 (save-excursion 922 (goto-char (point-min)) 923 (occur (concat "^\\(?:" (if nodes-too "@node\\>\\|") 924 outline-regexp "\\)"))) 925 (pop-to-buffer "*Occur*") 926 (goto-char (point-min)) 927 (let ((inhibit-read-only t)) 928 (flush-lines "-----") 929 ;; Now format the "*Occur*" buffer to show the structure. 930 ;; Thanks to ceder@signum.se (Per Cederqvist) 931 (goto-char (point-max)) 932 (let (level) 933 (while (re-search-backward "^ *[0-9]*:@\\(\\sw+\\)" nil 0) 934 (goto-char (1- (match-beginning 1))) 935 (setq level 936 (or (cadr (assoc (match-string 1) texinfo-section-list)) 2)) 937 (indent-to-column (+ (current-column) (* 4 (- level 2)))) 938 (beginning-of-line)))) 939 ;; Third, go to line corresponding to location in source file 940 ;; potential bug: two exactly similar `current-location' lines ... 941 (goto-char (point-min)) 942 (re-search-forward current-location nil t) 943 (beginning-of-line) 944 )) 945 946 947;;; The tex and print function definitions: 948 949(defcustom texinfo-texi2dvi-command "texi2dvi" 950 "*Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer." 951 :type 'string 952 :group 'texinfo) 953 954(defcustom texinfo-tex-command "tex" 955 "*Command used by `texinfo-tex-region' to run TeX on a region." 956 :type 'string 957 :group 'texinfo) 958 959(defcustom texinfo-texindex-command "texindex" 960 "*Command used by `texinfo-texindex' to sort unsorted index files." 961 :type 'string 962 :group 'texinfo) 963 964(defcustom texinfo-delete-from-print-queue-command "lprm" 965 "*Command string used to delete a job from the line printer queue. 966Command is used by \\[texinfo-delete-from-print-queue] based on 967number provided by a previous \\[tex-show-print-queue] 968command." 969 :type 'string 970 :group 'texinfo) 971 972(defvar texinfo-tex-trailer "@bye" 973 "String appended after a region sent to TeX by `texinfo-tex-region'.") 974 975(defun texinfo-tex-region (beg end) 976 "Run TeX on the current region. 977This works by writing a temporary file (`tex-zap-file') in the directory 978that is the value of `tex-directory', then running TeX on that file. 979 980The first line of the buffer is copied to the 981temporary file; and if the buffer has a header, it is written to the 982temporary file before the region itself. The buffer's header is all lines 983between the strings defined by `tex-start-of-header' and `tex-end-of-header' 984inclusive. The header must start in the first 100 lines. 985 986The value of `texinfo-tex-trailer' is appended to the temporary file after the region." 987 (interactive "r") 988 (require 'tex-mode) 989 (let ((tex-command texinfo-tex-command) 990 (tex-trailer texinfo-tex-trailer)) 991 (tex-region beg end))) 992 993(defun texinfo-tex-buffer () 994 "Run TeX on visited file, once or twice, to make a correct `.dvi' file." 995 (interactive) 996 (require 'tex-mode) 997 (let ((tex-command texinfo-texi2dvi-command) 998 ;; Disable tex-start-options-string. texi2dvi would not 999 ;; understand anything specified here. 1000 (tex-start-options-string "")) 1001 (tex-buffer))) 1002 1003(defun texinfo-texindex () 1004 "Run `texindex' on unsorted index files. 1005The index files are made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. 1006This runs the shell command defined by `texinfo-texindex-command'." 1007 (interactive) 1008 (require 'tex-mode) 1009 (tex-send-command texinfo-texindex-command (concat tex-zap-file ".??")) 1010 ;; alternatively 1011 ;; (send-string "tex-shell" 1012 ;; (concat texinfo-texindex-command 1013 ;; " " tex-zap-file ".??" "\n")) 1014 (tex-recenter-output-buffer nil)) 1015 1016(defun texinfo-tex-print () 1017 "Print `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. 1018This runs the shell command defined by `tex-dvi-print-command'." 1019 (interactive) 1020 (require 'tex-mode) 1021 (tex-print)) 1022 1023(defun texinfo-tex-view () 1024 "View `.dvi' file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. 1025This runs the shell command defined by `tex-dvi-view-command'." 1026 (interactive) 1027 (require 'tex-mode) 1028 (tex-view)) 1029 1030(defun texinfo-quit-job () 1031 "Quit currently running TeX job, by sending an `x' to it." 1032 (interactive) 1033 (if (not (get-process "tex-shell")) 1034 (error "No TeX shell running")) 1035 (tex-send-command "x")) 1036;; alternatively: 1037;; save-excursion 1038;; (set-buffer (get-buffer "*tex-shell*")) 1039;; (goto-char (point-max)) 1040;; (insert "x") 1041;; (comint-send-input) 1042 1043(defun texinfo-delete-from-print-queue (job-number) 1044 "Delete job from the line printer spooling queue. 1045You are prompted for the job number (use a number shown by a previous 1046\\[tex-show-print-queue] command)." 1047 (interactive "nPrinter job number for deletion: ") 1048 (require 'tex-mode) 1049 (if (tex-shell-running) 1050 (tex-kill-job) 1051 (tex-start-shell)) 1052 (tex-send-command texinfo-delete-from-print-queue-command job-number) 1053 ;; alternatively 1054 ;; (send-string "tex-shell" 1055 ;; (concat 1056 ;; texinfo-delete-from-print-queue-command 1057 ;; " " 1058 ;; job-number"\n")) 1059 (tex-recenter-output-buffer nil)) 1060 1061(provide 'texinfo) 1062 1063;; arch-tag: 005d7c38-43b9-4b7d-aa1d-aea69bae73e1 1064;;; texinfo.el ends here 1065