selectrum pauses in file completions while others don't

Created on 8 Jan 2021  路  16Comments  路  Source: raxod502/selectrum

Hi,

when trying to open a file on a somewhat slow nfs file system I always end up with a quite long pause ; interestingly, this does not happen with ido or ivy. I run it via the profiler (profiler-start, find-file and C-g once the prompted appeared, then profiler-report) and this is the output. The profiler manages to get quite a few samples in the selectrum routines while hardly anything in the case of e.g. ivy

EDIT: selectrum seams to go for all-completions while ivy has completion--twq-all?

selectrum:
selectrum
ivy:
ivy
ido:
ido

All 16 comments

Interesting, thanks for the pointers! Maybe related: #210

Could you check with #335? I don't know if this fixes it I have no test case I could use.

Thank you for looking into this. The Pause is still there unfortunately.

Yes, it is not easy to test :-( I don't know how this could be reproduced in another setting.

Okay, ivy let binds deault-directory and calls the table with an empty string so I thought it might help. Could you M-x debug-on-entry completion--twq-all and post the backtrace?

This is now from ivy (I removed some file names and path, so there was a long list of files where now is only "zzzz1" etc. and I changed the pathname to "/vol/zzzzzzzz/" in the backtrace):

Debugger entered--entering a function:

  • completion--twq-all("" "" ("zzzz1" "zzzz2" "zzzzz3" ...) 0 substitute-in-file-name completion--sifn-requote)
    completion--file-name-table("" nil t)
    complete-with-action(t completion--file-name-table "" nil)
    #f(compiled-function (table) #)(completion--file-name-table)
    completion--some(#f(compiled-function (table) #) (completion--embedded-envvar-table completion--file-name-table))
    read-file-name-internal("" nil t)
    all-completions("" read-file-name-internal nil)
    ivy--sorted-files("/vol/zzzzzzzz/")
    ivy--reset-state(#s(ivy-state :prompt "Find file: " :collection read-file-name-internal :predicate nil :require-match confirm-after-completion :initial-input nil :history file-name-history :preselect nil :keymap (keymap (remap keymap (undo . counsel-find-file-undo)) (67108960 lambda (&optional arg) "nil (nil')" (interactive "p") (if (string= "" ivy-text) (execute-kbd-macro (kbd "M-o b")) (self-insert-command arg))) (96 . counsel-file-jump-from-find) (C-backspace . counsel-up-directory) (67108991 . counsel-up-directory)) :update-fn nil :sort nil :frame #<frame emacs@cloten 0x276a1d0> :window #<window 3 on zzzzzzzz> :buffer #<buffer zzzzzzzz> :text nil :action (1 ("o" counsel-find-file-action "default") ("i" ivy--action-insert "insert") ("w" ivy--action-copy "copy") ("j" find-file-other-window "other window") ("f" find-file-other-frame "other frame") ("b" counsel-find-file-cd-bookmark-action "cd bookmark") ("x" counsel-find-file-extern "open externally") ("r" counsel-find-file-as-root "open as root") ("R" find-file-read-only "read only") ("l" find-file-literally "open literally") ("k" counsel-find-file-delete "delete") ("c" counsel-find-file-copy "copy file") ("m" counsel-find-file-move "move or rename") ("d" counsel-find-file-mkdir-action "mkdir")) :unwind nil :re-builder ivy--regex-plus :matcher counsel--find-file-matcher :dynamic-collection nil :display-transformer-fn ivy-read-file-transformer :directory "/vol/zzzzzzzz/" :caller counsel-find-file :current nil :def nil :ignore t :multi-action nil :extra-props nil)) ivy-read("Find file: " read-file-name-internal :matcher counsel--find-file-matcher :initial-input nil :action counsel-find-file-action :preselect nil :require-match confirm-after-completion :history file-name-history :keymap (keymap (remap keymap (undo . counsel-find-file-undo)) (67108960 lambda (&optional arg) "nil (nil')" (interactive "p") (if (string= "" ivy-text) (execute-kbd-macro (kbd "M-o b")) (self-insert-command arg))) (96 . counsel-file-jump-from-find) (C-backspace . counsel-up-directory) (67108991 . counsel-up-directory)) :caller counsel-find-file)
    counsel--find-file-1("Find file: " nil counsel-find-file-action counsel-find-file)
    counsel-find-file()
    funcall-interactively(counsel-find-file)
    call-interactively(counsel-find-file nil nil)
    command-execute(counsel-find-file)

Thanks, ivy does not pass a predicate but otherwise it shouldn't be to different from what selectrum does. Hm...

I will try to remove the predicate, maybe this causes some unnecessary file access thought we don't access anything in the predicate itself.

I did the same for selectrum (completion--twq-all); seems to do some additional work?

Debugger entered--entering a function:

  • completion--twq-all("" "" ("zzz1" "zzz2" "zzz3" ...) 0 substitute-in-file-name completion--sifn-requote)
    completion--file-name-table("" (closure ((matchstr . "") (dir . "/vol/zzzzzzzz/") (input . "/vol/zzzzzzzz/") (last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (i) (and (not (member i '("./" "../"))) (or (not predicate) (funcall predicate i)))) t)
    complete-with-action(t completion--file-name-table "" (closure ((matchstr . "") (dir . "/vol/zzzzzzzz/") (input . "/vol/zzzzzzzz/") (last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (i) (and (not (member i '("./" "../"))) (or (not predicate) (funcall predicate i)))))
    #f(compiled-function (table) #)(completion--file-name-table)
    completion--some(#f(compiled-function (table) #) (completion--embedded-envvar-table completion--file-name-table))
    read-file-name-internal("" (closure ((matchstr . "") (dir . "/vol/zzzzzzzz/") (input . "/vol/zzzzzzzz/") (last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (i) (and (not (member i '("./" "../"))) (or (not predicate) (funcall predicate i)))) t)
    funcall(read-file-name-internal "" (closure ((matchstr . "") (dir . "/vol/zzzzzzzz/") (input . "/vol/zzzzzzzz/") (last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (i) (and (not (member i '("./" "../"))) (or (not predicate) (funcall predicate i)))) t)
    (let ((default-directory (substitute-in-file-name dir))) (funcall collection "" #'(lambda (i) (and (not (member i '...)) (or (not predicate) (funcall predicate i)))) t))
    (condition-case _ (let ((default-directory (substitute-in-file-name dir))) (funcall collection "" #'(lambda (i) (and (not (member i ...)) (or (not predicate) (funcall predicate i)))) t)) (quit))
    (cond ((equal last-dir dir) selectrum--preprocessed-candidates) (t (condition-case _ (let ((default-directory (substitute-in-file-name dir))) (funcall collection "" #'(lambda (i) (and ... ...)) t)) (quit))))
    (let* ((dir (or (file-name-directory input) "")) (matchstr (file-name-nondirectory input)) (cands (cond ((equal last-dir dir) selectrum--preprocessed-candidates) (t (condition-case _ (let (...) (funcall collection "" ... t)) (quit)))))) (setq last-dir dir) (list (cons 'input matchstr) (cons 'candidates cands)))
    (closure ((last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (input) (let* ((dir (or (file-name-directory input) "")) (matchstr (file-name-nondirectory input)) (cands (cond ((equal last-dir dir) selectrum--preprocessed-candidates) (t (condition-case _ ... ...))))) (setq last-dir dir) (list (cons 'input matchstr) (cons 'candidates cands))))("/vol/zzzzzzzz/")
    funcall((closure ((last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (input) (let* ((dir (or (file-name-directory input) "")) (matchstr (file-name-nondirectory input)) (cands (cond ((equal last-dir dir) selectrum--preprocessed-candidates) (t (condition-case _ ... ...))))) (setq last-dir dir) (list (cons 'input matchstr) (cons 'candidates cands)))) "/vol/zzzzzzzz/")
    (let* ((result (funcall selectrum--dynamic-candidates input)) (cands (copy-sequence (if (stringp (car result)) result (setq input (or (alist-get ... result) input)) (setq selectrum--visual-input input) (alist-get 'candidates result))))) (funcall selectrum-preprocess-candidates-function cands))
    (cond (dynamic (let* ((result (funcall selectrum--dynamic-candidates input)) (cands (copy-sequence (if (stringp ...) result (setq input ...) (setq selectrum--visual-input input) (alist-get ... result))))) (funcall selectrum-preprocess-candidates-function cands))) (init-table (funcall selectrum-preprocess-candidates-function (selectrum--normalize-collection minibuffer-completion-table minibuffer-completion-predicate))))
    (setq selectrum--preprocessed-candidates (cond (dynamic (let* ((result (funcall selectrum--dynamic-candidates input)) (cands (copy-sequence (if ... result ... ... ...)))) (funcall selectrum-preprocess-candidates-function cands))) (init-table (funcall selectrum-preprocess-candidates-function (selectrum--normalize-collection minibuffer-completion-table minibuffer-completion-predicate)))))
    (progn (setq selectrum--preprocessed-candidates (cond (dynamic (let* ((result (funcall selectrum--dynamic-candidates input)) (cands (copy-sequence ...))) (funcall selectrum-preprocess-candidates-function cands))) (init-table (funcall selectrum-preprocess-candidates-function (selectrum--normalize-collection minibuffer-completion-table minibuffer-completion-predicate))))) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates)))
    (if (or dynamic init-table) (progn (setq selectrum--preprocessed-candidates (cond (dynamic (let* ((result ...) (cands ...)) (funcall selectrum-preprocess-candidates-function cands))) (init-table (funcall selectrum-preprocess-candidates-function (selectrum--normalize-collection minibuffer-completion-table minibuffer-completion-predicate))))) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates))))
    (let ((dynamic (functionp selectrum--dynamic-candidates)) (init-table (and (not selectrum--preprocessed-candidates) minibuffer-completion-table))) (if (or dynamic init-table) (progn (setq selectrum--preprocessed-candidates (cond (dynamic (let* (... ...) (funcall selectrum-preprocess-candidates-function cands))) (init-table (funcall selectrum-preprocess-candidates-function (selectrum--normalize-collection minibuffer-completion-table minibuffer-completion-predicate))))) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates)))))
    (if (equal input selectrum--previous-input-string) nil (setq selectrum--previous-input-string input) (setq selectrum--visual-input nil) (let ((dynamic (functionp selectrum--dynamic-candidates)) (init-table (and (not selectrum--preprocessed-candidates) minibuffer-completion-table))) (if (or dynamic init-table) (progn (setq selectrum--preprocessed-candidates (cond (dynamic (let* ... ...)) (init-table (funcall selectrum-preprocess-candidates-function ...)))) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates))))) (setq selectrum--refined-candidates (funcall selectrum-refine-candidates-function input selectrum--preprocessed-candidates)) (if selectrum--move-default-candidate-p (progn (setq selectrum--refined-candidates (selectrum--move-to-front-destructive selectrum--default-candidate selectrum--refined-candidates)))) (setq selectrum--refined-candidates (selectrum--move-to-front-destructive (if (and minibuffer-completing-file-name (member (file-name-as-directory input) selectrum--refined-candidates)) (file-name-as-directory input) input) selectrum--refined-candidates)) (setq selectrum--refined-candidates (delete "" selectrum--refined-candidates)) (if selectrum--repeat (progn (setq selectrum--current-candidate-index (and (> (length selectrum--refined-candidates) 0) (min (or selectrum--current-candidate-index 0) (1- (length selectrum--refined-candidates))))) (setq selectrum--repeat nil)) (setq selectrum--current-candidate-index (cond (keep-selected (or (cl-position keep-selected selectrum--refined-candidates :key #'selectrum--get-full :test #'equal) 0)) ((null selectrum--refined-candidates) (if (not selectrum--match-required-p) (progn -1))) ((and selectrum--default-candidate (string-empty-p (minibuffer-contents)) (not (member selectrum--default-candidate selectrum--refined-candidates))) -1) ((and (or selectrum--init-p (eq this-command ...)) (equal selectrum--default-candidate (minibuffer-contents))) -1) (selectrum--move-default-candidate-p 0) (t (or (cl-position selectrum--default-candidate selectrum--refined-candidates :key #'selectrum--get-full :test #'equal) 0))))))
    (let ((inhibit-read-only t) (buffer-undo-list t) (input (buffer-substring (minibuffer-prompt-end) (point-max))) (keep-mark-active (not deactivate-mark))) (if (equal input selectrum--previous-input-string) nil (setq selectrum--previous-input-string input) (setq selectrum--visual-input nil) (let ((dynamic (functionp selectrum--dynamic-candidates)) (init-table (and (not selectrum--preprocessed-candidates) minibuffer-completion-table))) (if (or dynamic init-table) (progn (setq selectrum--preprocessed-candidates (cond (dynamic ...) (init-table ...))) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates))))) (setq selectrum--refined-candidates (funcall selectrum-refine-candidates-function input selectrum--preprocessed-candidates)) (if selectrum--move-default-candidate-p (progn (setq selectrum--refined-candidates (selectrum--move-to-front-destructive selectrum--default-candidate selectrum--refined-candidates)))) (setq selectrum--refined-candidates (selectrum--move-to-front-destructive (if (and minibuffer-completing-file-name (member (file-name-as-directory input) selectrum--refined-candidates)) (file-name-as-directory input) input) selectrum--refined-candidates)) (setq selectrum--refined-candidates (delete "" selectrum--refined-candidates)) (if selectrum--repeat (progn (setq selectrum--current-candidate-index (and (> (length selectrum--refined-candidates) 0) (min (or selectrum--current-candidate-index 0) (1- ...)))) (setq selectrum--repeat nil)) (setq selectrum--current-candidate-index (cond (keep-selected (or (cl-position keep-selected selectrum--refined-candidates :key ... :test ...) 0)) ((null selectrum--refined-candidates) (if (not selectrum--match-required-p) (progn -1))) ((and selectrum--default-candidate (string-empty-p ...) (not ...)) -1) ((and (or selectrum--init-p ...) (equal selectrum--default-candidate ...)) -1) (selectrum--move-default-candidate-p 0) (t (or (cl-position selectrum--default-candidate selectrum--refined-candidates :key ... :test ...) 0)))))) (overlay-put selectrum--count-overlay 'before-string (selectrum--count-info)) (overlay-put selectrum--count-overlay 'priority 1) (setq input (or selectrum--visual-input input)) (let* ((window (if selectrum-display-action (and selectrum--refined-candidates (selectrum--get-display-window)) (active-minibuffer-window))) (ncands (if (and selectrum-display-action (windowp window)) (max (window-body-height window) selectrum-num-candidates-displayed) selectrum-num-candidates-displayed)) (first-index-displayed (setq selectrum--first-index-displayed (if selectrum--current-candidate-index (selectrum--clamp (1+ ...) 0 (max ... 0)) 0))) (highlighted-index (and selectrum--current-candidate-index (- selectrum--current-candidate-index first-index-displayed))) (displayed-candidates (seq-take (nthcdr first-index-displayed selectrum--refined-candidates) ncands)) (candidate-string (selectrum--candidates-display-string displayed-candidates input highlighted-index)) (default (if (or (and highlighted-index (< highlighted-index 0)) (and (not selectrum--match-required-p) (not displayed-candidates)) (and selectrum--default-candidate (not minibuffer-completing-file-name) (not ...))) (if (= (minibuffer-prompt-end) (point-max)) (format " %s %s%s" (propertize "[default value:" ... ...) (propertize ... ... ...) (propertize "]" ... ...)) (if (and highlighted-index ...) (progn ...))) (prog1 nil (remove-text-properties (minibuffer-prompt-end) (point-max) '...)))) (minibuf-after-string (or default #(" " 0 1 (cursor t))))) (if selectrum-display-action (save-current-buffer (set-buffer (get-buffer-create selectrum--candidates-buffer)) (erase-buffer) (insert candidate-string) (goto-char (point-min))) (if (string-empty-p candidate-string) nil (setq minibuf-after-string (concat minibuf-after-string "\n" candidate-string)))) (move-overlay selectrum--candidates-overlay (point-max) (point-max) (current-buffer)) (put-text-property 0 1 'cursor t minibuf-after-string) (overlay-put selectrum--candidates-overlay 'after-string minibuf-after-string) (if window (progn (selectrum--update-window-height window))) (if keep-mark-active (progn (setq deactivate-mark nil))) (set (make-local-variable 'selectrum--init-p) nil)))
    (if selectrum--skip-updates-p nil (goto-char (max (point) (minibuffer-prompt-end))) (set (make-local-variable 'truncate-lines) t) (let ((inhibit-read-only t) (buffer-undo-list t) (input (buffer-substring (minibuffer-prompt-end) (point-max))) (keep-mark-active (not deactivate-mark))) (if (equal input selectrum--previous-input-string) nil (setq selectrum--previous-input-string input) (setq selectrum--visual-input nil) (let ((dynamic (functionp selectrum--dynamic-candidates)) (init-table (and (not selectrum--preprocessed-candidates) minibuffer-completion-table))) (if (or dynamic init-table) (progn (setq selectrum--preprocessed-candidates (cond ... ...)) (setq selectrum--total-num-candidates (length selectrum--preprocessed-candidates))))) (setq selectrum--refined-candidates (funcall selectrum-refine-candidates-function input selectrum--preprocessed-candidates)) (if selectrum--move-default-candidate-p (progn (setq selectrum--refined-candidates (selectrum--move-to-front-destructive selectrum--default-candidate selectrum--refined-candidates)))) (setq selectrum--refined-candidates (selectrum--move-to-front-destructive (if (and minibuffer-completing-file-name (member ... selectrum--refined-candidates)) (file-name-as-directory input) input) selectrum--refined-candidates)) (setq selectrum--refined-candidates (delete "" selectrum--refined-candidates)) (if selectrum--repeat (progn (setq selectrum--current-candidate-index (and (> ... 0) (min ... ...))) (setq selectrum--repeat nil)) (setq selectrum--current-candidate-index (cond (keep-selected (or ... 0)) ((null selectrum--refined-candidates) (if ... ...)) ((and selectrum--default-candidate ... ...) -1) ((and ... ...) -1) (selectrum--move-default-candidate-p 0) (t (or ... 0)))))) (overlay-put selectrum--count-overlay 'before-string (selectrum--count-info)) (overlay-put selectrum--count-overlay 'priority 1) (setq input (or selectrum--visual-input input)) (let* ((window (if selectrum-display-action (and selectrum--refined-candidates (selectrum--get-display-window)) (active-minibuffer-window))) (ncands (if (and selectrum-display-action (windowp window)) (max (window-body-height window) selectrum-num-candidates-displayed) selectrum-num-candidates-displayed)) (first-index-displayed (setq selectrum--first-index-displayed (if selectrum--current-candidate-index (selectrum--clamp ... 0 ...) 0))) (highlighted-index (and selectrum--current-candidate-index (- selectrum--current-candidate-index first-index-displayed))) (displayed-candidates (seq-take (nthcdr first-index-displayed selectrum--refined-candidates) ncands)) (candidate-string (selectrum--candidates-display-string displayed-candidates input highlighted-index)) (default (if (or (and highlighted-index ...) (and ... ...) (and selectrum--default-candidate ... ...)) (if (= ... ...) (format " %s %s%s" ... ... ...) (if ... ...)) (prog1 nil (remove-text-properties ... ... ...)))) (minibuf-after-string (or default #(" " 0 1 (cursor t))))) (if selectrum-display-action (save-current-buffer (set-buffer (get-buffer-create selectrum--candidates-buffer)) (erase-buffer) (insert candidate-string) (goto-char (point-min))) (if (string-empty-p candidate-string) nil (setq minibuf-after-string (concat minibuf-after-string "\n" candidate-string)))) (move-overlay selectrum--candidates-overlay (point-max) (point-max) (current-buffer)) (put-text-property 0 1 'cursor t minibuf-after-string) (overlay-put selectrum--candidates-overlay 'after-string minibuf-after-string) (if window (progn (selectrum--update-window-height window))) (if keep-mark-active (progn (setq deactivate-mark nil))) (set (make-local-variable 'selectrum--init-p) nil))))
    selectrum--update()
    selectrum--minibuffer-post-command-hook()
    read-from-minibuffer("Find file: " "/vol/zzzzzzzz/" (keymap (9 . selectrum-insert-current-candidate) (10 . selectrum-submit-exact-input) (C-M-backspace . backward-kill-sexp) (27 keymap (115 keymap (114 . selectrum-prescient-toggle-regexp) (112 . selectrum-prescient-toggle-prefix) (108 . selectrum-prescient-toggle-literal) (105 . selectrum-prescient-toggle-initialism) (102 . selectrum-prescient-toggle-fuzzy) (97 . selectrum-prescient-toggle-anchored)) (67108991 . backward-kill-sexp)) (remap keymap (previous-matching-history-element . selectrum-select-from-history) (kill-ring-save . selectrum-kill-ring-save) (end-of-buffer . selectrum-goto-end) (beginning-of-buffer . selectrum-goto-beginning) (minibuffer-beginning-of-buffer . selectrum-goto-beginning) (scroll-up-command . selectrum-next-page) (scroll-down-command . selectrum-previous-page) (exit-minibuffer . selectrum-select-current-candidate) (next-line-or-history-element . selectrum-next-candidate) (previous-line-or-history-element . selectrum-previous-candidate) (next-line . selectrum-next-candidate) (previous-line . selectrum-previous-candidate) (minibuffer-keyboard-quit . abort-recursive-edit) (keyboard-quit . abort-recursive-edit)) keymap (remap keymap (previous-matching-history-element . selectrum-select-from-history)) (menu-bar keymap (minibuf "Minibuf" keymap (previous menu-item "Previous History Item" previous-history-element :help "Put previous minibuffer history element in the min...") (next menu-item "Next History Item" next-history-element :help "Put next minibuffer history element in the minibuf...") (isearch-backward menu-item "Isearch History Backward" isearch-backward :help "Incrementally search minibuffer history backward") (isearch-forward menu-item "Isearch History Forward" isearch-forward :help "Incrementally search minibuffer history forward") (return menu-item "Enter" exit-minibuffer :key-sequence "\15" :help "Terminate input and exit minibuffer") (quit menu-item "Quit" abort-recursive-edit :help "Abort input and exit minibuffer") "Minibuf")) (10 . exit-minibuffer) (13 . exit-minibuffer) (7 . abort-recursive-edit) (C-tab . file-cache-minibuffer-complete) (9 . self-insert-command) (XF86Back . previous-history-element) (up . previous-line-or-history-element) (prior . previous-history-element) (XF86Forward . next-history-element) (down . next-line-or-history-element) (next . next-history-element) (27 keymap (60 . minibuffer-beginning-of-buffer) (114 . previous-matching-history-element) (115 . next-matching-history-element) (112 . previous-history-element) (110 . next-history-element))) nil file-name-history)
    (let* ((minibuffer-allow-text-properties t) (resize-mini-windows 'grow-only) (max-mini-window-height (1+ selectrum-num-candidates-displayed)) (prompt (selectrum--remove-default-from-prompt prompt)) (icomplete-mode nil) (res (read-from-minibuffer prompt initial-input selectrum-minibuffer-map nil (or history 'minibuffer-history)))) (cond (minibuffer-completion-table (if (and selectrum--previous-input-string (string-empty-p selectrum--previous-input-string) (equal res selectrum--default-candidate)) default-candidate (substring-no-properties res))) (t res)))
    (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows 'grow-only) (max-mini-window-height (1+ selectrum-num-candidates-displayed)) (prompt (selectrum--remove-default-from-prompt prompt)) (icomplete-mode nil) (res (read-from-minibuffer prompt initial-input selectrum-minibuffer-map nil (or history 'minibuffer-history)))) (cond (minibuffer-completion-table (if (and selectrum--previous-input-string (string-empty-p selectrum--previous-input-string) (equal res selectrum--default-candidate)) default-candidate (substring-no-properties res))) (t res))))
    (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows 'grow-only) (max-mini-window-height (1+ selectrum-num-candidates-displayed)) (prompt (selectrum--remove-default-from-prompt prompt)) (icomplete-mode nil) (res (read-from-minibuffer prompt initial-input selectrum-minibuffer-map nil (or history 'minibuffer-history)))) (cond (minibuffer-completion-table (if (and selectrum--previous-input-string (string-empty-p selectrum--previous-input-string) (equal res selectrum--default-candidate)) default-candidate (substring-no-properties res))) (t res)))) (remove-hook 'minibuffer-setup-hook setup-hook))
    (let ((fun #'(lambda nil (selectrum--minibuffer-setup-hook candidates :default-candidate default-candidate))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows 'grow-only) (max-mini-window-height (1+ selectrum-num-candidates-displayed)) (prompt (selectrum--remove-default-from-prompt prompt)) (icomplete-mode nil) (res (read-from-minibuffer prompt initial-input selectrum-minibuffer-map nil (or history ...)))) (cond (minibuffer-completion-table (if (and selectrum--previous-input-string ... ...) default-candidate (substring-no-properties res))) (t res)))) (remove-hook 'minibuffer-setup-hook setup-hook)))
    (if selectrum-active-p (let ((selectrum--current-candidate-index selectrum--current-candidate-index) (selectrum--first-index-displayed selectrum--first-index-displayed) (selectrum--previous-input-string selectrum--previous-input-string) (selectrum--last-command selectrum--last-command) (selectrum--last-prefix-arg selectrum--last-prefix-arg)) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'(lambda nil (selectrum--minibuffer-setup-hook candidates :default-candidate default-candidate))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows ...) (max-mini-window-height ...) (prompt ...) (icomplete-mode nil) (res ...)) (cond (minibuffer-completion-table ...) (t res)))) (remove-hook 'minibuffer-setup-hook setup-hook)))) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'(lambda nil (selectrum--minibuffer-setup-hook candidates :default-candidate default-candidate))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows 'grow-only) (max-mini-window-height (1+ selectrum-num-candidates-displayed)) (prompt (selectrum--remove-default-from-prompt prompt)) (icomplete-mode nil) (res (read-from-minibuffer prompt initial-input selectrum-minibuffer-map nil ...))) (cond (minibuffer-completion-table (if ... default-candidate ...)) (t res)))) (remove-hook 'minibuffer-setup-hook setup-hook))))
    (let ((selectrum--preprocessed-candidates selectrum--preprocessed-candidates) (selectrum--refined-candidates selectrum--refined-candidates) (selectrum--match-required-p selectrum--match-required-p) (selectrum--move-default-candidate-p selectrum--move-default-candidate-p) (selectrum--default-candidate selectrum--default-candidate) (selectrum--visual-input selectrum--visual-input) (selectrum--read-args selectrum--read-args) (selectrum--count-overlay selectrum--count-overlay) (selectrum--repeat selectrum--repeat)) (if selectrum-active-p (let ((selectrum--current-candidate-index selectrum--current-candidate-index) (selectrum--first-index-displayed selectrum--first-index-displayed) (selectrum--previous-input-string selectrum--previous-input-string) (selectrum--last-command selectrum--last-command) (selectrum--last-prefix-arg selectrum--last-prefix-arg)) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'(lambda nil ...)) setup-hook) (setq setup-hook #'(lambda nil (remove-hook ... setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* (... ... ... ... ... ...) (cond ... ...))) (remove-hook 'minibuffer-setup-hook setup-hook)))) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'(lambda nil (selectrum--minibuffer-setup-hook candidates :default-candidate default-candidate))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* ((minibuffer-allow-text-properties t) (resize-mini-windows ...) (max-mini-window-height ...) (prompt ...) (icomplete-mode nil) (res ...)) (cond (minibuffer-completion-table ...) (t res)))) (remove-hook 'minibuffer-setup-hook setup-hook)))))
    (progn (if (or may-modify-candidates (functionp candidates)) nil (setq candidates (copy-sequence candidates))) (let ((selectrum--preprocessed-candidates selectrum--preprocessed-candidates) (selectrum--refined-candidates selectrum--refined-candidates) (selectrum--match-required-p selectrum--match-required-p) (selectrum--move-default-candidate-p selectrum--move-default-candidate-p) (selectrum--default-candidate selectrum--default-candidate) (selectrum--visual-input selectrum--visual-input) (selectrum--read-args selectrum--read-args) (selectrum--count-overlay selectrum--count-overlay) (selectrum--repeat selectrum--repeat)) (if selectrum-active-p (let ((selectrum--current-candidate-index selectrum--current-candidate-index) (selectrum--first-index-displayed selectrum--first-index-displayed) (selectrum--previous-input-string selectrum--previous-input-string) (selectrum--last-command selectrum--last-command) (selectrum--last-prefix-arg selectrum--last-prefix-arg)) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'...) setup-hook) (setq setup-hook #'(lambda nil ... ...)) (unwind-protect (progn (add-hook ... setup-hook t) (let* ... ...)) (remove-hook 'minibuffer-setup-hook setup-hook)))) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'(lambda nil ...)) setup-hook) (setq setup-hook #'(lambda nil (remove-hook ... setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (let* (... ... ... ... ... ...) (cond ... ...))) (remove-hook 'minibuffer-setup-hook setup-hook))))))
    (progn (let ((--cl-keys-- args)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:default-candidate :initial-input :require-match :history :no-move-default-candidate :may-modify-candidates :minibuffer-completion-table :minibuffer-completion-predicate :allow-other-keys)) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... args))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:default-candidate..." (car --cl-keys--)))))) (progn (if (or may-modify-candidates (functionp candidates)) nil (setq candidates (copy-sequence candidates))) (let ((selectrum--preprocessed-candidates selectrum--preprocessed-candidates) (selectrum--refined-candidates selectrum--refined-candidates) (selectrum--match-required-p selectrum--match-required-p) (selectrum--move-default-candidate-p selectrum--move-default-candidate-p) (selectrum--default-candidate selectrum--default-candidate) (selectrum--visual-input selectrum--visual-input) (selectrum--read-args selectrum--read-args) (selectrum--count-overlay selectrum--count-overlay) (selectrum--repeat selectrum--repeat)) (if selectrum-active-p (let ((selectrum--current-candidate-index selectrum--current-candidate-index) (selectrum--first-index-displayed selectrum--first-index-displayed) (selectrum--previous-input-string selectrum--previous-input-string) (selectrum--last-command selectrum--last-command) (selectrum--last-prefix-arg selectrum--last-prefix-arg)) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun ...) setup-hook) (setq setup-hook #'...) (unwind-protect (progn ... ...) (remove-hook ... setup-hook)))) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun #'...) setup-hook) (setq setup-hook #'(lambda nil ... ...)) (unwind-protect (progn (add-hook ... setup-hook t) (let* ... ...)) (remove-hook 'minibuffer-setup-hook setup-hook)))))))
    (let* ((default-candidate (car (cdr (plist-member args ':default-candidate)))) (initial-input (car (cdr (plist-member args ':initial-input)))) (require-match (car (cdr (plist-member args ':require-match)))) (history (car (cdr (plist-member args ':history)))) (no-move-default-candidate (car (cdr (plist-member args ':no-move-default-candidate)))) (may-modify-candidates (car (cdr (plist-member args ':may-modify-candidates)))) (minibuffer-completion-table (car (cdr (plist-member args ':minibuffer-completion-table)))) (minibuffer-completion-predicate (car (cdr (plist-member args ':minibuffer-completion-predicate))))) (progn (let ((--cl-keys-- args)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:default-candidate..." (car --cl-keys--)))))) (progn (if (or may-modify-candidates (functionp candidates)) nil (setq candidates (copy-sequence candidates))) (let ((selectrum--preprocessed-candidates selectrum--preprocessed-candidates) (selectrum--refined-candidates selectrum--refined-candidates) (selectrum--match-required-p selectrum--match-required-p) (selectrum--move-default-candidate-p selectrum--move-default-candidate-p) (selectrum--default-candidate selectrum--default-candidate) (selectrum--visual-input selectrum--visual-input) (selectrum--read-args selectrum--read-args) (selectrum--count-overlay selectrum--count-overlay) (selectrum--repeat selectrum--repeat)) (if selectrum-active-p (let ((selectrum--current-candidate-index selectrum--current-candidate-index) (selectrum--first-index-displayed selectrum--first-index-displayed) (selectrum--previous-input-string selectrum--previous-input-string) (selectrum--last-command selectrum--last-command) (selectrum--last-prefix-arg selectrum--last-prefix-arg)) (setq selectrum--read-args (cons prompt ...)) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let (... setup-hook) (setq setup-hook ...) (unwind-protect ... ...))) (setq selectrum--read-args (cons prompt (cons candidates args))) (if selectrum--repeat nil (setq selectrum--last-command this-command) (setq selectrum--last-prefix-arg current-prefix-arg)) (setq selectrum--match-required-p require-match) (setq selectrum--move-default-candidate-p (not no-move-default-candidate)) (let ((fun ...) setup-hook) (setq setup-hook #'...) (unwind-protect (progn ... ...) (remove-hook ... setup-hook))))))))
    selectrum-read("Find file: " (closure ((last-dir) (_inherit-input-method) (def . "/vol/zzzzzzzz/") (hist . file-name-history) (initial-input . "/vol/zzzzzzzz/") (require-match . confirm-after-completion) (predicate . file-exists-p) (collection . read-file-name-internal) (prompt . "Find file: ") t) (input) (let* ((dir (or (file-name-directory input) "")) (matchstr (file-name-nondirectory input)) (cands (cond ((equal last-dir dir) selectrum--preprocessed-candidates) (t (condition-case _ ... ...))))) (setq last-dir dir) (list (cons 'input matchstr) (cons 'candidates cands)))) :default-candidate "/vol/zzzzzzzz/" :initial-input "/vol/zzzzzzzz/" :history file-name-history :require-match nil :may-modify-candidates t :minibuffer-completion-table read-file-name-internal :minibuffer-completion-predicate file-exists-p)
    (progn (add-hook 'minibuffer-setup-hook setup-hook t) (selectrum-read prompt coll :default-candidate (or (car-safe def) def) :initial-input (or (car-safe initial-input) initial-input) :history hist :require-match (eq require-match t) :may-modify-candidates t :minibuffer-completion-table collection :minibuffer-completion-predicate predicate))
    (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (selectrum-read prompt coll :default-candidate (or (car-safe def) def) :initial-input (or (car-safe initial-input) initial-input) :history hist :require-match (eq require-match t) :may-modify-candidates t :minibuffer-completion-table collection :minibuffer-completion-predicate predicate)) (remove-hook 'minibuffer-setup-hook setup-hook))
    (let ((fun #'(lambda nil (set (make-local-variable 'minibuffer-completing-file-name) t) (set-syntax-table selectrum--minibuffer-local-filename-syntax))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (selectrum-read prompt coll :default-candidate (or (car-safe def) def) :initial-input (or (car-safe initial-input) initial-input) :history hist :require-match (eq require-match t) :may-modify-candidates t :minibuffer-completion-table collection :minibuffer-completion-predicate predicate)) (remove-hook 'minibuffer-setup-hook setup-hook)))
    (let* ((last-dir nil) (coll #'(lambda (input) (let* ((dir ...) (matchstr ...) (cands ...)) (setq last-dir dir) (list (cons ... matchstr) (cons ... cands)))))) (let ((fun #'(lambda nil (set (make-local-variable ...) t) (set-syntax-table selectrum--minibuffer-local-filename-syntax))) setup-hook) (setq setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook t) (selectrum-read prompt coll :default-candidate (or (car-safe def) def) :initial-input (or (car-safe initial-input) initial-input) :history hist :require-match (eq require-match t) :may-modify-candidates t :minibuffer-completion-table collection :minibuffer-completion-predicate predicate)) (remove-hook 'minibuffer-setup-hook setup-hook))))
    selectrum--completing-read-file-name("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/vol/zzzzzzzz/" file-name-history "/vol/zzzzzzzz/" nil)
    apply(selectrum--completing-read-file-name ("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/vol/zzzzzzzz/" file-name-history "/vol/zzzzzzzz/" nil))
    (closure ((crf . selectrum-completing-read) (predicate) (initial) (mustmatch . confirm-after-completion) (default-filename . "/vol/zzzzzzzz/") (dir) (prompt . "Find file: ") t) (&rest args) (setq completing-read-function crf) (if (and default-filename (not (equal (expand-file-name default-filename) (expand-file-name default-directory)))) (progn (let* ((c (nthcdr 6 args))) (setcar c (directory-file-name (file-relative-name default-filename default-directory)))))) (apply #'selectrum--completing-read-file-name args))("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/vol/zzzzzzzz/" file-name-history "/vol/zzzzzzzz/" nil)
    completing-read("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/vol/zzzzzzzz/" file-name-history "/vol/zzzzzzzz/")
    read-file-name-default("Find file: " nil "/vol/zzzzzzzz/" confirm-after-completion nil nil)
    (let* ((crf completing-read-function) (completing-read-function #'(lambda (&rest args) (setq completing-read-function crf) (if (and default-filename (not ...)) (progn (let* ... ...))) (apply #'selectrum--completing-read-file-name args)))) (read-file-name-default prompt dir (concat (expand-file-name (or dir default-directory)) initial) mustmatch initial predicate))
    selectrum-read-file-name("Find file: " nil "/vol/zzzzzzzz/" confirm-after-completion nil nil)
    read-file-name("Find file: " nil "/vol/zzzzzzzz/" confirm-after-completion)
    find-file-read-args("Find file: " confirm-after-completion)
    byte-code("\300\301\302 \"\207" [find-file-read-args "Find file: " confirm-nonexistent-file-or-buffer] 3)
    call-interactively(find-file nil nil)
    command-execute(find-file)

I updated the PR, could you recheck with the update?

yes, now it is instantanious, no pause :-)

Great!

I reverted the first attempt, just to be sure, could you recheck everything is still fixed for you?

Yes, still works with the default directory part removed. In general find-file seems much snappier now :-) great job!

I wonder if reading directories with Selectrum if that is still slow for you, when you use M-x dired (in some dir which has a comparable amount of directories as your file problem) is that slow?

Ah, I just discovered the table seem to special case file-directory-p so things should also be fine for dirs.

seems fine!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

piranha picture piranha  路  7Comments

clemera picture clemera  路  4Comments

Compro-Prasad picture Compro-Prasad  路  7Comments

revrari picture revrari  路  11Comments

grolongo picture grolongo  路  10Comments