From becff06c71d277647eda4378203d03ab36e141eb Mon Sep 17 00:00:00 2001 From: mattkae Date: Tue, 17 May 2022 07:07:37 -0400 Subject: Evil mode and latex support --- elpa/auctex-13.1.3/tex-info.el | 887 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 887 insertions(+) create mode 100644 elpa/auctex-13.1.3/tex-info.el (limited to 'elpa/auctex-13.1.3/tex-info.el') diff --git a/elpa/auctex-13.1.3/tex-info.el b/elpa/auctex-13.1.3/tex-info.el new file mode 100644 index 0000000..66e5751 --- /dev/null +++ b/elpa/auctex-13.1.3/tex-info.el @@ -0,0 +1,887 @@ +;;; tex-info.el --- Support for editing Texinfo source. -*- lexical-binding: t; -*- + +;; Copyright (C) 1993-2022 Free Software Foundation, Inc. + +;; Maintainer: auctex-devel@gnu.org +;; Keywords: tex + +;; This file is part of AUCTeX. + +;; AUCTeX is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; AUCTeX is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with AUCTeX; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +;; 02110-1301, USA. + +;;; Code: + +(eval-when-compile + (require 'cl-lib)) + +(require 'tex) + +(require 'texinfo) + +;;; Environments: +(defvar Texinfo-environment-list + '(("cartouche") ("command") ("copying") ("defcv") ("deffn") ("defivar") + ("defmac") ("defmethod") ("defop") ("defopt") ("defspec") + ("deftp") ("deftypefn") ("deftypefun") ("deftypevar") ("deftypevr") + ("defun") ("defvar") ("defvr") ("description") ("detailmenu") + ("direntry") ("display") ("documentdescription") ("enumerate") + ("example") ("float") ("flushleft") ("flushright") ("format") ("ftable") + ("group") ("html") ("ifclear") ("ifdocbook") ("ifhtml") ("ifinfo") + ("ifnotdocbook") ("ifnothtml") ("ifnotinfo") ("ifnotplaintext") + ("ifnottex") ("ifnotxml") ("ifplaintext") ("ifset") ("iftex") + ("ifxml") ("ignore") ("itemize") ("lisp") ("macro") ("menu") + ("multitable") ("quotation") ("smalldisplay") ("smallexample") + ("smallformat") ("smalllisp") ("table") ("tex") ("titlepage") + ("verbatim") ("vtable")) + "Alist of Texinfo environments.") + +(defconst texinfo-environment-regexp + ;; Overwrite version from `texinfo.el'. + (concat "^@\\(" + (mapconcat #'car Texinfo-environment-list "\\|") + "\\|end\\)\\>") + "Regexp for environment-like Texinfo list commands. +Subexpression 1 is what goes into the corresponding `@end' statement.") + +(defun Texinfo-environment (env &optional arg) + "Make Texinfo environment ENV. +With optional ARG, modify current environment." + ;; XXX: This could be enhanced to act like `LaTeX-environment', + ;; i.e. suggest a default environment and have its own history. + (interactive (list (completing-read "Environment: " + Texinfo-environment-list) + current-prefix-arg)) + (if arg + (Texinfo-modify-environment env) + (Texinfo-insert-environment env))) + +(defun Texinfo-insert-environment (env) + "Insert Texinfo environment ENV." + (if (and (TeX-active-mark) + (not (eq (mark) (point)))) + (progn + (when (< (mark) (point)) + (exchange-point-and-mark)) + (unless (TeX-looking-at-backward "^[ \t]*") + (newline)) + (insert "@" env) + (newline) + (goto-char (mark)) + (unless (TeX-looking-at-backward "^[ \t]*") + (newline)) + (insert "@end " env) + (save-excursion (newline)) + (end-of-line 0)) + (insert "@" env "\n\n@end " env "\n") + (if (null (cdr-safe (assoc "defcv" Texinfo-environment-list))) + (forward-line -2)))) + +(defun Texinfo-modify-environment (env) + "Change current environment to environment ENV." + (save-excursion + (Texinfo-find-env-end) + (re-search-backward (concat (regexp-quote TeX-esc) "end \\([a-zA-Z]*\\)") + (line-beginning-position)) + (replace-match env t t nil 1) + (beginning-of-line) + (Texinfo-find-env-start) + (re-search-forward (concat (regexp-quote TeX-esc) "\\([a-zA-Z]*\\)") + (line-end-position)) + (replace-match env t t nil 1))) + +(defun Texinfo-find-env-end () + "Move point to the end of the current environment." + (interactive) + (let* ((envs (mapcar #'car Texinfo-environment-list)) + (regexp (concat "^[ \t]*" (regexp-quote TeX-esc) "\\(end \\)*" + (regexp-opt envs t) "\\b")) + (orig-pos (point)) + (level 1) + case-fold-search) + (save-restriction + (save-excursion + (save-excursion + (beginning-of-line) + ;; Stop if point is inside of an @end command, but not + ;; if it is behind it. + (when (and (looking-at regexp) + (match-string 1) + (> (match-end 0) orig-pos)) + (setq level 0))) + (while (and (> level 0) (re-search-forward regexp nil t)) + (if (match-string 1) + (setq level (1- level)) + (setq level (1+ level))))) + (if (= level 0) + (goto-char (match-end 0)) + (error "Can't locate end of current environment"))))) + +(defun Texinfo-find-env-start () + "Move point to the start of the current environment." + (interactive) + (let* ((envs (mapcar #'car Texinfo-environment-list)) + (regexp (concat "^[ \t]*\\(" (regexp-quote TeX-esc) "\\)\\(end \\)*" + (regexp-opt envs t) "\\b")) + (level 1) + (orig-pos (point)) + case-fold-search) + (save-restriction + (save-excursion + (save-excursion + (beginning-of-line) + ;; Stop if point is inside of an @ command, but not if + ;; it is before it. + (when (and (looking-at regexp) + (not (match-string 2)) + (< (match-beginning 1) orig-pos)) + (setq level 0))) + (while (and (> level 0) (re-search-backward regexp nil t)) + (if (match-string 2) + (setq level (1+ level)) + (setq level (1- level))))) + (if (= level 0) + (goto-char (match-beginning 0)) + (error "Can't locate start of current environment"))))) + +(defun Texinfo-mark-environment (&optional count) + "Set mark to end of current environment and point to the matching begin. +If prefix argument COUNT is given, mark the respective number of +enclosing environments. The command will not work properly if +there are unbalanced begin-end pairs in comments and verbatim +environments." + ;; TODO: + ;; This is identical to the LaTeX counterpart but for the find begin/end + ;; functions. So some day the implemenation should be factorized. + (interactive "p") + (setq count (if count (abs count) 1)) + (let ((cur (point)) beg end) + ;; Only change point and mark after beginning and end were found. + ;; Point should not end up in the middle of nowhere if the search fails. + (save-excursion + (dotimes (_ count) + (Texinfo-find-env-end)) + (setq end (line-beginning-position 2)) + (goto-char cur) + (dotimes (c count) + (Texinfo-find-env-start) + (unless (= (1+ c) count) + (beginning-of-line 0))) + (setq beg (point))) + (push-mark end) + (goto-char beg) + (TeX-activate-region))) + +(defun Texinfo-mark-section (&optional no-subsection) + "Mark current section, with inclusion of any containing node. + +The current section is detected as starting by any of the +structuring commands matched by regexp in variable +`outline-regexp' which in turn is a regexp matching any element +of variable `texinfo-section-list'. + +If optional argument NO-SUBSECTION is set to any integer or is a +non nil empty argument (that is, `\\[universal-argument] \\[Texinfo-mark-section]'), +then mark the current section with exclusion of any subsections. + +Otherwise, any included subsections are also marked along with +current section. + +Note that when current section is starting immediatley after a +node commande, then the node command is also marked as part as +the section." + (interactive "P") + (let (beg end is-beg-section is-end-section + (section-re (concat "^\\s-*" outline-regexp))) + (if (and (consp no-subsection) (eq (car no-subsection) 4)) + ;; section with exclusion of any subsection + (setq beg (save-excursion + (unless (looking-at section-re) + (end-of-line)) + (re-search-backward section-re nil t)) + is-beg-section t + end (save-excursion + (beginning-of-line) + (when + (re-search-forward (concat section-re + "\\|^\\s-*@bye\\_>" ) + nil t) + (save-match-data + (beginning-of-line) + (point)))) + is-end-section (match-string 1)) + ;; full section without exclusion of any subsection + (let (section-command-level) + (setq beg + (save-excursion + (end-of-line) + (re-search-backward section-re nil t))) + (when beg + (setq is-beg-section t + section-command-level + (cadr (assoc (match-string 1) texinfo-section-list)) + end + (save-excursion + (beginning-of-line) + (while + (and (re-search-forward + (concat section-re "\\|^\\s-*@bye\\_>" ) nil t) + (or (null (setq is-end-section (match-string 1))) + (> (cadr (assoc is-end-section + texinfo-section-list)) + section-command-level)))) + (when (match-string 0) + (beginning-of-line) + (point))))))); (if ...) + (when (and beg end) + ;; now take also enclosing node of beg and end + (let ((before-@node + (lambda (pos) + (save-excursion + (goto-char pos) + (while (and + (null (bobp)) + (progn + (beginning-of-line 0) + (looking-at + "^\\s-*\\($\\|@\\(c\\|comment\\)\\_>\\)")))) + (when (looking-at "^\\s-*@node\\_>") + (point)))))) + (when is-beg-section + (setq beg (or (funcall before-@node beg) beg))) + (when is-end-section + (setq end (or (funcall before-@node end) end)))) + + (push-mark end) + (goto-char beg) + (TeX-activate-region) ))) + +(defun Texinfo-mark-node () + "Mark the current node. +This is the node in which the pointer is. It is starting at +previous beginning of keyword `@node' and ending at next +beginning of keyword `@node' or `@bye'." + (interactive) + (let ((beg (save-excursion + (unless (looking-at "^\\s-*@\\(?:node\\)\\_>") + (end-of-line)) + (re-search-backward "^\\s-*@\\(?:node\\)\\_>" nil t ))) + (end (save-excursion + (beginning-of-line) + (and (re-search-forward "^\\s-*@\\(?:node\\|bye\\)\\_>" nil t ) + (progn (beginning-of-line) (point)))))) + + (when (and beg end) + (push-mark end) + (goto-char beg) + (TeX-activate-region) ))) + +(defun Texinfo-nodename-de-escape (node-name) + "In NODE-NAME, convert `@comma{}' commands to the corresponding `,' +character. Return the resulting string." + (let ((pos 0) (map '(("comma" . ",")))) + (while (and (< pos (length + node-name)) + (string-match "@\\(comma\\)[[:blank:]]*{}" node-name pos)) + (setq node-name (concat (substring node-name 0 (match-beginning 0)) + (cdr (assoc-string (match-string 1 node-name) map)) + (substring node-name (match-end 0))) + pos (1+ (match-beginning 0))))) + node-name) + + +(defun Texinfo-nodename-escape (node-name) + "Convert in NODE-NAME the `,' characters to `@comma{}' +commands. Return the resulting string." + (let* ((pos 0) + (map '(("," . "comma"))) + (re (regexp-opt (mapcar #'car map))) ) + (while (and (< pos (length node-name)) (string-match re node-name pos)) + (setq node-name (concat (substring node-name 0 (match-beginning 0)) + "@" (cdr (assoc-string (match-string 0 node-name) map)) + "{}" + (substring node-name (match-end 0))) + pos (1+ (match-beginning 0))))) + node-name) + + +(defun Texinfo-make-node-list () + ;; Build list of nodes in current buffer. + ;; (What about using `imenu--index-alist'?) + ;; FIXME: Support multi-file documents. + (save-excursion + (goto-char (point-min)) + (let (nodes dups) + (while (re-search-forward "^@node\\b" nil t) + (skip-chars-forward "[:blank:]") + (cl-pushnew (list (Texinfo-nodename-de-escape + (buffer-substring-no-properties + (point) (progn (skip-chars-forward "^\r\n,") + (skip-chars-backward "[:blank:]") + (point))))) + nodes + :test (lambda (a b) + (when (equal a b) + (push (cons a (line-number-at-pos (point))) dups) + t)))) + (when dups + (display-warning + 'AUCTeX + (format "There are duplicate nodes:\n%s" + (mapconcat (lambda (dup) + (format " %s on line %d" (car dup) (cdr dup))) + (nreverse dups) + "\n")))) + (nreverse nodes)))) + +(defun Texinfo-insert-node () + "Insert a Texinfo node in the current buffer. +That means, insert the string `@node' and prompt for current, +next, previous and upper node. If there is an active region, use +this for the current node and inhibit the prompt for it. Insert +a comment on the following line indicating the order of arguments +for @node." + (interactive) + (let ((active-mark (and (TeX-active-mark) (not (eq (mark) (point))))) + (nodes (Texinfo-make-node-list)) + node-name next-node previous-node up-node) + (unless active-mark + (setq node-name (Texinfo-nodename-escape + (TeX-read-string "Node name: ")))) + ;; FIXME: What if key binding for `minibuffer-complete' was changed? + ;; `substitute-command-keys' doesn't return the correct value. + (setq next-node (Texinfo-nodename-escape + (completing-read "Next node (TAB completes): " nodes))) + (setq previous-node + (Texinfo-nodename-escape + (completing-read "Previous node (TAB completes): " nodes))) + (setq up-node (Texinfo-nodename-escape + (completing-read "Upper node (TAB completes): " nodes))) + (when (and active-mark + (< (mark) (point))) + (exchange-point-and-mark)) + (insert "@node ") + (if active-mark + (goto-char (mark)) + (insert node-name)) + (insert ", " next-node ", " previous-node ", " up-node + "\n@comment node-name, next, previous, up\n") + ;; Position point at first empty field. + (unless (and (or (> (length node-name) 0) active-mark) + (> (length next-node) 0) + (> (length previous-node) 0) + (> (length up-node) 0)) + (forward-line -2) + (forward-char 6) + (catch 'break + (if (or (> (length node-name) 0) active-mark) + (progn (skip-chars-forward "^,") (forward-char 2)) + (throw 'break nil)) + (dolist (node (list next-node previous-node up-node)) + (if (> (length node) 0) + (progn (skip-chars-forward "^,") (forward-char 2)) + (throw 'break nil))))))) + +(defun Texinfo-arg-nodename (optional &optional prompt _definition) + "Prompt for a node name completing with known node names. +OPTIONAL is ignored. +Use PROMPT as the prompt string. +If DEFINITION is non-nil, then chosen node name is a node name to be +added to the list of defined node names. Current implementation +ignored DEFINITION as the full document is scanned for node names at +each invocation." + (let ((node-name (completing-read (TeX-argument-prompt optional prompt "Node") + (Texinfo-make-node-list)))) + (insert "{" (Texinfo-nodename-escape node-name) "}" ))) + +(defun Texinfo-arg-lrc (_optional &rest _args) + (let ((l (read-from-minibuffer "Enter left part: ")) + (c (read-from-minibuffer "Enter center part: ")) + (r (read-from-minibuffer "Enter right part: "))) + (insert " " l " @| " c " @| " r))) + +(defun Texinfo-arg-next-line (_optional &rest _args) + "Go to the beginning of next line if we are at the end of line. +Otherwise insert an end-of-line." + (if (eolp) (forward-line) (insert "\n"))) + +(defun Texinfo-arg-on|off (optional &optional prompt style) + "Prompt for a boolean input. +OPTIONAL is ignored. +Use PROMPT as the prompt string. +STYLE may be one of `:on|off' or `:true|false', if omitted `:on|off' +is assumed by default." +(let ((collection (cdr (assq style + '((nil . #1=("on" "off")) + (:on|off . #1#) + (:true|false "true" "false")))))) + (insert (if (y-or-n-p (TeX-argument-prompt optional prompt (concat (car collection) ", not " (cadr collection)))) + (car collection) + (cadr collection))))) + +(defun Texinfo-arg-choice (optional &optional prompt collection) + (insert (completing-read (TeX-argument-prompt optional prompt "Key") + collection))) + +;; Silence the byte-compiler from warnings for variables and functions declared +;; in reftex. +(defvar reftex-section-levels-all) +(defvar reftex-level-indent) +(defvar reftex-label-menu-flags) +(defvar reftex-tables-dirty) +(defvar reftex-label-alist-builtin) + +(declare-function reftex-match-string "reftex" (n)) +(declare-function reftex-section-number "reftex-parse" (&optional level star)) +(declare-function reftex-nicify-text "reftex" (text)) +(declare-function reftex-ensure-compiled-variables "reftex" ()) + +(defun Texinfo-reftex-section-info (file) + ;; Return a section entry for the current match. + ;; Carefull: This function expects the match-data to be still in place! + (let* ((marker (set-marker (make-marker) (1- (match-beginning 3)))) + (macro (reftex-match-string 3)) + (level-exp (cdr (assoc macro reftex-section-levels-all))) + (level (if (symbolp level-exp) + (save-match-data (funcall level-exp)) + level-exp)) + (unnumbered (< level 0)) + (level (abs level)) + (section-number (reftex-section-number level unnumbered)) + (text1 (save-match-data + (save-excursion + (buffer-substring-no-properties (point) (progn (end-of-line) (point)))))) + (literal (buffer-substring-no-properties + (1- (match-beginning 3)) + (min (point-max) (+ (match-end 0) (length text1) 1)))) + ;; Literal can be too short since text1 too short. No big problem. + (text (reftex-nicify-text text1))) + + ;; Add section number and indentation + (setq text + (concat + (make-string (* reftex-level-indent level) ?\ ) + (if (nth 1 reftex-label-menu-flags) ; section number flag + (concat section-number " ")) + text)) + (prog1 + (list 'toc "toc" text file marker level section-number + literal (marker-position marker)) + (set-marker marker nil)))) + +(defun Texinfo-reftex-hook () + "Hook function to plug Texinfo into RefTeX." + ;; force recompilation of variables + (when (string= TeX-base-mode-name "Texinfo") + ;; dirty temporary hook to remove when reftex has a Texinfo builtin + ;; TODO --- taken on <2014-01-06 mon> --- remove the dirty trick once reftex + ;; has been corrected for long enough a time + (unless (assq 'Texinfo reftex-label-alist-builtin) + (setq reftex-label-alist-builtin (append reftex-label-alist-builtin + '((Texinfo "Texinfo default environments" nil))))) + (dolist (v `((reftex-section-pre-regexp . "@") + ; section post-regexp must contain exactly one group + (reftex-section-post-regexp . "\\([ \t]+\\)") + (reftex-section-info-function . Texinfo-reftex-section-info) + (reftex-default-label-alist-entries . (Texinfo)) + (reftex-section-levels + . ,(mapcar + (lambda (x) + (if (string-match "\\(\\`unnumbered\\)\\|\\(heading\\'\\)\\|\\(\\`top\\'\\)" + (car x)) + (cons (car x) (- (cadr x))) + (cons (car x) (cadr x)))) + texinfo-section-list)))) + (set (make-local-variable (car v) ) (cdr v))) + (reftex-ensure-compiled-variables))) + +;;; Keymap: + +(defvar Texinfo-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map TeX-mode-map) + + ;; From texinfo.el + ;; bindings for updating nodes and menus + (define-key map "\C-c\C-um" #'texinfo-master-menu) + (define-key map "\C-c\C-u\C-m" #'texinfo-make-menu) + (define-key map "\C-c\C-u\C-n" #'texinfo-update-node) + (define-key map "\C-c\C-u\C-e" #'texinfo-every-node-update) + (define-key map "\C-c\C-u\C-a" #'texinfo-all-menus-update) + + ;; Simulating LaTeX-mode + (define-key map "\C-c\C-e" #'Texinfo-environment) + (define-key map "\C-c." #'Texinfo-mark-environment) + (define-key map "\C-c*" #'Texinfo-mark-section) + (define-key map "\M-\C-h" #'Texinfo-mark-node) + (define-key map "\C-c\n" #'texinfo-insert-@item) + (or (key-binding "\e\r") + (define-key map "\e\r" #'texinfo-insert-@item)) ;*** Alias + (define-key map "\C-c\C-s" #'Texinfo-insert-node) + (define-key map "\C-c]" #'texinfo-insert-@end) + + ;; Override some bindings in `TeX-mode-map' + ;; FIXME: Inside @math{}, you can use all plain TeX math commands + ;; even in Texinfo documents. Thus it might be nice to develop + ;; context sensitive command so that the following four keys + ;; inherit the command in `TeX-mode-map' inside @math{}. + (define-key map "$" #'self-insert-command) + (define-key map "^" #'self-insert-command) + (define-key map "_" #'self-insert-command) + (define-key map "\\" #'self-insert-command) + ;; Users benefit from `TeX-electric-macro' even in Texinfo mode + (define-key map "@" #'TeX-insert-backslash) + map) + "Keymap for Texinfo mode.") + +(easy-menu-define Texinfo-command-menu + Texinfo-mode-map + "Menu used in Texinfo mode for external commands." + (TeX-mode-specific-command-menu 'texinfo-mode)) + +(easy-menu-define Texinfo-mode-menu + Texinfo-mode-map + "Menu used in Texinfo mode." + `("Texinfo" + ["Node ..." texinfo-insert-@node + :help "Insert a node"] + ["Macro ..." TeX-insert-macro + :help "Insert a macro and possibly arguments"] + ["Complete Macro" TeX-complete-symbol + :help "Complete the current macro"] + ["Environment ..." Texinfo-insert-environment + :help "Insert an environment"] + ["Item" texinfo-insert-@item + :help "Insert an @item"] + "-" + ("Insert Font" + ["Emphasize" (TeX-font nil ?\C-e) :keys "C-c C-f C-e"] + ["Bold" (TeX-font nil ?\C-b) :keys "C-c C-f C-b"] + ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"] + ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"] + ["Italic" (TeX-font nil ?\C-i) :keys "C-c C-f C-i"] + ["Sample" (TeX-font nil ?\C-s) :keys "C-c C-f C-s"] + ["Roman" (TeX-font nil ?\C-r) :keys "C-c C-f C-r"]) + ("Replace Font" + ["Emphasize" (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"] + ["Bold" (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"] + ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"] + ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"] + ["Italic" (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"] + ["Sample" (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"] + ["Roman" (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"]) + ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"] + "-" + ["Create Master Menu" texinfo-master-menu + :help "Make a master menu for the whole Texinfo file"] + ["Create Menu" texinfo-make-menu + :help "Make or update the menu for the current section"] + ["Update Node" texinfo-update-node + :help "Update the current node"] + ["Update Every Node" texinfo-every-node-update + :help "Update every node in the current file"] + ["Update All Menus" texinfo-all-menus-update + :help "Update every menu in the current file"] + "-" + ("Commenting" + ["Comment or Uncomment Region" + comment-or-uncomment-region + :help "Comment or uncomment the currently selected region"] + ["Comment or Uncomment Paragraph" + TeX-comment-or-uncomment-paragraph + :help "Comment or uncomment the current paragraph"]) + ,TeX-fold-menu + "-" + . ,TeX-common-menu-entries)) + +(defvar Texinfo-font-list + '((?\C-b "@b{" "}") + (?\C-c "@sc{" "}") + (?\C-e "@emph{" "}") + (?\C-i "@i{" "}") + (?\C-r "@r{" "}") + (?\C-s "@samp{" "}") + (?\C-t "@t{" "}") + (?s "@strong{" "}") + (?\C-f "@file{" "}") + (?d "@dfn{" "}") + (?\C-v "@var{" "}") + (?k "@key{" "}") + (?\C-k "@kbd{" "}") + (?c "@code{" "}") + (?C "@cite{" "}") + (?\C-d "" "" t)) + "Font commands used in Texinfo mode. See `TeX-font-list'.") + +;;; Mode: + +;;;###autoload +(defalias 'Texinfo-mode #'texinfo-mode) + +;;;###autoload +(defun TeX-texinfo-mode () + "Major mode in AUCTeX for editing Texinfo files. + +Special commands: +\\{Texinfo-mode-map} + +Entering Texinfo mode calls the value of `text-mode-hook' and then the +value of `Texinfo-mode-hook'." + (interactive) + (kill-all-local-variables) + (setq TeX-mode-p t) + (setq TeX-output-extension (if TeX-PDF-mode "pdf" "dvi")) + (setq TeX-sentinel-default-function #'TeX-TeX-sentinel) + ;; Mostly stolen from texinfo.el + (setq TeX-base-mode-name "Texinfo") + (setq major-mode 'texinfo-mode) + (use-local-map Texinfo-mode-map) + (set-syntax-table texinfo-mode-syntax-table) + + (set (make-local-variable 'page-delimiter) + (concat + "^@node [ \t]*[Tt]op\\|^@\\(" + texinfo-chapter-level-regexp + "\\)")) + (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'indent-tabs-mode) nil) + (set (make-local-variable 'paragraph-separate) + (concat "@[a-zA-Z]*[ \n]\\|" paragraph-separate)) + (set (make-local-variable 'paragraph-start) + (concat "@[a-zA-Z]*[ \n]\\|" paragraph-start)) + (set (make-local-variable 'fill-column) 72) + (set (make-local-variable 'comment-start) "@c ") + (set (make-local-variable 'comment-start-skip) "@c +\\|@comment +") + (set (make-local-variable 'comment-use-syntax) nil) + (setq TeX-comment-start-regexp "@c\\(?:omment\\)?\\>") + (set (make-local-variable 'words-include-escapes) t) + (set (make-local-variable 'imenu-generic-expression) + texinfo-imenu-generic-expression) + + (set (make-local-variable 'font-lock-defaults) + '(texinfo-font-lock-keywords nil nil nil backward-paragraph)) + (set (make-local-variable 'syntax-propertize-function) + texinfo-syntax-propertize-function) + + ;; Outline settings. + (set (make-local-variable 'outline-regexp) + (concat "@\\(" + (mapconcat #'car texinfo-section-list "\\>\\|") + "\\>\\)")) + (set (make-local-variable 'outline-level) 'texinfo-outline-level) + + ;; Mostly AUCTeX stuff + (set (make-local-variable 'TeX-command-current) #'TeX-command-master) + + (setq TeX-default-extension "texi") + (set (make-local-variable 'TeX-esc) "@") + + (set (make-local-variable 'TeX-auto-regexp-list) 'TeX-auto-empty-regexp-list) + + (setq TeX-command-default "TeX") + (setq TeX-header-end "%*end") + (setq TeX-trailer-start (regexp-quote (concat TeX-esc "bye"))) + + (set (make-local-variable 'TeX-complete-list) + (list (list "@\\([a-zA-Z]*\\)" 1 'TeX-symbol-list-filtered nil) + (list "" TeX-complete-word))) + + (set (make-local-variable 'TeX-font-list) Texinfo-font-list) + (set (make-local-variable 'TeX-font-replace-function) + #'TeX-font-replace-macro) + (set (make-local-variable 'TeX-style-hook-dialect) :texinfo) + + (add-hook 'find-file-hook (lambda () + (unless (file-exists-p (buffer-file-name)) + (TeX-master-file nil nil t))) + nil t) + + (when (and (boundp 'add-log-current-defun-function) + (fboundp 'texinfo-current-defun-name)) + (set (make-local-variable 'add-log-current-defun-function) + #'texinfo-current-defun-name)) + + (TeX-add-symbols + '("acronym" "Acronym") + '("allowcodebreaks" (TeX-arg-literal " ") (Texinfo-arg-on|off nil :true|false) (Texinfo-arg-next-line)) + '("appendix" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("appendixsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("appendixsection" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("appendixsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("appendixsubsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("asis") + '("atchar" nil) + '("author" (TeX-arg-literal " ") (TeX-arg-free "Author")) + '("b" "Text") + '("bullet") + '("bye") + '("c" (TeX-arg-literal " ") (TeX-arg-free "Comment")) + '("caption" "Caption" + ;; TODO: caption is meaningful only inside float env. Maybe some checking + ;; and warning would be good. + ) + '("center" (TeX-arg-literal " ") (TeX-arg-free "Line of text")) + '("chapheading" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("chapter" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("cindex" (TeX-arg-literal " ") (TeX-arg-free "Entry")) + '("cite" "Reference") + '("clear" (TeX-arg-literal " ") (TeX-arg-free "Flag")) + '("code" "Sample code") + '("codequotebacktick" (TeX-arg-literal " ") (Texinfo-arg-on|off) (Texinfo-arg-next-line)) + '("codequoteundirected" (TeX-arg-literal " ") (Texinfo-arg-on|off) (Texinfo-arg-next-line)) + '("command" "Command") + '("comment" (TeX-arg-literal " ") (TeX-arg-free "Comment")) + '("contents") + '("copyright" nil) + '("defcodeindex" (TeX-arg-literal " ") (TeX-arg-free "Index name")) + '("defindex" (TeX-arg-literal " ") (TeX-arg-free "Index name")) + '("dfn" "Term") + '("dmn" "Dimension") + '("documentlanguage" (TeX-arg-literal " ") (Texinfo-arg-choice "Language" ("ca" "cs" "de" "en" "es" "fr" "hu" "is" "it" "ja" "nb" "nl" "nn" "pl" "pt" "ru" "sr" "tr" "uk")) (Texinfo-arg-next-line)) + '("documentencoding" (TeX-arg-literal " ") (Texinfo-arg-choice "Encoding" ("US-ASCII" "UTF-8" "ISO-8859-1" "ISO-8859-15" "ISO-8859-2" "koi8-r" "koi8-u")) (Texinfo-arg-next-line)) + '("dots" nil) + '("emph" "Text") + '("email" "Email address") + '("equiv" nil) + '("error") + '("evenfooting" Texinfo-arg-lrc) + '("evenheading" Texinfo-arg-lrc) + '("everyfooting" Texinfo-arg-lrc) + '("everyheading" Texinfo-arg-lrc) + '("exdent" (TeX-arg-literal " ") (TeX-arg-free "Line of text")) + '("expansion" nil) + '("file" "Filename") + '("finalout") + '("findex" (TeX-arg-literal " ") (TeX-arg-free "Entry")) + '("footnote" "Text of footnote") + '("footnotestyle" (TeX-arg-literal " ") (TeX-arg-free "Style")) + '("guillemetleft") + '("guillemetright") + '("guilsinglleft") + '("guilsinglright") + '("heading" (TeX-arg-literal " ") (TeX-arg-free "Title")) + ;; XXX: Would be nice with completion. + '("headings" (TeX-arg-literal " ") (TeX-arg-free "On off single double")) + '("i" "Text") + '("ignore") + '("include" (TeX-arg-literal " ") (TeX-arg-free "Filename")) + '("inforef" "Node name" "Info file name") + '("item") + '("itemx") + '("kbd" "Keyboard characters") + '("key" "Key name") + '("kindex" (TeX-arg-literal " ") (TeX-arg-free "Entry")) + '("LaTeX" nil) + '("lowersections" 0) + '("majorheading" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("menu") + '("minus") + '("need" "N") + '("node" (TeX-arg-literal " ") (TeX-arg-free "Name") + (TeX-arg-literal ", ") (TeX-arg-free "Next") + (TeX-arg-literal ", ") (TeX-arg-free "Previous") + (TeX-arg-literal ", ") (TeX-arg-free "Up")) + '("noindent") + '("oddfooting" Texinfo-arg-lrc) + '("oddheading" Texinfo-arg-lrc) + '("page") + '("paragraphindent" (TeX-arg-literal " ") (TeX-arg-free "Indent")) + '("pindex" "Entry") + '("point" nil) + '("print") + '("printindex" (TeX-arg-literal " ") (TeX-arg-free "Index name")) + '("pxref" (Texinfo-arg-nodename "Node name")) + '("quotedblbase") + '("quotesinglbase") + '("r" "Text") + '("raisesections" 0) + '("ref" (Texinfo-arg-nodename "Node name")) + '("refill") + '("result") + '("samp" "Text") + '("sc" "Text") + '("section" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("set" (TeX-arg-literal " ") (TeX-arg-free "Flag")) + '("setchapternewpage" (TeX-arg-literal " ") (Texinfo-arg-choice "On off odd" ("on" "off" "odd")) (Texinfo-arg-next-line)) + '("setfilename" (TeX-arg-literal " ") (TeX-arg-free "Info file name")) + '("settitle" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("shortcontents") + '("smallbook") + '("sp" "N") + '("strong" "Text") + '("subheading" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("subsection" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("subsubheading" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("subsubsection" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("subtitle" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("summarycontents") + '("syncodeindex" (TeX-arg-literal " ") (TeX-arg-free "From index") + (TeX-arg-literal " ") (TeX-arg-free "Into index")) + '("synindex" (TeX-arg-literal " ") (TeX-arg-free "From index") + (TeX-arg-literal " ") (TeX-arg-free "Into index")) + '("t" "Text") + '("TeX" nil) + '("thischapter") + '("thischaptername") + '("thisfile") + '("thispage") + '("tie") + '("tindex" (TeX-arg-literal " ") (TeX-arg-free "Entry")) + '("title" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("titlefont" "Text") + '("titlepage") + '("today" nil) + '("top" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("unnumbered" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("unnumberedsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("unnumberedsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("unnumberedsubsubsec" (TeX-arg-literal " ") (TeX-arg-free "Title")) + '("url" "Link") + '("value" "Flag") + '("var" "Metasyntactic variable") + '("vindex" (TeX-arg-literal " ") (TeX-arg-free "Entry")) + '("vskip" (TeX-arg-literal " ") (TeX-arg-free "Amount")) + '("w" "Text") + '("xref" (Texinfo-arg-nodename "Node name"))) + + ;; RefTeX plugging + (add-hook 'reftex-mode-hook #'Texinfo-reftex-hook) + (if (and (boundp 'reftex-mode) reftex-mode) + (Texinfo-reftex-hook)) + + (run-mode-hooks 'text-mode-hook 'Texinfo-mode-hook) + (TeX-set-mode-name)) + +(defcustom Texinfo-clean-intermediate-suffixes + '("\\.cps?" "\\.vrs?" "\\.fns?" "\\.tps?" "\\.pgs?" "\\.kys?") + "List of regexps matching suffixes of files to be deleted. +The regexps will be anchored at the end of the file name to be matched, +that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." + :type '(repeat regexp) + :group 'TeX-command) + +(defcustom Texinfo-clean-output-suffixes + ;; See `man texi2html' for the HTML stuff. + '("\\.info\\(-[0-9]+\\)?" "\\.dvi" "\\.pdf" "\\.ps" "\\.html" + "_toc\\.html" "_fot\\.html" "_abt\\.html" "_[0-9]+\\.html" "_l2h_img.+") + "List of regexps matching suffixes of files to be deleted. +The regexps will be anchored at the end of the file name to be matched, +that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." + :type '(repeat regexp) + :group 'TeX-command) + +(provide 'tex-info) + +;;; tex-info.el ends here -- cgit v1.2.1