特定のポイントからディレクトリ構造を再帰的にたどり、各レベルで copyright-update-directory を呼び出したいと思います。
これに役立つEmacs 24に含まれる関数はありますか? たとえば、次のようなものです。
(recursive-directory-walk "~/src/foo" '(copyright-update-directory))
そのような関数が存在しない場合、これの実装 (または実際の実装) を開始するためのいくつかの指針が役立ちます。
存在するかどうかはわかりませんが、独自に作成するのはそれほど難しくありません。
(defun folder-dirs (folder)
(delete-if-not 'file-directory-p
(mapcar (lambda(arg) (file-name-as-directory (concat (file-name-as-directory folder) arg)))
(delete-if (lambda (arg) (or (string= ".." arg) (string= "." arg)))
(directory-files folder)))))
(defun recursively-run-on-every-dir (fn folder)
"FN - function, taking one argument;
FOLDER - initial forder"
(funcall fn folder)
(mapc (lambda(arg) (recursively-run-on-every-dir fn arg))
(folder-dirs folder))
nil)
;; use your function instead of print
(recursively-run-on-every-dir 'print "/your/initial/path/")
クリス・バレットの答えは正しく、慣用的なものだと思います。ただし、学習目的でos.walk
、ディレクトリ ツリーの幅優先トラバースの一般的な関数である Python の を実装したいと考えていました。dash.el
リスト ライブラリとf.el
ファイルおよびディレクトリ ライブラリを使用しました。これはPython から翻訳されたスタックベースの実装です。
(defun walk (path)
(let ((stack (list (f-full path)))
result)
(while stack
(let* ((path (pop stack))
(ds_ (f-directories path))
(ds (-map 'f-relative ds_))
(fs (-map 'f-relative (f-files path))))
(--each ds_ (!cons it stack))
(!cons (list path ds fs) result)))
(reverse result)))
関数を参照してください: f-full
、pop
、f-directories
、f-relative
、f-files
、--each
、。これで、Python で使用するのと同じようにループで使用できます。!cons
reverse
(loop for (b ds fs) in (walk path)
do (copyright-update-directory b "*"))
Emacs には、この目的のために組み込み関数directory-files-recurivelyがあります。
(mapc #'YOUR-FUNCTION
(remove-if-not
#'file-directory-p ;only dirs
(directory-files-recursively YOUR-DIRECTORY "" t)))
また、内部で再帰を使用しないため、他の回答で言及されているf-directories関数よりもはるかに高速です。