[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master ca447ec 129/173: [#464] Optimisation and fixes in `company
From: |
Dmitry Gutov |
Subject: |
[elpa] master ca447ec 129/173: [#464] Optimisation and fixes in `company-files` |
Date: |
Thu, 23 Jun 2016 00:28:44 +0000 (UTC) |
branch: master
commit ca447ec37f20b51edd21d1515d2dce170160148e
Author: Vitalie Spinu <address@hidden>
Commit: Vitalie Spinu <address@hidden>
[#464] Optimisation and fixes in `company-files`
- Don't rely on `directory-files`; it returns directories without
trailing slash
- Don't use `file-directory-p`; check for trailing / instead
- Don't append children on remotes or remote children
- Remove file-name-all-completions test from prefix check
---
company-files.el | 51 ++++++++++++++++++++++++++++++---------------------
1 file changed, 30 insertions(+), 21 deletions(-)
diff --git a/company-files.el b/company-files.el
index 53730c6..f90f3d0 100644
--- a/company-files.el
+++ b/company-files.el
@@ -30,9 +30,11 @@
(defun company-files--directory-files (dir prefix)
(ignore-errors
- (if (equal prefix "")
- (directory-files dir nil "\\`[^.]\\|\\`.[^.]")
- (file-name-all-completions prefix dir))))
+ ;; Don't use directory-files. It produces directories without trailing /.
+ (let ((comp (file-name-all-completions prefix dir)))
+ (if (equal prefix "")
+ (delete "../" (delete "./" comp))
+ comp))))
(defvar company-files--regexps
(let* ((root (if (eq system-type 'windows-nt)
@@ -54,37 +56,44 @@
(setq dir (file-name-directory file))
(not (string-match "//" dir))
(file-exists-p dir)
- (file-name-all-completions (file-name-nondirectory file) dir)
file)))
(defun company-files--connected-p (file)
(or (not (file-remote-p file))
(file-remote-p file nil t)))
+(defun company-files--trailing-slash-p (file)
+ ;; `file-directory-p' is very expensive on remotes. We are relying on
+ ;; `file-name-all-completions' returning directories with trailing / instead.
+ (let ((len (length file)))
+ (and (> len 0) (eq (aref file (1- len)) ?/))))
+
(defvar company-files--completion-cache nil)
(defun company-files--complete (prefix)
(let* ((dir (file-name-directory prefix))
- (key (list (file-name-nondirectory prefix)
+ (file (file-name-nondirectory prefix))
+ (key (list file
(expand-file-name dir)
(nth 5 (file-attributes dir))))
- (file (file-name-nondirectory prefix))
- (completion-ignore-case read-file-name-completion-ignore-case)
- candidates directories)
+ (completion-ignore-case read-file-name-completion-ignore-case))
(unless (company-file--keys-match-p key (car
company-files--completion-cache))
- (dolist (file (company-files--directory-files dir file))
- (setq file (concat dir file))
- (when (company-files--connected-p file)
- (push file candidates)
- (when (file-directory-p file)
- (push file directories))))
- (dolist (directory (reverse directories))
- ;; Add one level of children.
- (dolist (child (company-files--directory-files directory ""))
- (push (concat directory
- (unless (eq (aref directory (1- (length directory)))
?/) "/")
- child) candidates)))
- (setq company-files--completion-cache (cons key (nreverse candidates))))
+ (let* ((candidates (mapcar (lambda (f) (concat dir f))
+ (company-files--directory-files dir file)))
+ (directories (unless (file-remote-p dir)
+ (cl-remove-if-not (lambda (f)
+ (and
(company-files--trailing-slash-p f)
+ (not (file-remote-p f))
+
(company-files--connected-p f)))
+ candidates)))
+ (children (and directories
+ (cl-mapcan (lambda (d)
+ (mapcar (lambda (c) (concat d c))
+
(company-files--directory-files d "")))
+ directories))))
+ (setq company-files--completion-cache
+ (cons key (sort (append children candidates)
+ #'string-lessp)))))
(all-completions prefix
(cdr company-files--completion-cache))))
- [elpa] master 8952cfe 085/173: Handle key prefix being shorter than prefix (#422), (continued)
- [elpa] master 8952cfe 085/173: Handle key prefix being shorter than prefix (#422), Dmitry Gutov, 2016/06/22
- [elpa] master c2e5981 017/173: Remove company-ropemacs, Dmitry Gutov, 2016/06/22
- [elpa] master d97c98f 076/173: company-search-candidates: Mention company-search-regexp-function, Dmitry Gutov, 2016/06/22
- [elpa] master 2306c9c 054/173: Support whitespace-mode newline-mark, Dmitry Gutov, 2016/06/22
- [elpa] master 4a16a55 090/173: company-dabbrev--make-regexp: Regexp can match non-word characters, Dmitry Gutov, 2016/06/22
- [elpa] master 1c36f7c 091/173: company-dabbrev--search-buffer: Use use forward search (#433), Dmitry Gutov, 2016/06/22
- [elpa] master da9b108 104/173: Refine the workaround further, Dmitry Gutov, 2016/06/22
- [elpa] master 6bf2491 102/173: Rename company-clang-obc-templatify to company-template-objc-templatify, Dmitry Gutov, 2016/06/22
- [elpa] master a95d7f1 081/173: Respect yas-key-syntaxes (#422), Dmitry Gutov, 2016/06/22
- [elpa] master 5d0a9bb 118/173: company-semantic: Retain function overloads, Dmitry Gutov, 2016/06/22
- [elpa] master ca447ec 129/173: [#464] Optimisation and fixes in `company-files`,
Dmitry Gutov <=
- [elpa] master b526978 133/173: Fix typo in dependency name, Dmitry Gutov, 2016/06/22
- [elpa] master 39eb115 113/173: company--posn-col-row: Fall back to posn-col-row, Dmitry Gutov, 2016/06/22
- [elpa] master ae0a406 139/173: Add some C++11 keywords, fixes #478, Dmitry Gutov, 2016/06/22
- [elpa] master 9b89556 149/173: company-capf: Look up `face', not `font-lock-face', Dmitry Gutov, 2016/06/22
- [elpa] master d587bd0 156/173: Fix an old typo, Dmitry Gutov, 2016/06/22
- [elpa] master 2d9bf1e 160/173: company--preprocess-candidates: Check that all CANDIDATES are strings, Dmitry Gutov, 2016/06/22
- [elpa] master 395f846 159/173: Revert "Remove completions without annotations when considering duplicates", Dmitry Gutov, 2016/06/22
- [elpa] master 69228c7 168/173: Tag company-dabbrev-ignore-buffers with package-version, Dmitry Gutov, 2016/06/22
- [elpa] master be2f586 100/173: Add workaround for bug#18067, Dmitry Gutov, 2016/06/22
- [elpa] master df14727 110/173: Fix bbdb completion for multi-recipient messages, Dmitry Gutov, 2016/06/22