[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 7b312dd 52/66: Introduce `company-search-toggle-filtering'
From: |
Dmitry Gutov |
Subject: |
[elpa] master 7b312dd 52/66: Introduce `company-search-toggle-filtering' |
Date: |
Tue, 13 Jan 2015 02:45:03 +0000 |
branch: master
commit 7b312dd27537031fb1503b4e0e5840250f161e51
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>
Introduce `company-search-toggle-filtering'
Plus calculate-candidates/update-candidates cleanup.
It's not good to save processed candidates list to the cache.
`copy-sequence' is
the price for neater code.
---
company.el | 95 +++++++++++++++++++++++++++++++----------------------------
1 files changed, 50 insertions(+), 45 deletions(-)
diff --git a/company.el b/company.el
index 3e3047c..217f37b 100644
--- a/company.el
+++ b/company.el
@@ -1078,8 +1078,6 @@ can retrieve meta-data for them."
company-selection)))))
(setq company-selection 0
company-candidates candidates))
- ;; Save in cache:
- (push (cons company-prefix company-candidates) company-candidates-cache)
;; Calculate common.
(let ((completion-ignore-case (company-call-backend 'ignore-case)))
;; We want to support non-prefix completion, so filtering is the
@@ -1107,11 +1105,12 @@ can retrieve meta-data for them."
company-candidates-cache)))
(setq candidates (all-completions prefix prev))
(cl-return t)))))
- ;; no cache match, call back-end
- (setq candidates
- (company--process-candidates
- (company--fetch-candidates prefix))))
- (setq candidates (company--transform-candidates candidates))
+ (progn
+ ;; No cache match, call the backend.
+ (setq candidates (company--fetch-candidates prefix))
+ ;; Save in cache (without the predicate applied).
+ (push (cons prefix candidates) company-candidates-cache)))
+ (setq candidates (company--process-candidates candidates))
(when candidates
(if (or (cdr candidates)
(not (eq t (compare-strings (car candidates) nil nil
@@ -1140,10 +1139,7 @@ can retrieve meta-data for them."
;; or the fetcher called us back right away.
(setq res candidates)
(setq company-backend backend
- company-candidates-cache
- (list (cons prefix
- (company--process-candidates
- candidates))))
+ company-candidates-cache (list (cons prefix candidates)))
(company-idle-begin buf win tick pt)))))
;; FIXME: Relying on the fact that the callers
;; will interpret nil as "do nothing" is shaky.
@@ -1157,10 +1153,10 @@ can retrieve meta-data for them."
(company-apply-predicate candidates
company-candidates-predicate)))
(unless (company-call-backend 'sorted)
- (setq candidates (sort candidates 'string<)))
+ (setq candidates (sort (copy-sequence candidates) 'string<)))
(when (company-call-backend 'duplicates)
(company--strip-duplicates candidates))
- candidates)
+ (company--transform-candidates candidates))
(defun company--strip-duplicates (candidates)
(let ((c2 candidates))
@@ -1567,10 +1563,13 @@ from the rest of the back-ends in the group, if any,
will be left at the end."
;;; search
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar-local company-search-string nil)
+(defvar-local company-search-string "")
(defvar-local company-search-lighter " Search: \"\"")
+(defvar-local company-search-filtering nil
+ "Non-nil to filter the completion candidates by the search string")
+
(defvar-local company--search-old-selection 0)
(defun company--search (text lines)
@@ -1590,15 +1589,30 @@ from the rest of the back-ends in the group, if any,
will be left at the end."
(defun company-search-printing-char ()
(interactive)
(company--search-assert-enabled)
- (company--search-update-string (concat company-search-string
- (string last-command-event))))
+ (let ((ss (concat company-search-string (string last-command-event))))
+ (when company-search-filtering
+ (company--search-update-predicate ss))
+ (company--search-update-string ss)))
+
+(defun company--search-update-predicate (&optional ss)
+ (or ss (setq ss company-search-string))
+ (let* ((company-candidates-predicate
+ (when company-search-filtering
+ (lambda (candidate) (string-match ss candidate))))
+ (cc (company-calculate-candidates company-prefix)))
+ (unless cc (error "No match"))
+ (company-update-candidates cc)))
(defun company--search-update-string (new)
(let* ((pos (company--search new (nthcdr company-selection
company-candidates))))
(if (null pos)
(ding)
(setq company-search-string new
- company-search-lighter (concat " Search: \"" new "\""))
+ company-search-lighter (format " %s: \"%s\""
+ (if company-search-filtering
+ "Filter"
+ "Search")
+ new))
(company-set-selection (+ company-selection pos) t))))
(defun company--search-assert-input ()
@@ -1629,34 +1643,20 @@ from the rest of the back-ends in the group, if any,
will be left at the end."
(ding)
(company-set-selection (- company-selection pos 1) t))))
-(defun company--search-create-predicate ()
- (let ((ss company-search-string))
- (setq company-candidates-predicate
- (when ss (lambda (candidate) (string-match ss candidate)))))
- (company-update-candidates
- (company-apply-predicate company-candidates company-candidates-predicate))
- ;; Invalidate cache.
- (setq company-candidates-cache (cons company-prefix company-candidates)))
-
-(defun company-filter-printing-char ()
- (interactive)
- (company--search-assert-enabled)
- (company-search-printing-char)
- (company-create-match-predicate)
- (company-call-frontends 'update))
-
-(defun company-search-kill-others ()
- "Limit the completion candidates to the ones matching the search string."
+(defun company-search-toggle-filtering ()
+ "Toggle `company-search-filtering'."
(interactive)
(company--search-assert-enabled)
- (company-create-match-predicate)
- (company-search-mode 0)
- (company-call-frontends 'update))
+ (setq company-search-filtering (not company-search-filtering))
+ (let ((ss company-search-string))
+ (company--search-update-predicate ss)
+ (company--search-update-string ss)))
(defun company-search-abort ()
"Abort searching the completion candidates."
(interactive)
(company--search-assert-enabled)
+ (company--search-update-predicate "")
(company-set-selection company--search-old-selection t)
(company-search-mode 0))
@@ -1670,7 +1670,10 @@ from the rest of the back-ends in the group, if any,
will be left at the end."
(interactive)
(company--search-assert-enabled)
(when (cl-plusp (length company-search-string))
- (company--search-update-string (substring company-search-string 0 -1))))
+ (let ((ss (substring company-search-string 0 -1)))
+ (when company-search-filtering
+ (company--search-update-predicate ss))
+ (company--search-update-string ss))))
(defvar company-search-map
(let ((i 0)
@@ -1705,7 +1708,7 @@ from the rest of the back-ends in the group, if any, will
be left at the end."
(define-key keymap "\C-g" 'company-search-abort)
(define-key keymap "\C-s" 'company-search-repeat-forward)
(define-key keymap "\C-r" 'company-search-repeat-backward)
- (define-key keymap "\C-o" 'company-search-kill-others)
+ (define-key keymap "\C-o" 'company-search-toggle-filtering)
keymap)
"Keymap used for incrementally searching the completion candidates.")
@@ -1722,6 +1725,7 @@ Don't start this directly, use
`company-search-candidates' or
(setq company-search-mode nil))
(kill-local-variable 'company-search-string)
(kill-local-variable 'company-search-lighter)
+ (kill-local-variable 'company-search-filtering)
(kill-local-variable 'company--search-old-selection)
(company-enable-overriding-keymap company-active-map)))
@@ -1738,11 +1742,12 @@ Don't start this directly, use
`company-search-candidates' or
- `company-search-repeat-forward' (\\[company-search-repeat-forward])
- `company-search-repeat-backward' (\\[company-search-repeat-backward])
- `company-search-abort' (\\[company-search-abort])
+- `company-search-delete-char' (\\[company-search-delete-char])
Regular characters are appended to the search string.
-The command `company-search-kill-others' (\\[company-search-kill-others])
-uses the search string to limit the completion candidates."
+The command `company-search-toggle-filtering'
(\\[company-search-toggle-filtering])
+uses the search string to filter the completion candidates."
(interactive)
(company-search-mode 1)
(company-enable-overriding-keymap company-search-map))
@@ -1758,10 +1763,10 @@ uses the search string to limit the completion
candidates."
(defun company-filter-candidates ()
"Start filtering the completion candidates incrementally.
This works the same way as `company-search-candidates' immediately
-followed by `company-search-kill-others' after each input."
+followed by `company-search-toggle-filtering'."
(interactive)
(company-search-mode 1)
- (company-enable-overriding-keymap company-filter-map))
+ (setq company-search-filtering t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2163,7 +2168,7 @@ If SHOW-VERSION is non-nil, show the version in the echo
area."
mouse-face company-tooltip-mouse)
line))
(when selected
- (if (and company-search-string
+ (if (and (cl-plusp (length company-search-string))
(string-match (regexp-quote company-search-string) value
(length company-prefix)))
(let ((beg (+ margin (match-beginning 0)))
- [elpa] master 6ff5ed3 40/66: Clear out unused variable warnings, (continued)
- [elpa] master 6ff5ed3 40/66: Clear out unused variable warnings, Dmitry Gutov, 2015/01/12
- [elpa] master 8b587c0 43/66: Add .elpaignore, Dmitry Gutov, 2015/01/12
- [elpa] master eef07a5 44/66: Support template functions in company-clang annotations, Dmitry Gutov, 2015/01/12
- [elpa] master 80620a1 45/66: Remove ineffective change from c6e9fbad312fc62876d40032a84a94439a055d05, Dmitry Gutov, 2015/01/12
- [elpa] master 829b40f 46/66: company--continue-failed: Don't burp on `stop', Dmitry Gutov, 2015/01/12
- [elpa] master 0a172c5 47/66: company-search-map: Support keypad numbers, Dmitry Gutov, 2015/01/12
- [elpa] master ff9bafc 41/66: Don't idle-begin when company-candidates is non-nil, Dmitry Gutov, 2015/01/12
- [elpa] master 9335f7b 48/66: company-search-delete-char: New command, Dmitry Gutov, 2015/01/12
- [elpa] master 048a9c4 50/66: company-search-old-map: Remove, unused, Dmitry Gutov, 2015/01/12
- [elpa] master a850cdb 51/66: Privatize some search functions (and a var), Dmitry Gutov, 2015/01/12
- [elpa] master 7b312dd 52/66: Introduce `company-search-toggle-filtering',
Dmitry Gutov <=
- [elpa] master 0d2757c 56/66: company-search-map: Add M-n and M-p bindings, Dmitry Gutov, 2015/01/12
- [elpa] master f5942e9 55/66: company-fill-propertize: Don't highlight match beg till common part, Dmitry Gutov, 2015/01/12
- [elpa] master aa7c1ca 57/66: Simplify NEWS entry, Dmitry Gutov, 2015/01/12
- [elpa] master eb1f0db 58/66: Fixup a test, Dmitry Gutov, 2015/01/12
- [elpa] master 9c99c7c 60/66: company-search-abort: Move predicate reset to the mode function, Dmitry Gutov, 2015/01/12
- [elpa] master 31d352f 53/66: Update NEWS.md, Dmitry Gutov, 2015/01/12
- [elpa] master 559b4f2 49/66: Don't repeat search with empty string, Dmitry Gutov, 2015/01/12
- [elpa] master 388545b 54/66: Add company-complete-common-or-cycle, Dmitry Gutov, 2015/01/12
- [elpa] master 160ab01 63/66: Split company--process-candidates into -pre and -post, Dmitry Gutov, 2015/01/12
- [elpa] master 8f09f52 61/66: Replace `cl-plusp' usages with `string=', Dmitry Gutov, 2015/01/12