WhichFuncMode (also known as WhichFunctionMode) is a minor mode, that when activated displays the current function name in the mode line. It works under certain major modes, like CcMode or PerlMode. To activate it, type

  M-x which-function-mode RET

or enter the following piece of elisp into your `.emacs` file to make it permanent :

  (which-function-mode 1)

WhichFuncMode is based on ImenuMode, so if it doesn’t show correct current function name (and mode supports imenu), try

  M-x imenu RET *Rescan* RET RET

To show the function in the HeaderLine instead of the ModeLine,


(setq mode-line-format (delete (assoc 'which-func-mode
                                      mode-line-format) mode-line-format)
      which-func-header-line-format '(which-func-mode ("" which-func-format)))
(defadvice which-func-ff-hook (after header-line activate)
  (when which-func-mode
    (setq mode-line-format (delete (assoc 'which-func-mode
                                          mode-line-format) mode-line-format)
          header-line-format which-func-header-line-format)))

(Note: Emacs 24.2.91 seems to put the which-func configuration in ‘mode-line-misc-info’ instead, so you may need to replace ‘mode-line-format’ with ‘mode-line-misc-info’ in the above snippet.)

By default, which-func mode automatically enables itself in all modes which have imenu support. To configure a subset of languages for which-func mode, set ‘which-func-modes’:

  (eval-after-load "which-func"
      '(setq which-func-modes '(java-mode c++-mode org-mode)))

To configure a language for which-func mode, you need to configure it for ImenuMode.

WhichFuncMode shows which function’s source code you are in, ElDoc shows where you are in a parameter list to a function call. They both are mode-configurable.

Non-standard languages (TL;DR;)

WhichFuncMode can be customized for non-standard language modes (including non-imenu supporting modes) using the hook ‘which-func-functions’, so adding an elisp function for a non-standard mode to this hook should work.

However, there is a gotcha. Internally, when imenu isn’t available, WhichFuncMode disables itself in the function ‘which-func-ff-hook’, which is called from the hook ‘find-file-hook’. An ugly workaround for this is to re-enable it by appending to ‘find-file-hook’. For example, for ‘foo-mode’ which provides the name of a context with `foo-whereami()’:

(defun foo-find-file-hook ()
  (when (derived-mode-p 'foo-mode)
    (which-function-mode t)
    (setq which-func-mode t)
    (add-hook 'which-func-functions 'foo-whereami t t)))

;; We need this to be run AFTER which-func-ff-hook - the "t" means append
(add-hook 'find-file-hook 'foo-find-file-hook t)


An alternative mode is semantic-stickyfunc-mode that displays out of screen context (i.e. current function) at the top line. Its enhanced version, stickfyfunc-enhance improves it further.

Another alternative mode that offers similar functionality for several programming languages is SemanticIdleBreadcrumbsMode.

Another alternative mode is cfm. Cfm (display current function or method) will display class-qualified member function names (A::foo), particularly useful for C++ and Java classes that embed member function definitions (that is, without the three-box model).

CategoryProgrammerUtils CategoryNavigation