5

組織ファイルを検索するすべてのサブディレクトリをすばやく再帰する方法を見つけようとしています。いくつかの解決策 ( Elisp Cookbook、およびgithubのいくつかの解決策)を見つけましたが、それらは私の実際の使用法 (数百のディレクトリ (およびサブディレクトリ) と数百の組織ファイル) を処理しません。それらは私のシステム (Windows 7、max-lisp-eval-depth = 10000) で永久に実行されるようです。私の回避策は、各ディレクトリを org-agenda-list に手動で追加することですが、面倒ですし、おそらくいくつか忘れていることもわかっています。任意の提案をいただければ幸いです。

4

5 に答える 5

4

次のコードは、emacs 24.3 以降でうまく機能します。

;; Collect all .org from my Org directory and subdirs
(setq org-agenda-file-regexp "\\`[^.].*\\.org\\'") ; default value
(defun load-org-agenda-files-recursively (dir) "Find all directories in DIR."
    (unless (file-directory-p dir) (error "Not a directory `%s'" dir))
    (unless (equal (directory-files dir nil org-agenda-file-regexp t) nil)
      (add-to-list 'org-agenda-files dir)
    )
    (dolist (file (directory-files dir nil nil t))
        (unless (member file '("." ".."))
            (let ((file (concat dir file "/")))
                (when (file-directory-p file)
                    (load-org-agenda-files-recursively file)
                )
            )
        )
    )
)
(load-org-agenda-files-recursively "/path/to/your/org/dir/" ) ; trailing slash required

中間ファイルの作成は不要で、ショートカットに配置することもできます。

見つかったファイルに再ファイルできるようにするには、次を追加します。

(setq org-refile-targets
      '((nil :maxlevel . 3)
        (org-agenda-files :maxlevel . 1)))
于 2014-10-24T13:34:59.817 に答える
2

org-agenda ディレクトリのリストをファイルに保存し、ディレクトリ構造が変更されたことを知っていて、時間があるときに (自動的に) 時々更新するのはどうでしょうか。

たとえば、次のようなものを使用できます。

;; From http://www.emacswiki.org/emacs/ElispCookbook#toc58
(defun directory-dirs (dir)
  "Find all directories in DIR."
  (unless (file-directory-p dir)
    (error "Not a directory `%s'" dir))
  (let ((dir (directory-file-name dir))
        (dirs '())
        (files (directory-files dir nil nil t)))
    (dolist (file files)
      (unless (member file '("." ".."))
        (let ((file (concat dir "/" file)))
          (when (file-directory-p file)
            (setq dirs (append (cons file
                                     (directory-dirs file))
                               dirs))))))
    dirs))


(setq my-org-agenda-root "~/org")
(setq my-org-agenda-files-list "~/.emacs.d/org-agenda-list.el")

(defun my-update-org-agenda-files ()
  "Create or update the `my-org-agenda-files-list' file.

This file contains elisp code to set `org-agenda-files' to a
recursive list of all children under `my-org-agenda-root'. "
  (interactive)
  (with-temp-buffer
    (insert
     ";; Warning: this file has been automatically generated\n"
     ";; by `my-update-org-agenda-files'\n")
    (let ((dir-list (directory-dirs my-org-agenda-root))
          (print-level nil)
          (print-length nil))
      (cl-prettyprint `(setq org-agenda-files (quote ,dir-list))))
    (write-file my-org-agenda-files-list)))

(load my-org-agenda-files-list)

時々、実行M-xmy-update-org-agenda-filesしてリストを更新します。

于 2013-06-21T10:02:29.013 に答える