web-dev-qa-db-fra.com

Comment faire automatiquement tous les fichiers org sous un dossier ajouté dans l'agenda-liste?

J'utilise le mode org pour écrire des notes et org-agenda pour organiser toutes les notes, en particulier pour rechercher des informations. par mot-clé ou tag.

Cc am peut rechercher certains fichiers par balise entrée, Cc as par mot-clé, ces fonctions de org-agenda sont bien à utiliser, cependant, je dois ajouter org-file dans l'ordre du jour à la main.

J'ai ajouté quelques codes dans . Emacs, tels que

(setq org-agenda-files (list "path/folder/*.org"))

ou

(setq org-agenda-files (file-expand-wildcards "path/folder/*.org"))

mais, les deux n'ont pas réussi à ajouter automatiquement des fichiers dans le dossier spécifié dans l'agenda-liste, donc je ne peux pas rechercher de mots-clés ou de balises parmi ces fichiers org, sauf si j'ouvre un fichier org et que je tape Cc [ = pour l'ajouter à l'agenda-liste.

Comment puis-je créer automatiquement tous les fichiers d'organisation d'un dossier dans l'agenda?

41
Zoe Rowa

Le simple fait de nommer le répertoire devrait suffire. Par exemple, cela fonctionne très bien pour moi:

(setq org-agenda-files '("~/org"))

Jetez également un œil à org-agenda-text-search-extra-files; il vous permet d'ajouter des fichiers supplémentaires inclus uniquement dans les recherches de texte. Une valeur typique pourrait être,

(setq org-agenda-text-search-extra-files
      '(agenda-archives
        "~/org/subdir/textfile1.txt"
        "~/org/subdir/textfile1.txt"))

Avertissement: Si vous ajoutez un fichier au répertoire après avoir démarré Emacs, il ne sera pas inclus.

Edit: (2018) Pour inclure tous les fichiers avec une certaine extension dans la liste des fichiers supplémentaires, vous pouvez essayer la fonction suivante que j'ai écrite il y a quelque temps ( ne version plus récente pourrait être disponible ici ).

;; recursively find .org files in provided directory
;; modified from an Emacs LISP Intro example
(defun sa-find-org-file-recursively (&optional directory filext)
  "Return .org and .org_archive files recursively from DIRECTORY.
If FILEXT is provided, return files with extension FILEXT instead."
  (interactive "DDirectory: ")
  (let* (org-file-list
         (case-fold-search t)         ; filesystems are case sensitive
         (file-name-regex "^[^.#].*") ; exclude dot, autosave, and backupfiles
         (filext (or filext "org$\\\|org_archive"))
         (fileregex (format "%s\\.\\(%s$\\)" file-name-regex filext))
         (cur-dir-list (directory-files directory t file-name-regex)))
    ;; loop over directory listing
    (dolist (file-or-dir cur-dir-list org-file-list) ; returns org-file-list
      (cond
       ((file-regular-p file-or-dir)             ; regular files
        (if (string-match fileregex file-or-dir) ; org files
            (add-to-list 'org-file-list file-or-dir)))
       ((file-directory-p file-or-dir)
        (dolist (org-file (sa-find-org-file-recursively file-or-dir filext)
                          org-file-list) ; add files found to result
          (add-to-list 'org-file-list org-file)))))))

Vous pouvez l'utiliser comme ceci:

(setq org-agenda-text-search-extra-files
      (append (sa-find-org-file-recursively "~/org/dir1/" "txt")
              (sa-find-org-file-recursively "~/org/dir2/" "tex")))

Edit: (2019) Comme mentionné dans la réponse de @ mingwei-zhang et le commentaire de @xiaobing, find-LISP-find-files de find-LISP et directory-files-recursively fournit également cette fonctionnalité. Cependant, veuillez noter que dans ces cas, l'argument du nom de fichier est une expression rationnelle (gourmande). Donc quelque chose comme (directory-files-recursively "~/my-dir" "org") vous donnera tous les fichiers Org, y compris les fichiers de sauvegarde (*.org~). Pour inclure uniquement *.org fichiers, vous pouvez utiliser (directory-files-recursively "~/my-dir" "org$").

68
Quarky

Il existe un moyen plus simple d'effectuer une recherche récursive de fichiers org:

(load-library "find-LISP")
(setq org-agenda-files
   (find-LISP-find-files "FOLDERNAME" "\.org$"))

J'ai ajouté ces lignes dans ma configuration organisationnelle et cela fonctionne simplement.

(Je ne suis pas un expert en ELisp ou emacs, juste un utilisateur régulier qui vient de convertir de Vim en Spacemacs)

EDIT: @ xiaobing dans la section commentaire a un meilleure solution , également pas besoin de faire load-library:

(setq org-agenda-files (directory-files-recursively "~/org/" "\.org$"))
15
Mingwei Zhang