走上目录树

Rea*_*onk 20 elisp

文件树如下:

- foo
  - lorem
    - ipsum <-
  - baz <-
- bar
- baz
Run Code Online (Sandbox Code Playgroud)

当前访问的文件是ipsum.现在我想找到第一个 baz和它所在的目录.如何从ipsumelisp中走出树 ?

Ste*_*fan 28

你想要的locate-dominating-file.

  • `(locate-dominating-file DIR(lambda(parent)(directory-files parent nil"\\(GNU \\)?[Mm] akefile")))` (3认同)
  • 实际上,在最新版本的 Emacs 中,它接受一个函数作为参数,因此它绝对可以做通配符的事情(通过 `directory-files`)。 (2认同)

Chr*_*ett 16

(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)))))
Run Code Online (Sandbox Code Playgroud)

如果结果不是nil,则可以使用提取文件的目录file-name-directory,如下所示:

(let ((file (find-file-in-heirarchy (buffer-file-name) "baz")))
  (when file
    (file-name-directory file)))
Run Code Online (Sandbox Code Playgroud)