X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c99240cc17349c10634c77c10f2d5b7c6f7f9316..19998f14b67de66754081cacdbca5668680c41ba:/lisp/info-look.el diff --git a/lisp/info-look.el b/lisp/info-look.el index 2ac461aa66..a061611aa9 100644 --- a/lisp/info-look.el +++ b/lisp/info-look.el @@ -2,7 +2,7 @@ ;; An older version of this was known as libc.el. ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, -;; 2004, 2005, 2006 Free Software Foundation, Inc. +;; 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. ;; Author: Ralph Schleicher ;; (did not show signs of life (Nov 2001) -stef) @@ -10,10 +10,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; 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) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,9 +21,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -144,7 +142,7 @@ to `symbol', and the help mode defaults to the current major mode." (apply 'info-lookup-add-help* nil arg)) (defun info-lookup-maybe-add-help (&rest arg) - "Add a help specification iff none is defined. + "Add a help specification if none is defined. See the documentation of the function `info-lookup-add-help' for more details." (apply 'info-lookup-add-help* t arg)) @@ -250,10 +248,10 @@ system." ;;;###autoload (defun info-lookup-symbol (symbol &optional mode) "Display the definition of SYMBOL, as found in the relevant manual. -When this command is called interactively, it reads SYMBOL from the minibuffer. -In the minibuffer, use M-n to yank the default argument value -into the minibuffer so you can edit it. -The default symbol is the one found at point. +When this command is called interactively, it reads SYMBOL from the +minibuffer. In the minibuffer, use M-n to yank the default argument +value into the minibuffer so you can edit it. The default symbol is the +one found at point. With prefix arg a query for the symbol help mode is offered." (interactive @@ -328,23 +326,32 @@ If optional argument QUERY is non-nil, query for the help mode." (error "Not documented as a %s: %s" topic (or item "")))) (modes (info-lookup->all-modes topic mode)) (window (selected-window)) + (new-Info-history + ;; Avoid clobbering Info-history with nodes searched during + ;; lookup. If lookup succeeds set `Info-history' to + ;; `new-Info-history'. + (when (get-buffer "*info*") + (with-current-buffer "*info*" + (cons (list Info-current-file Info-current-node (point)) + Info-history)))) found doc-spec node prefix suffix doc-found) - (if (not (eq major-mode 'Info-mode)) - (if (not info-lookup-other-window-flag) - (info) - (progn - (save-window-excursion (info)) - ;; Determine whether or not the Info buffer is visible in - ;; another frame on the same display. If it is, simply raise - ;; that frame. Otherwise, display it in another window. - (let* ((window (get-buffer-window "*info*" t)) - (info-frame (and window (window-frame window)))) - (if (and info-frame - (display-multi-frame-p) - (memq info-frame (frames-on-display-list)) - (not (eq info-frame (selected-frame)))) - (select-frame info-frame) - (switch-to-buffer-other-window "*info*")))))) + (unless (eq major-mode 'Info-mode) + (if (not info-lookup-other-window-flag) + (info) + (save-window-excursion (info)) + (let* ((info-window (get-buffer-window "*info*" t)) + (info-frame (and info-window (window-frame info-window)))) + (if (and info-frame + (not (eq info-frame (selected-frame))) + (display-multi-frame-p) + (memq info-frame (frames-on-display-list))) + ;; *info* is visible in another frame on same display. + ;; Raise that frame and select the window. + (progn + (select-window info-window) + (raise-frame info-frame)) + ;; In any other case, switch to *info* in another window. + (switch-to-buffer-other-window "*info*"))))) (while (and (not found) modes) (setq doc-spec (info-lookup->doc-spec topic (car modes))) (while (and (not found) doc-spec) @@ -353,8 +360,12 @@ If optional argument QUERY is non-nil, query for the help mode." suffix (nth 3 (car doc-spec))) (when (condition-case error-data (progn - (Info-goto-node node) - (setq doc-found t)) + ;; Don't need Index menu fontifications here, and + ;; they slow down the lookup. + (let (Info-fontify-maximum-menu-size + Info-history-list) + (Info-goto-node node) + (setq doc-found t))) (error (message "Cannot access Info node %s" node) (sit-for 1) @@ -397,6 +408,8 @@ If optional argument QUERY is non-nil, query for the help mode." (unless (or ignore-case (string-equal item (car entry))) (message "Found in different case: %s" (car entry))) + (when found + (setq Info-history new-Info-history)) (or doc-found (error "Info documentation for lookup was not found")) ;; Don't leave the Info buffer if the help item couldn't be looked up. @@ -406,7 +419,8 @@ If optional argument QUERY is non-nil, query for the help mode." (defun info-lookup-setup-mode (topic mode) "Initialize the internal data structure." (or (info-lookup->initialized topic mode) - (let (cell data (initialized 0) completions refer-modes) + (let ((initialized 0) + cell data completions refer-modes Info-history-list) (if (not (info-lookup->mode-value topic mode)) (message "No %s help available for `%s'" topic mode) ;; Recursively setup cross references. @@ -441,6 +455,7 @@ If optional argument QUERY is non-nil, query for the help mode." (let ((doc-spec (info-lookup->doc-spec topic mode)) (regexp (concat "^\\(" (info-lookup->regexp topic mode) "\\)\\([ \t].*\\)?$")) + Info-history-list Info-fontify-maximum-menu-size node trans entry item prefix result doc-found (buffer (get-buffer-create " temp-info-look"))) (with-current-buffer buffer @@ -566,6 +581,45 @@ Return nil if there is nothing appropriate in the buffer near point." (concat prefix name)))) (error nil))) +(defun info-lookup-guess-custom-symbol () + "Get symbol at point in custom buffers." + (condition-case nil + (save-excursion + (let ((case-fold-search t) + (ignored-chars "][()`',:.\" \t\n") + (significant-chars "^][()`',:.\" \t\n") + beg end) + (cond + ((and (memq (get-char-property (point) 'face) + '(custom-variable-tag custom-variable-tag-face)) + (setq beg (previous-single-char-property-change + (point) 'face nil (line-beginning-position))) + (setq end (next-single-char-property-change + (point) 'face nil (line-end-position))) + (> end beg)) + (subst-char-in-string + ?\s ?\- (buffer-substring-no-properties beg end))) + ((or (and (looking-at (concat "[" significant-chars "]")) + (save-excursion + (skip-chars-backward significant-chars) + (setq beg (point))) + (skip-chars-forward significant-chars) + (setq end (point)) + (> end beg)) + (and (looking-at "[ \t\n]") + (looking-back (concat "[" significant-chars "]")) + (setq end (point)) + (skip-chars-backward significant-chars) + (setq beg (point)) + (> end beg)) + (and (skip-chars-forward ignored-chars) + (setq beg (point)) + (skip-chars-forward significant-chars) + (setq end (point)) + (> end beg))) + (buffer-substring-no-properties beg end))))) + (error nil))) + ;;;###autoload (defun info-complete-symbol (&optional mode) "Perform completion on symbol preceding point." @@ -702,12 +756,15 @@ Return nil if there is nothing appropriate in the buffer near point." ;; M4 Macro Index entries are without "AS_" prefixes, and ;; mostly without "m4_" prefixes. "dnl" is an exception, not ;; wanting any prefix. So AS_ is added back to upper-case - ;; names, m4_ to others which don't already an m4_. + ;; names (if needed), m4_ to others which don't already an m4_. ("(autoconf)M4 Macro Index" (lambda (item) (let ((case-fold-search nil)) (cond ((or (string-equal item "dnl") - (string-match "^m4_" item)) + (string-match "^m4_" item) + ;; Autoconf 2.62 index includes some macros + ;; (e.g., AS_HELP_STRING), so avoid prefixing. + (string-match "^AS_" item)) item) ((string-match "^[A-Z0-9_]+$" item) (concat "AS_" item)) @@ -789,7 +846,7 @@ Return nil if there is nothing appropriate in the buffer near point." (info-lookup-maybe-add-help :mode 'emacs-lisp-mode - :regexp "[^][()'\" \t\n]+" + :regexp "[^][()`',\" \t\n]+" :doc-spec '(;; Commands with key sequences appear in nodes as `foo' and ;; those without as `M-x foo'. ("(emacs)Command Index" nil "`\\(M-x[ \t\n]+\\)?" "'") @@ -806,13 +863,13 @@ Return nil if there is nothing appropriate in the buffer near point." (info-lookup-maybe-add-help :mode 'lisp-interaction-mode - :regexp "[^][()'\" \t\n]+" + :regexp "[^][()`',\" \t\n]+" :parse-rule 'ignore :other-modes '(emacs-lisp-mode)) (info-lookup-maybe-add-help :mode 'lisp-mode - :regexp "[^()'\" \t\n]+" + :regexp "[^()`',\" \t\n]+" :parse-rule 'ignore :other-modes '(emacs-lisp-mode)) @@ -826,10 +883,11 @@ Return nil if there is nothing appropriate in the buffer near point." (info-lookup-maybe-add-help :mode 'octave-mode - :regexp "[_a-zA-Z0-9]+" + :regexp "[_a-zA-Z0-9]+\\|\\s.+\\|[-!=^|*/.\\,><~&+]\\{1,3\\}\\|[][();,\"']" :doc-spec '(("(octave)Function Index" nil "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil) ("(octave)Variable Index" nil "^ -+ [^:]+:[ ]+" nil) + ("(octave)Operator Index" nil nil nil) ;; Catch lines of the form "xyz statement" ("(octave)Concept Index" (lambda (item) @@ -913,8 +971,20 @@ Return nil if there is nothing appropriate in the buffer near point." ;; This gets functions in evaluated classes. Other ;; possible patterns don't seem to work too well. "`" "("))) + +(info-lookup-maybe-add-help + :mode 'Custom-mode + :ignore-case t + :regexp "[^][()`',:\" \t\n]+" + :parse-rule 'info-lookup-guess-custom-symbol + :other-modes '(emacs-lisp-mode)) + +(info-lookup-maybe-add-help + :mode 'help-mode + :regexp "[^][()`',:\" \t\n]+" + :other-modes '(emacs-lisp-mode)) (provide 'info-look) -;;; arch-tag: 0f1e3ea3-32a2-4461-bbab-3cff93539a74 +;; arch-tag: 0f1e3ea3-32a2-4461-bbab-3cff93539a74 ;;; info-look.el ends here