- candidates)
- (setq company-files-completion-cache nil)
- (unless (equal dir (car company-files-completion-cache))
- (dolist (file (company-files-directory-files dir file))
- (setq file (concat dir file))
- (push file candidates)
- (when (file-directory-p file)
- ;; Add one level of children.
- (dolist (child (company-files-directory-files file ""))
- (push (concat file child) candidates))))
- (setq company-files-completion-cache (cons dir (nreverse candidates))))
- (cdr company-files-completion-cache)))
+ (key (list file
+ (expand-file-name dir)
+ (nth 5 (file-attributes dir))))
+ (completion-ignore-case read-file-name-completion-ignore-case))
+ (unless (company-file--keys-match-p key (car company-files--completion-cache))
+ (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 (append candidates children)))))
+ (all-completions prefix
+ (cdr company-files--completion-cache))))
+
+(defun company-file--keys-match-p (new old)
+ (and (equal (cdr old) (cdr new))
+ (string-prefix-p (car old) (car new))))