comparison lisp/prim/help.el @ 179:9ad43877534d r20-3b16

Import from CVS: tag r20-3b16
author cvs
date Mon, 13 Aug 2007 09:52:19 +0200
parents 6075d714658b
children e121b013d1f0
comparison
equal deleted inserted replaced
178:e703507b8a00 179:9ad43877534d
1290 (while cmd 1290 (while cmd
1291 (princ (car cmd) stream) 1291 (princ (car cmd) stream)
1292 (setq cmd (cdr cmd)) 1292 (setq cmd (cdr cmd))
1293 (if cmd (princ " " stream))))) 1293 (if cmd (princ " " stream)))))
1294 (terpri stream))))))) 1294 (terpri stream)))))))
1295
1296 (defvar find-function-function 'ff-function-at-point
1297 "The function used by `find-function' to select the function near
1298 point.
1299
1300 For example `ff-function-at-point' or `function-called-at-point'.")
1301
1302 (defvar find-function-source-path nil
1303 "The default list of directories where find-function searches.
1304
1305 If this variable is `nil' then find-function searches `load-path' by
1306 default.")
1307
1308 ;;; Code:
1309
1310 (defun find-function-noselect (function &optional path)
1311 "Put point at the definition of the function at point and return the buffer.
1312
1313 Finds the emacs-lisp package containing the definition of FUNCTION
1314 into a buffer and place point before the definition. The buffer is
1315 not selected.
1316
1317 If the optional argument PATH is given, the package where FUNCTION is
1318 defined is searched in PATH instead of `load-path' (see
1319 `find-function-source-path')."
1320 (and (subrp (symbol-function function))
1321 (error "%s is a primitive function" function))
1322 (if (not function)
1323 (error "You didn't specify a function"))
1324 (let ((def (symbol-function function))
1325 package aliases)
1326 (while (symbolp def)
1327 (or (eq def function)
1328 (if aliases
1329 (setq aliases (concat aliases
1330 (format ", which is an alias for %s"
1331 (symbol-name def))))
1332 (setq aliases (format "an alias for %s" (symbol-name
1333 def)))))
1334 (setq function (symbol-function function)
1335 def (symbol-function function)))
1336 (if aliases
1337 (message aliases))
1338 (setq package
1339 (cond ((eq (car-safe def) 'autoload)
1340 (nth 1 def))
1341 ((describe-function-find-file function))
1342 ((and (compiled-function-p def)
1343 (fboundp 'compiled-function-annotation))
1344 (substring (compiled-function-annotation def) 0 -4))))
1345 (if (null package)
1346 (error "Can't find package"))
1347 (if (string-match "\\(\\.elc?\\'\\)" package)
1348 (setq package (substring package 0 (match-beginning 1))))
1349 (setq package (concat package ".el"))
1350 (let ((filename (locate-library package t
1351 (if path
1352 path
1353 find-function-source-path)))
1354 (calling-buffer (current-buffer)))
1355 (if (not filename)
1356 (error "The package \"%s\" is not in the path." package))
1357 (set-buffer (find-file-noselect filename))
1358 (save-match-data
1359 (let ((p (point))
1360 ;; avoid defconst, defgroup, defvar (any others?)
1361 (re (format "^(def[^cgv\W]\\w+\\s-+%s\\s-" function))
1362 (syntable (syntax-table)))
1363 (set-syntax-table emacs-lisp-mode-syntax-table)
1364 (goto-char (point-min))
1365 (if (prog1
1366 (re-search-forward re nil t)
1367 (set-syntax-table syntable))
1368 (prog2
1369 (beginning-of-line)
1370 (current-buffer)
1371 (set-buffer calling-buffer))
1372 (goto-char p)
1373 (set-buffer calling-buffer)
1374 (error "Cannot find definition of %s" function)))))))
1375
1376 (defun ff-function-at-point ()
1377 (condition-case ()
1378 (let ((stab (syntax-table)))
1379 (unwind-protect
1380 (save-excursion
1381 (set-syntax-table emacs-lisp-mode-syntax-table)
1382 (or (not (zerop (skip-syntax-backward "_w")))
1383 (eq (char-syntax (char-after (point))) ?w)
1384 (eq (char-syntax (char-after (point))) ?_)
1385 (forward-sexp -1))
1386 (skip-chars-forward "'")
1387 (let ((obj (read (current-buffer))))
1388 (and (symbolp obj) (fboundp obj) obj)))
1389 (set-syntax-table stab)))
1390 (error nil)))
1391
1392 (defun ff-read-function ()
1393 "Read and return a function, defaulting to the one near point.
1394
1395 The function named by `find-function-function' is used to select the
1396 default function."
1397 (let ((fn (funcall find-function-function))
1398 (enable-recursive-minibuffers t)
1399 val)
1400 (setq val (completing-read
1401 (if fn
1402 (format "Find function (default %s): " fn)
1403 "Find function: ")
1404 obarray 'fboundp t))
1405 (list (if (equal val "")
1406 fn (intern val)))))
1407
1408
1409 (defun find-function (function &optional path)
1410 "Find the definition of the function near point in the current window.
1411
1412 Finds the emacs-lisp package containing the definition of the function
1413 near point (selected by `find-function-function') and places point
1414 before the definition.
1415
1416 If the optional argument PATH is given, the package where FUNCTION is
1417 defined is searched in PATH instead of `load-path'"
1418 (interactive (ff-read-function))
1419 (switch-to-buffer
1420 (find-function-noselect function path)))
1421
1422 (defun find-function-other-window (function &optional path)
1423 "Find the definition of the function near point in the other window.
1424
1425 Finds the emacs-lisp package containing the definition of the function
1426 near point (selected by `find-function-function') and places point
1427 before the definition.
1428
1429 If the optional argument PATH is given, the package where FUNCTION is
1430 defined is searched in PATH instead of `load-path'"
1431 (interactive (ff-read-function))
1432 (switch-to-buffer-other-window
1433 (find-function-noselect function path)))
1434
1435 (defun find-function-other-frame (function &optional path)
1436 "Find the definition of the function near point in the another frame.
1437
1438 Finds the emacs-lisp package containing the definition of the function
1439 near point (selected by `find-function-function') and places point
1440 before the definition.
1441
1442 If the optional argument PATH is given, the package where FUNCTION is
1443 defined is searched in PATH instead of `load-path'"
1444 (interactive (ff-read-function))
1445 (switch-to-buffer-other-frame
1446 (find-function-noselect function path)))
1447
1448 (define-key mode-specific-map "f" 'find-function)
1449 (define-key ctl-x-4-map "F" 'find-function-other-window)
1450 (define-key ctl-x-5-map "F" 'find-function-other-frame)
1451
1452 ;;; help.el ends here