emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/lisp ChangeLog textmodes/tex-mode.el


From: Stefan Monnier
Subject: [Emacs-diffs] emacs/lisp ChangeLog textmodes/tex-mode.el
Date: Thu, 19 Nov 2009 22:55:45 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Stefan Monnier <monnier>        09/11/19 22:55:44

Modified files:
        lisp           : ChangeLog 
        lisp/textmodes : tex-mode.el 

Log message:
        (latex-complete-bibtex-cache, latex-complete-alist): New vars.
        (latex-string-prefix-p, latex-complete-bibtex-keys, latex-complete-data)
        (latex-complete-envnames, latex-complete-refkeys): New functions.
        (latex-complete, latex-indent-or-complete): New commands.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/ChangeLog?cvsroot=emacs&r1=1.16677&r2=1.16678
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/textmodes/tex-mode.el?cvsroot=emacs&r1=1.230&r2=1.231

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.16677
retrieving revision 1.16678
diff -u -b -r1.16677 -r1.16678
--- ChangeLog   19 Nov 2009 22:05:40 -0000      1.16677
+++ ChangeLog   19 Nov 2009 22:55:41 -0000      1.16678
@@ -1,5 +1,12 @@
 2009-11-19  Stefan Monnier  <address@hidden>
 
+       * textmodes/tex-mode.el (latex-complete-bibtex-cache)
+       (latex-complete-alist): New vars.
+       (latex-string-prefix-p, latex-complete-bibtex-keys)
+       (latex-complete-envnames, latex-complete-refkeys)
+       (latex-complete-data): New functions.
+       (latex-complete, latex-indent-or-complete): New commands.
+
        * window.el (display-buffer-mark-dedicated): New var.
        (display-buffer): Obey it.
        * minibuffer.el (minibuffer-completion-help): Use it.

Index: textmodes/tex-mode.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/textmodes/tex-mode.el,v
retrieving revision 1.230
retrieving revision 1.231
diff -u -b -r1.230 -r1.231
--- textmodes/tex-mode.el       6 Nov 2009 05:16:30 -0000       1.230
+++ textmodes/tex-mode.el       19 Nov 2009 22:55:44 -0000      1.231
@@ -1420,6 +1420,116 @@
   \n "\\item " >)
 
 
+;;;; LaTeX completion.
+
+(defvar latex-complete-bibtex-cache nil)
+
+(defun latex-string-prefix-p (str1 str2)
+  (eq t (compare-strings str1 nil nil str2 0 (length str1))))
+
+(defvar bibtex-reference-key)
+(declare-function reftex-get-bibfile-list "reftex-cite.el" ())
+
+(defun latex-complete-bibtex-keys ()
+  (when (bound-and-true-p reftex-mode)
+    (lambda (key pred action)
+      (let ((re (concat "^[ address@hidden([a-zA-Z]+\\)[ \t\n]*\\([{(][ 
\t\n]*\\)"
+                        (regexp-quote key)))
+            (files (reftex-get-bibfile-list))
+            keys)
+        (if (and (eq (car latex-complete-bibtex-cache)
+                     (reftex-get-bibfile-list))
+                 (latex-string-prefix-p (nth 1 latex-complete-bibtex-cache)
+                                        key))
+            ;; Use the cache.
+            (setq keys (nth 2 latex-complete-bibtex-cache))
+          (dolist (file files)
+            (with-current-buffer (find-file-noselect file)
+              (goto-char (point-min))
+              (while (re-search-forward re nil t)
+                (goto-char (match-end 2))
+                (when (and (not (member-ignore-case (match-string 1)
+                                                    '("c" "comment" "string")))
+                           (looking-at bibtex-reference-key))
+                  (push (match-string-no-properties 0) keys)))))
+          ;; Fill the cache.
+          (set (make-local-variable 'latex-complete-bibtex-cache)
+               (list files key keys)))
+        (complete-with-action action keys key pred)))))
+
+(defun latex-complete-envnames ()
+  (append latex-block-names latex-standard-block-names))
+
+(defun latex-complete-refkeys ()
+  (when (boundp 'reftex-docstruct-symbol)
+    (symbol-value reftex-docstruct-symbol)))
+
+(defvar latex-complete-alist
+  ;; TODO: Add \begin, \end, \ref, ...
+  '(("\\`\\\\\\(short\\)?cite\\'" . latex-complete-bibtex-keys)
+    ("\\`\\\\\\(begin\\|end\\)\\'" . latex-complete-envnames)
+    ("\\`\\\\[vf]?ref\\'" . latex-complete-refkeys)))
+
+(defun latex-complete-data ()
+  "Get completion-data at point."
+  (save-excursion
+    (let ((pt (point)))
+      (skip-chars-backward "^ {}\n\t\\\\")
+      (case (char-before)
+        ((nil ?\s ?\n ?\t ?\}) nil)
+        (?\\
+         ;; TODO: Complete commands.
+         nil)
+        (?\{
+         ;; Complete args to commands.
+         (let* ((cmd
+                 (save-excursion
+                   (forward-char -1)
+                   (skip-chars-backward " \n")
+                   (buffer-substring (point)
+                                     (progn
+                                       (skip-chars-backward "address@hidden")
+                                       (let ((n (skip-chars-backward "\\\\")))
+                                         (forward-char (* 2 (/ n 2))))
+                                       (point)))))
+                (start (point))
+                (_ (progn (goto-char pt) (skip-chars-backward "^," start)))
+                (comp-beg (point))
+                (_ (progn (goto-char pt) (skip-chars-forward "^, {}\n\t\\\\")))
+                (comp-end (point))
+                (table
+                 (funcall
+                  (let ((f (lambda () t)))
+                    (dolist (comp latex-complete-alist)
+                      (if (string-match (car comp) cmd)
+                          (setq f (cdr comp))))
+                    f))))
+           (if (eq table t)
+               ;; Unknown command.
+               nil
+             (list comp-beg comp-end table))))))))
+
+(defun latex-complete ()
+  "Perform completion at point for LaTeX mode.
+Return non-nil if we found what to complete."
+  (interactive)
+  (let ((data (latex-complete-data)))
+    (when data
+      (apply 'completion-in-region data)
+      t)))
+
+(defun latex-indent-or-complete ()
+  "Perform completion at point or indentation, according to DWIM.
+The heuristic is to try indentation, if that fails try completion,
+if that fails insert a tab."
+  (interactive)
+  (let ((undo buffer-undo-list)
+       (pos (point)))
+    (indent-according-to-mode)
+    (or (not (and (eq pos (point)) (eq undo buffer-undo-list)))
+        (latex-complete)
+        (insert-tab))))
+
 ;;;;
 ;;;; LaTeX syntax navigation
 ;;;;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]