2012-12-30 12 views
19

Il file albero è come follwing:piedi fino alla struttura di directory

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

Il file attualmente visitata è ipsum. Ora voglio trovare il primo baz e la directory in cui si trova. Come si sale l'albero da ipsum in elisp?

+0

"Primo" è ambiguo, non in questo esempio, ma in generale. Se ci sono multipli, dovremmo preferire un bambino, un genitore o uno dei nodi fratelli? – tripleee

risposta

26

Volete locate-dominating-file.

+0

Sembra carino, tranne che sembra non accettare i caratteri jolly. Sto cercando un file con una determinata estensione. – Reactormonk

+1

In realtà, nelle versioni recenti di Emacs, accetta una funzione come argomento, quindi può fare definitivamente la cosa della widlcard (tramite 'directory-files'). – Stefan

+0

Fornire un codice di esempio? – 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))))) 

Se il risultato non è pari a zero, è possibile estrarre directory del file utilizzando file-name-directory, in questo modo:

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