summaryrefslogtreecommitdiff
path: root/lisp/help-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/help-mode.el')
-rw-r--r--lisp/help-mode.el71
1 files changed, 53 insertions, 18 deletions
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index be488ea80ca..fb29bd2be4f 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -203,12 +203,18 @@ The format is (FUNCTION ARGS...).")
(help-C-file-name (indirect-function fun) 'fun)))
;; Don't use find-function-noselect because it follows
;; aliases (which fails for built-in functions).
- (let ((location
- (find-function-search-for-symbol fun type file)))
+ (let* ((location
+ (find-function-search-for-symbol fun type file))
+ (position (cdr location)))
(pop-to-buffer (car location))
(run-hooks 'find-function-after-hook)
- (if (cdr location)
- (goto-char (cdr location))
+ (if position
+ (progn
+ ;; Widen the buffer if necessary to go to this position.
+ (when (or (< position (point-min))
+ (> position (point-max)))
+ (widen))
+ (goto-char position))
(message "Unable to find location in file")))))
'help-echo (purecopy "mouse-2, RET: find function's definition"))
@@ -219,6 +225,7 @@ The format is (FUNCTION ARGS...).")
(if (and file (file-readable-p file))
(progn
(pop-to-buffer (find-file-noselect file))
+ (widen)
(goto-char (point-min))
(if (re-search-forward
(format "^[ \t]*(\\(cl-\\)?define-compiler-macro[ \t]+%s"
@@ -234,12 +241,18 @@ The format is (FUNCTION ARGS...).")
'help-function (lambda (var &optional file)
(when (eq file 'C-source)
(setq file (help-C-file-name var 'var)))
- (let ((location (find-variable-noselect var file)))
+ (let* ((location (find-variable-noselect var file))
+ (position (cdr location)))
(pop-to-buffer (car location))
(run-hooks 'find-function-after-hook)
- (if (cdr location)
- (goto-char (cdr location))
- (message "Unable to find location in file"))))
+ (if position
+ (progn
+ ;; Widen the buffer if necessary to go to this position.
+ (when (or (< position (point-min))
+ (> position (point-max)))
+ (widen))
+ (goto-char position))
+ (message "Unable to find location in file"))))
'help-echo (purecopy "mouse-2, RET: find variable's definition"))
(define-button-type 'help-face-def
@@ -248,12 +261,18 @@ The format is (FUNCTION ARGS...).")
(require 'find-func)
;; Don't use find-function-noselect because it follows
;; aliases (which fails for built-in functions).
- (let ((location
- (find-function-search-for-symbol fun 'defface file)))
+ (let* ((location
+ (find-function-search-for-symbol fun 'defface file))
+ (position (cdr location)))
(pop-to-buffer (car location))
- (if (cdr location)
- (goto-char (cdr location))
- (message "Unable to find location in file"))))
+ (if position
+ (progn
+ ;; Widen the buffer if necessary to go to this position.
+ (when (or (< position (point-min))
+ (> position (point-max)))
+ (widen))
+ (goto-char position))
+ (message "Unable to find location in file"))))
'help-echo (purecopy "mouse-2, RET: find face's definition"))
(define-button-type 'help-package
@@ -268,12 +287,12 @@ The format is (FUNCTION ARGS...).")
(define-button-type 'help-theme-def
:supertype 'help-xref
- 'help-function 'find-file
+ 'help-function #'find-file
'help-echo (purecopy "mouse-2, RET: visit theme file"))
(define-button-type 'help-theme-edit
:supertype 'help-xref
- 'help-function 'customize-create-theme
+ 'help-function #'customize-create-theme
'help-echo (purecopy "mouse-2, RET: edit this theme file"))
(define-button-type 'help-dir-local-var-def
@@ -283,7 +302,13 @@ The format is (FUNCTION ARGS...).")
;; local variable was defined.
(find-file file))
'help-echo (purecopy "mouse-2, RET: open directory-local variables file"))
-
+(define-button-type 'help-news
+ :supertype 'help-xref
+ 'help-function
+ (lambda (file pos)
+ (pop-to-buffer (find-file-noselect file))
+ (goto-char pos))
+ 'help-echo (purecopy "mouse-2, RET: show corresponding NEWS announcement"))
(defvar bookmark-make-record-function)
@@ -402,7 +427,15 @@ it does not already exist."
(or (and (boundp symbol) (not (keywordp symbol)))
(get symbol 'variable-documentation)))
,#'describe-variable)
- ("face" ,#'facep ,(lambda (s _b _f) (describe-face s)))))
+ ("face" ,#'facep ,(lambda (s _b _f) (describe-face s))))
+ "List of providers of information about symbols.
+Each element has the form (NAME TESTFUN DESCFUN) where:
+ NAME is a string naming a category of object, such as \"type\" or \"face\".
+ TESTFUN is a predicate which takes a symbol and returns non-nil if the
+ symbol is such an object.
+ DESCFUN is a function which takes three arguments (a symbol, a buffer,
+ and a frame), inserts the description of that symbol in the current buffer
+ and returns that text as well.")
;;;###autoload
(defun help-make-xrefs (&optional buffer)
@@ -754,7 +787,9 @@ Implements `bookmark-make-record-function' for help-mode buffers."
(error "Cannot create bookmark - help command not known"))
`(,@(bookmark-make-record-default 'NO-FILE 'NO-CONTEXT)
(help-fn . ,(car help-xref-stack-item))
- (help-args . ,(cdr help-xref-stack-item))
+ (help-args . ,(mapcar (lambda (a)
+ (if (bufferp a) (buffer-name a) a))
+ (cdr help-xref-stack-item)))
(position . ,(point))
(handler . help-bookmark-jump)))