diff options
Diffstat (limited to 'modules/org-refile-config.el')
| -rw-r--r-- | modules/org-refile-config.el | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/modules/org-refile-config.el b/modules/org-refile-config.el index 8c058d66..3f71d91d 100644 --- a/modules/org-refile-config.el +++ b/modules/org-refile-config.el @@ -5,58 +5,77 @@ ;;; Code: -(with-eval-after-load 'org-roam-config - (require 'org-refile) +(use-package org-refile + :ensure nil ;; built-in + :defer .5 + :bind + (:map org-mode-map + ("C-c C-w" . cj/org-refile) + ("C-c w" . cj/org-refile-in-file)) + :config ;; ----------------------------- Org Refile Targets ---------------------------- ;; sets refile targets ;; - adds project files in org-roam to the refile targets ;; - adds todo.org files in subdirectories of the code and project directories - (defun cj/add-files-to-org-refile-targets (directory) - "Recursively searches for all files named 'todo.org' in DIRECTORY and adds them to org-project-files." - (interactive "D") - (let ((files (directory-files-recursively directory "^[Tt][Oo][Dd][Oo]\\.[Oo][Rr][Gg]$" t))) - (dolist (file files) - (add-to-list 'org-refile-targets `(,file . (:level . 1)))))) - (defun cj/build-org-refile-targets() - "Build org-refile-targets. -Starts with the schedule file, then adds the Emacs task list, -and any task list in the code or projects directories." + "Build org-refile-targets." (interactive) - (let ((new-files - (append - (cj/org-roam-list-notes-by-tag "Project") - (cj/org-roam-list-notes-by-tag "Topic")))) - (dolist (file new-files) - (unless (member file org-agenda-files) - (setq org-agenda-files (cons file org-agenda-files)))) - ) - (setq org-refile-targets '((org-agenda-files :maxlevel . 1))) - (cj/add-files-to-org-refile-targets user-emacs-directory) - (cj/add-files-to-org-refile-targets code-dir) - (cj/add-files-to-org-refile-targets projects-dir)) - - ;; --------------------------------- Org-Refile ------------------------------- + (let (new-files) + ;; Start with the inbox and the schedule files. + (setq new-files `((,inbox-file . (:maxlevel . 1)) (,schedule-file . (:maxlevel . 1)))) + + ;; Extend new-files with the project and topic files. + (let ((project-and-topic-files (append (cj/org-roam-list-notes-by-tag "Project") + (cj/org-roam-list-notes-by-tag "Topic")))) + (let ((file-rule `(:level . 1))) + (dolist (file project-and-topic-files) + (unless (assoc file new-files) + (push `(,file . ,file-rule) new-files))))) + + ;; Extend new-files with todo.org files in the specified directories. + (dolist (dir (list user-emacs-directory code-dir projects-dir)) + (let ((todo-files (directory-files-recursively dir "^[Tt][Oo][Dd][Oo]\\.[Oo][Rr][Gg]$"))) + (let ((file-rule `(:level . 1))) + (dolist (file todo-files) + (unless (assoc file new-files) + (push `(,file . ,file-rule) new-files)))))) + + ;; Set org-refile-targets. + (setq org-refile-targets (nreverse new-files)))) + + ;; -------------------------------- Org-Refile ------------------------------- + ;; used in place of org-refile to ensure the refile targets are rebuilt. + + (defun cj/org-refile (&optional ARG DEFAULT-BUFFER RFLOC MSG) + "Simply rebuilds the refile targets before calling org-refile. +ARG DEFAULT-BUFFER RFLOC and MSG parameters passed to org-refile." + (interactive "P") + (cj/build-org-refile-targets) + (org-refile ARG DEFAULT-BUFFER RFLOC MSG)) + + ;; ----------------------------- Org Refile In File ---------------------------- ;; convenience function for scoping the refile candidates to the current buffer. (defun cj/org-refile-in-file () "Refile to a target within the current file and save the buffer." - (interactive) - (let ((org-refile-targets `(((,(buffer-file-name)) :maxlevel . 6)))) + (interactive) + (let ((org-refile-targets `(((,(buffer-file-name)) :maxlevel . 6)))) (call-interactively 'org-refile) (save-buffer))) - ;; ----------------------- Save Org Files After Refile ----------------------- - ;; advice that saves all open org buffers after a refile is complete + ) ; end use-package statement + + +;; ----------------------- Save Org Files After Refile ----------------------- +;; advice that saves all open org buffers after a refile is complete - (advice-add 'org-refile :after - (lambda (&rest _) - (org-save-all-org-buffers))) +(advice-add 'org-refile :after + (lambda (&rest _) + (org-save-all-org-buffers))) - ) ;; end with eval-after-load 'org-roam (provide 'org-refile-config) ;;; org-refile-config.el ends here. |
