# HG changeset patch # User Stefan Monnier # Date 1026679158 0 # Node ID 56af7a7485ae5e6e8676d053300e3f398f3a5060 # Parent 93ea423da06e787ba103d17ad1baf504d5436971 Set encoding to utf-8. (tex-start-options): Make it into always-a-string. Remove silly custom options that are covered by the other var. (tex-start-commands): Fix docstring. (tex-open-quote, tex-close-quote): Add options. (tex-command): Provide default. (tex-font-lock-keywords-1): Highlight $$...$$. (tex-font-lock-keywords-2): Fix latin-1 chars. (tex-mode-map): Remove redundant \t binding. (tex-mode): Add `subsection' and `newcommand' to known latex cmds. (latex-mode): Use add-hook for fill-nobreak-predicate. (tex-common-initialization): Set indent-tabs-mode to nil. (tex-insert-quote): Undo magic if invoked twice in a row. (latex-fill-nobreak-predicate): Don't use narrowing. (tex-latex-block): Don't cons uselessly. (tex-last-unended-begin): Signal user-friendlier error. (tex-goto-last-unclosed-latex-block): Don't catch signal. (tex-start-tex): Switch order of tex-start-options and tex-start-commands to make it obey docstrings. diff -r 93ea423da06e -r 56af7a7485ae lisp/textmodes/tex-mode.el --- a/lisp/textmodes/tex-mode.el Sun Jul 14 19:52:35 2002 +0000 +++ b/lisp/textmodes/tex-mode.el Sun Jul 14 20:39:18 2002 +0000 @@ -1,4 +1,4 @@ -;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands +;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands -*- coding: utf-8 -*- ;; Copyright (C) 1985, 86, 89, 92, 94, 95, 96, 97, 98, 1999, 2002 ;; Free Software Foundation, Inc. @@ -120,23 +120,20 @@ :group 'tex-run) ;;;###autoload -(defcustom tex-start-options nil +(defcustom tex-start-options "" "*TeX options to use when starting TeX. -These precede the commands in `tex-start-options' -and the input file name. If nil, TeX runs with no options. -See the documentation of `tex-command'." - :type '(radio (const :tag "Interactive \(nil\)" nil) - (const :tag "Nonstop \(\"\\nonstopmode\\input\"\)" - "\\nonstopmode\\input") - (string :tag "String at your choice")) +These immediately precede the commands in `tex-start-commands' +and the input file name, with no separating space and are not shell-quoted. +If nil, TeX runs with no options. See the documentation of `tex-command'." + :type 'string :group 'tex-run :version "21.4") ;;;###autoload (defcustom tex-start-commands "\\nonstopmode\\input" "*TeX commands to use when starting TeX. -These precede the input file name. If nil, no commands are used. -See the documentation of `tex-command'." +They are shell-quoted and precede the input file name, with a separating space. +If nil, no commands are used. See the documentation of `tex-command'." :type '(radio (const :tag "Interactive \(nil\)" nil) (const :tag "Nonstop \(\"\\nonstopmode\\input\"\)" "\\nonstopmode\\input") @@ -235,12 +232,14 @@ (defcustom tex-open-quote "``" "*String inserted by typing \\[tex-insert-quote] to open a quotation." :type 'string + :options '("``" "\"<" "\"`" "<<" "«") :group 'tex) ;;;###autoload (defcustom tex-close-quote "''" "*String inserted by typing \\[tex-insert-quote] to close a quotation." :type 'string + :options '("''" "\">" "\"'" ">>" "»") :group 'tex) (defvar tex-last-temp-file nil @@ -248,9 +247,9 @@ Deleted when the \\[tex-region] or \\[tex-buffer] is next run, or when the tex shell terminates.") -(defvar tex-command nil +(defvar tex-command "tex" "*Command to run TeX. -If this string contains an asterisk \(`*'\), that is replaced by the file name\; +If this string contains an asterisk \(`*'\), that is replaced by the file name; otherwise the value of `tex-start-options', the \(shell-quoted\) value of `tex-start-commands', and the file name are added at the end with blanks as separators. @@ -465,6 +464,12 @@ ;; (arg "\\(?:{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)\\|\\\\[a-z*]+\\)")) (arg "{\\(\\(?:[^{}\\]+\\|\\\\.\\|{[^}]*}\\)+\\)")) (list + ;; display $$ math $$ + ;; We only mark the match between $$ and $$ because the $$ delimiters + ;; themselves have already been marked (along with $..$) by syntactic + ;; fontification. Also this is done at the very beginning so as to + ;; interact with the other keywords in the same way as $...$ does. + (list "\\$\\$\\([^$]+\\)\\$\\$" 1 'tex-math-face) ;; Heading args. (list (concat slash headings "\\*?" opt arg) ;; If ARG ends up matching too much (if the {} don't match, f.ex) @@ -529,9 +534,9 @@ (list (concat slash citations opt arg) 3 'font-lock-constant-face) ;; ;; Text between `` quotes ''. - (cons (concat (regexp-opt `("``" "\"<" "\"`" "<<" "k") t) + (cons (concat (regexp-opt `("``" "\"<" "\"`" "<<" "«") t) "[^'\">{]+" ;a bit pessimistic - (regexp-opt `("''" "\">" "\"'" ">>" "{") t)) + (regexp-opt `("''" "\">" "\"'" ">>" "»") t)) 'font-lock-string-face) ;; ;; Command names, special and general. @@ -601,7 +606,6 @@ (define-key map "[" 'skeleton-pair-insert-maybe) (define-key map "$" 'skeleton-pair-insert-maybe) (define-key map "\n" 'tex-terminate-paragraph) - (define-key map "\t" 'indent-for-tab-command) (define-key map "\M-\r" 'latex-insert-item) (define-key map "\C-c}" 'up-list) (define-key map "\C-c{" 'tex-insert-braces) @@ -686,7 +690,8 @@ (eval-when-compile (concat (regexp-opt '("documentstyle" "documentclass" - "begin" "section" "part" "chapter") 'words) + "begin" "subsection" "section" + "part" "chapter" "newcommand") 'words) "\\|NeedsTeXFormat{LaTeX"))) (if (looking-at "document\\(style\\|class\\)\\(\\[.*\\]\\)?{slides}") @@ -824,8 +829,7 @@ (set (make-local-variable 'imenu-create-index-function) 'latex-imenu-create-index) (set (make-local-variable 'tex-face-alist) tex-latex-face-alist) - (set (make-local-variable 'fill-nobreak-predicate) - 'latex-fill-nobreak-predicate) + (add-hook 'fill-nobreak-predicate 'latex-fill-nobreak-predicate nil t) (set (make-local-variable 'indent-line-function) 'latex-indent) (set (make-local-variable 'fill-indent-according-to-mode) t) (set (make-local-variable 'outline-regexp) latex-outline-regexp) @@ -913,6 +917,8 @@ (font-lock-mark-block-function . mark-paragraph) (font-lock-syntactic-face-function . tex-font-lock-syntactic-face-function))) + ;; TABs in verbatim environments don't do what you think. + (set (make-local-variable 'indent-tabs-mode) nil) (make-local-variable 'tex-command) (make-local-variable 'tex-start-of-header) (make-local-variable 'tex-end-of-header) @@ -954,12 +960,17 @@ \(normally '') depending on the context. With prefix argument, always inserts \" characters." (interactive "*P") - (if arg + (if (or arg (memq (char-syntax (preceding-char)) '(?/ ?\\)) + (eq (get-text-property (point) 'face) 'tex-verbatim-face) + (save-excursion + (backward-char (length tex-open-quote)) + (when (or (looking-at (regexp-quote tex-open-quote)) + (looking-at (regexp-quote tex-close-quote))) + (delete-char (length tex-open-quote)) + t))) (self-insert-command (prefix-numeric-value arg)) - (insert - (cond ((= (preceding-char) ?\\) ?\") - ((memq (char-syntax (preceding-char)) '(?\( ?> ?\ )) tex-open-quote) - (t tex-close-quote))))) + (insert (if (memq (char-syntax (preceding-char)) '(?\( ?> ?\ )) + tex-open-quote tex-close-quote)))) (defun tex-validate-buffer () "Check current buffer for paragraphs containing mismatched braces or $s. @@ -1090,12 +1101,10 @@ (let ((opoint (point)) inside) (save-excursion - (save-restriction - (beginning-of-line) - (narrow-to-region (point) opoint) - (while (re-search-forward "\\\\verb\\(.\\)" nil t) - (unless (re-search-forward (regexp-quote (match-string 1)) nil t) - (setq inside t))))) + (beginning-of-line) + (while (re-search-forward "\\\\verb\\(.\\)" opoint t) + (unless (re-search-forward (regexp-quote (match-string 1)) opoint t) + (setq inside t)))) inside)) (defvar latex-block-default "enumerate") @@ -1106,9 +1115,8 @@ Puts point on a blank line between them." (let ((choice (completing-read (format "LaTeX block name [%s]: " latex-block-default) - (mapcar 'list - (append standard-latex-block-names - latex-block-names)) + (append latex-block-names + standard-latex-block-names) nil nil nil nil latex-block-default))) (setq latex-block-default choice) (unless (or (member choice standard-latex-block-names) @@ -1116,10 +1124,10 @@ ;; Remember new block names for later completion. (push choice latex-block-names)) choice) - \n "\\begin{" str ?\} + \n "\\begin{" str "}" ?\[ (skeleton-read "[options]: ") & ?\] | -1 > \n _ \n - "\\end{" str ?\} > \n) + "\\end{" str "}" > \n) (define-skeleton latex-insert-item "Insert a \item macro." @@ -1133,9 +1141,11 @@ (defun tex-last-unended-begin () "Leave point at the beginning of the last `\\begin{...}' that is unended." - (while (and (re-search-backward "\\\\\\(begin\\|end\\)\\s *{") - (looking-at "\\\\end")) - (tex-last-unended-begin))) + (condition-case nil + (while (and (re-search-backward "\\\\\\(begin\\|end\\)\\s *{") + (looking-at "\\\\end")) + (tex-last-unended-begin)) + (search-failed (error "Couldn't find unended \\begin")))) (defun tex-next-unmatched-end () "Leave point at the end of the next `\\end' that is unended." @@ -1150,9 +1160,7 @@ (interactive) (let ((spot)) (save-excursion - (condition-case nil - (tex-last-unended-begin) - (error (error "Couldn't find unended \\begin"))) + (tex-last-unended-begin) (setq spot (point))) (push-mark) (goto-char spot))) @@ -1428,7 +1436,8 @@ (save-restriction (widen) (goto-char (point-min)) - (re-search-forward header-re 10000 t)))) + (re-search-forward + header-re (+ (point) 10000) t)))) (throw 'found (expand-file-name buffer-file-name)))))))) (defun tex-main-file () @@ -1443,7 +1452,8 @@ (file-relative-name (if (save-excursion (goto-char (point-min)) - (re-search-forward tex-start-of-header 10000 t)) + (re-search-forward tex-start-of-header + (+ (point) 10000) t)) ;; This is the main file. buffer-file-name ;; This isn't the main file, let's try to find better, @@ -1462,10 +1472,10 @@ (comint-quote-filename file) (substring command (1+ star))) (concat command " " + tex-start-options (if (< 0 (length tex-start-commands)) (concat (shell-quote-argument tex-start-commands) " ")) - tex-start-options (comint-quote-filename file))))) (tex-send-tex-command compile-command dir)))