Emacs: Fix org-clock opening up all your agenda files
This commit is contained in:
		
							parent
							
								
									61326287ce
								
							
						
					
					
						commit
						e854e540dd
					
				| @ -2451,7 +2451,64 @@ and there's no need for a middle-man when it's already been implemented. | ||||
| (setq org-directory "~/Notes/") | ||||
| 
 | ||||
| (evil-define-key 'normal calendar-mode-map (kbd "RET") #'org-calendar-select) | ||||
| ;; This is for org-clock-report | ||||
| (setq org-duration-format 'h:mm) | ||||
| #+end_src | ||||
| 
 | ||||
| There's an issue when I invoke ~org-clock-in~ where it seems to search all my | ||||
| ~org-agenda-files~ for any open clocks. This is a bit annoying as it opens all | ||||
| these files whenever I clock in, making clocking in slow. This fixes it but then | ||||
| existing clocks don't get resolved. | ||||
| 
 | ||||
| Here's a github [[https://github.com/doomemacs/doomemacs/issues/5317][issue]] describing a little bit about the problem; | ||||
| 
 | ||||
| #+begin_src emacs-lisp | ||||
| (with-eval-after-load 'org-clock | ||||
|   (defun joe/org-files-list () | ||||
|     "A version of `org-files-list' that doesn't open all `org-agenda-files'" | ||||
|     (let ((files '())) | ||||
|       (dolist (buf (buffer-list)) | ||||
|         (with-current-buffer buf | ||||
|           (when (and (derived-mode-p 'org-mode) (buffer-file-name)) | ||||
|             (cl-pushnew (expand-file-name (buffer-file-name)) files | ||||
|                         :test #'equal)))) | ||||
|       files)) | ||||
| 
 | ||||
|   (defun org-resolve-clocks (&optional only-dangling-p prompt-fn last-valid) | ||||
|     "Resolve all currently open Org clocks. | ||||
| If `only-dangling-p' is non-nil, only ask to resolve dangling | ||||
| \(i.e., not currently open and valid) clocks." | ||||
|     (interactive "P") | ||||
|     (unless org-clock-resolving-clocks | ||||
|       (let ((org-clock-resolving-clocks t)) | ||||
|         (dolist (file (joe/org-files-list)) | ||||
|           (let ((clocks (org-find-open-clocks file))) | ||||
|             (dolist (clock clocks) | ||||
|               (let ((dangling (or (not (org-clock-is-active)) | ||||
|                                   (/= (car clock) org-clock-marker)))) | ||||
|                 (if (or (not only-dangling-p) dangling) | ||||
|                     (org-clock-resolve | ||||
|                      clock | ||||
|                      (or prompt-fn | ||||
|                          (lambda (clock) | ||||
|                            (format | ||||
|                             "Dangling clock started %d mins ago" | ||||
|                             (floor (org-time-convert-to-integer | ||||
|                                     (time-since (cdr clock))) | ||||
|                                    60)))) | ||||
|                      (or last-valid | ||||
|                          (cdr clock)))))))))))) | ||||
| #+end_src | ||||
| 
 | ||||
| In this modified function, =dolist= processes the list returned by =buffer-list= | ||||
| instead of =org-files-list=. For each buffer in the list, we switch to it with | ||||
| =with-current-buffer= and then test if its major mode is =org-mode=. If it is, we | ||||
| process the clocks in that buffer as before. We find open clocks in the current | ||||
| buffer's associated file using =(buffer-file-name buffer)=. It's assumed that all | ||||
| Org mode buffers have associated files. | ||||
| #+end_src | ||||
| 
 | ||||
| 
 | ||||
| *** Visuals | ||||
| #+begin_src emacs-lisp | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user