changeset 46367:56af7a7485ae

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.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 14 Jul 2002 20:39:18 +0000
parents 93ea423da06e
children 0b55cf135919
files lisp/textmodes/tex-mode.el
diffstat 1 files changed, 54 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- 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)))