From e898442be343588c2be9638b1684856dbc898ab9 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Sat, 18 Jan 2020 00:14:24 +0300 Subject: [PATCH] Honor tags-case-fold-search during xref identifer completion * etc/NEWS: New entry. * lisp/progmodes/etags.el (tags-case-fold-search): Mark as safe-local. (find-tag--completion-ignore-case): Extract from tags-completion-at-point-function, find-tag-tag and etags--xref-find-definitions. (xref-backend-identifier-completion-ignore-case): New method. Use it here as well. * lisp/progmodes/xref.el (xref-backend-identifier-completion-ignore-case): New generic. (xref--read-identifier): Use it here. --- etc/NEWS | 4 ++++ lisp/progmodes/etags.el | 23 +++++++++++++---------- lisp/progmodes/xref.el | 8 +++++++- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 69ffcdb66e5..1494fab47a8 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1458,6 +1458,10 @@ A new command 'xref-revert-buffer' is bound to 'g'. --- *** Imenu support has been added to 'xref--xref-buffer-mode'. +*** New generic method 'xref-backend-identifier-completion-ignore-case'. +Using it, the etags backend now honors 'tags-case-fold-search' during +identifier completion. + ** Checkdoc --- diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el index fe64895725f..897f105019e 100644 --- a/lisp/progmodes/etags.el +++ b/lisp/progmodes/etags.el @@ -60,7 +60,8 @@ Any other value means use the setting of `case-fold-search'." :type '(choice (const :tag "Case-sensitive" nil) (const :tag "Case-insensitive" t) (other :tag "Use default" default)) - :version "21.1") + :version "21.1" + :safe 'symbolp) ;;;###autoload ;; Use `visit-tags-table-buffer' to cycle through tags tables in this list. @@ -819,9 +820,7 @@ tags table for BUF and its (recursively) included tags tables." "Using tags, return a completion table for the text around point. If no tags table is loaded, do nothing and return nil." (when (or tags-table-list tags-file-name) - (let ((completion-ignore-case (if (memq tags-case-fold-search '(t nil)) - tags-case-fold-search - case-fold-search)) + (let ((completion-ignore-case (find-tag--completion-ignore-case)) (pattern (find-tag--default)) beg) (when pattern @@ -836,9 +835,7 @@ If no tags table is loaded, do nothing and return nil." (defun find-tag-tag (string) "Read a tag name, with defaulting and completion." - (let* ((completion-ignore-case (if (memq tags-case-fold-search '(t nil)) - tags-case-fold-search - case-fold-search)) + (let* ((completion-ignore-case (find-tag--completion-ignore-case)) (default (find-tag--default)) (spec (completing-read (if default (format "%s (default %s): " @@ -851,6 +848,11 @@ If no tags table is loaded, do nothing and return nil." (or default (user-error "There is no default tag")) spec))) +(defun find-tag--completion-ignore-case () + (if (memq tags-case-fold-search '(t nil)) + tags-case-fold-search + case-fold-search)) + (defun find-tag--default () (funcall (or find-tag-default-function (get major-mode 'find-tag-default-function) @@ -2072,6 +2074,9 @@ file name, add `tag-partial-file-name-match-p' to the list value.") (cl-defmethod xref-backend-identifier-completion-table ((_backend (eql etags))) (tags-lazy-completion-table)) +(cl-defmethod xref-backend-identifier-completion-ignore-case ((_backend (eql etags))) + (find-tag--completion-ignore-case)) + (cl-defmethod xref-backend-definitions ((_backend (eql etags)) symbol) (etags--xref-find-definitions symbol)) @@ -2086,9 +2091,7 @@ file name, add `tag-partial-file-name-match-p' to the list value.") (first-time t) (search-fun (if regexp? #'re-search-forward #'search-forward)) (marks (make-hash-table :test 'equal)) - (case-fold-search (if (memq tags-case-fold-search '(nil t)) - tags-case-fold-search - case-fold-search)) + (case-fold-search (find-tag--completion-ignore-case)) (cbuf (current-buffer))) (save-excursion (while (visit-tags-table-buffer (not first-time) cbuf) diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index 4fbcd08506b..1a344563405 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -287,6 +287,10 @@ recognize and then delegate the work to an external process." (cl-defgeneric xref-backend-identifier-completion-table (backend) "Return the completion table for identifiers.") +(cl-defgeneric xref-backend-identifier-completion-ignore-case (_backend) + "Return t if case is not significant in identifier completion." + completion-ignore-case) + ;;; misc utilities (defun xref--alistify (list key test) @@ -967,7 +971,9 @@ Accepts the same arguments as `xref-show-xrefs-function'." (defun xref--read-identifier (prompt) "Return the identifier at point or read it from the minibuffer." (let* ((backend (xref-find-backend)) - (def (xref-backend-identifier-at-point backend))) + (def (xref-backend-identifier-at-point backend)) + (completion-ignore-case + (xref-backend-identifier-completion-ignore-case backend))) (cond ((or current-prefix-arg (not def) (xref--prompt-p this-command)) -- 2.39.2