Commit 7a513c47 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

(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.
parent a3255400
......@@ -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
"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
(if (not (setq which-func-current (which-function)))
(setq which-func-current which-func-unknown))
(if (not (string= which-func-current which-func-previous))
(when which-func-mode
(condition-case info
(setq which-func-current (or (which-function) which-func-unknown))
(unless (string= which-func-current which-func-previous)
(setq which-func-previous which-func-current))))
(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)))
(which-func-mode -1)
(error "Error in which-func-update: %s" info)))))
;; This is the name people would normally expect.
......@@ -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
(remove-hook 'post-command-hook 'which-func-update)
(setq which-func-mode-global nil)
(setq which-func-mode nil)
(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."
(boundp '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)
(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)
(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)
(provide 'which-func)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment