6

特定のポイントからディレクトリ構造を再帰的にたどり、各レベルで copyright-update-directory を呼び出したいと思います。

これに役立つEmacs 24に含まれる関数はありますか? たとえば、次のようなものです。

(recursive-directory-walk "~/src/foo" '(copyright-update-directory))

そのような関数が存在しない場合、これの実装 (または実際の実装) を開始するためのいくつかの指針が役立ちます。

4

5 に答える 5

3

存在するかどうかはわかりませんが、独自に作成するのはそれほど難しくありません。

(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/")
于 2013-01-12T09:39:25.827 に答える
1

クリス・バレットの答えは正しく、慣用的なものだと思います。ただし、学習目的で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-fullpopf-directoriesf-relativef-files--each、。これで、Python で使用するのと同じようにループで使用できます。!consreverse

(loop for (b ds fs) in (walk path)
      do (copyright-update-directory b "*"))
于 2014-03-14T16:34:34.693 に答える
1

Emacs には、この目的のために組み込み関数directory-files-recurivelyがあります。

(mapc #'YOUR-FUNCTION
      (remove-if-not
       #'file-directory-p       ;only dirs
       (directory-files-recursively YOUR-DIRECTORY "" t)))

また、内部で再帰を使用しないため、他の回答で言及されているf-directories関数よりもはるかに高速です。

于 2017-08-15T16:03:56.547 に答える