changeset 41357:9e8cfa1e3b05

(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.
author Richard M. Stallman <rms@gnu.org>
date Thu, 22 Nov 2001 00:07:57 +0000
parents 39332ec6c47d
children f1d3cfc0cdeb
files lisp/which-func.el
diffstat 1 files changed, 29 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/which-func.el	Wed Nov 21 19:42:46 2001 +0000
+++ b/lisp/which-func.el	Thu Nov 22 00:07:57 2001 +0000
@@ -153,17 +153,24 @@
      (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 @@
     (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)))