changeset 65851:c9b01535e163

(lambda): Add its doc-string-elt property. (lisp-doc-string-elt-property): New var. (lisp-font-lock-syntactic-face-function): Use it. Rewrite to recognize docstrings even for forms not at toplevel.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 05 Oct 2005 15:03:09 +0000
parents 125c8f7cc7d2
children 4b5af439906f
files lisp/emacs-lisp/lisp-mode.el
diffstat 1 files changed, 33 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/lisp-mode.el	Wed Oct 05 14:23:13 2005 +0000
+++ b/lisp/emacs-lisp/lisp-mode.el	Wed Oct 05 15:03:09 2005 +0000
@@ -147,25 +147,42 @@
 (put 'define-ibuffer-filter 'doc-string-elt 2)
 (put 'define-ibuffer-op 'doc-string-elt 3)
 (put 'define-ibuffer-sorter 'doc-string-elt 2)
+(put 'lambda 'doc-string-elt 2)
+
+(defvar lisp-doc-string-elt-property 'doc-string-elt
+  "The symbol property that holds the docstring position info.")
 
 (defun lisp-font-lock-syntactic-face-function (state)
   (if (nth 3 state)
-      (if (and (eq (nth 0 state) 1)
-	       ;; This might be a docstring.
-	       (save-excursion
-		 (let ((n 0))
-		   (goto-char (nth 8 state))
-		   (condition-case nil
-		       (while (and (not (bobp))
-				   (progn (backward-sexp 1) (setq n (1+ n)))))
-		     (scan-error nil))
-		   (when (> n 0)
-		     (let ((sym (intern-soft
-				 (buffer-substring
-				  (point) (progn (forward-sexp 1) (point))))))
-		       (eq n (get sym 'doc-string-elt)))))))
-	  font-lock-doc-face
-	font-lock-string-face)
+      ;; This might be a docstring.
+      (let* ((listbeg (nth 1 state))
+             (firstsym (and listbeg
+                            (save-excursion
+                              (goto-char listbeg)
+                              (and (looking-at "([ \t\n]*\\(\\(\\sw\\|\\s_\\)+\\)")
+                                   (match-string 1)))))
+             (docelt (and firstsym (get (intern-soft firstsym)
+                                        lisp-doc-string-elt-property))))
+        (if (and docelt
+                 ;; It's a string passed to a macro that has docstrings.
+                 ;; Check whether it's in docstring position.
+                 (let ((startpos (nth 8 state)))
+                   (save-excursion
+                     (when (functionp docelt)
+                       (goto-char (match-end 1))
+                       (setq docelt (funcall docelt)))
+                     (goto-char listbeg)
+                     (forward-char 1)
+                     (condition-case nil
+                         (while (and (> docelt 0) (< (point) startpos)
+                                     (progn (forward-sexp 1) t))
+                           (setq docelt (1- docelt)))
+                       (error nil))
+                     (and (zerop docelt) (<= (point) startpos)
+                          (progn (forward-comment (point-max)) t)
+                          (= (point) (nth 8 state))))))
+            font-lock-doc-face
+          font-lock-string-face))
     font-lock-comment-face))
 
 ;; The LISP-SYNTAX argument is used by code in inf-lisp.el and is