;;; my-org.el --- Configure org-mode ;;; Commentary: ;;; Code: (require 'use-package) (require 's) (defvar my/org-directory (if (memq window-system '(mac ns)) (expand-file-name "~/workspace/notebooks/") (expand-file-name "~/documents/notes/"))) (defun my/clipboard-get-contents () "Return the contents of the system clipboard as a string." (condition-case nil (cond ((fboundp 'ns-get-pasteboard) (ns-get-pasteboard)) ((and (featurep 'mac) (fboundp 'gui-get-selection)) (gui-get-selection 'CLIPBOARD 'NSStringPboardType)) ((and (featurep 'mac) (fboundp 'x-get-selection)) (x-get-selection 'CLIPBOARD 'NSStringPboardType)) ((fboundp 'gui-get-selection) (gui-get-selection 'CLIPBOARD (or x-select-request-type 'UTF8_STRING))) (t (error "Clipboard support not available"))))) (use-package org-ml :ensure t) (use-package htmlize :ensure t) (use-package org :ensure t :commands (org-check-agenda-file org-protocol-capture) :mode (("\\.txt\\'" . org-mode)) :hook ((org-mode . org-indent-mode) (org-mode . org-hide-block-all) (org-mode . visual-line-mode) (org-capture-after-finalize . org-save-all-org-buffers) (org-capture-prepare-finalize . org-save-all-org-buffers)) :bind (("C-c c" . org-capture)) :init ;; save all the org buffers after refilling tasks (advice-add 'org-refile :after (lambda (&rest _) (org-save-all-org-buffers))) :config (defvar load-language-list '((emacs-lisp . t) (python . t) (shell . t))) (use-package ob-go :ensure t :init (cl-pushnew '(go . t) load-language-list)) (org-babel-do-load-languages 'org-babel-load-languages load-language-list) :custom (org-directory my/org-directory) ;; hide emphasis markup (org-hide-emphasis-markers t) ;; when archiving, inherit the tags from the parent (org-archive-subtree-add-inherited-tags t) ;; display unicode characters (org-pretty-entities t) ;; log the time of completion (org-log-done 'time) (org-log-into-drawer t) (org-startup-indented t) (org-cycle-separator-lines 0) (org-startup-folded 'content) (org-todo-keywords '((sequence "TODO" "STARTED" "WAITING" "|" "DONE" "CANCELED"))) ;; priorities (org-priority-start-cycle-with-default nil) ;; Start one over/under default value. (org-highest-priority ?A) (org-lowest-priority ?D) (org-default-priority ?C) ;; Ensures unset tasks have low priority. ;; refile (org-refile-use-cache nil) (org-refile-targets `((,(expand-file-name "tasks.org" org-directory) :maxlevel . 1) (,(expand-file-name "notes.org" org-directory) :maxlevel . 1) (,(expand-file-name "projects.org" org-directory) :tag . "project"))) (org-refile-use-outline-path 'file) (org-outline-path-complete-in-steps nil) (org-refile-allow-creating-parent-nodes 'confirm) ;; org babel related ;; prevent the conversion of spaces into tabs (necessary for Python code exports) (org-src-fontify-natively t) (org-src-preserve-indentation t) (org-edit-src-content-indentation t) ;; I want to follow links on RET (org-return-follows-link t) ;; some configurations for exporting document (org-export-with-toc nil) (org-export-with-section-numbers nil) ;; A few abbreviations I use regularly (org-link-abbrev-alist '(("src" . "~/workspace/%s") ("jira" . "https://jira.rbx.com/browse/%s") ("go" . "http://go/%s"))) ;; entries (org-blank-before-new-entry nil) (org-blank-before-new-entry (quote ((heading . nil) (plain-list-item . nil)))) ;; see https://github.com/abo-abo/swiper/issues/986 (org-goto-interface 'outline-path-completion) (org-reverse-note-order t)) (use-package org-agenda :ensure nil :after (org) :bind (("C-c a" . org-agenda)) :custom (org-agenda-files `(,(expand-file-name "inbox.org" org-directory) ,(expand-file-name "notes.org" org-directory) ,(expand-file-name "tasks.org" org-directory) ,(expand-file-name "projects.org" org-directory) ,(expand-file-name "bookmarks.org" org-directory) ,(expand-file-name "journal.org" org-directory))) (org-agenda-show-all-dates t) (calendar-week-start-day 1) (org-agenda-custom-commands nil) (org-agenda-start-on-weekday 1) :config (add-to-list 'org-agenda-custom-commands '("A" "Agenda" ((agenda "" ((org-agenda-span 'week))) (todo "TODO" ((org-agenda-overriding-header "To Refile") (org-agenda-files `(,(expand-file-name "inbox.org" org-directory))))) (todo "STARTED" ((org-agenda-overriding-header "In Progress"))) (todo "WAITING" ((org-agenda-overriding-header "Blocked"))) (todo "TODO" ((org-agenda-overriding-header "Not yet started") (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled)))))))) (use-package org-web-tools :ensure t) (use-package org-capture :ensure nil :after (org org-web-tools) :preface (defun my/org-capture-link () "Make a TODO entry with a link in clipboard. The page title is used as an entry heading." (let* ((url-string (s-trim (my/clipboard-get-contents))) (pdf (string-suffix-p "pdf" url-string))) (unless pdf (let ((page-title (org-web-tools--html-title (org-web-tools--get-url url-string)))) (concat "* " page-title "\t%^g" "\n:PROPERTIES:\n:CREATED: %T\n:URL: " url-string "\n:END:\n%?"))))) :custom (org-capture-templates `(("t" "Todo" entry (file "inbox.org") "* TODO [#D] %?\n:PROPERTIES:\n:CREATED: %U\n:END:\n") ("n" "Note" entry (file "notes.org") "* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n") ("l" "Bookmark" entry (file "bookmarks.org") (function my/org-capture-link)) ("j" "Journal" entry (file+olp+datetree "journal.org") "* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n" :tree-type day)))) (provide 'my-org) ;;; my-org.el ends here