Mercurial > emacs
annotate lisp/which-func.el @ 28923:dcafe3c9cd6c
(sh-while-getopts) <sh>: Handle case that
user-specified option string is empty.
| author | Gerd Moellmann <gerd@gnu.org> |
|---|---|
| date | Mon, 15 May 2000 20:14:39 +0000 |
| parents | f85f374e5395 |
| children | af0c1b2c3d6e |
| 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 | |
|
25425
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
116 (defvar which-func-cleanup-function nil |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
117 "Function to transform a string before displaying it in the mode line. |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
118 The function is called with one argument, the string to display. |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
119 Its return value is displayed in the modeline. |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
120 If nil, no function is called. The default value is nil. |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
121 |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
122 This feature can be useful if Imenu is set up to make more |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
123 detailed entries (e.g., containing the argument list of a function), |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
124 and you want to simplify them for the mode line |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
125 \(e.g., removing the parameter list to just have the function name.)") |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
126 |
| 20321 | 127 ;;; Code, nothing to customize below here |
| 128 ;;; ------------------------------------- | |
| 129 ;;; | |
| 130 (require 'imenu) | |
| 131 | |
| 132 (defvar which-func-current which-func-unknown) | |
| 133 (defvar which-func-previous which-func-unknown) | |
| 134 (make-variable-buffer-local 'which-func-current) | |
| 135 (make-variable-buffer-local 'which-func-previous) | |
| 136 | |
| 137 (defvar which-func-mode nil | |
| 138 "Non-nil means display current function name in mode line. | |
| 21697 | 139 This makes a difference only if `which-func-mode-global' is non-nil") |
| 20321 | 140 (make-variable-buffer-local 'which-func-mode) |
| 141 (put 'which-func-mode 'permanent-local t) | |
| 142 | |
| 143 (add-hook 'find-file-hooks 'which-func-ff-hook t) | |
| 144 | |
| 145 (defun which-func-ff-hook () | |
| 146 "File find hook for Which Function mode. | |
| 147 It creates the Imenu index for the buffer, if necessary." | |
| 148 (if (or (eq which-func-modes t) (member major-mode which-func-modes)) | |
| 149 (setq which-func-mode which-func-mode-global) | |
| 150 (setq which-func-mode nil)) | |
| 151 | |
|
22308
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
152 (condition-case nil |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
153 (if (and which-func-mode |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
154 (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
|
155 (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
|
156 (= which-func-maxout 0))) |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
157 (setq imenu--index-alist |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
158 (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
|
159 (error |
|
87366acfb1e9
(which-func-ff-hook): If imenu gets error,
Karl Heuer <kwzh@gnu.org>
parents:
22134
diff
changeset
|
160 (setq which-func-mode nil)))) |
| 20321 | 161 |
| 162 (defun which-func-update () | |
| 163 ;; Update the string containing the current function. | |
| 164 (condition-case info | |
|
20573
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
165 (progn |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
166 (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
|
167 (setq which-func-current which-func-unknown)) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
168 (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
|
169 (progn |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
170 (force-mode-line-update) |
|
b46523ef0e0a
(which-func-update): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
20322
diff
changeset
|
171 (setq which-func-previous which-func-current)))) |
| 20321 | 172 (error |
| 173 (ding) | |
| 174 (remove-hook 'post-command-hook 'which-func-update) | |
| 175 (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
|
176 (message "Error in which-func-update: %s" info)))) |
| 20321 | 177 |
|
21960
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
178 ;; This is the name people would normally expect. |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
179 ;;;###autoload |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
180 (defalias 'which-function-mode 'which-func-mode) |
|
79c7369b9ab4
(which-function-mode): New alias.
Richard M. Stallman <rms@gnu.org>
parents:
21697
diff
changeset
|
181 |
| 21697 | 182 ;;;###autoload |
| 20321 | 183 (defun which-func-mode (&optional arg) |
| 184 "Toggle Which Function mode, globally. | |
| 185 When Which Function mode is enabled, the current function name is | |
| 186 continuously displayed in the mode line, in certain major modes. | |
| 187 | |
| 188 With prefix arg, turn Which Function mode on iff arg is positive, | |
| 189 and off otherwise." | |
| 190 (interactive "P") | |
| 191 (if (or (and (null arg) which-func-mode-global) | |
| 192 (<= (prefix-numeric-value arg) 0)) | |
| 193 ;; Turn it off | |
| 194 (if which-func-mode-global | |
| 195 (progn | |
| 196 (remove-hook 'post-command-hook 'which-func-update) | |
| 197 (setq which-func-mode-global nil) | |
| 198 (setq which-func-mode nil) | |
| 199 (force-mode-line-update))) | |
| 200 ;;Turn it on | |
| 201 (if which-func-mode-global | |
| 202 () | |
| 203 (add-hook 'post-command-hook 'which-func-update) | |
| 204 (setq which-func-mode-global t) | |
| 205 (setq which-func-mode | |
| 206 (or (eq which-func-modes t) | |
| 207 (member major-mode which-func-modes)))))) | |
| 208 | |
| 209 (defun which-function () | |
| 21697 | 210 "Return current function name based on point. |
| 211 If `imenu--index-alist' does not exist, or is empty or if point | |
| 20321 | 212 is located before first function, returns nil." |
| 213 (and | |
| 214 (boundp 'imenu--index-alist) | |
| 215 imenu--index-alist | |
| 216 (let ((pair (car-safe imenu--index-alist)) | |
| 217 (rest (cdr-safe imenu--index-alist)) | |
| 218 (name nil)) | |
|
23350
df3df03d8a19
(which-function): Handle case when (car imenu--index-alist) is nil.
Karl Heuer <kwzh@gnu.org>
parents:
23018
diff
changeset
|
219 (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
|
220 (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
|
221 (> (point) (cdr pair)))) |
| 20321 | 222 (setq name (car pair)) |
| 223 (setq pair (car-safe rest)) | |
| 224 (setq rest (cdr-safe rest))) | |
|
25425
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
225 (and name |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
226 (if which-func-cleanup-function |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
227 (funcall which-func-cleanup-function name) |
|
f85f374e5395
(which-func-cleanup-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
24649
diff
changeset
|
228 name))))) |
| 20321 | 229 |
| 230 (provide 'which-func) | |
| 231 | |
| 232 ;; which-func.el ends here |
