2012-12-30 11 views
19

Der Dateibaum als follwing ist:Gehen Sie den Verzeichnisbaum

- foo 
    - lorem 
    - ipsum <- 
    - baz <- 
- bar 
- baz 

Die aktuell besuchte Datei ipsum ist. Jetzt möchte ich die erste baz und das Verzeichnis finden, in dem es ist. Wie gehe ich den Baum von ipsum in elisp?

+0

"Erste" ist zweideutig, nicht in diesem Beispiel, aber allgemein. Wenn es mehrere gibt, sollten wir ein Kind, ein Elternteil oder einen der Geschwisterknoten bevorzugen? – tripleee

Antwort

26

Sie locate-dominating-file wollen.

+0

Sieht gut aus, außer es scheint keine Platzhalter zu akzeptieren. Ich suche nach einer Datei mit einer bestimmten Erweiterung. – Reactormonk

+1

Tatsächlich akzeptiert es in neueren Versionen von Emacs eine Funktion als Argument, so dass es definitiv die Widlcard-Sache machen kann (über 'Verzeichnis-Dateien'). – Stefan

+0

Beispielcode bereitstellen? – Reactormonk

14
(defun parent-directory (dir) 
    (unless (equal "/" dir) 
    (file-name-directory (directory-file-name dir)))) 

(defun find-file-in-heirarchy (current-dir fname) 
    "Search for a file named FNAME upwards through the directory hierarchy, starting from CURRENT-DIR" 
    (let ((file (concat current-dir fname)) 
     (parent (parent-directory (expand-file-name current-dir)))) 
    (if (file-exists-p file) 
     file 
     (when parent 
     (find-file-in-heirarchy parent fname))))) 

Wenn das Ergebnis nicht Null ist, können Sie das Verzeichnis der Datei extrahieren file-name-directory verwenden, etwa so:

(let ((file (find-file-in-heirarchy (buffer-file-name) "baz"))) 
    (when file 
    (file-name-directory file))) 
Verwandte Themen