emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] master bdf6b22 138/173: Fix #474 by filtering dabbrev completions


From: Dmitry Gutov
Subject: [elpa] master bdf6b22 138/173: Fix #474 by filtering dabbrev completions at the end
Date: Thu, 23 Jun 2016 00:28:45 +0000 (UTC)

branch: master
commit bdf6b221c7b404d21e22851f75a6f294e415c641
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Fix #474 by filtering dabbrev completions at the end
    
    It seems impossible to combine supporting company-dabbrev-char-regexp, with
    arbitrary values, with using the "word boundary anchor" (or any of the three
    relevant anchors). And without anchors, using the regexp engine without
    lookaheads or etc, we must filter completions at the end.
    
    Which is okay, because it can allow us to cache the full list globally and
    refresh it less often, as well as implement fuzzy filtering more easily 
(#418).
---
 company-dabbrev.el |   18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/company-dabbrev.el b/company-dabbrev.el
index 37dcecc..05c9820 100644
--- a/company-dabbrev.el
+++ b/company-dabbrev.el
@@ -1,6 +1,6 @@
 ;;; company-dabbrev.el --- dabbrev-like company-mode completion backend  -*- 
lexical-binding: t -*-
 
-;; Copyright (C) 2009, 2011, 2014, 2015  Free Software Foundation, Inc.
+;; Copyright (C) 2009, 2011, 2014, 2015, 2016  Free Software Foundation, Inc.
 
 ;; Author: Nikolaj Schumacher
 
@@ -91,11 +91,8 @@ This variable affects both `company-dabbrev' and 
`company-dabbrev-code'."
               (> (float-time (time-since ,start)) ,limit)
               (throw 'done 'company-time-out))))))
 
-(defun company-dabbrev--make-regexp (prefix)
-  (concat (if (equal prefix "")
-              (concat "\\(?:" company-dabbrev-char-regexp "\\)")
-            (regexp-quote prefix))
-          "\\(?:" company-dabbrev-char-regexp "\\)*"))
+(defun company-dabbrev--make-regexp ()
+  (concat "\\(?:" company-dabbrev-char-regexp "\\)+"))
 
 (defun company-dabbrev--search-buffer (regexp pos symbols start limit
                                        ignore-comments)
@@ -118,7 +115,7 @@ This variable affects both `company-dabbrev' and 
`company-dabbrev-code'."
           (save-excursion
             ;; Before, we used backward search, but it matches non-greedily, 
and
             ;; that forced us to use the "beginning/end of word" anchors in
-            ;; `company-dabbrev--make-regexp'.
+            ;; `company-dabbrev--make-regexp'.  It's also about 2x slower.
             (while (re-search-forward regexp tmp-end t)
               (if (and ignore-comments (save-match-data 
(company-in-string-or-comment)))
                   (re-search-forward "\\s>\\|\\s!\\|\\s\"" tmp-end t)
@@ -161,6 +158,10 @@ This variable affects both `company-dabbrev' and 
`company-dabbrev-code'."
                                company-dabbrev-char-regexp)
                        1)))
 
+(defun company-dabbrev--filter (prefix candidates)
+  (let ((completion-ignore-case company-dabbrev-ignore-case))
+    (all-completions prefix candidates)))
+
 ;;;###autoload
 (defun company-dabbrev (command &optional arg &rest ignored)
   "dabbrev-like `company-mode' completion backend."
@@ -170,7 +171,7 @@ This variable affects both `company-dabbrev' and 
`company-dabbrev-code'."
     (prefix (company-dabbrev--prefix))
     (candidates
      (let* ((case-fold-search company-dabbrev-ignore-case)
-            (words (company-dabbrev--search (company-dabbrev--make-regexp arg)
+            (words (company-dabbrev--search (company-dabbrev--make-regexp)
                                             company-dabbrev-time-limit
                                             (pcase 
company-dabbrev-other-buffers
                                               (`t (list major-mode))
@@ -178,6 +179,7 @@ This variable affects both `company-dabbrev' and 
`company-dabbrev-code'."
             (downcase-p (if (eq company-dabbrev-downcase 'case-replace)
                             case-replace
                           company-dabbrev-downcase)))
+       (setq words (company-dabbrev--filter arg words))
        (if downcase-p
            (mapcar 'downcase words)
          words)))



reply via email to

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