From: Dmitry Gutov Date: Sun, 28 Feb 2016 22:53:59 +0000 (+0200) Subject: Fix #474 by filtering dabbrev completions at the end X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/bdf6b221c7b404d21e22851f75a6f294e415c641 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). --- diff --git a/company-dabbrev.el b/company-dabbrev.el index 37dceccce..05c982091 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)))