emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-27 e898442: Honor tags-case-fold-search during xref identifer comp


From: Dmitry Gutov
Subject: emacs-27 e898442: Honor tags-case-fold-search during xref identifer completion
Date: Fri, 17 Jan 2020 16:24:19 -0500 (EST)

branch: emacs-27
commit e898442be343588c2be9638b1684856dbc898ab9
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    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 69ffcdb..1494fab 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 fe64895..897f105 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 4fbcd08..1a34456 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))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]