summaryrefslogtreecommitdiff
path: root/modules/org-refile-config.el
diff options
context:
space:
mode:
Diffstat (limited to 'modules/org-refile-config.el')
-rw-r--r--modules/org-refile-config.el87
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.