syscfg/emacs/module/module-org.el

124 lines
4.1 KiB
EmacsLisp

;;; module-org.el --- org-mode
;;;
;;; Commentary:
;;;
;;; Setup org-mode and extensions for Emacs.
;;;
;;; Code:
(require 'module-pkg)
(pkg/require 'org)
(pkg/require 'ox-clip)
(pkg/require 'org-board)
(pkg/require 'org-index)
(pkg/require 'org-ai)
(require 'org)
(require 'org-agenda)
(require 'org-capture)
(defun my/visit-todo ()
"Visit TODO.org in home."
(interactive)
(find-file "~/TODO.org"))
(defun my/kill-all-org-agenda-buffers ()
"Close all org-agenda-related buffers."
(interactive)
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(when (or (derived-mode-p 'org-agenda-mode)
(and (buffer-file-name)
(member (buffer-file-name) (org-agenda-files))))
(kill-buffer buffer))))
(message "Closed all org-agenda-related buffers."))
(defun my-org-agenda-format-item (item)
"Format an agenda or to-do ITEM without the filename, but keep the keyword."
(let* ((marker (or (get-text-property 0 'org-marker item)
(get-text-property 0 'org-hd-marker item)))
(line (when marker
(org-with-point-at marker
(buffer-substring (line-beginning-position) (line-end-position)))))
(todo-keyword (when marker
(org-with-point-at marker
(org-get-todo-state))))
(truncated-line (when line
(replace-regexp-in-string "^\\[#[A-Z]\\] " "" line))))
(if truncated-line
(let ((clean-item (replace-regexp-in-string "^\\(\\*+ \\)" "" truncated-line)))
(if todo-keyword
(concat todo-keyword " " (replace-regexp-in-string (concat "^" todo-keyword " ?") "" clean-item))
clean-item))
item)))
(defun my/add-remote-todo-file ()
"Add remote TODO.org file to org-agenda-files."
(interactive)
(unless org-agenda-files
(setq org-agenda-files
(list "~/TODO.org"))))
;; org-mode general settings
(setq org-adapt-indentation nil
org-archive-location "%s_archive::datetree/"
org-log-done 'note
org-log-into-drawer t
org-outline-path-complete-in-steps nil
org-stuck-projects '("+prj/-maybe-someday"
("TODO" "WAIT" "CNCL" "prj")
nil
"")
org-tags-exclude-from-inheritance '("prj")
org-todo-keywords '((sequence "HOLD(h)" "TODO(t)" "WAIT(w)" "|"
"DONE(d)" "CNCL(x)"))
org-todo-keyword-faces
'(("HOLD" . (:foreground "orange" :weight bold))
("TODO" . (:foreground "red" :weight bold))
("DONE" . (:foreground "green" :weight bold))
("CNCL" . (:foreground "gray" :weight bold))))
;; org-agenda settings
(setq org-agenda-prefix-format '((agenda . "%i %?-12t% s ")
(todo . " %i ")
(tags . " %i ")
(search . " %i "))
org-agenda-inhibit-startup t
org-agenda-hide-tags-regexp "."
org-agenda-todo-keyword-format "%s"
org-agenda-hide-tags-regexp nil
org-agenda-tags-column -80)
;; org-refile settings
(setq org-refile-targets
'((nil :maxlevel . 9)
("~/TODO.org" :maxlevel . 9))
org-refile-use-outline-path 'file
org-refile-allow-creating-parent-nodes 'confirm)
;; org-capture settings
(setq org-capture-templates
'(("t" "TODO" entry (file "~/TODO.org")
"* TODO %?\n %i" :prepend t)))
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(advice-add 'org-agenda :before #'my/add-remote-todo-file)
(advice-add 'org-agenda-format-item-line
:filter-return #'my-org-agenda-format-item)
(advice-add 'org-agenda-format-item
:filter-return #'my-org-agenda-format-item)
(org-babel-do-load-languages 'org-babel-load-languages
'((shell . t)))
;; key bindings
(global-set-key (kbd "C-x c O") 'my/reload-org-config)
(global-set-key (kbd "C-x O a") 'org-agenda)
(global-set-key (kbd "C-x O c") 'org-capture)
(global-set-key (kbd "C-x O t") 'my/visit-todo)
(global-set-key (kbd "C-x O k") 'my/kill-all-org-agenda-buffers)
(provide 'module-org)
;;; module-org.el ends here.