;;; help-fns.el --- Complex help functions
;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001,
-;; 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;; 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: help, internal
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
libname)
file))))
+(defun find-source-lisp-file (file-name)
+ (let* ((elc-file (locate-file (concat file-name
+ (if (string-match "\\.el" file-name)
+ "c"
+ ".elc"))
+ load-path))
+ (str (if (and elc-file (file-readable-p elc-file))
+ (with-temp-buffer
+ (insert-file-contents-literally elc-file nil 0 256)
+ (buffer-string))))
+ (src-file (and str
+ (string-match ";;; from file \\(.*\\.el\\)" str)
+ (match-string 1 str))))
+ (if (and src-file (file-readable-p src-file))
+ src-file
+ file-name)))
+
;;;###autoload
(defun describe-function-1 (function)
(let* ((def (if (symbolp function)
;; but that's completely wrong when the user used load-file.
(princ (if (eq file-name 'C-source) "C source code" file-name))
(princ "'")
+ ;; See if lisp files are present where they where installed from.
+ (if (not (eq file-name 'C-source))
+ (setq file-name (find-source-lisp-file file-name)))
+
;; Make a hyperlink to the library.
(with-current-buffer standard-output
(save-excursion
;;;###autoload
(defun variable-at-point (&optional any-symbol)
- "Return the bound variable symbol found around point.
+ "Return the bound variable symbol found at or before point.
Return 0 if there is no such symbol.
If ANY-SYMBOL is non-nil, don't insist the symbol be bound."
(or (condition-case ()
;; of a symbol.
(set-syntax-table emacs-lisp-mode-syntax-table)
(goto-char val-start-pos)
- (delete-region (point) (progn (end-of-line) (point)))
+ ;; The line below previously read as
+ ;; (delete-region (point) (progn (end-of-line) (point)))
+ ;; which suppressed display of the buffer local value for
+ ;; large values.
+ (when (looking-at "value is") (replace-match ""))
(save-excursion
(insert "\n\nValue:")
(set (make-local-variable 'help-button-cache)
'action help-button-cache
'follow-link t
'help-echo "mouse-2, RET: show value")
- (insert ".\n\n")))
+ (insert ".\n")))
;; Mention if it's an alias
(let* ((alias (condition-case nil
(documentation-property alias 'variable-documentation))))
(unless (eq alias variable)
(princ (format "\nThis variable is an alias for `%s'.\n" alias)))
+ (if (or obsolete safe-var)
+ (terpri))
+
(when obsolete
- (princ "\nThis variable is obsolete")
+ (princ "This variable is obsolete")
(if (cdr obsolete) (princ (format " since %s" (cdr obsolete))))
(princ ";") (terpri)
(princ (if (stringp (car obsolete)) (car obsolete)
(princ "if its value\nsatisfies the predicate ")
(princ (if (byte-code-function-p safe-var)
"which is byte-compiled expression.\n"
- (format "`%s'.\n" safe-var)))
- (terpri))
- (princ "Documentation:\n")
- (princ (or doc "Not documented as a variable.")))
+ (format "`%s'.\n" safe-var))))
+ (princ "\nDocumentation:\n")
+ (with-current-buffer standard-output
+ (insert (or doc "Not documented as a variable."))))
;; Make a link to customize if this variable can be customized.
(if (custom-variable-p variable)
(let ((customize-label "customize"))