Mercurial > emacs
annotate lisp/which-func.el @ 24880:dc2d4e32cb21
*** empty log message ***
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Wed, 23 Jun 1999 15:11:39 +0000 |
| parents | ce2b5ccac297 |
| children | f85f374e5395 |
| rev | line source |
|---|---|
| 20322 | 1 ;;; which-func.el --- Print current function in mode line |
| 20321 | 2 |
| 21697 | 3 ;; Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. |
| 20321 | 4 |
| 5 ;; Author: Alex Rezinsky <alexr@msil.sps.mot.com> | |
| 21697 | 6 ;; Keywords: mode-line, imenu, tools |
| 20321 | 7 |
| 8 ;; This file is part of GNU Emacs. | |
| 9 | |
| 10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
| 11 ;; it under the terms of the GNU General Public License as published by | |
| 12 ;; the Free Software Foundation; either version 2, or (at your option) | |
| 13 ;; any later version. | |
| 14 | |
| 15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
| 16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 ;; GNU General Public License for more details. | |
| 19 | |
| 20 ;; You should have received a copy of the GNU General Public License | |
| 21 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
| 22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 23 ;; Boston, MA 02111-1307, USA. | |
| 24 | |
| 21697 | 25 ;;; Commentary: |
| 26 | |
| 27 ;; This package prints name of function where your current point is | |
| 28 ;; located in mode line. It assumes that you work with imenu package | |
| 29 ;; and imenu--index-alist is up to date. | |
| 20321 | 30 |
| 21697 | 31 ;; KNOWN BUGS |
| 32 ;; ---------- | |
| 33 ;; Really this package shows not "function where the current point is | |
| 34 ;; located now", but "nearest function which defined above the current | |
| 35 ;; point". So if your current point is located after end of function | |
| 36 ;; FOO but before begin of function BAR, FOO will be displayed in mode | |
| 37 ;; line. | |
| 20321 | 38 |
| 21697 | 39 ;; TODO LIST |
| 40 ;; --------- | |
| 41 ;; 1. Dependence on imenu package should be removed. Separate | |
| 42 ;; function determination mechanism should be used to determine the end | |
| 43 ;; of a function as well as the beginning of a function. | |
| 44 ;; 2. This package should be realized with the help of overlay | |
| 45 ;; properties instead of imenu--index-alist variable. | |
| 46 | |
| 47 ;;; History: | |
| 20321 | 48 |
| 21697 | 49 ;; THANKS TO |
| 50 ;; --------- | |
| 51 ;; Per Abrahamsen <abraham@iesd.auc.dk> | |
| 52 ;; Some ideas (inserting in mode-line, using of post-command hook | |
| 53 ;; and toggling this mode) have been borrowed from his package | |
| 54 ;; column.el | |
| 55 ;; Peter Eisenhauer <pipe@fzi.de> | |
| 56 ;; Bug fixing in case nested indexes. | |
| 57 ;; Terry Tateyama <ttt@ursa0.cs.utah.edu> | |
| 58 ;; Suggestion to use find-file-hooks for first imenu | |
| 59 ;; index building. | |
| 20321 | 60 |
| 21697 | 61 ;;; Code: |
| 62 | |
| 63 ;; Variables for customization | |
| 64 ;; --------------------------- | |
| 65 ;; | |
| 20321 | 66 (defvar which-func-unknown "???" |
| 67 "String to display in the mode line when current function is unknown.") | |
| 68 | |
|
21653
e95a88dc6110
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20573
diff
changeset
|
69 (defgroup which-func nil |
|
e95a88dc6110
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20573
diff
changeset
|
70 "Mode to display the current function name in the modeline." |
|
e95a88dc6110
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20573
diff
changeset
|
71 :group 'tools |
|
e95a88dc6110
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20573
diff
changeset
|
72 :version "20.3") |
|
e95a88dc6110
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20573
diff
changeset
|
73 |
| 20321 | 74 (defcustom which-func-modes |
|
23018
114211878bf9
(which-func-modes): Add fortran-mode.
Richard M. Stallman <rms@gnu.org>
parents:
22308
diff
changeset
|
75 '(emacs-lisp-mode c-mode c++-mode perl-mode makefile-mode sh-mode |
|
114211878bf9
(which-func-modes): Add fortran-mode.
Richard M. Stallman <rms@gnu.org>
parents:
22308
diff
changeset
|
76 fortran-mode) |
|
22134
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
77 "List of major modes for which Which Function mode should be used. |
| 20321 | 78 For other modes it is disabled. If this is equal to t, |
|
22134
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
79 then Which Function mode is enabled in any major mode that supports it." |
| 20321 | 80 :group 'which-func |
| 81 :type '(choice (const :tag "All modes" t) | |
|
22134
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
82 (repeat (symbol :tag "Major mode")))) |
| 20321 | 83 |
|
21964
390352ec56c6
(which-func-non-auto-modes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
21960
diff
changeset
|
84 (defcustom which-func-non-auto-modes nil |
|
390352ec56c6
(which-func-non-auto-modes): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
21960
diff
changeset
|
85 "List of major modes where Which Function mode is inactive till Imenu is used. |
|
22134
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
86 This means that Which Function mode won't really do anything |
|
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
87 until you use Imenu, in these modes. Note that files |
|
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
88 larger than `which-func-maxout' behave in this way too; |
|
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
89 Which Function mode doesn't do anything until you use Imenu." |
| 20321 | 90 :group 'which-func |
|
22134
29c2db002dd5
(which-func-modes): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents:
21964
diff
changeset
|
91 :type '(repeat (symbol :tag "Major mode"))) |
| 20321 | 92 |
| 93 (defcustom which-func-maxout 100000 | |
| 94 "Don't automatically compute the Imenu menu if buffer is this big or bigger. | |
| 95 Zero means compute the Imenu menu regardless of size." | |
| 96 :group 'which-func | |
| 97 :type 'integer) | |
| 98 | |
| 99 (defcustom which-func-format '(" [" which-func-current "]") | |
| 100 "Format for displaying the function in the mode line." | |
| 101 :group 'which-func | |
| 102 :type 'sexp) | |
| 103 | |
| 21697 | 104 ;;;###autoload |
| 105 (defcustom which-func-mode-global nil | |
|
24649
ce2b5ccac297
(which-func-mode-global): Doc fix.
Dave Love <fx@gnu.org>
parents:
24550
diff
changeset
|
106 "*Toggle `which-func-mode' globally. |
|
ce2b5ccac297
(which-func-mode-global): Doc fix.
Dave Love <fx@gnu.org>
parents:
24550
diff
changeset
|
107 Setting this variable directly does not take effect; |
|
ce2b5ccac297
(which-func-mode-global): Doc fix.
Dave Love <fx@gnu.org>
parents:
24550
diff
changeset
|
108 use either \\[customize] or the function `which-func-mode'." |
| 21697 | 109 :set #'(lambda (symbol value) |
|
23355
4486a6940607
(which-func-mode-global): Make :set function
Karl Heuer <kwzh@gnu.org>
parents:
23350
diff
changeset
|
110 (which-func-mode (if value 1 0))) |
| 21697 | 111 :initialize 'custom-initialize-default |
| 112 :type 'boolean | |
| 113 :group 'which-func | |
| 114 :require 'which-func) | |
| 115 | |
| 20321 | 116 ;;; Code, nothing to customize below here |
| 117 ;;; ------------------------------------- | |
| 118 ;;; | |
| 119 (require 'imenu) | |
| 120 | |
| 121 (defvar which-func-current which-func-unknown) | |
| 122 (defvar which-func-previous which-func-unknown) | |
| 123 (make-variable-buffer-local 'which-func-current) | |
| 124 (make-variable-buffer-local 'which-func-previous) | |
| 125 | |
| 126 (defvar which-func-mode nil | |
| 127 "Non-nil means display current function name in mode line. | |
| 21697 | 128 This makes a difference only if `which-func-mode-global' is non-nil") |
| 20321 | 129 (make-variable-buffer-local 'which-func-mode) |
| 130 (put 'which-func-mode 'permanent-local t) | |
| 131 | |
| 132 (add-hook 'find-file-hooks 'which-func-ff-hook t) | |
| 133 | |
| 134 (defun which-func-ff-hook () | |
| 135 "File find hook for Which Function mode. | |
| 136 It creates the Imenu index for the buffer, if necessary." | |
| 137 (if (or (eq which-func-modes t) (member major-mode which-func-modes)) | |
| 138 (setq which-func-mode which-func-mode-global) | |
| 139 (setq which-func-mode nil)) | |
| 140 | |
|
22308
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
141 (condition-case nil |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
142 (if (and which-func-mode |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
143 (not (member major-mode which-func-non-auto-modes)) |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
144 (or (< buffer-saved-size which-func-maxout) |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
145 (= which-func-maxout 0))) |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
146 (setq imenu--index-alist |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
147 (save-excursion (funcall imenu-create-index-function)))) |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
148 (error |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
149 (setq which-func-mode nil)))) |
| 20321 | 150 |
| 151 (defun which-func-update () | |
| 152 ;; Update the string containing the current function. | |
| 153 (condition-case info | |
|
20573
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
154 (progn |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
155 (if (not (setq which-func-current (which-function))) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
156 (setq which-func-current which-func-unknown)) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
157 (if (not (string= which-func-current which-func-previous)) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
158 (progn |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
159 (force-mode-line-update) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
160 (setq which-func-previous which-func-current)))) |
| 20321 | 161 (error |
| 162 (ding) | |
| 163 (remove-hook 'post-command-hook 'which-func-update) | |
| 164 (which-func-mode -1) ; Function mode off | |
|
20573
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
165 (message "Error in which-func-update: %s" info)))) |
| 20321 | 166 |
|
21960
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
167 ;; This is the name people would normally expect. |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
168 ;;;###autoload |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
169 (defalias 'which-function-mode 'which-func-mode) |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
170 |
| 21697 | 171 ;;;###autoload |
| 20321 | 172 (defun which-func-mode (&optional arg) |
| 173 "Toggle Which Function mode, globally. | |
| 174 When Which Function mode is enabled, the current function name is | |
| 175 continuously displayed in the mode line, in certain major modes. | |
| 176 | |
| 177 With prefix arg, turn Which Function mode on iff arg is positive, | |
| 178 and off otherwise." | |
| 179 (interactive "P") | |
| 180 (if (or (and (null arg) which-func-mode-global) | |
| 181 (<= (prefix-numeric-value arg) 0)) | |
| 182 ;; Turn it off | |
| 183 (if which-func-mode-global | |
| 184 (progn | |
| 185 (remove-hook 'post-command-hook 'which-func-update) | |
| 186 (setq which-func-mode-global nil) | |
| 187 (setq which-func-mode nil) | |
| 188 (force-mode-line-update))) | |
| 189 ;;Turn it on | |
| 190 (if which-func-mode-global | |
| 191 () | |
| 192 (add-hook 'post-command-hook 'which-func-update) | |
| 193 (setq which-func-mode-global t) | |
| 194 (setq which-func-mode | |
| 195 (or (eq which-func-modes t) | |
| 196 (member major-mode which-func-modes)))))) | |
| 197 | |
| 198 (defun which-function () | |
| 21697 | 199 "Return current function name based on point. |
| 200 If `imenu--index-alist' does not exist, or is empty or if point | |
| 20321 | 201 is located before first function, returns nil." |
| 202 (and | |
| 203 (boundp 'imenu--index-alist) | |
| 204 imenu--index-alist | |
| 205 (let ((pair (car-safe imenu--index-alist)) | |
| 206 (rest (cdr-safe imenu--index-alist)) | |
| 207 (name nil)) | |
|
23350
df3df03d8a19
(which-function): Handle case when (car imenu--index-alist) is nil.
Karl Heuer <kwzh@gnu.org>
parents:
23018
diff
changeset
|
208 (while (and (or rest pair) |
|
df3df03d8a19
(which-function): Handle case when (car imenu--index-alist) is nil.
Karl Heuer <kwzh@gnu.org>
parents:
23018
diff
changeset
|
209 (or (not (number-or-marker-p (cdr pair))) |
|
df3df03d8a19
(which-function): Handle case when (car imenu--index-alist) is nil.
Karl Heuer <kwzh@gnu.org>
parents:
23018
diff
changeset
|
210 (> (point) (cdr pair)))) |
| 20321 | 211 (setq name (car pair)) |
| 212 (setq pair (car-safe rest)) | |
| 213 (setq rest (cdr-safe rest))) | |
| 214 name))) | |
| 215 | |
| 216 (provide 'which-func) | |
| 217 | |
| 218 ;; which-func.el ends here |
