1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

(tex-font-lock-keywords-1): Use `keep'

rather than `prepend' and add an interesting comment.
(tex-math-face, tex-font-lock-syntactic-face-function):
New face and function to use it.
(tex-define-common-keys, tex-mode-map): Use menu-item rather
than `menu-enable' symbol property.
(tex-mode-map): Bind {, (, [ and $ to skeleton-pair-insert-maybe.
(tex-mode): Add some latex-mode commands for auto-selection.
Use tex-font-lock-syntactic-face-function.
(tex-insert-quote): Simplify.
(tex-shell): New mode.
(tex-start-shell): Use it.
(tex-shell-proc, tex-shell-buf): New functions.
(tex-send-command): Use it.
(tex-main-file): Fix the meaning of the new arg REALFILE.
(tex-send-tex-command): New function split from `tex-start-tex'.
Set compilation-last-buffer and compilation-parsing-end.
This commit is contained in:
Stefan Monnier 2000-11-14 11:41:51 +00:00
parent 1265b5398a
commit bdbd960600
2 changed files with 163 additions and 118 deletions

View file

@ -1,5 +1,23 @@
2000-11-14 Stefan Monnier <monnier@cs.yale.edu>
* textmodes/tex-mode.el (tex-font-lock-keywords-1): Use `keep'
rather than `prepend' and add an interesting comment.
(tex-math-face, tex-font-lock-syntactic-face-function):
New face and function to use it.
(tex-define-common-keys, tex-mode-map): Use menu-item rather
than `menu-enable' symbol property.
(tex-mode-map): Bind {, (, [ and $ to skeleton-pair-insert-maybe.
(tex-mode): Add some latex-mode commands for auto-selection.
Use tex-font-lock-syntactic-face-function.
(tex-insert-quote): Simplify.
(tex-shell): New mode.
(tex-start-shell): Use it.
(tex-shell-proc, tex-shell-buf): New functions.
(tex-send-command): Use it.
(tex-main-file): Fix the meaning of the new arg REALFILE.
(tex-send-tex-command): New function split from `tex-start-tex'.
Set compilation-last-buffer and compilation-parsing-end.
* newcomment.el (comment-indent-default): Stick \s<\s< to the left
when it follows non-comment text on the line.

View file

