You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1364 lines
45 KiB
1364 lines
45 KiB
\input texinfo @c -*- texinfo -*- |
|
@c %**start of header |
|
@setfilename org-roam.info |
|
@settitle Org-roam User Manual |
|
@documentencoding UTF-8 |
|
@documentlanguage en |
|
@c %**end of header |
|
|
|
@copying |
|
@quotation |
|
Copyright (C) 2020-2020 Jethro Kuan <jethrokuan95@@gmail.com> |
|
|
|
You can redistribute this document and/or modify it under the terms |
|
of the GNU General Public License as published by the Free Software |
|
Foundation, either version 3 of the License, or (at your option) any |
|
later version. |
|
|
|
This document is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU |
|
General Public License for more details. |
|
|
|
@end quotation |
|
@end copying |
|
|
|
@dircategory Emacs |
|
@direntry |
|
* Org-roam: (org-roam). Rudimentary Roam Replica for Emacs. |
|
@end direntry |
|
|
|
@finalout |
|
@titlepage |
|
@title Org-roam User Manual |
|
@subtitle for version 1.2.0 |
|
@author Jethro Kuan |
|
@page |
|
@vskip 0pt plus 1filll |
|
@insertcopying |
|
@end titlepage |
|
|
|
@contents |
|
|
|
@ifnottex |
|
@node Top |
|
@top Org-roam User Manual |
|
|
|
@noindent |
|
|
|
This manual is for Org-roam version 1.2.0. |
|
|
|
@quotation |
|
Copyright (C) 2020-2020 Jethro Kuan <jethrokuan95@@gmail.com> |
|
|
|
You can redistribute this document and/or modify it under the terms of the GNU |
|
General Public License as published by the Free Software Foundation, either |
|
version 3 of the License, or (at your option) any later version. |
|
|
|
This document is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU |
|
General Public License for more details. |
|
|
|
@end quotation |
|
@end ifnottex |
|
|
|
@menu |
|
* Introduction:: |
|
* A Brief Introduction to the Zettelkasten Method:: |
|
* Installation:: |
|
* Getting Started:: |
|
* Anatomy of an Org-roam File:: |
|
* The Templating System:: |
|
* Concepts and Configuration:: |
|
* Navigating Around:: |
|
* Encryption:: |
|
* Graphing:: |
|
* Org-roam Completion System:: |
|
* Roam Protocol:: |
|
* Daily Notes:: |
|
* Diagnosing and Repairing Files:: |
|
* Appendix:: |
|
* FAQ:: |
|
|
|
@detailmenu |
|
--- The Detailed Node Listing --- |
|
|
|
Installation |
|
|
|
* Installing from MELPA:: |
|
* Installing from the Git Repository:: |
|
* Post-Installation Tasks:: |
|
|
|
Anatomy of an Org-roam File |
|
|
|
* Titles:: |
|
* Tags:: |
|
* File Refs:: |
|
|
|
The Templating System |
|
|
|
* Template Walkthrough:: |
|
* Org-roam Template Expansion:: |
|
|
|
Concepts and Configuration |
|
|
|
* Directories and Files:: |
|
* The Org-roam Buffer:: |
|
* Org-roam Links:: |
|
* Org-roam Files:: |
|
|
|
Navigating Around |
|
|
|
* Index File:: |
|
|
|
Graphing |
|
|
|
* Graph Options:: |
|
* Excluding Nodes and Edges:: |
|
|
|
Roam Protocol |
|
|
|
* _:: |
|
* Installation: Installation (1). |
|
* The @samp{roam-file} protocol:: |
|
* The @samp{roam-ref} Protocol:: |
|
|
|
Appendix |
|
|
|
* Note-taking Workflows:: |
|
* Ecosystem:: |
|
|
|
Ecosystem |
|
|
|
* Deft:: |
|
* Org-journal:: |
|
* Note-taking Add-ons:: |
|
|
|
|
|
FAQ |
|
|
|
* How do I have more than one Org-roam directory?:: |
|
* How do I migrate from Roam Research?:: |
|
|
|
@end detailmenu |
|
@end menu |
|
|
|
@node Introduction |
|
@chapter Introduction |
|
|
|
Org-roam is a @uref{https://roamresearch.com/, Roam Research} replica built around the |
|
all-powerful @uref{https://orgmode.org/, Org-mode}. |
|
|
|
Org-roam is a solution for effortless non-hierarchical note-taking |
|
with Org-mode. With Org-roam, notes flow naturally, making note-taking |
|
fun and easy. Org-roam should also work as a plug-and-play solution |
|
for anyone already using Org-mode for their personal wiki. |
|
|
|
To understand more about Roam, a collection of links are available in |
|
@ref{Note-taking Workflows}. |
|
|
|
Org-roam aims to implement the core features of Roam, leveraging the |
|
mature ecosystem around Org-mode where possible. Eventually, we hope |
|
to further introduce features enabled by the Emacs ecosystem. |
|
|
|
Org-roam provides several benefits over other tooling: |
|
|
|
@table @asis |
|
@item Privacy and Security |
|
Edit your personal wiki completely offline, entirely in your control. Encrypt your notes with GPG@. |
|
@item Longevity of Plain Text |
|
Unlike web solutions like Roam research, the notes are first and foremost plain Org-mode files -- Org-roam simply builds up an auxilliary database to give the personal wiki superpowers. Having your notes in plain-text is crucial for the longevity of your wiki. Never have to worry about proprietary web solutions being taken down. Edit your plain-text notes in notepad if all other editors cease to exist |
|
@item Free and Open Source |
|
Org-roam is free and open-source, which means that if you feel unhappy with any part of Org-roam, you may choose to extend Org-roam, or open a PR@. |
|
@item Leverages the Org-mode ecosystem |
|
Over the years, Emacs and Org-mode has developed into a mature system for plain-text organization. Building upon Org-mode already puts Org-roam light-years ahead of many other solutions. |
|
@item Built on Emacs |
|
Emacs is also a fantastic interface for editing text, and we can inherit many of the powerful text-navigation and editing packages available to Emacs. |
|
@end table |
|
|
|
@node A Brief Introduction to the Zettelkasten Method |
|
@chapter A Brief Introduction to the Zettelkasten Method |
|
|
|
Org-roam provides utilities for maintaining a digital slip-box. This section |
|
aims to provide a brief introduction to the ``slip-box'', or ``Zettelkasten'' |
|
method. By providing some background on the method, we hope that the design |
|
decisions of Org-roam will become clear, and that will aid in using Org-roam |
|
appropriately. In this section we will also introduce terms commonly used within |
|
the Zettelkasten community, which will also commonly appear in the Org-roam |
|
forums and channels of discussion. |
|
|
|
The Zettelkasten method of note-taking is designed to increase research |
|
productivity: in particular, it acts as a research partner, where conversations |
|
with it may produce new and surprising lines of thought. This method is |
|
attributed to German sociologist Niklas Luhmann, who using the method had |
|
produced volumes of written works. |
|
|
|
In its paper form, the slip-box is simply a box of cards. These cards are small |
|
-- often only large enough to fit a single concept. The size limitation |
|
encourages ideas to be broken down into individual concepts. These ideas are |
|
explicitly linked together. The breakdown of ideas encourages tangential |
|
exploration of ideas, increasing the surface for thought. Making linking |
|
explicit between notes also encourages one to think about the connections |
|
between concepts. |
|
|
|
Org-roam is the slip-box, digitalized in Org-mode. Every zettel (card) is a |
|
plain-text, Org-mode file. These files are often placed in the same directory. |
|
In the same way one would maintain a paper slip-box, Org-roam makes it easy to |
|
create new zettels, pre-filling boilerplate content using a powerful templating |
|
system. Org-roam also facilitates the linking of zettels using Org-mode @code{file:} |
|
links. |
|
|
|
A slip-box requires a method of quickly capturing ideas. These are called |
|
@strong{fleeting notes}: they are simple reminders of information or ideas that will |
|
need to be processed later on, or trashed. This is typically accomplished using |
|
@code{org-capture} (see @ref{capture,,,org,}), or using Org-roam's daily notes |
|
functionality (see @ref{Daily Notes}). This provides a central inbox for collecting |
|
thoughts, to be processed later into permanent notes. |
|
|
|
Permanent notes are further split into two categories: @strong{literature notes} and |
|
@strong{concept notes}. Literature notes can be brief annotations on a particular |
|
source (e.g. book, website or paper), that you'd like to access later on. |
|
Concept notes require much more care in authoring: they need to be |
|
self-explanatory and detailed. Org-roam's templating system supports the |
|
addition of different templates to facilitate the creation of these notes. |
|
|
|
@node Installation |
|
@chapter Installation |
|
|
|
Org-roam can be installed using Emacs' package manager or manually from its |
|
development repository. |
|
|
|
@menu |
|
* Installing from MELPA:: |
|
* Installing from the Git Repository:: |
|
* Post-Installation Tasks:: |
|
@end menu |
|
|
|
@node Installing from MELPA |
|
@section Installing from MELPA |
|
|
|
Org-roam is available from Melpa and Melpa-Stable. If you haven't used Emacs' |
|
package manager before, you may familiarize yourself with it by reading the |
|
documentation in the Emacs manual, see @ref{Packages,,,emacs,}. Then, add one of the |
|
archives to @samp{package-archives}: |
|
|
|
@itemize |
|
@item |
|
To use Melpa: |
|
@end itemize |
|
|
|
@lisp |
|
(require 'package) |
|
(add-to-list 'package-archives |
|
'("melpa" . "http://melpa.org/packages/") t) |
|
@end lisp |
|
|
|
@itemize |
|
@item |
|
To use Melpa-Stable: |
|
@end itemize |
|
|
|
@lisp |
|
(require 'package) |
|
(add-to-list 'package-archives |
|
'("melpa-stable" . "http://stable.melpa.org/packages/") t) |
|
@end lisp |
|
|
|
Org-roam also depends on a recent version of Org, which can be obtained in Org's |
|
package repository (see @ref{Installation,,,org,}). To use Org's ELPA archive: |
|
|
|
@lisp |
|
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) |
|
@end lisp |
|
|
|
Once you have added your preferred archive, you need to update the |
|
local package list using: |
|
|
|
@example |
|
M-x package-refresh-contents RET |
|
@end example |
|
|
|
Once you have done that, you can install Org-roam and its dependencies |
|
using: |
|
|
|
@example |
|
M-x package-install RET org-roam RET |
|
@end example |
|
|
|
Now see @ref{Post-Installation Tasks}. |
|
|
|
@node Installing from the Git Repository |
|
@section @strong{TODO} Installing from the Git Repository |
|
|
|
@node Post-Installation Tasks |
|
@section Post-Installation Tasks |
|
|
|
Org-roam uses @code{emacsql-sqlite3}, which requires @code{sqlite3} to be located on |
|
@code{exec-path}. Please ensure that @code{sqlite3} is installed appropriately on your |
|
operating system. You can verify that this is the case by executing: |
|
|
|
@lisp |
|
(executable-find "sqlite3") |
|
@end lisp |
|
|
|
If you have @code{sqlite3} installed, and @code{executable-find} still reports @code{nil}, then |
|
it is likely that the path to the executable is not a member of the Emacs |
|
variable @code{exec-path}. You may rectify this by manually adding the path within |
|
your Emacs configuration: |
|
|
|
@lisp |
|
(add-to-list 'exec-path "path/to/sqlite3") |
|
@end lisp |
|
|
|
@node Getting Started |
|
@chapter Getting Started |
|
|
|
This short tutorial describes the essential commands used in Org-roam, to help |
|
you get started. |
|
|
|
First, it is important to understand how Org-roam was designed. Org-roam was |
|
built to support a workflow that was not possible with vanilla Org-mode. This |
|
flow is modelled after the @uref{https://zettelkasten.de/, Zettelkasten Method}, and many of @uref{https://roamresearch.com, Roam Research's} |
|
workflows. Org-roam does not magically make note-taking better -- this often |
|
requires a radical change in your current note-taking workflow. To understand |
|
more about the methods and madness, see @ref{Note-taking Workflows}. |
|
|
|
To begin using Org-roam, one should set the @samp{org-roam-directory} to the directory |
|
containing your notes. For this tutorial, create an empty directory, and set the |
|
@samp{org-roam-directory}: |
|
|
|
@lisp |
|
(make-directory "~/org-roam") |
|
(setq org-roam-directory "~/org-roam") |
|
@end lisp |
|
|
|
We encourage using a flat hierarchy for storing notes, but some prefer using |
|
folders for storing specific kinds of notes (e.g. websites, papers). This is |
|
fine; Org-roam searches recursively within @samp{org-roam-directory} for any notes. |
|
Instead of relying on the file hierarchy for any form of categorization, we |
|
solely rely on links between files to establish connections between notes. |
|
|
|
Next, we need to enable the global minor mode @samp{org-roam-mode}. This sets up Emacs |
|
with several hooks, builds a cache and keeps it consistent. We recommend |
|
starting @samp{org-roam-mode} on startup: |
|
|
|
@lisp |
|
(add-hook 'after-init-hook 'org-roam-mode) |
|
@end lisp |
|
|
|
To build the cache manually, one can run @samp{M-x org-roam-db-build-cache}. The cache |
|
is a sqlite database named @samp{org-roam.db}, which defaults to residing in the root |
|
@samp{org-roam-directory}. Cache builds may take a while the first time, but is often |
|
instantaneous in subsequent runs. |
|
|
|
Let us now create our first note. Call @samp{M-x org-roam-find-file}. This shows a list |
|
of titles for notes that reside in @samp{org-roam-directory}. It should show nothing |
|
right now, since there are no notes in the directory. Entering the title of the |
|
note you wish to create, and pressing @samp{RET} should begin the note creation |
|
process. This process uses @samp{org-capture}'s templating system, and can be freely |
|
customized (see @ref{The Templating System}). Using the default template, pressing @samp{C-c |
|
C-c} finishes the note capture. Running @samp{M-x org-roam-find-file} again should show |
|
the note you have created, and selecting that entry will bring you to that note. |
|
|
|
The crux of Org-roam is making it easy to create notes, and link them together. |
|
To link notes together, we call @samp{M-x org-roam-insert}. This brings up a prompt |
|
with a list of title for existing notes. Selecting an existing entry will create |
|
and insert a link to the current file. Entering a non-existent title will create |
|
a new note with that title. Good usage of Org-roam requires liberally linking |
|
files: this facilitates building up a dense knowledge graph of inter-connected |
|
notes. |
|
|
|
Org-roam provides an interface to view backlinks. It shows backlinks for the |
|
currently active Org-roam note, along with some surrounding context. To toggle |
|
the visibility of this buffer, call @samp{M-x org-roam}. |
|
|
|
For a visual representation of the notes and their connections, Org-roam also |
|
provides graphing capabilities, using Graphviz. It generates graphs with notes |
|
as nodes, and links between them as edges. The generated graph can be used to |
|
navigate to the files, but this requires some additional setup (see @ref{Roam Protocol, , Roam |
|
Protocol}). |
|
|
|
@node Anatomy of an Org-roam File |
|
@chapter Anatomy of an Org-roam File |
|
|
|
The bulk of Org-roam's functionality is built on top of vanilla |
|
Org-mode. However, to support additional functionality, Org-roam adds |
|
several Org-roam-specific keywords. These functionality are not crucial |
|
to effective use of Org-roam. |
|
|
|
@menu |
|
* Titles:: |
|
* Tags:: |
|
* File Refs:: |
|
@end menu |
|
|
|
@node Titles |
|
@section Titles |
|
|
|
To easily find a note, a title needs to be prescribed to a note. A note can have |
|
many titles: this allows a note to be referred to by different names, which is |
|
especially useful for topics or concepts with acronyms. For example, for a note |
|
like ``World War 2'', it may be desirable to also refer to it using the acronym |
|
``WWII''. |
|
|
|
Org-roam calls @samp{org-roam--extract-titles} to extract titles. It uses the |
|
variable @samp{org-roam-title-sources}, to control how the titles are extracted. The |
|
title extraction methods supported are: |
|
|
|
@enumerate |
|
@item |
|
@samp{'title}: This extracts the title using the file @samp{#+title} property |
|
@item |
|
@samp{'headline}: This extracts the title from the first headline in the Org file |
|
@item |
|
@samp{'alias}: This extracts a list of titles using the @samp{#+roam_alias} property. |
|
The aliases are space-delimited, and can be multi-worded using quotes |
|
@end enumerate |
|
|
|
Take for example the following org file: |
|
|
|
@example |
|
#+title: World War 2 |
|
#+roam_alias: "WWII" "World War II" |
|
|
|
* Headline |
|
@end example |
|
|
|
@multitable {aaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaa} |
|
@headitem Method |
|
@tab Titles |
|
@item @samp{'title} |
|
@tab '(``World War 2'') |
|
@item @samp{'headline} |
|
@tab '(``Headline'') |
|
@item @samp{'alias} |
|
@tab '(``WWII'' ``World War II'') |
|
@end multitable |
|
|
|
One can freely control which extraction methods to use by customizing |
|
@samp{org-roam-title-sources}: see the doc-string for the variable for more |
|
information. If all methods of title extraction return no results, the file-name |
|
is used in place of the titles for completions. |
|
|
|
If you wish to add your own title extraction method, you may push a symbol |
|
@samp{'foo} into @samp{org-roam-title-sources}, and define a |
|
@samp{org-roam--extract-titles-foo} which accepts no arguments. See |
|
@samp{org-roam--extract-titles-title} for an example. |
|
|
|
@node Tags |
|
@section Tags |
|
|
|
Tags are used as meta-data for files: they facilitate interactions with notes |
|
where titles are insufficient. For example, tags allow for categorization of |
|
notes: differentiating between bibliographical and structure notes during interactive commands. |
|
|
|
Org-roam calls @samp{org-roam--extract-tags} to extract tags from files. It uses the |
|
variable @samp{org-roam-tag-sources}, to control how tags are extracted. The tag |
|
extraction methods supported are: |
|
|
|
@enumerate |
|
@item |
|
@samp{'prop}: This extracts tags from the @samp{#+roam_tags} property. Tags are space delimited, and can be multi-word using double quotes. |
|
@item |
|
@samp{'all-directories}: All sub-directories relative to @samp{org-roam-directory} are |
|
extracted as tags. That is, if a file is located at relative path |
|
@samp{foo/bar/file.org}, the file will have tags @samp{foo} and @samp{bar}. |
|
@item |
|
@samp{'last-directory}: Extracts the last directory relative to |
|
@samp{org-roam-directory} as the tag. That is, if a file is located at relative |
|
path @samp{foo/bar/file.org}, the file will have tag @samp{bar}. |
|
@item |
|
@samp{'first-directory}: Extracts the first directory relative to |
|
@samp{org-roam-directory} as the tag. That is, if a file is located at relative |
|
path @samp{foo/bar/file.org}, the file will have tag @samp{foo}. |
|
@end enumerate |
|
|
|
By default, only the @samp{'prop} extraction method is enabled. To enable the other |
|
extraction methods, you may modify @samp{org-roam-tag-sources}: |
|
|
|
@lisp |
|
(setq org-roam-tag-sources '(prop last-directory)) |
|
@end lisp |
|
|
|
If you wish to add your own tag extraction method, you may push a symbol @samp{'foo} |
|
into @samp{org-roam-tag-sources}, and define a @samp{org-roam--extract-tags-foo} which |
|
accepts the absolute file path as its argument. See |
|
@samp{org-roam--extract-tags-prop} for an example. |
|
|
|
@node File Refs |
|
@section File Refs |
|
|
|
Refs are unique identifiers for files. Each note can only have 1 ref. |
|
For example, a note for a website may contain a ref: |
|
|
|
@example |
|
#+title: Google |
|
#+roam_key: https://www.google.com/ |
|
@end example |
|
|
|
These keys come in useful for when taking website notes, using the |
|
@samp{roam-ref} protocol (see @ref{Roam Protocol}). |
|
|
|
Alternatively, add a ref for notes for a specific paper, using its |
|
@uref{https://github.com/jkitchin/org-ref, org-ref} citation key: |
|
|
|
@example |
|
#+title: Neural Ordinary Differential Equations |
|
#+roam_key: cite:chen18_neural_ordin_differ_equat |
|
@end example |
|
|
|
The backlinks buffer will show any cites of this key: e.g. |
|
|
|
@float Figure |
|
@image{images/org-ref-citelink,,,,png} |
|
@caption{org-ref-citelink} |
|
@end float |
|
|
|
@node The Templating System |
|
@chapter The Templating System |
|
|
|
Rather than creating blank files on @samp{org-roam-insert} and @samp{org-roam-find-file}, it |
|
may be desirable to prefill the file with templated content. This may include: |
|
|
|
@itemize |
|
@item |
|
Time of creation |
|
@item |
|
File it was created from |
|
@item |
|
Clipboard content |
|
@item |
|
Any other data you may want to input manually |
|
@end itemize |
|
|
|
This requires a complex template insertion system. Fortunately, Org ships with a |
|
powerful one: @samp{org-capture}. However, org-capture was not designed for such use. |
|
Org-roam abuses @samp{org-capture}, extending its syntax. To first understand how |
|
org-roam's templating system works, it may be useful to look into basic usage of |
|
@samp{org-capture}. |
|
|
|
Org-roam's templates can be customized by modifying the variable |
|
@samp{org-roam-capture-templates}. Just like the base @samp{org-capture} this variable can |
|
contain multiple templates, in which case you will be prompted on which one to |
|
use when capturing a new note. |
|
|
|
@menu |
|
* Template Walkthrough:: |
|
* Org-roam Template Expansion:: |
|
@end menu |
|
|
|
@node Template Walkthrough |
|
@section Template Walkthrough |
|
|
|
To demonstrate the additions made to org-capture templates. Here, we walkthrough |
|
the default template, reproduced below. |
|
|
|
@lisp |
|
("d" "default" plain (function org-roam--capture-get-point) |
|
"%?" |
|
:file-name "%<%Y%m%d%H%M%S>-$@{slug@}" |
|
:head "#+title: $@{title@}\n" |
|
:unnarrowed t) |
|
@end lisp |
|
|
|
@enumerate |
|
@item |
|
The template has short key @samp{"d"}. If you have only one template, |
|
org-roam automatically chooses this template for you. |
|
@item |
|
The template is given a description of @samp{"default"}. |
|
@item |
|
@samp{plain} text is inserted. Other options include Org headings via |
|
@samp{entry}. |
|
@item |
|
@samp{(function org-roam--capture-get-point)} should not be changed. |
|
@item |
|
@samp{"%?"} is the template inserted on each call to @samp{org-roam-capture--capture}. |
|
This template means don't insert any content, but place the cursor |
|
here. |
|
@item |
|
@samp{:file-name} is the file-name template for a new note, if it doesn't yet |
|
exist. This creates a file at path that looks like |
|
@samp{/path/to/org-roam-directory/20200213032037-foo.org}. This template also |
|
allows you to specify if you want the note to go into a subdirectory. For |
|
example, the template @samp{private/$@{slug@}} will create notes in |
|
@samp{/path/to/org-roam-directory/private}. |
|
@item |
|
@samp{:head} contains the initial template to be inserted (once only), at |
|
the beginning of the file. Here, the title global attribute is |
|
inserted. |
|
@item |
|
@samp{:unnarrowed t} tells org-capture to show the contents for the whole |
|
file, rather than narrowing to just the entry. |
|
@end enumerate |
|
|
|
Other options you may want to learn about include @samp{:immediate-finish}. |
|
|
|
@node Org-roam Template Expansion |
|
@section Org-roam Template Expansion |
|
|
|
Org-roam's template definitions also extend org-capture's template syntax, to |
|
allow prefilling of strings. We have seen a glimpse of this in @ref{Template Walkthrough, , Template |
|
Walkthrough}. |
|
|
|
In org-roam templates, the @samp{$@{var@}} syntax allows for the expansion of |
|
variables, stored in @samp{org-roam-capture--info}. For example, during |
|
@samp{org-roam-insert}, the user is prompted for a title. Upon entering a |
|
non-existent title, the @samp{title} key in @samp{org-roam-capture--info} is set to the |
|
provided title. @samp{$@{title@}} is then expanded into the provided title during the |
|
org-capture process. Any variables that do not contain strings, are prompted for |
|
values using @samp{completing-read}. |
|
|
|
After doing this expansion, the org-capture's template expansion system |
|
is used to fill up the rest of the template. You may read up more on |
|
this on @uref{https://orgmode.org/manual/Template-expansion.html#Template-expansion, org-capture's documentation page}. |
|
|
|
To illustrate this dual expansion process, take for example the template string: |
|
@samp{"%<%Y%m%d%H%M%S>-$@{title@}"}, with the title @samp{"Foo"}. The template is first |
|
expanded into @samp{%<%Y%m%d%H%M%S>-Foo}. Then org-capture expands @samp{%<%Y%m%d%H%M%S>} |
|
with timestamp: e.g. @samp{20200213032037-Foo}. |
|
|
|
All of the flexibility afforded by Emacs and Org-mode are available. For |
|
example, if you want to encode a UTC timestamp in the filename, you can take |
|
advantage of org-mode's @samp{%(EXP)} template expansion to call @samp{format-time-string} |
|
directly to provide its third argument to specify UTC@. |
|
|
|
@lisp |
|
("d" "default" plain (function org-roam--capture-get-point) |
|
"%?" |
|
:file-name "%(format-time-string \"%Y-%m-%d--%H-%M-%SZ--$@{slug@}\" (current-time) t)" |
|
:head "#+title: $@{title@}\n" |
|
:unnarrowed t) |
|
@end lisp |
|
|
|
@node Concepts and Configuration |
|
@chapter Concepts and Configuration |
|
|
|
The number of configuration options is deliberately kept small, to keep |
|
the Org-roam codebase manageable. However, we attempt to accommodate as |
|
many usage styles as possible. |
|
|
|
All of Org-roam's customization options can be viewed via |
|
@samp{M-x customize-group org-roam}. |
|
|
|
@menu |
|
* Directories and Files:: |
|
* The Org-roam Buffer:: |
|
* Org-roam Links:: |
|
* Org-roam Files:: |
|
@end menu |
|
|
|
@node Directories and Files |
|
@section Directories and Files |
|
|
|
This section concerns the placement and creation of files. |
|
|
|
@itemize |
|
@item |
|
Variable: org-roam-directory |
|
|
|
This is the default path to Org-roam files. All Org files, at any level of |
|
nesting, are considered part of the Org-roam. |
|
|
|
@item |
|
Variable: org-roam-db-location |
|
|
|
Location of the Org-roam database. If this is non-nil, the Org-roam sqlite |
|
database is saved here. |
|
|
|
It is the user’s responsibility to set this correctly, especially when used |
|
with multiple Org-roam instances. |
|
@end itemize |
|
|
|
@node The Org-roam Buffer |
|
@section The Org-roam Buffer |
|
|
|
The Org-roam buffer displays backlinks for the currently active Org-roam note. |
|
|
|
@itemize |
|
@item |
|
User Option: org-roam-buffer |
|
|
|
The name of the org-roam buffer. Defaults to @samp{*org-roam*}. |
|
|
|
@item |
|
User Option: org-roam-buffer-position |
|
|
|
The position of the Org-roam buffer side window. Valid values are @samp{'left}, |
|
@samp{'right}, @samp{'top}, @samp{'bottom}. |
|
|
|
@item |
|
User Option: org-roam-buffer-width |
|
|
|
Width of @samp{org-roam-buffer}. Has an effect only if @samp{org-roam-buffer-position} is |
|
@samp{'left} or @samp{'right}. |
|
|
|
@item |
|
User Option: org-roam-buffer-height |
|
|
|
Height of @samp{org-roam-buffer}. Has an effect only if @samp{org-roam-buffer-position} is |
|
@samp{'top} or @samp{'bottom}. |
|
|
|
@item |
|
User Option: org-roam-buffer-no-delete-other-windows |
|
|
|
The @samp{no-delete-window} parameter for the org-roam buffer. Setting it to @samp{'t} prevents the window from being deleted when calling @samp{delete-other-windows}. |
|
@end itemize |
|
|
|
@node Org-roam Links |
|
@section Org-roam Links |
|
|
|
Org-roam links are regular @samp{file:} links in Org-mode. By default, links are |
|
inserted with the title as the link description with @samp{org-roam-insert}. |
|
|
|
@itemize |
|
@item |
|
User Option: org-roam-link-title-format |
|
|
|
To distinguish between org-roam links and regular links, one may choose to use |
|
special indicators for Org-roam links. Defaults to @samp{"%s"}. |
|
|
|
If your version of Org is at least @samp{9.2}, consider styling the link differently, |
|
by customizing the @samp{org-roam-link}, and @samp{org-roam-link-current} faces. |
|
@end itemize |
|
|
|
@node Org-roam Files |
|
@section Org-roam Files |
|
|
|
Org-roam files are created and prefilled using Org-roam's templating |
|
system. The templating system is customizable (see @ref{The Templating System}). |
|
|
|
@node Navigating Around |
|
@chapter Navigating Around |
|
|
|
@menu |
|
* Index File:: |
|
@end menu |
|
|
|
@node Index File |
|
@section Index File |
|
|
|
As your collection grows, you might want to create an index where you keep links |
|
to your main files. |
|
|
|
In Org-roam, you can define the path to your index file by setting |
|
@samp{org-roam-index-file}. |
|
|
|
@itemize |
|
@item |
|
Variable: org-roam-index-file |
|
|
|
Path to the Org-roam index file. |
|
|
|
The path can be a string or a function. If it is a string, it should be the |
|
path (absolute or relative to @samp{org-roam-directory}) to the index file. If it |
|
is is a function, the function should return the path to the index file. |
|
Otherwise, the index is assumed to be a note in @samp{org-roam-index} whose |
|
title is @samp{"Index"}. |
|
|
|
@item |
|
Function: org-roam-find-index |
|
|
|
Opens the Index file in the current @samp{org-roam-directory}. |
|
@end itemize |
|
|
|
@node Encryption |
|
@chapter Encryption |
|
|
|
One may wish to keep private, encrypted files. Org-roam supports encryption (via |
|
GPG), which can be enabled for all new files by setting @samp{org-roam-encrypt-files} |
|
to @samp{t}. When enabled, new files are created with the @samp{.org.gpg} extension and |
|
decryption are handled automatically by EasyPG@. |
|
|
|
Note that Emacs will prompt for a password for encrypted files during |
|
cache updates if it requires reading the encrypted file. To reduce the |
|
number of password prompts, you may wish to cache the password. |
|
|
|
@itemize |
|
@item |
|
Variable: org-roam-encrypt-files |
|
|
|
Whether to encrypt new files. If true, create files with .org.gpg extension. |
|
@end itemize |
|
|
|
@node Graphing |
|
@chapter Graphing |
|
|
|
Org-roam provides graphing capabilities to explore interconnections between |
|
notes. This is done by performing SQL queries and generating images using |
|
@uref{https://graphviz.org/, Graphviz}. The graph can also be navigated: see @ref{Roam Protocol}. |
|
|
|
The entry point to graph creation is @samp{org-roam-graph}. |
|
|
|
@itemize |
|
@item |
|
Function: org-roam-graph & optional arg file node-query |
|
|
|
Build and possibly display a graph for FILE from NODE-QUERY@. |
|
If FILE is nil, default to current buffer’s file name. |
|
ARG may be any of the following values: |
|
|
|
@itemize |
|
@item |
|
@samp{nil} show the graph. |
|
@item |
|
@samp{C-u} show the graph for FILE@. |
|
@item |
|
@samp{C-u N} show the graph for FILE limiting nodes to N steps. |
|
@item |
|
@samp{C-u C-u} build the graph. |
|
@item |
|
@samp{C-u -} build the graph for FILE@. |
|
@item |
|
@samp{C-u -N} build the graph for FILE limiting nodes to N steps. |
|
@end itemize |
|
|
|
@item |
|
User Option: org-roam-graph-executable |
|
|
|
Path to the graphing executable (in this case, Graphviz). Set this if Org-roam is unable to find the Graphviz executable on your system. |
|
|
|
You may also choose to use @samp{neato} in place of @samp{dot}, which generates a more |
|
compact graph layout. |
|
|
|
@item |
|
User Option: org-roam-graph-viewer |
|
|
|
Org-roam defaults to using Firefox (located on PATH) to view the SVG, but you may choose to set it to: |
|
|
|
@enumerate |
|
@item |
|
A string, which is a path to the program used |
|
@item |
|
a function accepting a single argument: the graph file path. |
|
@end enumerate |
|
|
|
@samp{nil} uses @samp{view-file} to view the graph. |
|
@end itemize |
|
|
|
@menu |
|
* Graph Options:: |
|
* Excluding Nodes and Edges:: |
|
@end menu |
|
|
|
@node Graph Options |
|
@section Graph Options |
|
|
|
Graphviz provides many options for customizing the graph output, and Org-roam supports some of them. See @uref{https://graphviz.gitlab.io/_pages/doc/info/attrs.html} for customizable options. |
|
|
|
@itemize |
|
@item |
|
User Option: org-roam-graph-extra-config |
|
|
|
Extra options passed to graphviz for the digraph (The ``G'' attributes). |
|
Example: @samp{'=(("rankdir" . "LR"))} |
|
|
|
@item |
|
User Option: org-roam-graph-node-extra-config |
|
|
|
Extra options for nodes in the graphviz output (The ``N'' attributes). |
|
Example: @samp{'(("color" . "skyblue"))} |
|
|
|
@item |
|
User Option: org-roam-graph-edge-extra-config |
|
|
|
Extra options for edges in the graphviz output (The ``E'' attributes). |
|
Example: @samp{'(("dir" . "back"))} |
|
|
|
@item |
|
User Option: org-roam-graph-edge-cites-extra-config |
|
|
|
Extra options for citation edges in the graphviz output. |
|
Example: @samp{'(("color" . "red"))} |
|
@end itemize |
|
|
|
@node Excluding Nodes and Edges |
|
@section Excluding Nodes and Edges |
|
|
|
One may want to exclude certain files to declutter the graph. |
|
|
|
@itemize |
|
@item |
|
User Option: org-roam-graph-exclude-matcher |
|
|
|
Matcher for excluding nodes from the generated graph. Any nodes and links for |
|
file paths matching this string is excluded from the graph. |
|
|
|
If value is a string, the string is the only matcher. |
|
|
|
If value is a list, all file paths matching any of the strings |
|
are excluded. |
|
@end itemize |
|
|
|
@example |
|
(setq org-roam-graph-exclude-matcher '("private" "dailies")) |
|
@end example |
|
|
|
This setting excludes all files whose path contain ``private'' or ``dailies''. |
|
|
|
@node Org-roam Completion System |
|
@chapter Org-roam Completion System |
|
|
|
Org-roam offers completion when choosing note titles etc. The completion |
|
system is configurable. The default setting, |
|
|
|
@lisp |
|
(setq org-roam-completion-system 'default) |
|
@end lisp |
|
|
|
uses Emacs' standard @samp{completing-read}. If you prefer |
|
@uref{https://emacs-helm.github.io/helm/, Helm}, use |
|
|
|
@lisp |
|
(setq org-roam-completion-system 'helm) |
|
@end lisp |
|
|
|
Other options include @samp{'ido}, and @samp{'ivy}. |
|
|
|
@node Roam Protocol |
|
@chapter Roam Protocol |
|
|
|
@menu |
|
* _:: |
|
* Installation: Installation (1). |
|
* The @samp{roam-file} protocol:: |
|
* The @samp{roam-ref} Protocol:: |
|
@end menu |
|
|
|
@node _ |
|
@section _ :ignore: |
|
|
|
Org-roam extending @samp{org-protocol} with 2 protocols: the @samp{roam-file} |
|
and @samp{roam-ref} protocol. |
|
|
|
@node Installation (1) |
|
@section Installation |
|
|
|
To enable Org-roam's protocol extensions, you have to add the following to your init file: |
|
|
|
@lisp |
|
(require 'org-roam-protocol) |
|
@end lisp |
|
|
|
The instructions for setting up @samp{org-protocol=} are reproduced below. |
|
|
|
We will also need to create a desktop application for @samp{emacsclient}. The |
|
instructions for various platforms are shown below. |
|
|
|
For Linux users, create a desktop application in @samp{~/.local/share/applications/org-protocol.desktop}: |
|
|
|
@example |
|
[Desktop Entry] |
|
Name=Org-Protocol |
|
Exec=emacsclient %u |
|
Icon=emacs-icon |
|
Type=Application |
|
Terminal=false |
|
MimeType=x-scheme-handler/org-protocol |
|
@end example |
|
|
|
Associate @samp{org-protocol://} links with the desktop application by |
|
running in your shell: |
|
|
|
@example |
|
xdg-mime default org-protocol.desktop x-scheme-handler/org-protocol |
|
@end example |
|
|
|
To disable the ``confirm'' prompt in Chrome, you can also make Chrome |
|
show a checkbox to tick, so that the @samp{Org-Protocol Client} app will be used |
|
without confirmation. To do this, run in a shell: |
|
|
|
@example |
|
sudo mkdir -p /etc/opt/chrome/policies/managed/ |
|
sudo tee /etc/opt/chrome/policies/managed/external_protocol_dialog.json >/dev/null <<'EOF' |
|
@{ |
|
"ExternalProtocolDialogShowAlwaysOpenCheckbox": true |
|
@} |
|
EOF |
|
sudo chmod 644 /etc/opt/chrome/policies/managed/external_protocol_dialog.json |
|
@end example |
|
|
|
and then restart Chrome (for example, by navigating to <chrome://restart>) to |
|
make the new policy take effect. |
|
|
|
See @uref{https://www.chromium.org/administrators/linux-quick-start, here} for more info on the @samp{/etc/opt/chrome/policies/managed} directory and |
|
@uref{https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExternalProtocolDialogShowAlwaysOpenCheckbox, here} for information on the @samp{ExternalProtocolDialogShowAlwaysOpenCheckbox} policy. |
|
|
|
For MacOS, one solution is to use @uref{https://github.com/sveinbjornt/Platypus, Platypus}. Here are the instructions for |
|
setting up with Platypus and Chrome: |
|
|
|
@enumerate |
|
@item |
|
Install and launch Platypus (with @uref{https://brew.sh/, Homebrew}): |
|
@end enumerate |
|
|
|
@example |
|
brew cask install platypus |
|
@end example |
|
|
|
@enumerate |
|
@item |
|
Create a script @samp{launch_emacs.sh}: |
|
@end enumerate |
|
|
|
@example |
|
#!/usr/bin/env bash |
|
/usr/local/bin/emacsclient --no-wait $1 |
|
@end example |
|
|
|
@enumerate |
|
@item |
|
Create a Platypus app with the following settings: |
|
@end enumerate |
|
|
|
@example |
|
| Setting | Value | |
|
|--------------------------------+---------------------------| |
|
| App Name | "OrgProtocol" | |
|
| Script Type | "env" · "/usr/bin/env" | |
|
| Script Path | "path/to/launch-emacs.sh" | |
|
| Interface | None | |
|
| Accept dropped items | true | |
|
| Remain running after execution | false | |
|
@end example |
|
|
|
|
|
Inside @samp{Settings}: |
|
|
|
@example |
|
| Setting | Value | |
|
|--------------------------------+----------------| |
|
| Accept dropped files | true | |
|
| Register as URI scheme handler | true | |
|
| Protocol | "org-protocol" | |
|
@end example |
|
|
|
To disable the ``confirm'' prompt in Chrome, you can also make Chrome |
|
show a checkbox to tick, so that the @samp{OrgProtocol} app will be used |
|
without confirmation. To do this, run in a shell: |
|
|
|
@example |
|
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true |
|
@end example |
|
|
|
|
|
If you're using @uref{https://github.com/railwaycat/homebrew-emacsmacport, Emacs Mac Port}, it registered its `Emacs.app` as the default |
|
handler for the URL scheme `org-protocol`. To make @samp{OrgProtocol.app} |
|
the default handler instead, run: |
|
|
|
@example |
|
defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add \ |
|
'@{"LSHandlerPreferredVersions" = @{ "LSHandlerRoleAll" = "-"; @}; LSHandlerRoleAll = "org.yourusername.OrgProtocol"; LSHandlerURLScheme = "org-protocol";@}' |
|
@end example |
|
|
|
Then restart your computer. |
|
|
|
@node The @samp{roam-file} protocol |
|
@section The @samp{roam-file} protocol |
|
|
|
This is a simple protocol that opens the path specified by the @samp{file} |
|
key (e.g. @samp{org-protocol://roam-file?file=/tmp/file.org}). This is used |
|
in the generated graph. |
|
|
|
@node The @samp{roam-ref} Protocol |
|
@section The @samp{roam-ref} Protocol |
|
|
|
This protocol finds or creates a new note with a given @code{roam_key} (see @ref{Anatomy of an Org-roam File}): |
|
|
|
@image{images/roam-ref,,,,gif} |
|
|
|
To use this, create the following @uref{https://en.wikipedia.org/wiki/Bookmarklet, bookmarklet} in your browser: |
|
|
|
@example |
|
javascript:location.href = |
|
'org-protocol://roam-ref?template=r&ref=' |
|
+ encodeURIComponent(location.href) |
|
+ '&title=' |
|
+ encodeURIComponent(document.title) |
|
@end example |
|
|
|
or as a keybinding in @code{qutebrowser} in , using the @code{config.py} file (see |
|
@uref{https://github.com/qutebrowser/qutebrowser/blob/master/doc/help/configuring.asciidoc, Configuring qutebrowser}): |
|
|
|
@example |
|
config.bind("<Ctrl-r>", "spawn bash -c 'emacsclient \"org-protocol://roam-ref?template=r&ref=@{url:pretty@}&title=@{title@}\" '") |
|
@end example |
|
|
|
where @code{template} is the template key for a template in |
|
@code{org-roam-capture-ref-templates} (see @ref{The Templating System}). These templates |
|
should contain a @code{#+roam_key: $@{ref@}} in it. |
|
|
|
@node Daily Notes |
|
@chapter @strong{TODO} Daily Notes |
|
|
|
@node Diagnosing and Repairing Files |
|
@chapter Diagnosing and Repairing Files |
|
|
|
Org-roam provides a utility for diagnosing and repairing problematic files via |
|
@code{org-roam-doctor}. By default, @code{org-roam-doctor} runs the check on the current |
|
Org-roam file. To run the check only for the current file, run @samp{C-u M-x |
|
org-roam-doctor}, but note that this may take some time. |
|
|
|
@itemize |
|
@item |
|
Function: org-roam-doctor &optional this-buffer |
|
|
|
Perform a check on Org-roam files to ensure cleanliness. If THIS-BUFFER, run |
|
the check only for the current buffer. |
|
@end itemize |
|
|
|
The checks run are defined in @samp{org-roam-doctor--checkers}. Each checker is an instance of @samp{org-roam-doctor-checker}. To define a checker, use @samp{make-org-roam-doctor-checker}. Here is a sample definition: |
|
|
|
@lisp |
|
(make-org-roam-doctor-checker |
|
:name 'org-roam-doctor-broken-links |
|
:description "Fix broken links." |
|
:actions '(("d" . ("Unlink" . org-roam-doctor--remove-link)) |
|
("r" . ("Replace link" . org-roam-doctor--replace-link)) |
|
("R" . ("Replace link (keep label)" . org-roam-doctor--replace-link-keep-label)))) |
|
@end lisp |
|
|
|
The @samp{:name} property is the name of the function run. The function takes in the |
|
Org parse tree, and returns a list of @samp{(point error-message)}. @samp{:description} is a |
|
short description of what the checker does. @samp{:actions} is an alist containing |
|
elements of the form @samp{(char . (prompt . function))}. These actions are defined per |
|
checker, to perform autofixes for the errors. For each error detected, |
|
@samp{org-roam-doctor} will move the point to the current error, and pop-up a help |
|
window displaying the error message, as well as the list of actions that can be |
|
taken provided in @samp{:actions}. |
|
|
|
@node Appendix |
|
@chapter Appendix |
|
|
|
@menu |
|
* Note-taking Workflows:: |
|
* Ecosystem:: |
|
@end menu |
|
|
|
@node Note-taking Workflows |
|
@section Note-taking Workflows |
|
|
|
@table @asis |
|
@item Books |
|
@itemize |
|
@item |
|
@uref{https://www.goodreads.com/book/show/34507927-how-to-take-smart-notes, How To Take Smart Notes} |
|
@end itemize |
|
@item Articles |
|
@itemize |
|
@item |
|
@uref{https://www.lesswrong.com/posts/NfdHG6oHBJ8Qxc26s/the-zettelkasten-method-1, The Zettelkasten Method - LessWrong 2.0} |
|
@item |
|
@uref{https://reddit.com/r/RoamResearch/comments/eho7de/building_a_second_brain_in_roamand_why_you_might, Building a Second Brain in Roam@dots{}And Why You Might Want To : RoamResearch} |
|
@item |
|
@uref{https://www.nateliason.com/blog/roam, Roam Research: Why I Love It and How I Use It - Nat Eliason} |
|
@item |
|
@uref{https://twitter.com/adam_keesling/status/1196864424725774336?s=20, Adam Keesling's Twitter Thread} |
|
@item |
|
@uref{https://blog.jethro.dev/posts/how_to_take_smart_notes_org/, How To Take Smart Notes With Org-mode · Jethro Kuan} |
|
@end itemize |
|
@item Threads |
|
@itemize |
|
@item |
|
@uref{https://news.ycombinator.com/item?id=22473209, Ask HN: How to Take Good Notes} |
|
@end itemize |
|
@item Videos |
|
@itemize |
|
@item |
|
@uref{https://www.youtube.com/watch?v=RvWic15iXjk, How to Use Roam to Outline a New Article in Under 20 Minutes} |
|
@end itemize |
|
@end table |
|
|
|
@node Ecosystem |
|
@section Ecosystem |
|
|
|
A number of packages work well combined with Org-Roam: |
|
|
|
@menu |
|
* Deft:: |
|
* Org-journal:: |
|
* Note-taking Add-ons:: |
|
@end menu |
|
|
|
@node Deft |
|
@subsection Deft |
|
|
|
@uref{https://jblevins.org/projects/deft/, Deft} provides a nice interface |
|
for browsing and filtering org-roam notes. |
|
|
|
@lisp |
|
(use-package deft |
|
:after org |
|
:bind |
|
("C-c n d" . deft) |
|
:custom |
|
(deft-recursive t) |
|
(deft-use-filter-string-for-filename t) |
|
(deft-default-extension "org") |
|
(deft-directory "/path/to/org-roam-files/")) |
|
@end lisp |
|
|
|
If the title of the Org file is not the first line, you might not get |
|
nice titles. You may choose to patch this to use @samp{org-roam}'s |
|
functionality. Here I'm using |
|
@uref{https://github.com/raxod502/el-patch, el-patch}: |
|
|
|
@lisp |
|
(use-package el-patch |
|
:straight (:host github |
|
:repo "raxod502/el-patch" |
|
:branch "develop")) |
|
|
|
(eval-when-compile |
|
(require 'el-patch)) |
|
|
|
(use-package deft |
|
;; same as above... |
|
:config/el-patch |
|
(defun deft-parse-title (file contents) |
|
"Parse the given FILE and CONTENTS and determine the title. |
|
If `deft-use-filename-as-title' is nil, the title is taken to |
|
be the first non-empty line of the FILE. Else the base name of the FILE is |
|
used as title." |
|
(el-patch-swap (if deft-use-filename-as-title |
|
(deft-base-filename file) |
|
(let ((begin (string-match "^.+$" contents))) |
|
(if begin |
|
(funcall deft-parse-title-function |
|
(substring contents begin (match-end 0)))))) |
|
(org-roam--get-title-or-slug file)))) |
|
@end lisp |
|
|
|
The Deft interface can slow down quickly when the number of files get |
|
huge. @uref{https://github.com/hasu/notdeft, Notdeft} is a fork of Deft |
|
that uses an external search engine and indexer. |
|
|
|
@node Org-journal |
|
@subsection Org-journal |
|
|
|
@uref{https://github.com/bastibe/org-journal, Org-journal} is a more |
|
powerful alternative to the simple function @samp{org-roam-dailies-today}. It |
|
provides better journaling capabilities, and a nice calendar interface |
|
to see all dated entries. |
|
|
|
@lisp |
|
(use-package org-journal |
|
:bind |
|
("C-c n j" . org-journal-new-entry) |
|
:custom |
|
(org-journal-date-prefix "#+title: ") |
|
(org-journal-file-format "%Y-%m-%d.org") |
|
(org-journal-dir "/path/to/org-roam-files/") |
|
(org-journal-date-format "%A, %d %B %Y")) |
|
@end lisp |
|
|
|
@node Note-taking Add-ons |
|
@subsection Note-taking Add-ons |
|
|
|
These are some plugins that make note-taking in Org-mode more enjoyable. |
|
|
|
@menu |
|
* Org-download:: |
|
* mathpix.el: mathpixel. |
|
* Org-noter / Interleave:: |
|
* Bibliography:: |
|
* Spaced Repetition:: |
|
@end menu |
|
|
|
@node Org-download |
|
@unnumberedsubsubsec Org-download |
|
|
|
@uref{https://github.com/abo-abo/org-download, Org-download} lets you screenshot and yank images from the web into your notes: |
|
|
|
@float Figure |
|
@image{images/org-download,,,,gif} |
|
@caption{org-download} |
|
@end float |
|
|
|
@lisp |
|
(use-package org-download |
|
:after org |
|
:bind |
|
(:map org-mode-map |
|
(("s-Y" . org-download-screenshot) |
|
("s-y" . org-download-yank)))) |
|
@end lisp |
|
|
|
@node mathpixel |
|
@unnumberedsubsubsec mathpix.el |
|
|
|
@uref{https://github.com/jethrokuan/mathpix.el, mathpix.el} uses @uref{https://mathpix.com/, Mathpix's} API to convert clips into latex equations: |
|
|
|
@float Figure |
|
@image{images/mathpix,,,,gif} |
|
@caption{mathpix} |
|
@end float |
|
|
|
@lisp |
|
(use-package mathpix.el |
|
:straight (:host github :repo "jethrokuan/mathpix.el") |
|
:custom ((mathpix-app-id "app-id") |
|
(mathpix-app-key "app-key")) |
|
:bind |
|
("C-x m" . mathpix-screenshot)) |
|
@end lisp |
|
|
|
@node Org-noter / Interleave |
|
@unnumberedsubsubsec Org-noter / Interleave |
|
|
|
@uref{https://github.com/weirdNox/org-noter, Org-noter} and |
|
@uref{https://github.com/rudolfochrist/interleave, Interleave} are both |
|
projects that allow synchronised annotation of documents (PDF, EPUB |
|
etc.) within Org-mode. |
|
|
|
@node Bibliography |
|
@unnumberedsubsubsec Bibliography |
|
|
|
@uref{https://github.com/org-roam/org-roam-bibtex, org-roam-bibtex} offers |
|
tight integration between |
|
@uref{https://github.com/jkitchin/org-ref, org-ref}, |
|
@uref{https://github.com/tmalsburg/helm-bibtex, helm-bibtex} and |
|
@samp{org-roam}. This helps you manage your bibliographic notes under |
|
@samp{org-roam}. |
|
|
|
@node Spaced Repetition |
|
@unnumberedsubsubsec Spaced Repetition |
|
|
|
@uref{https://github.com/l3kn/org-fc/, Org-fc} is a spaced repetition system that scales well with a large number of |
|
files. Other alternatives include @uref{https://orgmode.org/worg/org-contrib/org-drill.html, org-drill}, and @uref{https://github.com/abo-abo/pamparam, pamparam}. |
|
|
|
@node FAQ |
|
@chapter FAQ |
|
|
|
@menu |
|
* How do I have more than one Org-roam directory?:: |
|
* How do I migrate from Roam Research?:: |
|
@end menu |
|
|
|
@node How do I have more than one Org-roam directory? |
|
@section How do I have more than one Org-roam directory? |
|
|
|
Emacs supports directory-local variables, allowing the value of |
|
@samp{org-roam-directory} to be different in different directories. It does this by |
|
checking for a file named @samp{.dir-locals.el}. |
|
|
|
To add support for multiple directories, override the @samp{org-roam-directory} |
|
variable using directory-local variables. This is what @samp{.dir-locals.el} may |
|
contain: |
|
|
|
@lisp |
|
((nil . ((org-roam-directory . "/path/to/here/")))) |
|
@end lisp |
|
|
|
All files within that directory will be treated as their own separate |
|
set of Org-roam files. Remember to run @samp{org-roam-db-build-cache} from a |
|
file within that directory, at least once. |
|
|
|
@node How do I migrate from Roam Research? |
|
@section How do I migrate from Roam Research? |
|
|
|
Fabio has produced a command-line tool that converts markdown files exported from Roam Research into Org-roam compatible markdown. More instructions are provided @uref{https://github.com/fabioberger/roam-migration, in the repository}. |
|
|
|
Emacs 28.0.50 (Org mode 9.4) |
|
@bye
|
|
|