emacs.d/bundle/bundle--org.el

341 lines
13 KiB
EmacsLisp

(use-package org
:ensure nil
:hook ((org-mode . turn-on-auto-fill)
(org-mode . abbrev-mode)
(org-mode . flyspell-mode))
:init (org-clock-persistence-insinuate)
:bind
(("C-c l" . org-store-link)
("C-c a" . org-agenda)
("C-c c" . org-capture)
("C-c b" . org-switchb))
:init
(org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")
(setq org-capture-templates '())
:custom
(abbrev-suggest t)
(org-hide-emphasis-markers nil)
(org-default-notes-file "notes.org")
(org-insert-mode-line-in-empty-file t)
(org-adapt-indentation nil)
(org-agenda-prefix-format
'((agenda . " %i %-12:c%?-12t%-6e% s")
(todo . " %i %-12:c %-6e")
(tags . " %i %-12:c")
(search . " %i %-12:c")))
(org-agenda-dim-blocked-tasks nil)
(org-agenda-inhibit-startup nil)
(org-agenda-span 14)
(org-agenda-start-on-weekday 1)
(org-agenda-include-diary t)
(org-clock-out-remove-zero-time-clocks t)
(org-clock-persist t)
(org-clock-rounding-minutes 30)
(org-confirm-babel-evaluate nil)
(org-duration-format (quote h:mm))
(org-export-dispatch-use-expert-ui nil)
(org-export-default-language "en")
(org-export-with-smart-quotes t)
(org-export-with-emphasize t)
(org-export-with-special-strings t)
(org-export-with-fixed-width t)
(org-export-with-timestamps nil)
(org-export-preserve-breaks nil)
(org-export-with-sub-superscripts nil)
(org-export-with-archived-trees nil)
(org-export-with-author t)
(org-export-with-broken-links t)
(org-export-with-clocks nil)
(org-export-with-creator nil)
(org-export-with-drawers nil)
(org-export-with-date t)
(org-export-with-entities t)
(org-export-with-email t)
(org-export-with-footnotes t)
(org-export-headline-levels 3)
(org-export-with-inlinetasks nil)
(org-export-with-section-numbers t)
(org-export-with-planning nil)
(org-export-with-priority nil)
(org-export-with-properties nil)
(org-export-with-statistics-cookies nil)
(org-export-with-tags nil)
(org-export-with-tasks nil)
(org-export-with-latex t)
(org-export-time-stamp-file nil)
(org-export-with-title t)
(org-export-with-toc t)
(org-export-with-todo-keywords nil)
(org-export-with-tables t)
(org-export-date-timestamp-format "%a, %d %b %Y %R %z")
(org-confirm-babel-evaluate nil)
(org-export-backends '(ascii html latex md odt texinfo))
(org-global-properties '(("EFFORT_ALL" . "0:30 1:00 2:00 3:00 5:00 8:00")))
(org-html-doctype "html5")
(org-html-html5-fancy t)
(org-log-done (quote time))
(org-refile-targets '((nil :maxlevel . 3)))
(org-startup-folded t)
(org-startup-truncated nil)
(org-src-fontify-natively t)
(org-src-tab-acts-natively t)
(org-src-window-setup 'other-window)
(org-time-stamp-rounding-minutes '(30 30))
(org-todo-keywords
'((sequence "TODO" "DOING(!)" "DONE(!)")
(sequence "RECRUIT" "INTERVIEW" "QDA" "DOC" "REVIEW")))
(org-use-property-inheritance nil)
(org-attach-store-link-p 'attached)
:config
(setq time-stamp-active t
time-stamp-start "#\\+[dD][aA][tT][eE]:[ \t]*"
time-stamp-end "$"
time-stamp-format "[%Y-%02m-%02d %3a]")
(add-hook 'before-save-hook 'time-stamp nil)
(when (eq system-type 'windows-nt)
(setq org-babel-sqlite3-command "c:/msys64/ucrt64/bin/sqlite3.exe"))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t) (lisp . t) (gnuplot . t) (python . t) (sqlite . t) (shell . t) (plantuml . t) (C . t)))
;; work with org-agenda dispatcher [c] "Today Clocked Tasks" to view today's clocked tasks.
(defun org-agenda-log-mode-colorize-block ()
"Set different line spacing based on clock time duration."
(save-excursion
(let* ((colors (cl-case (alist-get 'background-mode (frame-parameters))
('light (list "#d8dee9" "#e5e9f0" "#eceff4"))
('dark (list "#bf616a" "#d08770" "#ebcb8b" "#a3be8c" "#b48ead"))))
pos
duration)
(nconc colors colors)
(goto-char (point-min))
(while (setq pos (next-single-property-change (point) 'duration))
(goto-char pos)
(when (and (not (equal pos (point-at-eol)))
(setq duration (org-get-at-bol 'duration)))
;; larger duration bar height
(let ((line-height (if (< duration 15) 1.0 (+ 0.5 (/ duration 30))))
(ov (make-overlay (point-at-bol) (1+ (point-at-eol)))))
(overlay-put ov 'face `(:background ,(car colors) :foreground "black"))
(setq colors (cdr colors))
(overlay-put ov 'line-height line-height)
(overlay-put ov 'line-spacing (1- line-height))))))))
(add-hook 'org-agenda-finalize-hook #'org-agenda-log-mode-colorize-block))
(setq org-html-protect-char-alist
'(("&" . "&amp;")
("<" . "&lt;")
(">" . "&gt;")
(":lambda:" . "&#955;")
(":python:" . "&#128013;")
(":whale:" . "&#128051;")
(":turtle:" . "&#x1f422;")
(":dash:" . "&#x1f4a8;")
(":party:" . "&#129395;")
(":see-no-evil:" . "&#128584;")
(":cloud:" . "&#9729;&#65039;")
(":abacus:" . "&#129518;")
(":desktop:" . "&#128421;&#65039;")
(":rocket:" . "&#128640;")
(":unicorn:" . "&#129412;")
(":recycling:" . "&#9851;")
(":crystalball:" . "&#128302;")
(":photography:" . "&#128247;")
(":money:" . "&#128181;")
(":-)" . "&#x1f60a;")
(":-(" . "&#x1f61e;")))
(defun mk/link-to-current-task ()
"Return an Org link to the current clocked-in task, if any, or prompt for manual entry."
(if (org-clock-is-active)
(with-current-buffer (marker-buffer org-clock-marker)
(save-excursion
(goto-char org-clock-marker)
(format ":TASK_ID: [[id:%s][%s]]" (org-id-get) (org-get-heading t t))))
(let ((manual-id (read-string "Enter Task ID (leave empty if not applicable): ")))
(unless (string-empty-p manual-id)
(format ":TASK_ID: [[id:%s][Task]]" manual-id)))))
(add-to-list 'org-capture-templates
`("n" "Note" entry (file+headline "agenda/notes.org" "Notes")
,(concat "* %? :NOTE:\n"
":PROPERTIES:\n"
"%(mk/link-to-current-task)\n"
":END:\n"
"%i\n%a\n"
"Entered on: %U\n")))
;; A task can be everything to do which involves some kind of physical activity.
(add-to-list 'org-capture-templates
`("t" "Task" entry (file "agenda/tasks.org")
,(format "* TODO %%? :TASK:\n:PROPERTIES:\n:ID: %s\n:END:\nEntered on %%U\n%%a" (org-id-new))))
;; A journal is an unordered collection of thougths and ideas.
(add-to-list 'org-capture-templates
'("j" "Journal" entry (file+olp+datetree "agenda/journal.org")
"* %T - End of Day Reflection :JOURNAL:\n- What went well today?\n %?\n- What could have been improved?\n \n- What will I focus on tomorrow?\n "
:empty-lines 1))
;; Remember me of an important event.
(add-to-list 'org-capture-templates
'("a" "Appointment" entry (file "agenda/appointments.org")
"* %? :APPOINTMENT:\n%T\n"))
;; Capture a meeting
(add-to-list 'org-capture-templates
'("m" "Meeting" entry (file "agenda/meetings.org")
"* %^{Topic} :MEETING:\n%T\n%?"
:clock-in t
:empty-lines 1))
;; Capture activities in a chronological order.
(add-to-list 'org-capture-templates
'("l" "Log" entry (file+olp+datetree "agenda/logbook.org")
"* %T - %^{Activity} :LOG:\n%?"
:clock-in t
:empty-lines 1))
(add-to-list 'org-capture-templates
'("u" "UTM Parameters" entry (file+headline "utm.org" "UTM Parameters")
"* %^{Campaign Name}\n:PROPERTIES:\n:Source: %^{utm_source}\n:Medium: %^{utm_medium}\n:Term: %^{utm_term}\n:Content: %^{utm_content}\n:END:\n"))
(add-to-list 'org-capture-templates
'("b" "Bookmark" table-line (file+headline "bookmarks.org" "Bookmarks")
"| %^{URL} | %^{Tags} | %u |" :prepend t))
(add-to-list 'org-capture-templates
'("c" "Code Snippet" entry (file+headline "code.org" "Snippets")
"* %?\n#+begin_src %^{language}\n%i\n#+end_src"))
(add-to-list 'org-capture-templates
'("H" "How Might We" entry (file+headline "interviews.org" "HMW Questions")
"* HOW MIGHT WE %? :HMW:\n%U\n** Interviewee: %^{Interviewee}\n** Context: %^{Context}\n"))
(add-to-list 'org-capture-templates
'("i" "Interview Question" entry (file+headline "interviews.org" "Questions")
"* %^{Interview Topic} :INTERVIEW:\n:PROPERTIES:\n:Project: %^{Project Name}\n:Date: %T\n:END:\n- %?\n"))
(add-to-list 'org-capture-templates
`("p" "Project" entry (file "projects.org")
,(format "* %%^{Project Name} :PROJECT:\n:PROPERTIES:\n:ID: %s\n:Start Date: %%T\n:End Date: %%^{End Date}\n:END:\n** Objective\n%%?\n** Challenges\n- [ ] %%^{Challenge 1}\n- [ ] %%^{Challenge 2}\n" (org-id-new))))
(add-to-list 'org-capture-templates
'("a" "Achievement" entry (file+datetree "achievements.org")
"* %^{Achievement Title} :ACHIEVEMENT:\n:PROPERTIES:\n:Project: %^{Project Name}\n:Date: %T\n:END:\n- Description: %?\n- Impact: %^{Impact}\n- Associated Tasks: %^{Tasks}\n"))
(require 'request)
(defun fetch-gitlab-issue-and-capture ()
(interactive)
(let ((project-id (read-string "Enter GitLab Project ID: "))
(issue-id (read-string "Enter GitLab Issue ID: "))
(gitlab-token (getenv "GITLAB_TOKEN")))
(unless gitlab-token
(error "GITLAB_TOKEN environment variable not set"))
(request
(format "https://code.siemens.com/api/v4/projects/%s/issues/%s" project-id issue-id)
:headers `(("Private-Token" . ,gitlab-token))
:parser 'json-read
:success (cl-function
(lambda (&key data &allow-other-keys)
(org-capture nil "g")
(let ((title (assoc-default 'title data))
(description (assoc-default 'description data)))
(insert (format "%s\n%s" title description))))))))
(add-to-list 'org-capture-templates
'("g" "GitLab Issue" entry (file "gitlab_issues.org")
"* %?"))
(global-set-key (kbd "C-c g") 'fetch-gitlab-issue-and-capture)
(use-package org-roam
:after org
:init
(setq org-roam-v2-ack t)
(setq org-roam-db-location "~/org-roam.db")
(require 'org-roam-dailies)
:bind (("C-c r l" . org-roam-buffer-toggle)
("C-c r f" . org-roam-node-find)
("C-c r g" . org-roam-graph)
("C-c r i" . org-roam-node-insert)
("C-c r c" . org-roam-capture)
("C-c r j" . org-roam-dailies-map)
:map org-roam-dailies-map
("t" . org-roam-dailies-capture-today)
("y" . org-roam-dailies-capture-yesterday)
("T" . org-roam-dailies-capture-tomorrow)
:map org-mode-map
("C-M-i" . completion-at-point))
:custom
(org-roam-completion-everywhere nil)
(org-roam-dailies-capture-templates
'(("d" "default" entry "* %<%R> %?"
:if-new (file+head "%<%F>.org" "#+title: %<%F>\n"))))
(org-roam-capture-templates
'(("d" "default" plain
"%?"
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+date: %U\n")
:unnarrowed t)
("n" "Note" plain
"%?"
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+date: %U\n%l\n\n%i")
:unnarrowed t)
("p" "user" plain
"%?"
:if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+date: %U\n* Jobs\n* Pains\n* Gains\n")
:unnarrowed t))))
(use-package org-tree-slide
:bind ("<f5>" . org-tree-slide-mode)
:custom
(org-image-actual-width nil))
(use-package org-web-tools
:defer t
:custom (org-web-tools-pandoc-sleep-time 0.4))
;; (use-package ob-go
;; :after org)
(use-package ox-reveal
:after org)
;; (use-package ox-pandoc
;; :after org
;; :custom
;; (org-pandoc-options-for-beamer-pdf '((pdf-engine . "xelatex"))))
;; (defun me/write-readme-md-on-save ()
;; ;; when README.org, also write README.md on save
;; (when (string-match "README" (buffer-file-name))
;; (make-local-variable 'after-save-hook)
;; (add-hook 'after-save-hook
;; (lambda () (let ((outfile (org-export-output-file-name ".md")))
;; (org-export-to-file 'md outfile))))))
;; (add-hook 'org-mode-hook 'me/write-readme-md-on-save)
;; (use-package ob-go
;; :after org
;; :config
;; (append '((go . t)) org-babel-load-languages))
(use-package ob-http
:after org
:config
(append '((http . t)) org-babel-load-languages))
;; (use-package ob-racket
;; :after org
;; :pin manual
;; :config
;; (append '((racket . t) (scribble . t)) org-babel-load-languages))
;; (use-package ox-rss
;; :after org)
(use-package ob-restclient
:after org
:config
(append '((restclient . t)) org-babel-load-languages))