From b21b6d24626c75fa7eb92974121bcc817ca4dbdf Mon Sep 17 00:00:00 2001 From: Riyyi Date: Sat, 13 Jul 2024 11:24:53 +0200 Subject: [PATCH] Emacs: Add worklog org-capture templates --- .config/emacs/site-lisp/dot-keybinds.el | 6 ++++ .config/emacs/site-lisp/dot-org-mode.el | 45 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/.config/emacs/site-lisp/dot-keybinds.el b/.config/emacs/site-lisp/dot-keybinds.el index 8a210e5..56c761d 100644 --- a/.config/emacs/site-lisp/dot-keybinds.el +++ b/.config/emacs/site-lisp/dot-keybinds.el @@ -485,6 +485,12 @@ "n r r" '(org-roam-buffer-toggle :which-key "Toggle buffer") "n r s" '(org-roam-ui-mode :which-key "Toggle server") + ;; Org + "o" '(:ignore t :which-key "org") + "o i" '(dot/org-clock-in :which-key "Clock in") + "o o" '(dot/org-clock-out :which-key "Clock out") + "o s" '(dot/org-switch-task :which-key "Switch task") + ;; Project "p" '(:keymap project-prefix-map :which-key "project") "p b" '(consult-project-buffer :which-key "project-switch-buffer") diff --git a/.config/emacs/site-lisp/dot-org-mode.el b/.config/emacs/site-lisp/dot-org-mode.el index 92d3e73..77ac915 100644 --- a/.config/emacs/site-lisp/dot-org-mode.el +++ b/.config/emacs/site-lisp/dot-org-mode.el @@ -46,6 +46,51 @@ (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) + (defun dot/org-find-or-create-heading (heading level) + "Find or create heading" + (if (re-search-forward (format org-complex-heading-regexp-format + (regexp-quote heading)) + nil t) + (beginning-of-line) + (goto-char (point-max)) + (unless (bolp) (insert "\n")) + (insert (concat (make-string level ?*) " ") heading "\n") + (beginning-of-line 0))) + + (defun dot/org-find-month-week-day () + "Find or create the journal tree for the current week under current month" + (unless (derived-mode-p 'org-mode) + (error "Target buffer \"%s\" for dot/find-org-week should be in Org mode" + (current-buffer))) + (org-capture-put-target-region-and-position) + (widen) + (goto-char (point-min)) + (dot/org-find-or-create-heading "Worklog" 1) + (org-narrow-to-subtree) + (dot/org-find-or-create-heading (format-time-string "%B") 2) ;; month + (org-narrow-to-subtree) + (dot/org-find-or-create-heading (format-time-string "Week %W") 3) + (org-narrow-to-subtree) + (dot/org-find-or-create-heading (format-time-string "%A") 4) ;; day + (org-end-of-subtree)) + + ;; Capture templates + (setq org-capture-templates + `(("i" "Clock in" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day) + "| %<%Y-%m-%d> | IN | %<%H:%M> | %^{Location|Office|Home|Office|Visit} |\n===================================%?" + :immediate-finish t) + ("o" "Clock out" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day) + "===================================\n| %<%Y-%m-%d> | OUT | %<%H:%M> |%?" + :immediate-finish t) + ("s" "Switch task" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day) + "| %<%Y-%m-%d> | %<%H:%M> | %^{Item ID} | X | %^{Description|-} |%?" + :immediate-finish t))) + + ;; Keybind functions + (defun dot/org-clock-in () (interactive) (org-capture nil "i")) + (defun dot/org-clock-out () (interactive) (org-capture nil "o")) + (defun dot/org-switch-task () (interactive) (org-capture nil "s")) + (with-eval-after-load 'evil-commands (defun dot/org-ret-at-point () "Org return key at point.