/[emacs]/emacs/lisp/emacs-lisp/find-func.el
ViewVC logotype

Diff of /emacs/lisp/emacs-lisp/find-func.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.51 by monnier, Mon Jan 3 22:05:12 2005 UTC revision 1.52 by rms, Wed Jan 5 01:08:24 2005 UTC
# Line 78  Please send improvements and fixes to th Line 78  Please send improvements and fixes to th
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."
# Line 86  Please send improvements and fixes to th Line 87  Please send improvements and fixes to th
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    
# Line 136  See the functions `find-function' and `f Line 157  See the functions `find-function' and `f
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)))
# Line 146  VARIABLE-P should be non-nil for a varia Line 167  VARIABLE-P should be non-nil for a varia
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                           "\"")                           "\"")
# Line 175  VARIABLE-P should be non-nil for a varia Line 196  VARIABLE-P should be non-nil for a varia
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
# Line 186  If VARIABLE-P is nil, `find-function-reg Line 209  If VARIABLE-P is nil, `find-function-reg
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
# Line 245  in `load-path'." Line 267  in `load-path'."
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
# Line 310  Point is saved in the buffer if it is on Line 330  Point is saved in the buffer if it is on
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'.
# Line 340  See `find-function' for more details." Line 360  See `find-function' for more details."
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)
# Line 356  The library where VARIABLE is defined is Line 376  The library where VARIABLE is defined is
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'.
# Line 382  See `find-variable' for more details." Line 403  See `find-variable' for more details."
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

Legend:
Removed from v.1.51  
changed lines
  Added in v.1.52

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26