dotfiles/emacs-lisp/org_roam.org
main a5a651dbb9
Large rework and cleanup
Signed-off-by: main <magic_rb@redalder.org>
2022-07-31 11:03:59 +02:00

145 lines
4.2 KiB
Org Mode

:PROPERTIES:
:ID: 18476d68-cccb-48f4-aa77-caefe213d8bd
:END:
#+title: Org Roam
#+filetags: emacs-load
# SPDX-FileCopyrightText: 2022 Richard Brežák <richard@brezak.sk>
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#+BEGIN_NOTE
When exporting, running ~(org-id-update-id-locations (directory-files-recursively org-roam-directory ".org"))~
#+END_NOTE
#+BEGIN_SRC emacs-lisp :tangle no :results none
(defun replace-in-string (what with in)
(replace-regexp-in-string (regexp-quote what) with in nil 'literal))
(defun org-html--format-image (source attributes info)
(progn
(setq source (replace-in-string "%20" " " source))
(format "<img src=\"data:image/%s+xml;base64,%s\"%s />"
(or (file-name-extension source) "")
(base64-encode-string
(with-temp-buffer
(insert-file-contents-literally source)
(buffer-string)))
(file-name-nondirectory source))))
#+END_SRC
#+BEGIN_QUOTE
Org-roam is a plain-text knowledge management system. It brings some of Roam's more powerful features into the Org-mode ecosystem.
#+END_QUOTE
#+BEGIN_WARNING
SQLite3 must be on Emacs' PATH!
#+END_WARNING
#+BEGIN_SRC emacs-lisp :results none
(use-package org-roam
:straight t
:init
(setq org-roam-v2-ack t)
:config
(add-hook 'after-init-hook 'org-roam-setup)
;; Add ignore for SyncThing
(setq org-roam-file-exclude-regexp "\\.stversions")
(setq org-roam-directory "~/roam")
(setq org-roam-capture-templates
`(("e" "Emacs Lisp" plain "%?"
:target (file+head "emacs-lisp/${slug}.org"
"#+title: ${title}\n#+filetags: emacs-load")
:unnarrowed t)
("d" "default" plain "%?"
:target (file+head "%<%Y%m%d%H%M%S>-${slug}.org"
"#+title: ${title}\n")
:unnarrowed t)))
;; Add more informative completion interface
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:30}" 'face 'org-tag)))
(defun magic_rb/org-roam-buffer-hook ()
(when (org-roam-buffer-p)
(make-local-variable 'org-link-frame-setup)
(add-to-list 'org-link-frame-setup '(file . find-file))))
(add-hook 'org-mode-hook 'magic_rb/org-roam-buffer-hook)
(defun magic_rb/org-roam-hook ()
(visual-line-mode))
(add-hook 'org-roam-mode-hook 'magic_rb/org-roam-hook))
(use-package shackle
:straight t
:init
(shackle-mode))
(with-eval-after-load 'shackle
(with-eval-after-load 'org-roam
(setq shackle-rules
'((org-roam-mode
:align right
:size 0.25
:popup t)))))
#+END_SRC
* Ref Capture
Using ~org-protocol~, one can capture a website from their browser directly into Org Roam.
#+BEGIN_SRC emacs-lisp
(with-eval-after-load "org-roam"
(require 'org-roam-protocol)
(setq org-roam-capture-ref-templates
`(("r" "ref" plain "%?"
:target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n\n${body}")
:unnarrowed t))))
#+END_SRC
Then you need a desktop entry for ~org-protocol~. Such as:
#+BEGIN_SRC conf-desktop
[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;
#+END_SRC
or in Nix form:
#+BEGIN_SRC nix
makeDesktopItem {
name = "Org-Protocol";
exec = "emacsclient %u";
comment = "Org protocol";
desktopName = "org-protocol";
type = "Application";
mimeType = "x-scheme-handler/org-protocol";
}
#+END_SRC
Lastly a bookmarklet in Firefox.
#+BEGIN_SRC javascript
javascript:location.href ='org-protocol://roam-ref?template=r&ref=' + encodeURIComponent(location.href) + '&title=' + encodeURIComponent(document.title) + '&body=' + encodeURIComponent(window.getSelection())
#+END_SRC
* Export
#+begin_src emacs-lisp :tangle no :results none
(require 'org-roam-export)
(setq org-publish-project-alist
'(("org"
:base-directory "~/roam/"
:publishing-function org-html-publish-to-html
:publishing-directory "~/roam/published"
:section-numbers nil
:with-toc t
)))
(org-publish "org" t)
#+end_src