From 9b057d613a30b83adcb26600118075dc81777510 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Tue, 2 Jul 2013 20:09:38 -0700 Subject: [PATCH] Make info-xref checks case-sensitive by default * lisp/info.el (Info-find-node, Info-find-in-tag-table) (Info-find-node-in-buffer, Info-find-node-2, Info-goto-node): Add option for exact case matching of nodes. * lisp/info-xref.el (info-xref): New custom group. (info-xref-case-fold): New option. (info-xref-goto-node-p): Pass info-xref-case-fold to Info-goto-node. --- lisp/ChangeLog | 10 ++++++++++ lisp/info-xref.el | 23 +++++++++++++++++++++-- lisp/info.el | 43 +++++++++++++++++++++++++++---------------- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f717fdcc4e..8327fb03b4 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2013-07-03 Glenn Morris + + Make info-xref checks case-sensitive by default + * info.el (Info-find-node, Info-find-in-tag-table) + (Info-find-node-in-buffer, Info-find-node-2, Info-goto-node): + Add option for exact case matching of nodes. + * info-xref.el (info-xref): New custom group. + (info-xref-case-fold): New option. + (info-xref-goto-node-p): Pass info-xref-case-fold to Info-goto-node. + 2013-07-03 Leo Liu * ido.el (ido-delete-file-at-head): Respect delete-by-moving-to-trash. diff --git a/lisp/info-xref.el b/lisp/info-xref.el index c38e23bab8..21fb592ff1 100644 --- a/lisp/info-xref.el +++ b/lisp/info-xref.el @@ -45,7 +45,25 @@ ;;; Code: (require 'info) -(eval-when-compile (require 'cl-lib)) ;; for `incf' +(eval-when-compile (require 'cl-lib)) ; for `cl-incf' + +(defgroup info-xref nil + "Check external cross-references in Info documents." + :group 'docs) ; FIXME right parent? + +;; Should this even be an option? +(defcustom info-xref-case-fold nil + "Non-nil means node checks should ignore case. +When following cross-references, the Emacs Info reader first tries a +case-sensitive match, then if that fails a case-insensitive one. +The standalone Info reader does not do this, nor does this work +for links in the html versions of Texinfo manuals. Therefore +to ensure your cross-references work on the widest range of platforms, +you should set this variable to nil." + :group 'info-xref + :type 'boolean + :version "24.4") + ;;----------------------------------------------------------------------------- ;; vaguely generic @@ -204,7 +222,8 @@ buffer's line and column of point." (Info-goto-node node (when (get-buffer "*info*") (set-buffer "*info*") - "xref - temporary")) + "xref - temporary") + (not info-xref-case-fold)) t) (error nil)) (unless (equal (current-buffer) oldbuf) diff --git a/lisp/info.el b/lisp/info.el index f9851a0c1e..0e0a11753b 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -920,10 +920,14 @@ just return nil (no error)." (error "Info file %s does not exist" filename))) filename)))) -(defun Info-find-node (filename nodename &optional no-going-back) +(defun Info-find-node (filename nodename &optional no-going-back strict-case) "Go to an Info node specified as separate FILENAME and NODENAME. NO-GOING-BACK is non-nil if recovering from an error in this function; -it says do not attempt further (recursive) error recovery." +it says do not attempt further (recursive) error recovery. + +This function first looks for a case-sensitive match for NODENAME; +if none is found it then tries a case-insensitive match (unless +STRICT-CASE is non-nil)." (info-initialize) (setq filename (Info-find-file filename)) ;; Go into Info buffer. @@ -933,7 +937,7 @@ it says do not attempt further (recursive) error recovery." Info-current-file (push (list Info-current-file Info-current-node (point)) Info-history)) - (Info-find-node-2 filename nodename no-going-back)) + (Info-find-node-2 filename nodename no-going-back strict-case)) ;;;###autoload (defun Info-on-current-buffer (&optional nodename) @@ -1010,7 +1014,7 @@ which the match was found." (+ (point-min) (read (current-buffer))) major-mode))))) -(defun Info-find-in-tag-table (marker regexp) +(defun Info-find-in-tag-table (marker regexp &optional strict-case) "Find a node in a tag table. MARKER specifies the buffer and position to start searching at. REGEXP is a regular expression matching nodes or references. Its first @@ -1020,10 +1024,11 @@ FOUND-ANCHOR is non-nil if a `Ref:' was matched, POS is the position where the match was found, and MODE is `major-mode' of the buffer in which the match was found. This function tries to find a case-sensitive match first, then a -case-insensitive match is tried." +case-insensitive match is tried (unless optional argument STRICT-CASE +is non-nil)." (let ((result (Info-find-in-tag-table-1 marker regexp nil))) - (when (null (car result)) - (setq result (Info-find-in-tag-table-1 marker regexp t))) + (or strict-case (car result) + (setq result (Info-find-in-tag-table-1 marker regexp t))) result)) (defun Info-find-node-in-buffer-1 (regexp case-fold) @@ -1046,17 +1051,19 @@ Value is the position at which a match was found, or nil if not found." (setq found (line-beginning-position))))))) found)) -(defun Info-find-node-in-buffer (regexp) +(defun Info-find-node-in-buffer (regexp &optional strict-case) "Find a node or anchor in the current buffer. REGEXP is a regular expression matching nodes or references. Its first group should match `Node:' or `Ref:'. Value is the position at which a match was found, or nil if not found. This function looks for a case-sensitive match first. If none is found, -a case-insensitive match is tried." +a case-insensitive match is tried (unless optional argument STRICT-CASE +is non-nil)." (or (Info-find-node-in-buffer-1 regexp nil) - (Info-find-node-in-buffer-1 regexp t))) + (and (not strict-case) + (Info-find-node-in-buffer-1 regexp t)))) -(defun Info-find-node-2 (filename nodename &optional no-going-back) +(defun Info-find-node-2 (filename nodename &optional no-going-back strict-case) (buffer-disable-undo (current-buffer)) (or (eq major-mode 'Info-mode) (Info-mode)) @@ -1167,7 +1174,7 @@ a case-insensitive match is tried." ;; First, search a tag table, if any (when (marker-position Info-tag-table-marker) (let* ((m Info-tag-table-marker) - (found (Info-find-in-tag-table m regexp))) + (found (Info-find-in-tag-table m regexp strict-case))) (when found ;; FOUND is (ANCHOR POS MODE). @@ -1194,7 +1201,7 @@ a case-insensitive match is tried." ;; buffer) to find the actual node. First, check ;; whether the node is right where we are, in case the ;; buffer begins with a node. - (let ((pos (Info-find-node-in-buffer regexp))) + (let ((pos (Info-find-node-in-buffer regexp strict-case))) (when pos (goto-char pos) (throw 'foo t))) @@ -1701,7 +1708,7 @@ escaped (\\\",\\\\)." ;; Don't autoload this function: the correct entry point for other packages ;; to use is `info'. --Stef ;; ;;;###autoload -(defun Info-goto-node (nodename &optional fork) +(defun Info-goto-node (nodename &optional fork strict-case) "Go to Info node named NODENAME. Give just NODENAME or (FILENAME)NODENAME. If NODENAME is of the form (FILENAME)NODENAME, the node is in the Info file FILENAME; otherwise, NODENAME should be in the current Info file (or one of @@ -1711,7 +1718,11 @@ in the Info file FILENAME after the closing parenthesis in (FILENAME). Empty NODENAME in (FILENAME) defaults to the Top node. If FORK is non-nil (interactively with a prefix arg), show the node in a new Info buffer. -If FORK is a string, it is the name to use for the new buffer." +If FORK is a string, it is the name to use for the new buffer. + +This function first looks for a case-sensitive match for the node part +of NODENAME; if none is found it then tries a case-insensitive match +\(unless STRICT-CASE is non-nil)." (interactive (list (Info-read-node-name "Go to node: ") current-prefix-arg)) (info-initialize) (if fork @@ -1730,7 +1741,7 @@ If FORK is a string, it is the name to use for the new buffer." (if trim (setq nodename (substring nodename 0 trim)))) (if transient-mark-mode (deactivate-mark)) (Info-find-node (if (equal filename "") nil filename) - (if (equal nodename "") "Top" nodename)))) + (if (equal nodename "") "Top" nodename) nil strict-case))) (defvar Info-read-node-completion-table) -- 2.39.2