@ -446,15 +446,26 @@ An alternative value is \" . \", if you use a font with a narrow period."
(list
;; Heading args.
(list (concat slash headings "\\*?" opt arg)
3 'font-lock-function-name-face 'prepend)
;; If ARG ends up matching too much (if the {} don't match, f.ex)
;; jit-lock will do funny things: when updating the buffer
;; the re-highlighting is only done locally so it will just
;; match the local line, but defer-contextually will
;; match more lines at a time, so ARG will end up matching
;; a lot more, which might suddenly include a comment
;; so you get things highlighted bold when you type them
;; but they get turned back to normal a little while later
;; because "there's already a face there".
;; Using `keep' works around this un-intuitive behavior as well
;; as improves the behavior in the very rare case where you do have
;; a comment in ARG.
3 'font-lock-function-name-face 'keep)
;; Variable args.
(list (concat slash variables arg) 2 'font-lock-variable-name-face)
;; Include args.
(list (concat slash includes opt arg) 3 'font-lock-builtin-face)
;; Definitions. I think.
'("^[ \t]*\\\\def\\\\\\(\\(\\w\\|@\\)+\\)"
1 font-lock-function-name-face)
)))
1 font-lock-function-name-face))))
"Subdued expressions to highlight in TeX modes.")
(defconst tex-font-lock-keywords-2
@ -505,13 +516,22 @@ An alternative value is \" . \", if you use a font with a narrow period."
;; Old-style bf/em/it/sl. Stop at `\\' and un-escaped `&', for tables.
(list (concat "\\\\\\(\\(bf\\)\\|em\\|it\\|sl\\)\\>"
"\\(\\([^}&\\]\\|\\\\[^\\]\\)+\\)")
3 '(if (match-beginning 2) 'bold 'italic) 'append)
))))
3 '(if (match-beginning 2) 'bold 'italic) 'append)))))
"Gaudy expressions to highlight in TeX modes.")
(defvar tex-font-lock-keywords tex-font-lock-keywords-1
"Default expressions to highlight in TeX modes.")
(defface tex-math-face
'((t :inherit font-lock-string-face))
"Face used to highlight TeX math expressions.")
(defvar tex-math-face 'tex-math-face)
;; Use string syntax but math face for $...$.
(defun tex-font-lock-syntactic-face-function (state)
(if (nth 3 state) tex-math-face font-lock-comment-face))
(defun tex-define-common-keys (keymap)
"Define the keys that we want defined both in TeX mode and in the TeX shell."
@ -523,56 +543,56 @@ An alternative value is \" . \", if you use a font with a narrow period."
(define-key keymap [menu-bar tex] (cons "TeX" (make-sparse-keymap "TeX")))
(define-key keymap [menu-bar tex tex-kill-job] '("Tex Kill" . tex-kill-job))
(define-key keymap [menu-bar tex tex-kill-job]
'(menu-item "Tex Kill" tex-kill-job :enable (tex-shell-running)))
(define-key keymap [menu-bar tex tex-recenter-output-buffer]
'("Tex Recenter" . tex-recenter-output-buffer))
'(menu-item "Tex Recenter" tex-recenter-output-buffer
:enable (get-buffer "*tex-shell*")))
(define-key keymap [menu-bar tex tex-show-print-queue]
'("Show Print Queue" . tex-show-print-queue))
(define-key keymap [menu-bar tex tex-alt-print]
'("Tex Print (alt printer)" . tex-alt-print))
(define-key keymap [menu-bar tex tex-print] '("Tex Print" . tex-print))
(define-key keymap [menu-bar tex tex-view] '("Tex View" . tex-view))
)
'(menu-item "Tex Print (alt printer)" tex-alt-print
:enable (stringp tex-print-file)))
(define-key keymap [menu-bar tex tex-print]
'(menu-item "Tex Print" tex-print :enable (stringp tex-print-file)))
(define-key keymap [menu-bar tex tex-view]
'(menu-item "Tex View" tex-view :enable (stringp tex-print-file))))
(defvar tex-mode-map nil "Keymap for TeX mode.")
(if tex-mode-map
nil
(setq tex-mode-map (make-sparse-keymap))
(tex-define-common-keys tex-mode-map)
(define-key tex-mode-map "\"" 'tex-insert-quote)
(define-key tex-mode-map "\n" 'tex-terminate-paragraph)
(define-key tex-mode-map "\M-\r" 'latex-insert-item)
(define-key tex-mode-map "\C-c}" 'up-list)
(define-key tex-mode-map "\C-c{" 'tex-insert-braces)
(define-key tex-mode-map "\C-c\C-r" 'tex-region)
(define-key tex-mode-map "\C-c\C-b" 'tex-buffer)
(define-key tex-mode-map "\C-c\C-f" 'tex-file)
(define-key tex-mode-map "\C-c\C-i" 'tex-bibtex-file)
(define-key tex-mode-map "\C-c\C-o" 'tex-latex-block)
(define-key tex-mode-map "\C-c\C-e" 'tex-close-latex-block)
(define-key tex-mode-map "\C-c\C-u" 'tex-goto-last-unclosed-latex-block)
(define-key tex-mode-map "\C-c\C-m" 'tex-feed-input)
(define-key tex-mode-map [(control return)] 'tex-feed-input)
(define-key tex-mode-map [menu-bar tex tex-bibtex-file]
'("BibTeX File" . tex-bibtex-file))
(define-key tex-mode-map [menu-bar tex tex-validate-region]
'("Validate Region" . tex-validate-region))
(define-key tex-mode-map [menu-bar tex tex-validate-buffer]
'("Validate Buffer" . tex-validate-buffer))
(define-key tex-mode-map [menu-bar tex tex-region]
'("TeX Region" . tex-region))
(define-key tex-mode-map [menu-bar tex tex-buffer]
'("TeX Buffer" . tex-buffer))
(define-key tex-mode-map [menu-bar tex tex-file] '("TeX File" . tex-file)))
(put 'tex-region 'menu-enable 'mark-active)
(put 'tex-validate-region 'menu-enable 'mark-active)
(put 'tex-print 'menu-enable '(stringp tex-print-file))
(put 'tex-alt-print 'menu-enable '(stringp tex-print-file))
(put 'tex-view 'menu-enable '(stringp tex-print-file))
(put 'tex-recenter-output-buffer 'menu-enable '(get-buffer "*tex-shell*"))
(put 'tex-kill-job 'menu-enable '(tex-shell-running))
(defvar tex-mode-map
(let ((map (make-sparse-keymap)))
(tex-define-common-keys map)
(define-key map "\"" 'tex-insert-quote)
(define-key map "(" 'skeleton-pair-insert-maybe)
(define-key map "{" 'skeleton-pair-insert-maybe)
(define-key map "[" 'skeleton-pair-insert-maybe)
(define-key map "$" 'skeleton-pair-insert-maybe)
(define-key map "\n" 'tex-terminate-paragraph)
(define-key map "\M-\r" 'latex-insert-item)
(define-key map "\C-c}" 'up-list)
(define-key map "\C-c{" 'tex-insert-braces)
(define-key map "\C-c\C-r" 'tex-region)
(define-key map "\C-c\C-b" 'tex-buffer)
(define-key map "\C-c\C-f" 'tex-file)
(define-key map "\C-c\C-c" 'tex-compile)
(define-key map "\C-c\C-i" 'tex-bibtex-file)
(define-key map "\C-c\C-o" 'tex-latex-block)
(define-key map "\C-c\C-e" 'tex-close-latex-block)
(define-key map "\C-c\C-u" 'tex-goto-last-unclosed-latex-block)
(define-key map "\C-c\C-m" 'tex-feed-input)
(define-key map [(control return)] 'tex-feed-input)
(define-key map [menu-bar tex tex-bibtex-file]
'("BibTeX File" . tex-bibtex-file))
(define-key map [menu-bar tex tex-validate-region]
'(menu-item "Validate Region" tex-validate-region :enable mark-active))
(define-key map [menu-bar tex tex-validate-buffer]
'("Validate Buffer" . tex-validate-buffer))
(define-key map [menu-bar tex tex-region]
'(menu-item "TeX Region" tex-region :enable mark-active))
(define-key map [menu-bar tex tex-buffer]
'("TeX Buffer" . tex-buffer))
(define-key map [menu-bar tex tex-file] '("TeX File" . tex-file))
map)
"Keymap for TeX modes.")
(defvar tex-shell-map
(let ((m (make-sparse-keymap)))
@ -614,13 +634,19 @@ says which mode to use."
(save-excursion
(beginning-of-line)
(search-forward "%" search-end t))))))
(if (and slash (not comment))
(setq mode (if (looking-at "documentstyle\\|documentclass\\|begin\\b\\|NeedsTeXFormat{LaTeX")
(if (looking-at
"document\\(style\\|class\\)\\(\\[.*\\]\\)?{slides}")
'slitex-mode
'latex-mode)
'plain-tex-mode))))
(when (and slash (not comment))
(setq mode
(if (looking-at
(eval-when-compile
(concat
(regexp-opt '("documentstyle" "documentclass"
"begin" "section" "part" "chapter") 'words)
"\\|NeedsTeXFormat{LaTeX")))
(if (looking-at
"document\\(style\\|class\\)\\(\\[.*\\]\\)?{slides}")
'slitex-mode
'latex-mode)
'plain-tex-mode))))
(funcall mode)))
;;;###autoload
@ -838,7 +864,9 @@ Entering SliTeX mode runs the hook `text-mode-hook', then the hook
tex-font-lock-keywords-1 tex-font-lock-keywords-2)
nil nil ((?$ . "\"")) nil
;; Who ever uses that anyway ???
(font-lock-mark-block-function . mark-paragraph)))
(font-lock-mark-block-function . mark-paragraph)
(font-lock-syntactic-face-function
. tex-font-lock-syntactic-face-function)))
(make-local-variable 'tex-command)
(make-local-variable 'tex-start-of-header)
(make-local-variable 'tex-end-of-header)
@ -883,15 +911,9 @@ inserts \" characters."
(if arg
(self-insert-command (prefix-numeric-value arg))
(insert
(cond ((or (bobp)
(save-excursion
(forward-char -1)
(looking-at "\\s(\\|\\s \\|\\s>")))
tex-open-quote)
((= (preceding-char) ?\\)
?\")
(t
tex-close-quote)))))
(cond ((= (preceding-char) ?\\) ?\")
((memq (char-syntax (preceding-char)) '(?\( ?> ?\ )) tex-open-quote)
(t tex-close-quote)))))
(defun tex-validate-buffer ()
"Check current buffer for paragraphs containing mismatched braces or $s.
@ -956,8 +978,7 @@ on the line for the invalidity you want to see."
(- (marker-position text-end) 1)
'occur tem)))))
(goto-char prev-end))))
(save-excursion
(set-buffer standard-output)
(with-current-buffer standard-output
(if (eq num-matches 0)
(insert "None!\n"))
(if (interactive-p)
@ -990,11 +1011,8 @@ area if a mismatch is found."
(error
(skip-syntax-forward " .>")
(setq failure-point (point)))))
(if failure-point
(progn
(goto-char failure-point)
nil)
t)))
(if failure-point (goto-char failure-point))
(not failure-point)))
(defun tex-terminate-paragraph (inhibit-validation)
"Insert two newlines, breaking a paragraph for TeX.
@ -1189,6 +1207,9 @@ Mark is left at original location."
;;; The utility functions:
(define-derived-mode tex-shell shell-mode "TeX-Shell"
(compilation-shell-minor-mode t))
;;;###autoload
(defun tex-start-shell ()
(with-current-buffer
@ -1199,15 +1220,7 @@ Mark is left at original location."
(let ((proc (get-process "tex-shell")))
(set-process-sentinel proc 'tex-shell-sentinel)
(process-kill-without-query proc)
(setq comint-prompt-regexp shell-prompt-pattern)
(use-local-map tex-shell-map)
(compilation-shell-minor-mode t)
(add-hook 'comint-input-filter-functions 'shell-directory-tracker nil t)
(make-local-variable 'list-buffers-directory)
(make-local-variable 'shell-dirstack)
(make-local-variable 'shell-last-dir)
(make-local-variable 'shell-dirtrackp)
(run-hooks 'tex-shell-hook)
(tex-shell)
(while (zerop (buffer-size))
(sleep-for 1)))))
@ -1245,6 +1258,11 @@ In the tex shell buffer this command behaves like `comint-send-input'."
(defvar tex-send-command-modified-tick 0)
(make-variable-buffer-local 'tex-send-command-modified-tick)
(defun tex-shell-proc ()
(or (get-process "tex-shell") (error "No TeX subprocess")))
(defun tex-shell-buf ()
(process-buffer (tex-shell-proc)))
(defun tex-send-command (command &optional file background)
"Send COMMAND to TeX shell process, substituting optional FILE for *.
Do this in background if optional BACKGROUND is t. If COMMAND has no *,
@ -1255,7 +1273,7 @@ evaluates to a command string.
Return the process in which TeX is running."
(save-excursion
(let* ((cmd (eval command))
(proc (or (get-process "tex-shell") (error "No TeX subprocess")))
(proc (tex-shell-proc))
(buf (process-buffer proc))
(star (string-match "\\*" cmd))
(string
@ -1329,28 +1347,30 @@ ALL other buffers."
(defun tex-main-file (&optional realfile)
"Return the name of the main file with the `.tex' extension stripped.
If REALFILE is non-nil, don't strip the extension."
(let ((file (or tex-main-file
;; Compatibility with AUCTeX.
(and (boundp 'TeX-master) (stringp TeX-master)
(set (make-local-variable 'tex-main-file) TeX-master))
;; Try to guess the main file.
(if (not buffer-file-name)
(error "Buffer is not associated with any file")
(file-relative-name
(if (save-excursion
(goto-char (point-min))
(re-search-forward tex-start-of-header 10000 t))
;; This is the main file.
buffer-file-name
;; This isn't the main file, let's try to find better,
(or (tex-guess-main-file)
;; (tex-guess-main-file t)
buffer-file-name)))))))
(cond
(realfile (if (file-exists-p file) file (concat file ".tex")))
((string-match "\\.tex\\'" file) (substring file 0 (match-beginning 0)))
(t file))))
If REALFILE is non-nil, return the pair (FILE . REALFILE) where FILE
is the filename without the extension while REALFILE is the filename
with extension."
(let* ((file (or tex-main-file
;; Compatibility with AUCTeX.
(and (boundp 'TeX-master) (stringp TeX-master)
(set (make-local-variable 'tex-main-file) TeX-master))
;; Try to guess the main file.
(if (not buffer-file-name)
(error "Buffer is not associated with any file")
(file-relative-name
(if (save-excursion
(goto-char (point-min))
(re-search-forward tex-start-of-header 10000 t))
;; This is the main file.
buffer-file-name
;; This isn't the main file, let's try to find better,
(or (tex-guess-main-file)
;; (tex-guess-main-file t)
buffer-file-name))))))
(real (if (file-exists-p file) file (concat file ".tex"))))
(when (string-match "\\.tex\\'" file)
(setq file (substring file 0 (match-beginning 0))))
(if realfile (cons file real) file)))
(defun tex-start-tex (command file &optional dir)
@ -1366,18 +1386,25 @@ If REALFILE is non-nil, don't strip the extension."
(concat
(shell-quote-argument tex-start-options-string) " "))
(comint-quote-filename file)))))
(when dir
(let (shell-dirtrack-verbose)
(tex-send-command tex-shell-cd-command dir)))
(with-current-buffer (process-buffer (tex-send-command compile-command))
(save-excursion
(forward-line -1)
(setq tex-start-tex-marker (point-marker)))
(make-local-variable 'compilation-parse-errors-function)
(setq compilation-parse-errors-function 'tex-compilation-parse-errors)
(compilation-forget-errors))
(tex-display-shell)
(setq tex-last-buffer-texed (current-buffer))))
(tex-send-tex-command compile-command dir)))
(defun tex-send-tex-command (cmd &optional dir)
(unless (or (equal dir (with-current-buffer (tex-shell-buf)
default-directory))
(not dir))
(let (shell-dirtrack-verbose)
(tex-send-command tex-shell-cd-command dir)))
(with-current-buffer (process-buffer (tex-send-command cmd))
(save-excursion
(forward-line -1)
(setq tex-start-tex-marker (point-marker)))
(make-local-variable 'compilation-parse-errors-function)
(setq compilation-parse-errors-function 'tex-compilation-parse-errors)
(setq compilation-last-buffer (current-buffer))
(compilation-forget-errors)
(set-marker compilation-parsing-end (1- (point-max))))
(tex-display-shell)
(setq tex-last-buffer-texed (current-buffer)))
(defun tex-compilation-parse-errors (limit-search find-at-least)
"Parse the current buffer as TeX error messages.