Adding the following snippet to your .emacs file will cause Emacs’ dired mode to omit all files ignored by Git. This only works if you have dired-omit-mode on, which is ordinarily bound to Meta-o.

The code

Here is the code you would add to your .emacs file:

(add-hook ‘dired-load-hook #’(lambda nil (load “dired-x” t)))

(eval-after-load “dired-x”
  ‘(progn
     (defvar dired-omit-regexp-orig (symbol-function ‘dired-omit-regexp))

     (defun dired-omit-regexp ()
       (let ((file (expand-file-name “.git”))
             parent-dir)
         (while (and (not (file-exists-p file))
                     (progn
                       (setq parent-dir
                             (file-name-directory
                              (directory-file-name
                               (file-name-directory file))))
                       ;; Give up if we are already at the root dir.
                       (not (string= (file-name-directory file)
                                     parent-dir))))
           ;; Move up to the parent dir and try again.
           (setq file (expand-file-name “.git” parent-dir)))
         ;; If we found a change log in a parent, use that.
         (if (file-exists-p file)
             (let ((regexp (funcall dired-omit-regexp-orig)))
               (assert (stringp regexp))
               (concat
                regexp
                (if (> (length regexp) 0)
                    “\\|” “”)
                “\\(“
                (mapconcat
                 #’(lambda (str)
                     (concat “^”
                             (regexp-quote
                              (substring str 13
                                         (if (= ?/ (aref str (1- (length str))))
                                             (1- (length str))
                                           nil)))
                             “$”))
                 (split-string (shell-command-to-string
                                “git clean -d -x -n”)
                               “\n” t)
                 “\\|”)
                “\\)”))
           (funcall dired-omit-regexp-orig))))))

A note to fellow Emacs coders: I tried writing this as a piece of defadvice, rather than hijacking the definition of dired-omit-regexp, but for some reason it never called this function.

 

3 Responses to Omitting Git-ignored files in Emacs dired

  1. Marcin Bachry says:

    Did you call `(ad-activate ‘dired-omit-regexp)’? I always forget to do it.

  2. anon says:

    Your posting software conveniently “fixed” all the quotes in your code to be pretty…

  3. John Wiegley says:

    Ugh. I’ll have to find a way to stop it from doing that. Thanks.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Notify me of followup comments via e-mail. You can also subscribe without commenting.

Set your Twitter account name in your settings to use the TwitterBar Section.