;;; 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) (require 'org) (require 'org-agenda) (require 'org-capture) (defun my/visit-todo () "Visit TODO.org in home." (interactive) (find-file "~/eris/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 "~/eris/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) ("~/eris/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 "~/eris/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.