-;;; which-func.el --- Print current function in mode line
+;;; which-func.el --- print current function in mode line
-;; Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1997, 1998, 2001 Free Software Foundation, Inc.
;; Author: Alex Rezinsky <alexr@msil.sps.mot.com>
;; (doesn't seem to be responsive any more)
;; Peter Eisenhauer <pipe@fzi.de>
;; Bug fixing in case nested indexes.
;; Terry Tateyama <ttt@ursa0.cs.utah.edu>
-;; Suggestion to use find-file-hooks for first imenu
+;; Suggestion to use find-file-hook for first imenu
;; index building.
;;; Code:
:group 'which-func
:type '(repeat (symbol :tag "Major mode")))
-(defcustom which-func-maxout 100000
+(defcustom which-func-maxout 500000
"Don't automatically compute the Imenu menu if buffer is this big or bigger.
Zero means compute the Imenu menu regardless of size."
:group 'which-func
(defvar which-func-mode nil
"Non-nil means display current function name in mode line.
-This makes a difference only if `which-func-mode-global' is non-nil")
+This makes a difference only if `which-function-mode' is non-nil.")
(make-variable-buffer-local 'which-func-mode)
;;(put 'which-func-mode 'permanent-local t)
-(add-hook 'find-file-hooks 'which-func-ff-hook t)
+(add-hook 'find-file-hook 'which-func-ff-hook t)
(defun which-func-ff-hook ()
"File find hook for Which Function mode.
It creates the Imenu index for the buffer, if necessary."
(setq which-func-mode
- (and which-func-mode-global
- (or (eq which-func-modes t) (member major-mode which-func-modes))))
+ (and which-function-mode
+ (or (eq which-func-modes t)
+ (member major-mode which-func-modes))))
(condition-case nil
(if (and which-func-mode
(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))))))
-;; This is the name people would normally expect.
-;;;###autoload
-(defalias 'which-function-mode 'which-func-mode-global)
;;;###autoload
-(defalias 'which-func-mode 'which-func-mode-global)
+(defalias 'which-func-mode 'which-function-mode)
+
+;; This is the name people would normally expect.
;;;###autoload
-(define-minor-mode which-func-mode-global
+(define-minor-mode which-function-mode
"Toggle Which Function mode, globally.
When Which Function mode is enabled, the current function name is
continuously displayed in the mode line, in certain major modes.
With prefix ARG, turn Which Function mode on iff arg is positive,
and off otherwise."
:global t :group 'which-func
- (if which-func-mode-global
+ (if which-function-mode
;;Turn it on
(progn
(add-hook 'post-command-idle-hook 'which-func-update)
(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)))
(provide 'which-func)
-;; which-func.el ends here
+;;; which-func.el ends here