I am frequently diving through many layers of directory hierarchies (thanks, Java) to find files named like this…


The main issue that I have is that TAB-completion in find-file only completes one directory at a time, meaning that I may have to press TAB 5 times to get through the first few layers of the hierarchy, where each directory contains only one subdirectory and nothing more (e.g. com/ contains only company/, company/ contains only thing/), etc.

Is there any package that modifies TAB-completion with standard Emacs commands, including find-file, so that multiple directories will be "greedily" autocompleted when they contain only one subdirectory?

I'm aware of Projectile, and know that it has a similar feature, but I'm hoping to find something standalone and minimal that just solves this one issue.

  • project-find-file might be more convenient
    – Hubisan
    Commented Jul 28, 2023 at 15:31

1 Answer 1


I use ivy/counsel so I only have an ivy solution:

(defcustom dc4ever-cd-all-the-way t
  "Whether to enable cd-all-the-way feature." :type 'boolean)
(defvar dc4ever--cd-all-the-way-flag nil "Internal flag for cd-all-the-way.")

(defun dc4ever//ivy-magic-slash-advice (func &rest r)
  "Set `dc4ever--cd-all-the-way-flag' for `ivy--magic-file-slash'."
  (let ((dc4ever--cd-all-the-way-flag dc4ever-cd-all-the-way))
    (apply func r)))
(advice-add #'ivy--magic-file-slash :around #'dc4ever//ivy-magic-slash-advice)

(defun dc4ever//ivy--cd-advice (func &rest r)
  "Advice `ivy--cd' to do cd-all-the-way."
  (if (not dc4ever--cd-all-the-way-flag) (apply func r)
    (cl-labels ((get-only-dir
                 (let* ((entries (f-entries dir))
                        (onlyent (when (= 1 (length entries))
                                   (concat (expand-file-name (car entries) dir)
                    ((null onlyent) dir)
                    ((f-dir? onlyent) (get-only-dir onlyent))
                    (t dir)))))
      (funcall func (get-only-dir (car r))))))
(advice-add #'ivy--cd :around #'dc4ever//ivy--cd-advice)


This only works if you type / since I implemented that way, so that TAB would keep the original behavior.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.