]> git.eshelyaron.com Git - emacs.git/commitdiff
(lambda): Add its doc-string-elt property.
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 5 Oct 2005 15:03:09 +0000 (15:03 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 5 Oct 2005 15:03:09 +0000 (15:03 +0000)
(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.

lisp/emacs-lisp/lisp-mode.el

index b347c136adfb97f824ba9d9ba2b4e7ff6a123dd7..c9786ad68d325008ee4ab5b0f8c5a594b9c1bb6e 100644 (file)
 (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