1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-24 10:38:38 +00:00

(which-func-format): Remove spurious space.

(which-func-mode): Don't make it permanent-local.
(which-func-ff-hook): Allow which-func-maxout to be nil.
(which-func-update): Simplify a bit.  Only run if which-func-mode is t.
(which-func-mode): Simplify.
Use post-command-idle-hook rather than post-command-hook.
Go through all buffers and update their state.
(which-function): Also try add-log-current-defun-function.
This commit is contained in:
Stefan Monnier 2000-10-05 23:13:07 +00:00
parent a325540023
commit 7a513c475d

View File

@ -71,7 +71,7 @@
:group 'tools
:version "20.3")
(defcustom which-func-modes
(defcustom which-func-modes
'(emacs-lisp-mode c-mode c++-mode perl-mode makefile-mode sh-mode
fortran-mode)
"List of major modes for which Which Function mode should be used.
@ -96,7 +96,7 @@ Zero means compute the Imenu menu regardless of size."
:group 'which-func
:type 'integer)
(defcustom which-func-format '(" [" which-func-current "]")
(defcustom which-func-format '("[" which-func-current "]")
"Format for displaying the function in the mode line."
:group 'which-func
:type 'sexp)
@ -138,21 +138,22 @@ and you want to simplify them for the mode line
"Non-nil means display current function name in mode line.
This makes a difference only if `which-func-mode-global' is non-nil")
(make-variable-buffer-local 'which-func-mode)
(put 'which-func-mode 'permanent-local t)
;;(put 'which-func-mode 'permanent-local t)
(add-hook 'find-file-hooks '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."
(if (or (eq which-func-modes t) (member major-mode which-func-modes))
(setq which-func-mode which-func-mode-global)
(setq which-func-mode nil))
(setq which-func-mode
(and which-func-mode-global
(or (eq which-func-modes t) (member major-mode which-func-modes))))
(condition-case nil
(if (and which-func-mode
(not (member major-mode which-func-non-auto-modes))
(or (< buffer-saved-size which-func-maxout)
(or (null which-func-maxout)
(< buffer-saved-size which-func-maxout)
(= which-func-maxout 0)))
(setq imenu--index-alist
(save-excursion (funcall imenu-create-index-function))))
@ -161,19 +162,16 @@ It creates the Imenu index for the buffer, if necessary."
(defun which-func-update ()
;; Update the string containing the current function.
(condition-case info
(progn
(if (not (setq which-func-current (which-function)))
(setq which-func-current which-func-unknown))
(if (not (string= which-func-current which-func-previous))
(progn
(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
(ding)
(remove-hook 'post-command-hook 'which-func-update)
(which-func-mode -1) ; Function mode off
(message "Error in which-func-update: %s" info))))
(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
@ -185,47 +183,50 @@ It creates the Imenu index for the buffer, if necessary."
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,
With prefix ARG, turn Which Function mode on iff arg is positive,
and off otherwise."
(interactive "P")
(if (or (and (null arg) which-func-mode-global)
(<= (prefix-numeric-value arg) 0))
(setq which-func-mode-global
(or (and (null arg) which-func-mode-global)
(<= (prefix-numeric-value arg) 0)))
(if which-func-mode-global
;; Turn it off
(if which-func-mode-global
(progn
(remove-hook 'post-command-hook 'which-func-update)
(setq which-func-mode-global nil)
(setq which-func-mode nil)
(force-mode-line-update)))
(progn
(remove-hook 'post-command-idle-hook 'which-func-update)
(dolist (buf (buffer-list))
(with-current-buffer buf (setq which-func-mode nil))))
;;Turn it on
(if which-func-mode-global
()
(add-hook 'post-command-hook 'which-func-update)
(setq which-func-mode-global t)
(setq which-func-mode
(or (eq which-func-modes t)
(member major-mode which-func-modes))))))
(add-hook 'post-command-idle-hook 'which-func-update)
(dolist (buf (buffer-list))
(with-current-buffer buf
(setq which-func-mode
(or (eq which-func-modes t)
(member major-mode which-func-modes)))))))
(defun which-function ()
"Return current function name based on point.
If `imenu--index-alist' does not exist, or is empty or if point
is located before first function, returns nil."
(and
(boundp 'imenu--index-alist)
imenu--index-alist
(let ((pair (car-safe imenu--index-alist))
(rest (cdr-safe imenu--index-alist))
(name nil))
(while (and (or rest pair)
(or (not (number-or-marker-p (cdr pair)))
(> (point) (cdr pair))))
(setq name (car pair))
(setq pair (car-safe rest))
(setq rest (cdr-safe rest)))
(and name
(if which-func-cleanup-function
(funcall which-func-cleanup-function name)
name)))))
(let (name)
;; First try using imenu support.
(when (and (boundp 'imenu--index-alist) imenu--index-alist)
(let ((pair (car-safe imenu--index-alist))
(rest (cdr-safe imenu--index-alist)))
(while (and (or rest pair)
(or (not (number-or-marker-p (cdr pair)))
(> (point) (cdr pair))))
(setq name (car pair))
(setq pair (car-safe rest))
(setq rest (cdr-safe rest)))))
;; Try using add-log support.
(when (and (null name) (boundp 'add-log-current-defun-function)
add-log-current-defun-function)
(setq name (funcall add-log-current-defun-function)))
;; Filter the name if requested.
(when name
(if which-func-cleanup-function
(funcall which-func-cleanup-function name)
name))))
(provide 'which-func)