diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-10 02:43:58 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-10 02:43:58 -0500 |
| commit | 2afb005af6272b1b4229b377db0423dca045732f (patch) | |
| tree | 907b6c0dbb369b8f79be02617544bced4ed268c8 | |
| parent | 0248afe222a0722ec336e8c09269612eb773702b (diff) | |
| download | dotemacs-2afb005af6272b1b4229b377db0423dca045732f.tar.gz dotemacs-2afb005af6272b1b4229b377db0423dca045732f.zip | |
Clean up Org keymap ownership
Remove the duplicate Org cache keymap and keep C-; O owned by the shared Org map. The cache clear command now clears all Org buffers by default, with a prefix argument for the current buffer.
| -rw-r--r-- | modules/org-config.el | 32 | ||||
| -rw-r--r-- | tests/test-org-config-keymap-ownership.el | 55 | ||||
| -rw-r--r-- | tests/test-org-sort-by-todo-and-priority.el | 4 |
3 files changed, 64 insertions, 27 deletions
diff --git a/modules/org-config.el b/modules/org-config.el index c817f3e0..caac29fd 100644 --- a/modules/org-config.el +++ b/modules/org-config.el @@ -276,21 +276,19 @@ with a file, the function will throw an error." (defun cj/org-clear-element-cache () "Clear the org-element cache for the current buffer or all buffers. -With prefix argument, clear cache for all org buffers. Otherwise, clear only +By default, clear cache for all org buffers. With prefix argument, clear only the current buffer's cache. Useful when encountering parsing errors like 'wrong-type-argument stringp nil' during agenda generation." (interactive) (if current-prefix-arg - (progn - (org-element-cache-reset 'all) - (message "Cleared org-element cache for all buffers")) - (if (derived-mode-p 'org-mode) + (if (derived-mode-p 'org-mode) (progn (org-element-cache-reset) (message "Cleared org-element cache for current buffer")) - (user-error "Current buffer is not in org-mode")))) + (user-error "Current buffer is not in org-mode")) + (org-element-cache-reset 'all) + (message "Cleared org-element cache for all buffers"))) -;; Add to org keymap (keymap-set cj/org-map "c" #'cj/org-clear-element-cache) ;; ----------------------- Org Multi-Level Sorting ----------------------------- @@ -316,28 +314,8 @@ status to preserve priority ordering within TODO groups." (user-error nil))) (message "Sorted entries by TODO status and priority")) -;; ----------------------- Org Element Cache Reset ----------------------------- - -(defun cj/org-element-cache-reset-all () - "Reset the org-element cache in all org-mode buffers." - (interactive) - (let ((count 0)) - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (derived-mode-p 'org-mode) - (org-element-cache-reset) - (cl-incf count)))) - (message "Reset org-element cache in %d buffer%s" count (if (= count 1) "" "s")))) - ;; ------------------------------ Org Keybindings ------------------------------ -(defvar cj/org-keymap (make-sparse-keymap) - "Keymap for org commands under C-; O.") - -(global-set-key (kbd "C-; O") cj/org-keymap) - -(define-key cj/org-keymap (kbd "c") #'cj/org-element-cache-reset-all) - ;; which-key labels for org keymaps (with-eval-after-load 'which-key (which-key-add-key-based-replacements diff --git a/tests/test-org-config-keymap-ownership.el b/tests/test-org-config-keymap-ownership.el new file mode 100644 index 00000000..dd7d314d --- /dev/null +++ b/tests/test-org-config-keymap-ownership.el @@ -0,0 +1,55 @@ +;;; test-org-config-keymap-ownership.el --- Tests for Org keymap ownership -*- lexical-binding: t; -*- + +;;; Commentary: + +;; Ensure org-config owns C-; O through one keymap. + +;;; Code: + +(require 'ert) + +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) +(setq load-prefer-newer t) + +(defun org-appear-mode (&optional _arg) + "Stub `org-appear-mode' for loading org-config in batch tests.") +(provide 'org-appear) + +(require 'org-config) + +(ert-deftest test-org-config-keymap-ownership-normal-org-prefix-uses-org-map () + "C-; O should be mounted through `cj/org-map'." + (should (eq (keymap-lookup cj/custom-keymap "O") + cj/org-map))) + +(ert-deftest test-org-config-keymap-ownership-normal-clear-cache-on-org-map () + "The Org prefix should expose one cache-clear command on c." + (should (eq (keymap-lookup cj/org-map "c") + #'cj/org-clear-element-cache))) + +(ert-deftest test-org-config-keymap-ownership-regression-no-duplicate-org-keymap () + "The old duplicate `cj/org-keymap' binding should not exist." + (should-not (boundp 'cj/org-keymap))) + +(ert-deftest test-org-config-keymap-ownership-normal-clear-cache-defaults-all () + "Cache clear should reset all Org buffers by default." + (let ((current-prefix-arg nil) + (calls nil)) + (cl-letf (((symbol-function 'org-element-cache-reset) + (lambda (&optional arg) (push arg calls)))) + (cj/org-clear-element-cache)) + (should (equal calls '(all))))) + +(ert-deftest test-org-config-keymap-ownership-normal-prefix-clears-current-buffer () + "Cache clear should reset only the current Org buffer with a prefix." + (let ((current-prefix-arg '(4)) + (calls nil)) + (cl-letf (((symbol-function 'org-element-cache-reset) + (lambda (&optional arg) (push arg calls)))) + (with-temp-buffer + (setq major-mode 'org-mode) + (cj/org-clear-element-cache))) + (should (equal calls '(nil))))) + +(provide 'test-org-config-keymap-ownership) +;;; test-org-config-keymap-ownership.el ends here diff --git a/tests/test-org-sort-by-todo-and-priority.el b/tests/test-org-sort-by-todo-and-priority.el index cb9ce375..5ad7fccd 100644 --- a/tests/test-org-sort-by-todo-and-priority.el +++ b/tests/test-org-sort-by-todo-and-priority.el @@ -20,11 +20,15 @@ (require 'ert) (require 'org) +(setq load-prefer-newer t) ;; Stub variables needed by org-config before loading (defvar cj/custom-keymap (make-sparse-keymap) "Stub keymap for testing.") (defvar cj/org-map (make-sparse-keymap) "Stub org keymap for testing.") (defvar org-dir "/tmp/test-org/" "Stub org directory for testing.") +(defun org-appear-mode (&optional _arg) + "Stub `org-appear-mode' for loading org-config in batch tests.") +(provide 'org-appear) (require 'org-config) ; Defines cj/org-sort-by-todo-and-priority |
