2009-04-26 6 views
4

Ich habe viele Verzeichnisse mit einer Reihe von TeX-Dokumenten gefüllt. Also, es gibt viele Dateien mit dem gleichen Basisdateinamen und verschiedenen Erweiterungen. Nur einer von ihnen ist jedoch editierbar. Ich würde einen Weg möchte Emacs zu überzeugen, dass, wenn ich in einem Verzeichnis bin, wo ichBevorzugen bestimmte Dateierweiterungen mit Emacs Dateinamen Vollendung

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

und ich bin in der Minipuffer haben und tun

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

es in ‚Dokument füllt .tex ', weil das das einzig wirklich editierbare Dokument in diesem Verzeichnis ist. Weiß jemand einen guten Weg, das zu tun?

Antwort

6

Ich habe einen Code geschrieben, der tun sollte, was Sie wollen. Die Grundidee besteht darin, die Variable 'completion-ignored-extensions so einzustellen, dass sie den Erweiterungen entspricht, die Sie überspringen möchten, jedoch nur, wenn .tex Dateien vorhanden sind. Dieser Code macht das.

(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) 

Genießen.

+0

Ich bekomme einen undefinierten Funktionsfehler für 'mapcq' - wird das von einem elisp-Paket zur Verfügung gestellt, das ich laden sollte? –

+0

Ich sollte erwähnen, ich habe 'Mapc' und 'Mapchar' versucht und keiner arbeitete. Das sieht aber gut aus, danke! –

+0

Die mapcq war ein Tippfehler, ich habe es behoben. mapc hat für mich funktioniert, dass der Code das tut, was ich erwartet habe. Ein Problem könnte sein, dass der Code vielleicht nicht aktiviert ist. Versuchen Sie, kurz vor der mapc-Zeile ein (y-or-n-p "Running?") Hinzuzufügen, und wenn Sie TAB ausführen, sollten Sie dazu aufgefordert werden. Wenn dies nicht der Fall ist, wird der Ratschlag (aus irgendeinem Grund) nicht aktiviert, und Sie können versuchen, die Minibuffer-Complete-Limit-Auswahl zu aktivieren (ad-activate). Ich brauchte das nicht, als ich das in einem Vanille-Emacs testete. –

1

Wahrscheinlich ist der einfachste Weg, dies in Ihrem Fall zu tun, nur die Variable "completion-ignored-extensions" anzupassen.

Dies wird jedoch bedeuten, dass Emacs immer Dinge wie ".log" und ".pdf" ignoriert, die möglicherweise nicht das sind, was Sie wollen. Wenn Sie wünschen, dass es selektiver ist, müssen Sie die Funktion Dateiname-Vervollständigung effektiv neu implementieren.

1

Wenn Sie eine große Bibliothek installieren und einige Dokumentationen lesen möchten, können Sie sich Icicles ansehen und eine sort function definieren, die Ihren Anforderungen entspricht. Eine Alternative ist ido, deren Wiki-Seite ein Beispiel von sorting by mtime hat, das leicht geändert werden sollte, um nach einer Funktion der Dateinamenserweiterung zu sortieren.

Verwandte Themen