X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/b038485e9a815712dd80038565ce391a7128701e..e54faddb96acd3580d48b9db7c1746f17b824dd6:/lisp/info.el diff --git a/lisp/info.el b/lisp/info.el index f3dd9a859a..424de35b58 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -139,7 +139,7 @@ These directories are searched after those in `Info-directory-list'." :type '(repeat directory) :group 'info) -(defcustom Info-scroll-prefer-subnodes t +(defcustom Info-scroll-prefer-subnodes nil "*If non-nil, \\\\[Info-scroll-up] in a menu visits subnodes. If this is non-nil, and you scroll far enough in a node that its menu appears on the screen, the next \\\\[Info-scroll-up] @@ -162,6 +162,14 @@ If value is non-nil but not t, the reference section is still shown." (other :tag "Replace only tag" tag)) :group 'info) +(defcustom Info-refill-paragraphs nil + "*If non-nil, attempt to refill paragraphs with hidden references. +This refilling may accidentally remove explicit line breaks in the info +file, so be prepared for a few surprises if you enable this feature." + :version "21.4" + :type 'boolean + :group 'info) + (defcustom Info-mode-hook ;; Try to obey obsolete Info-fontify settings. (unless (and (boundp 'Info-fontify) (null Info-fontify)) @@ -1547,9 +1555,10 @@ FOOTNOTENAME may be an abbreviation of the reference name." (skip-chars-forward " \t\n") (let ((beg (point)) str) - (while (not (looking-at ":*[,.;() \t\n]")) - (skip-chars-forward "^:") - (forward-char 1)) + (while (progn + (skip-chars-forward "^:") + (forward-char 1) + (not (looking-at ":*[,.;() \t\n]")))) (setq str (if (looking-at ":") (buffer-substring-no-properties beg (1- (point))) @@ -1578,7 +1587,11 @@ FOOTNOTENAME may be an abbreviation of the reference name." ;; also look for menu items in subsequent nodes as long as those ;; nodes' names match `Info-complete-next-re'. This feature is currently ;; only used for completion in Info-index. - (with-current-buffer Info-complete-menu-buffer + + ;; Note that `Info-complete-menu-buffer' could be current already, + ;; so we want to save point. + (save-excursion + (set-buffer Info-complete-menu-buffer) (let ((completion-ignore-case t) (case-fold-search t) (orignode Info-current-node) @@ -2743,7 +2756,7 @@ the variable `Info-file-list-for-emacs'." "Add the face `info-menu-header' to any header before a menu entry." (save-excursion (goto-char (point-min)) - (when (re-search-forward "\\* Menu:" nil t) + (when (re-search-forward "^\\* Menu:" nil t) (put-text-property (match-beginning 0) (match-end 0) 'font-lock-face 'info-menu-header) (while (re-search-forward "\n\n\\([^*\n ].*\\)\n\n?[*]" nil t) @@ -2855,7 +2868,7 @@ the variable `Info-file-list-for-emacs'." ;; on frames that can display the font above. (when (memq (framep (selected-frame)) '(x pc w32 mac)) (add-text-properties (1- (match-beginning 2)) (match-end 2) - '(invisible t)))) + '(invisible t front-sticky nil rear-nonsticky t)))) (goto-char (point-min)) (while (re-search-forward "\\(\\*Note[ \t]*\\)\n?[ \t]*\\([^:]*\\)\\(:[^.,:(]*\\(([^)]*)[^.,:]*\\)?[,:]?\n?\\)" nil t) (unless (= (char-after (1- (match-beginning 0))) ?\") ; hack @@ -2868,17 +2881,23 @@ the variable `Info-file-list-for-emacs'." (goto-char start) (skip-syntax-backward " ") (setq other-tag - (cond - ((<= (point) (point-min)) - "See ") - ((memq (char-before) '(nil ?\. ?! )) - "See ") - ((memq (char-before) '( ?\( ?\[ ?\{ ?\, ?\; ?\: )) - "see "))) + (cond ((memq (char-before) '(nil ?\. ?! ??)) + "See ") + ((memq (char-before) '(?\, ?\; ?\: ?-)) + "see ") + ((memq (char-before) '(?\( ?\[ ?\{)) + ;; Check whether the paren is preceded by + ;; an end of sentence + (skip-syntax-backward " (") + (if (memq (char-before) '(nil ?\. ?! ??)) + "See " + "see ")) + ((save-match-data (looking-at "\n\n")) + "See "))) (goto-char next)) (if hide-tag (add-text-properties (match-beginning 1) (match-end 1) - '(invisible t))) + '(invisible t front-sticky nil rear-nonsticky t))) (add-text-properties (match-beginning 2) (match-end 2) (cons 'help-echo @@ -2889,33 +2908,35 @@ the variable `Info-file-list-for-emacs'." mouse-face highlight)))) (when (eq Info-hide-note-references t) (add-text-properties (match-beginning 3) (match-end 3) - '(invisible t))) + '(invisible t front-sticky nil rear-nonsticky t))) (when other-tag (save-excursion (goto-char (match-beginning 1)) (insert other-tag))) - (when (or hide-tag (eq Info-hide-note-references t)) + (when (and Info-refill-paragraphs + (or hide-tag (eq Info-hide-note-references t))) (push (set-marker (make-marker) start) paragraph-markers))))) - (let ((fill-nobreak-invisible t) - (fill-individual-varying-indent nil) - (paragraph-start "\f\\|[ \t]*[-*]\\|[ \t]*$") - (paragraph-separate ".*\\.[ \t]*\n[ \t]\\|[ \t]*[-*]\\|[ \t\f]*$") - (adaptive-fill-mode nil)) - (goto-char (point-max)) - (while paragraph-markers - (let ((m (car paragraph-markers))) - (setq paragraph-markers (cdr paragraph-markers)) - (when (< m (point)) - (goto-char m) - (move-to-left-margin) - (when (zerop (forward-paragraph)) - (let ((end (point)) - (beg (progn (backward-paragraph) (point)))) - (fill-individual-paragraphs beg end nil nil) - (goto-char beg)))) - (set-marker m nil)))) + (when (and Info-refill-paragraphs + paragraph-markers) + (let ((fill-nobreak-invisible t) + (fill-individual-varying-indent nil) + (paragraph-start "\f\\|[ \t]*[-*]\\|[ \t]*$") + (paragraph-separate ".*\\.[ \t]*\n[ \t]\\|[ \t]*[-*]\\|[ \t\f]*$") + (adaptive-fill-mode nil)) + (goto-char (point-max)) + (while paragraph-markers + (let ((m (car paragraph-markers))) + (setq paragraph-markers (cdr paragraph-markers)) + (when (< m (point)) + (goto-char m) + (beginning-of-line) + (let ((beg (point))) + (when (zerop (forward-paragraph)) + (fill-individual-paragraphs beg (point) nil nil) + (goto-char beg)))) + (set-marker m nil))))) (goto-char (point-min)) (when (and (search-forward "\n* Menu:" nil t) @@ -2943,11 +2964,11 @@ the variable `Info-file-list-for-emacs'." '(font-lock-face info-xref mouse-face highlight)))) (when (eq Info-hide-note-references t) - (put-text-property (match-beginning 2) (match-beginning 4) + (put-text-property (match-beginning 2) (1- (match-end 4)) 'invisible t) ;; We need a stretchable space like :align-to but with ;; a minimum value. - (put-text-property (match-beginning 4) (match-end 4) 'display + (put-text-property (1- (match-end 4)) (match-end 4) 'display (if (>= 22 (- (match-end 1) (match-beginning 0))) '(space :align-to 24) @@ -2955,7 +2976,10 @@ the variable `Info-file-list-for-emacs'." (setq cont (looking-at ".")) (while (and (= (forward-line 1) 0) (looking-at "\\([ \t]+\\)[^*\n]")) - (put-text-property (match-beginning 1) (match-end 1) 'display + (put-text-property (match-beginning 1) (1- (match-end 1)) + 'invisible t) + (put-text-property (1- (match-end 1)) (match-end 1) + 'display (if cont '(space :align-to 26) '(space :align-to 24)))