]> git.eshelyaron.com Git - emacs.git/commitdiff
(which-function): Call imenu--make-index-alist
authorRichard M. Stallman <rms@gnu.org>
Thu, 22 Nov 2001 00:08:32 +0000 (00:08 +0000)
committerRichard M. Stallman <rms@gnu.org>
Thu, 22 Nov 2001 00:08:32 +0000 (00:08 +0000)
if necessary to get a list of functions.
(which-function-imenu-failed): New variable.
(which-func-update): Handle all visible windows.
(which-func-update-1): New subroutine broken out of which-func-update.

lisp/ChangeLog
lisp/which-func.el

index 0a842a59c6657b82b98878e3bb016fbd6847cca0..596e010d931c2cee9455e2f21dbfd818cd9af13e 100644 (file)
@@ -1,5 +1,11 @@
 2001-11-21  Richard M. Stallman  <rms@gnu.org>
 
+       * which-func.el (which-function): Call imenu--make-index-alist
+       if necessary to get a list of functions.
+       (which-function-imenu-failed): New variable.
+       (which-func-update): Handle all visible windows.
+       (which-func-update-1): New subroutine broken out of which-func-update.
+
        * files.el (temporary-file-directory, null-device) 
        (small-temporary-file-directory): Definitions moved up.
 
index f183fd0e2a4e67e21edd45910e661fb67f1da449..c594945d89e43993d6a30b836857928ba75c167b 100644 (file)
@@ -153,17 +153,24 @@ It creates the Imenu index for the buffer, if necessary."
      (setq which-func-mode nil))))
 
 (defun which-func-update ()
-  ;; Update the string containing the current function.
-  (when which-func-mode
-    (condition-case info
-       (progn
-         (setq which-func-current (or (which-function) which-func-unknown))
-         (unless (string= which-func-current which-func-previous)
-           (force-mode-line-update)
-           (setq which-func-previous which-func-current)))
-      (error
-       (which-func-mode -1)
-       (error "Error in which-func-update: %s" info)))))
+  "Update the Which-Function mode display for all windows."
+  (walk-windows 'which-func-update-1 nil 'visible))
+
+(defun which-func-update-1 (window)
+  "Update the Which-Function mode display for window WINDOW."
+  (save-selected-window
+    (select-window window)
+    ;; Update the string containing the current function.
+    (when which-func-mode
+      (condition-case info
+         (progn
+           (setq which-func-current (or (which-function) which-func-unknown))
+           (unless (string= which-func-current which-func-previous)
+             (force-mode-line-update)
+             (setq which-func-previous which-func-current)))
+       (error
+        (which-func-mode -1)
+        (error "Error in which-func-update: %s" info))))))
 
 ;;;###autoload
 (defalias 'which-func-mode 'which-function-mode)
@@ -192,12 +199,22 @@ and off otherwise."
     (dolist (buf (buffer-list))
       (with-current-buffer buf (setq which-func-mode nil)))))
 
+(defvar which-function-imenu-failed nil
+  "Locally t in a buffer if `imenu--make-index-alist' found nothing there.")
+
 (defun which-function ()
   "Return current function name based on point.
 Uses `imenu--index-alist' or `add-log-current-defun-function'.
 If no function name is found, return nil."
   (let (name)
-    ;; First try using imenu support.
+    ;; If Imenu is loaded, try to make an index alist with it.
+    (when (and (boundp 'imenu--index-alist) (null imenu--index-alist)
+              (null which-function-imenu-failed))
+      (imenu--make-index-alist)
+      (unless imenu--index-alist
+       (make-local-variable 'which-function-imenu-failed)
+       (setq which-function-imenu-failed t)))
+    ;; If we have an index alist, use it.
     (when (and (boundp 'imenu--index-alist) imenu--index-alist)
       (let ((pair (car-safe imenu--index-alist))
            (rest (cdr-safe imenu--index-alist)))