summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Gutov <dgutov@yandex.ru>2020-01-18 00:14:24 +0300
committerDmitry Gutov <dgutov@yandex.ru>2020-01-18 00:23:46 +0300
commite898442be343588c2be9638b1684856dbc898ab9 (patch)
tree46e56a5a9190e8f69608fa36a0f9e4b66f6d3c7d
parent4df0c1c6c4627e83ba3b2a76ce618af6ef180a57 (diff)
downloademacs-e898442be343588c2be9638b1684856dbc898ab9.tar.gz
emacs-e898442be343588c2be9638b1684856dbc898ab9.tar.bz2
emacs-e898442be343588c2be9638b1684856dbc898ab9.zip
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.
-rw-r--r--etc/NEWS4
-rw-r--r--lisp/progmodes/etags.el23
-rw-r--r--lisp/progmodes/xref.el8
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))