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 --- dabbrev-like company-mode completion backend -*- lexical-binding: t -*-
;;; 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
;; Author: Nikolaj Schumacher
(> (float-time (time-since ,start)) ,limit)
(throw 'done 'company-time-out))))))
(> (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)
(defun company-dabbrev--search-buffer (regexp pos symbols start limit
ignore-comments)
(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
(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)
(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)
company-dabbrev-char-regexp)
1)))
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."
;;;###autoload
(defun company-dabbrev (command &optional arg &rest ignored)
"dabbrev-like `company-mode' completion backend."
(prefix (company-dabbrev--prefix))
(candidates
(let* ((case-fold-search company-dabbrev-ignore-case)
(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))
company-dabbrev-time-limit
(pcase company-dabbrev-other-buffers
(`t (list major-mode))
(downcase-p (if (eq company-dabbrev-downcase 'case-replace)
case-replace
company-dabbrev-downcase)))
(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)))
(if downcase-p
(mapcar 'downcase words)
words)))