78 |
(defcustom find-variable-regexp |
(defcustom find-variable-regexp |
79 |
(concat"^\\s-*(def[^fumag]\\(\\w\\|\\s_\\)+\\*?" find-function-space-re "%s\\(\\s-\\|$\\)") |
(concat"^\\s-*(def[^fumag]\\(\\w\\|\\s_\\)+\\*?" find-function-space-re "%s\\(\\s-\\|$\\)") |
80 |
"The regexp used by `find-variable' to search for a variable definition. |
"The regexp used by `find-variable' to search for a variable definition. |
81 |
It should match right up to the variable name. The default value |
Note it must contain a `%s' at the place where `format' |
82 |
|
should insert the variable name. The default value |
83 |
avoids `defun', `defmacro', `defalias', `defadvice', `defgroup', `defface'. |
avoids `defun', `defmacro', `defalias', `defadvice', `defgroup', `defface'. |
84 |
|
|
85 |
Please send improvements and fixes to the maintainer." |
Please send improvements and fixes to the maintainer." |
87 |
:group 'find-function |
:group 'find-function |
88 |
:version "21.1") |
:version "21.1") |
89 |
|
|
90 |
|
(defcustom find-face-regexp |
91 |
|
(concat"^\\s-*(defface" find-function-space-re "%s\\(\\s-\\|$\\)") |
92 |
|
"The regexp used by `find-face' to search for a face definition. |
93 |
|
Note it must contain a `%s' at the place where `format' |
94 |
|
should insert the face name. |
95 |
|
|
96 |
|
Please send improvements and fixes to the maintainer." |
97 |
|
:type 'regexp |
98 |
|
:group 'find-function |
99 |
|
:version "21.4") |
100 |
|
|
101 |
|
(defvar find-function-regexp-alist |
102 |
|
'((nil . find-function-regexp) |
103 |
|
(defvar . find-variable-regexp) |
104 |
|
(defface . find-face-regexp)) |
105 |
|
"Alist mapping definition types into regexp variables. |
106 |
|
Each regexp variable's value should actually be a format string |
107 |
|
to be used to substitute the desired symbol name into the regexp.") |
108 |
|
(put 'find-function-regexp-alist 'risky-local-variable t) |
109 |
|
|
110 |
(defcustom find-function-source-path nil |
(defcustom find-function-source-path nil |
111 |
"The default list of directories where `find-function' searches. |
"The default list of directories where `find-function' searches. |
112 |
|
|
157 |
If nil, do not try to find the source code of functions and variables |
If nil, do not try to find the source code of functions and variables |
158 |
defined in C.") |
defined in C.") |
159 |
|
|
160 |
(defun find-function-C-source (fun-or-var file variable-p) |
(defun find-function-C-source (fun-or-var file type) |
161 |
"Find the source location where SUBR-OR-VAR is defined in FILE. |
"Find the source location where SUBR-OR-VAR is defined in FILE. |
162 |
VARIABLE-P should be non-nil for a variable or nil for a subroutine." |
TYPE should be nil to find a function, or `defvar' to find a variable." |
163 |
(unless find-function-C-source-directory |
(unless find-function-C-source-directory |
164 |
(setq find-function-C-source-directory |
(setq find-function-C-source-directory |
165 |
(read-directory-name "Emacs C source dir: " nil nil t))) |
(read-directory-name "Emacs C source dir: " nil nil t))) |
167 |
(unless (file-readable-p file) |
(unless (file-readable-p file) |
168 |
(error "The C source file %s is not available" |
(error "The C source file %s is not available" |
169 |
(file-name-nondirectory file))) |
(file-name-nondirectory file))) |
170 |
(unless variable-p |
(unless type |
171 |
(setq fun-or-var (indirect-function fun-or-var))) |
(setq fun-or-var (indirect-function fun-or-var))) |
172 |
(with-current-buffer (find-file-noselect file) |
(with-current-buffer (find-file-noselect file) |
173 |
(goto-char (point-min)) |
(goto-char (point-min)) |
174 |
(unless (re-search-forward |
(unless (re-search-forward |
175 |
(if variable-p |
(if type |
176 |
(concat "DEFVAR[A-Z_]*[ \t\n]*([ \t\n]*\"" |
(concat "DEFVAR[A-Z_]*[ \t\n]*([ \t\n]*\"" |
177 |
(regexp-quote (symbol-name fun-or-var)) |
(regexp-quote (symbol-name fun-or-var)) |
178 |
"\"") |
"\"") |
196 |
(condition-case nil (switch-to-buffer buf) (error (pop-to-buffer buf))))) |
(condition-case nil (switch-to-buffer buf) (error (pop-to-buffer buf))))) |
197 |
|
|
198 |
;;;###autoload |
;;;###autoload |
199 |
(defun find-function-search-for-symbol (symbol variable-p library) |
(defun find-function-search-for-symbol (symbol type library) |
200 |
"Search for SYMBOL. |
"Search for SYMBOL's definition of type TYPE in LIBRARY. |
201 |
If VARIABLE-P is nil, `find-function-regexp' is used, otherwise |
If TYPE is nil, look for a function definition. |
202 |
`find-variable-regexp' is used. The search is done in library LIBRARY." |
Otherwise, TYPE specifies the kind of definition, |
203 |
|
and it is interpreted via `find-function-regexp-alist'. |
204 |
|
The search is done in the source for library LIBRARY." |
205 |
(if (null library) |
(if (null library) |
206 |
(error "Don't know where `%s' is defined" symbol)) |
(error "Don't know where `%s' is defined" symbol)) |
207 |
;; Some functions are defined as part of the construct |
;; Some functions are defined as part of the construct |
209 |
(while (and (symbolp symbol) (get symbol 'definition-name)) |
(while (and (symbolp symbol) (get symbol 'definition-name)) |
210 |
(setq symbol (get symbol 'definition-name))) |
(setq symbol (get symbol 'definition-name))) |
211 |
(if (string-match "\\`src/\\(.*\\.c\\)\\'" library) |
(if (string-match "\\`src/\\(.*\\.c\\)\\'" library) |
212 |
(find-function-C-source symbol (match-string 1 library) variable-p) |
(find-function-C-source symbol (match-string 1 library) type) |
213 |
(if (string-match "\\.el\\(c\\)\\'" library) |
(if (string-match "\\.el\\(c\\)\\'" library) |
214 |
(setq library (substring library 0 (match-beginning 1)))) |
(setq library (substring library 0 (match-beginning 1)))) |
215 |
(let* ((filename (find-library-name library))) |
(let* ((filename (find-library-name library)) |
216 |
|
(regexp-symbol (cdr (assq type find-function-regexp-alist)))) |
217 |
(with-current-buffer (find-file-noselect filename) |
(with-current-buffer (find-file-noselect filename) |
218 |
(let ((regexp (format (if variable-p |
(let ((regexp (format (symbol-value regexp-symbol) |
|
find-variable-regexp |
|
|
find-function-regexp) |
|
219 |
(regexp-quote (symbol-name symbol)))) |
(regexp-quote (symbol-name symbol)))) |
220 |
(case-fold-search)) |
(case-fold-search)) |
221 |
(with-syntax-table emacs-lisp-mode-syntax-table |
(with-syntax-table emacs-lisp-mode-syntax-table |
267 |
((symbol-file function 'defun))))) |
((symbol-file function 'defun))))) |
268 |
(find-function-search-for-symbol function nil library)))) |
(find-function-search-for-symbol function nil library)))) |
269 |
|
|
270 |
(defalias 'function-at-point 'function-called-at-point) |
(defun find-function-read (&optional type) |
|
|
|
|
(defun find-function-read (&optional variable-p) |
|
271 |
"Read and return an interned symbol, defaulting to the one near point. |
"Read and return an interned symbol, defaulting to the one near point. |
272 |
|
|
273 |
If the optional VARIABLE-P is nil, then a function is gotten |
If TYPE is nil, insist on a symbol with a function definition. |
274 |
defaulting to the value of the function `function-at-point', otherwise |
Otherwise TYPE should be `defvar' or `defface'. |
275 |
a variable is asked for, with the default coming from |
If TYPE is nil, defaults using `function-called-at-point', |
276 |
`variable-at-point'." |
otherwise uses `variable-at-point'." |
277 |
(let ((symb (funcall (if variable-p |
(let ((symb (if (null type) |
278 |
'variable-at-point |
(function-called-at-point) |
279 |
'function-at-point))) |
(if (eq type 'defvar) |
280 |
|
(variable-at-point) |
281 |
|
(variable-at-point t)))) |
282 |
|
(predicate (cdr (assq type '((nil . fboundp) (defvar . boundp) |
283 |
|
(defface . facep))))) |
284 |
|
(prompt (cdr (assq type '((nil . "function") (defvar . "variable") |
285 |
|
(defface . "face"))))) |
286 |
(enable-recursive-minibuffers t) |
(enable-recursive-minibuffers t) |
287 |
val) |
val) |
288 |
(if (equal symb 0) |
(if (equal symb 0) |
289 |
(setq symb nil)) |
(setq symb nil)) |
290 |
(setq val (if variable-p |
(setq val (completing-read |
291 |
(completing-read |
(concat "Find " |
292 |
(concat "Find variable" |
prompt |
293 |
(if symb |
(if symb |
294 |
(format " (default %s)" symb)) |
(format " (default %s)" symb)) |
295 |
": ") |
": ") |
296 |
obarray 'boundp t nil) |
obarray predicate t nil)) |
|
(completing-read |
|
|
(concat "Find function" |
|
|
(if symb |
|
|
(format " (default %s)" symb)) |
|
|
": ") |
|
|
obarray 'fboundp t nil))) |
|
297 |
(list (if (equal val "") |
(list (if (equal val "") |
298 |
symb |
symb |
299 |
(intern val))))) |
(intern val))))) |
300 |
|
|
301 |
(defun find-function-do-it (symbol variable-p switch-fn) |
(defun find-function-do-it (symbol type switch-fn) |
302 |
"Find Emacs Lisp SYMBOL in a buffer and display it. |
"Find Emacs Lisp SYMBOL in a buffer and display it. |
303 |
If VARIABLE-P is nil, a function definition is searched for, otherwise |
TYPE is nil to search for a function definition, |
304 |
a variable definition is searched for. The start of a definition is |
or else `defvar' or `defface'. |
305 |
centered according to the variable `find-function-recenter-line'. |
|
306 |
See also `find-function-after-hook' It is displayed with function SWITCH-FN. |
The variable `find-function-recenter-line' controls how |
307 |
|
to recenter the display. SWITCH-FN is the function to call |
308 |
|
to display and select the buffer. |
309 |
|
See also `find-function-after-hook'. |
310 |
|
|
311 |
Point is saved in the buffer if it is one of the current buffers." |
Set mark before moving, if the buffer already existed." |
312 |
(let* ((orig-point (point)) |
(let* ((orig-point (point)) |
313 |
(orig-buf (window-buffer)) |
(orig-buf (window-buffer)) |
314 |
(orig-buffers (buffer-list)) |
(orig-buffers (buffer-list)) |
315 |
(buffer-point (save-excursion |
(buffer-point (save-excursion |
316 |
(funcall (if variable-p |
(find-definition-noselect symbol type))) |
|
'find-variable-noselect |
|
|
'find-function-noselect) |
|
|
symbol))) |
|
317 |
(new-buf (car buffer-point)) |
(new-buf (car buffer-point)) |
318 |
(new-point (cdr buffer-point))) |
(new-point (cdr buffer-point))) |
319 |
(when buffer-point |
(when buffer-point |
330 |
|
|
331 |
Finds the Emacs Lisp library containing the definition of the function |
Finds the Emacs Lisp library containing the definition of the function |
332 |
near point (selected by `function-at-point') in a buffer and |
near point (selected by `function-at-point') in a buffer and |
333 |
places point before the definition. Point is saved in the buffer if |
places point before the definition. |
334 |
it is one of the current buffers. |
Set mark before moving, if the buffer already existed. |
335 |
|
|
336 |
The library where FUNCTION is defined is searched for in |
The library where FUNCTION is defined is searched for in |
337 |
`find-function-source-path', if non nil, otherwise in `load-path'. |
`find-function-source-path', if non nil, otherwise in `load-path'. |
360 |
"Return a pair `(BUFFER . POINT)' pointing to the definition of SYMBOL. |
"Return a pair `(BUFFER . POINT)' pointing to the definition of SYMBOL. |
361 |
|
|
362 |
Finds the Emacs Lisp library containing the definition of SYMBOL |
Finds the Emacs Lisp library containing the definition of SYMBOL |
363 |
in a buffer and the point of the definition. The buffer is |
in a buffer, and the point of the definition. It does not switch |
364 |
not selected. |
to the buffer or display it. |
365 |
|
|
366 |
The library where VARIABLE is defined is searched for in FILE or |
The library where VARIABLE is defined is searched for in FILE or |
367 |
`find-function-source-path', if non nil, otherwise in `load-path'." |
`find-function-source-path', if non nil, otherwise in `load-path'." |
368 |
(if (not variable) |
(if (not variable) |
369 |
(error "You didn't specify a variable")) |
(error "You didn't specify a variable")) |
370 |
(let ((library (or file (symbol-file variable 'defvar)))) |
(let ((library (or file (symbol-file variable 'defvar)))) |
371 |
(find-function-search-for-symbol variable 'variable library))) |
(find-function-search-for-symbol variable 'defvar library))) |
372 |
|
|
373 |
;;;###autoload |
;;;###autoload |
374 |
(defun find-variable (variable) |
(defun find-variable (variable) |
376 |
|
|
377 |
Finds the Emacs Lisp library containing the definition of the variable |
Finds the Emacs Lisp library containing the definition of the variable |
378 |
near point (selected by `variable-at-point') in a buffer and |
near point (selected by `variable-at-point') in a buffer and |
379 |
places point before the definition. Point is saved in the buffer if |
places point before the definition. |
380 |
it is one of the current buffers. |
|
381 |
|
Set mark before moving, if the buffer already existed. |
382 |
|
|
383 |
The library where VARIABLE is defined is searched for in |
The library where VARIABLE is defined is searched for in |
384 |
`find-function-source-path', if non nil, otherwise in `load-path'. |
`find-function-source-path', if non nil, otherwise in `load-path'. |
403 |
(find-function-do-it variable t 'switch-to-buffer-other-frame)) |
(find-function-do-it variable t 'switch-to-buffer-other-frame)) |
404 |
|
|
405 |
;;;###autoload |
;;;###autoload |
406 |
|
(defun find-definition-noselect (symbol type &optional file) |
407 |
|
"Return a pair `(BUFFER . POINT)' pointing to the definition of SYMBOL. |
408 |
|
TYPE says what type of definition: nil for a function, |
409 |
|
`defvar' or `defface' for a variable or face. This functoin |
410 |
|
does not switch to the buffer or display it. |
411 |
|
|
412 |
|
The library where SYMBOL is defined is searched for in FILE or |
413 |
|
`find-function-source-path', if non nil, otherwise in `load-path'." |
414 |
|
(if (not symbol) |
415 |
|
(error "You didn't specify a symbol")) |
416 |
|
(if (null type) |
417 |
|
(find-function-noselect symbol) |
418 |
|
(let ((library (or file (symbol-file symbol type)))) |
419 |
|
(find-function-search-for-symbol symbol type library)))) |
420 |
|
|
421 |
|
;;;###autoload |
422 |
|
(defun find-face (face) |
423 |
|
"Find the definition of FACE. FACE defaults to the name near point. |
424 |
|
|
425 |
|
Finds the Emacs Lisp library containing the definition of the face |
426 |
|
near point (selected by `variable-at-point') in a buffer and |
427 |
|
places point before the definition. |
428 |
|
|
429 |
|
Set mark before moving, if the buffer already existed. |
430 |
|
|
431 |
|
The library where FACE is defined is searched for in |
432 |
|
`find-function-source-path', if non nil, otherwise in `load-path'. |
433 |
|
See also `find-function-recenter-line' and `find-function-after-hook'." |
434 |
|
(interactive (find-function-read 'defface)) |
435 |
|
(find-function-do-it face 'defface 'switch-to-buffer)) |
436 |
|
|
437 |
|
;;;###autoload |
438 |
(defun find-function-on-key (key) |
(defun find-function-on-key (key) |
439 |
"Find the function that KEY invokes. KEY is a string. |
"Find the function that KEY invokes. KEY is a string. |
440 |
Point is saved if FUNCTION is in the current buffer." |
Set mark before moving, if the buffer already existed." |
441 |
(interactive "kFind function on key: ") |
(interactive "kFind function on key: ") |
442 |
(let (defn) |
(let (defn) |
443 |
(save-excursion |
(save-excursion |