Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preferring certain file extensions with Emacs file name completion

Tags:

emacs

I have lots of directories filled with a bunch of TeX documents. So, there's lots of files with the same base filename and different extensions. Only one of them, though, is editable. I'd like a way to convince Emacs that if I'm in a directory where I've got

document.tex
document.log
document.pdf
document.bbl
document.aux
...

and I'm in the minibuffer and do

~/Documents/.../doc<TAB>

it fills in 'document.tex', because that's the only really properly editable document in that directory. Anybody know of a good way to do that?

like image 401
Charles Pence Avatar asked Feb 28 '23 19:02

Charles Pence


1 Answers

I've written some code that should do what you want. The basic idea is to set the variable 'completion-ignored-extensions to match the extensions you want to skip, but only when there are .tex files present. This code does that.

(defadvice find-file-read-args (around find-file-read-args-limit-choices activate)
  "set some stuff up for controlling extensions when tab completing"
  (let ((completion-ignored-extensions completion-ignored-extensions)
        (find-file-limit-choices t))
    ad-do-it))

(defadvice minibuffer-complete (around minibuffer-complete-limit-choices nil activate)
  "When in find-file, check for files of extension .tex, and if they're found, ignore .log .pdf .bbl .aux"
  (let ((add-or-remove
     (if (and (boundp 'find-file-limit-choices) find-file-limit-choices
          (save-excursion
        (let ((b (progn (beginning-of-line) (point)))
              (e (progn (end-of-line) (point))))
          (directory-files (file-name-directory (buffer-substring-no-properties b e)) nil "\\.tex$"))))
     'add-to-list
       'remove)))
(mapc (lambda (e) (setq completion-ignored-extensions
            (funcall add-or-remove 'completion-ignored-extensions e)))
      '(".log" ".pdf" ".bbl" ".aux")))
  ad-do-it)

Enjoy.

like image 66
Trey Jackson Avatar answered May 07 '23 01:05

Trey Jackson