diff --git a/manual.html b/manual.html index 583eb4a..9a4121d 100644 --- a/manual.html +++ b/manual.html @@ -30,14 +30,8 @@ General Public License for more details. @@ -76,6 +70,7 @@ General Public License for more details. +

Additionally, one may want to ignore certain keys from being excluded within property drawers. For example, we would not want ROAM_REFS links to be self-referential. Hence, to exclude specific keys, we use org-roam-db-extra-links-exclude-keys.

-
- -
+
    +
  • Variable: org-roam-db-extra-links-exclude-keys +

    Keys to ignore when mapping over links.

    The car of the association list is the Org element type (e.g. keyword). The cdr is a list of case-insensitive strings to exclude from being treated as links. -

+


@@ -849,9 +746,9 @@ commands. slow operation. You can disable the automatic updating of the database by setting org-roam-db-update-on-save to nil.

-
-
Variable: org-roam-db-update-on-save
-
+

If t, update the Org-roam database upon saving the file. Disable this if your files are large and updating the database is slow. @@ -874,7 +771,6 @@ two main commands to use here:

  • org-roam-buffer-toggle: Launch an Org-roam buffer that tracks the node currently at point. This means that the content of the buffer changes as the point is moved, if necessary. -
  • org-roam-buffer-display-dedicated: Launch an Org-roam buffer for a specific node without visiting its file. Unlike org-roam-buffer-toggle you can have multiple such buffers and their content won’t be automatically replaced with a @@ -884,20 +780,20 @@ new node at point.

    To bring up a buffer that tracks the current node at point, call M-x org-roam-buffer-toggle.

    -
    -
    Function: org-roam-buffer-toggle
    -
    +
      +
    • Function: org-roam-buffer-toggle +

      Toggle display of the org-roam-buffer. -

    +

  • To bring up a buffer that’s dedicated for a specific node, call M-x org-roam-buffer-display-dedicated.

    -
    -
    Function: org-roam-buffer-display-dedicated
    -
    +
      +
    • Function: org-roam-buffer-display-dedicated +

      Launch node dedicated Org-roam buffer without visiting the node itself. -

    +

    +

    + -

    To configure what sections are displayed in the buffer, set ~org-roam-mode-sections. +

    To configure what sections are displayed in the buffer, set org-roam-mode-sections.

    (setq org-roam-mode-sections
    @@ -972,6 +869,19 @@ rendering reference links), set org-roam-mode-sections
             org-roam-reflinks-section))
     
    +

    The backlinks section org-roam-backlinks-section also supports a +predicate to filter backlinks, :show-backlink-p. This can be used +as follows: +

    +
    +
    (defun my-org-roam-show-backlink-p (backlink)
    +  (not (member "daily" (org-roam-node-tags (org-roam-backlink-source-node backlink)))))
    +
    +(setq org-roam-mode-sections
    +      '((org-roam-backlinks-section :unique t :show-backlink-p my-org-roam-show-backlink-p)
    +        org-roam-reflinks-section))
    +
    +
    @@ -999,7 +909,6 @@ for predictable navigation: @@ -1055,15 +964,10 @@ Next:
    -
    +
      +
    • Function: org-roam-alias-add alias +

      Add ALIAS to the node at point. When called interactively, prompt for the alias to add. -

    +

    +
  • Function: org-roam-alias-remove -
    -
    Function: org-roam-alias-remove
    -

    Remove an alias from the node at point. -

    +


  • @@ -1159,18 +1061,16 @@ key and a URL at the same time.

    Org-roam also provides some functions to add or remove refs.

    -
    -
    Function: org-roam-ref-add ref
    -
    +
      +
    • Function: org-roam-ref-add ref +

      Add REF to the node at point. When called interactively, prompt for the ref to add. -

    +

    +
  • Function: org-roam-ref-remove -
    -
    Function: org-roam-ref-remove
    -

    Remove a ref from the node at point. -

    +


  • @@ -1258,7 +1158,6 @@ currently provides completions in two scenarios:

    @@ -1312,9 +1211,9 @@ to t:
    (setq org-roam-completion-everywhere t)
     
    -
    -
    Variable: org-roam-completion-everywhere
    -
    +

    When non-nil, provide link completion matching outside of Org links.

    @@ -1385,32 +1284,26 @@ of the template are similar to org-capture templates. :unnarrowed t)) - +

    See the org-roam-capture-templates documentation for more details and customization options. @@ -1431,24 +1324,21 @@ Walkthrough.

    Org-roam provides the ${foo} syntax for substituting variables with known strings. ${foo}’s substitution is performed as follows:

    - + +

    One can check the list of available keys for nodes by inspecting the org-roam-node struct. At the time of writing, it is: @@ -1521,11 +1411,10 @@ file: org-protocol intercepts these and runs custom actions based on the protocols registered. Hence, to use org-protocol, once must:

    - +
      +
    1. launch the emacsclient process +
    2. Register org-protocol:// as a valid scheme-handler +

    The instructions for the latter for each operating system is detailed below.

    @@ -1594,28 +1483,26 @@ Next: , Previous: For Mac OS, we need to create our own application.

    - +
      +
    1. Launch Script Editor +
    2. Use the following script, paying attention to the path to emacsclient: +
    on open location this_URL
         set EC to "/usr/local/bin/emacsclient --no-wait "
         set filePath to quoted form of this_URL
    -    do shell script EC & filePath
    +    do shell script EC & filePath & " &> /dev/null &"
         tell application "Emacs" to activate
     end open location
     
    - +
    <key>CFBundleURLTypes</key>
    @@ -1631,9 +1518,9 @@ following before the last </dict> tag:
     </array>
     
    - +
      +
    1. Save the file, and run the OrgProtocolClient.app to register the protocol. +

    To disable the “confirm” prompt in Chrome, you can also make Chrome show a checkbox to tick, so that the OrgProtocol app will be used @@ -1654,6 +1541,25 @@ the default handler instead, run:

    Then restart your computer.

    +

    If you’re using the Emacs Homebrew formula, you may need one of the following additional configurations: +

    +
      +
    1. Add option ‘-c‘ to ‘emacsclient‘ in the script, and start emacs from command line with ‘emacs –daemon‘ +
    + +
    +
    on open location this_URL
    +    set EC to "/usr/local/bin/emacsclient -c --no-wait "
    +    set filePath to quoted form of this_URL
    +    do shell script EC & filePath & " &> /dev/null &"
    +    tell application "Emacs" to activate
    +end open location
    +
    + +
      +
    1. Add ‘(server-start)‘ in .emacs (in this case you do not need option ‘-c‘ for ‘emacsclient‘ in the script, and you do not need to start emacs with ‘emacs –daemon‘ +
    +

    There are variants of those commands for -yesterday and -tomorrow:

    -
    -
    Function: org-roam-dailies-capture-yesterday n &optional goto
    -
    +
    +

    +
  • Function: org-roam-dailies-goto-yesterday -
    -
    Function: org-roam-dailies-goto-yesterday
    -

    With numeric argument N, use the daily-note N days in the future. -

    +

  • There are also commands which allow you to use Emacs’s calendar to find the date

    -
    -
    Function: org-roam-dailies-capture-date
    -
    +
    +

    +
  • Function: org-roam-dailies-goto-date -
    -
    Function: org-roam-dailies-goto-date
    -

    Find the daily note for a date using the calendar, creating it if necessary.

    Prefer past dates, unless prefer-future is non-nil. -

    +

    +
  • Function: org-roam-dailies-find-directory -
    -
    Function: org-roam-dailies-find-directory
    -

    Find and open org-roam-dailies-directory. -

    +

    +
  • Function: org-roam-dailies-goto-previous-note -
    -
    Function: org-roam-dailies-goto-previous-note
    -

    When in an daily-note, find the previous one. -

    +

    +
  • Function: org-roam-dailies-goto-next-note -
    -
    Function: org-roam-dailies-goto-next-note
    -

    When in an daily-note, find the next one. -

    +


  • @@ -2288,7 +2171,6 @@ Next:
  • How do I migrate from Roam Research?
  • How to migrate from Org-roam v1?
  • How do I publish my notes with an Internet-friendly graph?
  • -
  • I’m seeing this “Selecting deleted buffer” error. What do I do?

  • @@ -2343,13 +2225,16 @@ Next: The solution is dependent on the mini-buffer completion framework in use. Here are the solutions:

    - +

    +
    @@ -2399,29 +2284,24 @@ provides a good overview of what’s new in v2 and how to migrate.

    Essentially, to migrate notes from v1 to v2, one must:

    - +
  • Replace existing file links with ID links. +

  • 16.6 How do I publish my notes with an Internet-friendly graph?

    @@ -2432,15 +2312,13 @@ Likewise, it defaults to displaying the graph in Emacs which has the exact same caveats. This problem is solvable in the following way using org-mode’s native publishing capability:

    - +

    The example code below is used to publish to a local directory where a separate shell script copies the files to the remote site. @@ -2460,13 +2338,11 @@ Next: 16.6.1 Configure org-mode for publishing

    This has two steps: -

    +

      +
    1. Setting of a roam project that publishes your notes. +
    2. Configuring the sitemap.html generation. +
    3. Setting up ‘org-publish’ to generate the graph. +

    This will require code like the following:

    @@ -2539,31 +2415,6 @@ to the publishing directory. Example code follows:
    -
    - -

    16.7 I’m seeing this “Selecting deleted buffer” error. What do I do?

    - -

    The “selecting deleted buffer” error usually occurs when you don’t have a -working emacsql-sqlite executable. Org-roam relies on this executable to -function properly, and doesn’t catch this error. This issue is most commonly -seen on Windows setups. You can browse through the various GitHub issues posted -about this here. -

    -

    To fix this, you can try the following: -

    - - -
    -
    @@ -2861,33 +2707,6 @@ Next: , Pre

    Appendix C Function Index

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    Index EntrySection

    O
    org-roam-alias-addTitles and Aliases
    org-roam-alias-removeTitles and Aliases
    org-roam-buffer-display-dedicatedThe Org-roam Buffer
    org-roam-buffer-toggleThe Org-roam Buffer
    org-roam-capture-Extending the Capture System
    org-roam-dailies-capture-dateUsage
    org-roam-dailies-capture-todayUsage
    org-roam-dailies-capture-yesterdayUsage
    org-roam-dailies-find-directoryUsage
    org-roam-dailies-goto-dateUsage
    org-roam-dailies-goto-next-noteUsage
    org-roam-dailies-goto-previous-noteUsage
    org-roam-dailies-goto-todayUsage
    org-roam-dailies-goto-yesterdayUsage
    org-roam-graphorg-roam-graph
    org-roam-node-at-pointAccessing and Modifying Nodes
    org-roam-node-readAccessing and Modifying Nodes
    org-roam-ref-addRefs
    org-roam-ref-removeRefs

    -

    @@ -2898,29 +2717,8 @@ Previous: ,

    Appendix D Variable Index

    -
    - - - - - - - - - - - - - - - - - - -
    Index EntrySection

    O
    org-roam-completion-everywhereCompleting anywhere
    org-roam-dailies-capture-templatesConfiguration
    org-roam-dailies-directoryConfiguration
    org-roam-db-extra-links-elementsWhat to cache
    org-roam-db-extra-links-exclude-keysWhat to cache
    org-roam-db-update-on-saveWhen to cache
    org-roam-graph-edge-extra-configGraph Options
    org-roam-graph-executableorg-roam-graph
    org-roam-graph-extra-configGraph Options
    org-roam-graph-filetypeGraph Options
    org-roam-graph-node-extra-configGraph Options
    org-roam-graph-viewerorg-roam-graph
    org-roam-node-display-templateCustomizing Node Completions

    -
    -

    Emacs 29.0.50 (Org mode 9.6) +

    Emacs 29.4 (Org mode 9.7.19)

    diff --git a/org-roam.org b/org-roam.org index f30bab5..9a268b6 100644 --- a/org-roam.org +++ b/org-roam.org @@ -268,40 +268,6 @@ file: install-info /path/to/my/info/files/org-roam.info /path/to/my/info/files/dir #+end_src -** Installation Troubleshooting -*** C Compiler -Org-roam relies on an Emacs package called ~emacsql~ and ~emacsql-sqlite~ to -work with the ~sqlite~ database. Both of them should be installed automatically -in your Emacs environment as a prerequisite for Org-roam when you install it. - -~emacsql-sqlite~ requires a C compiler (e.g. ~gcc~ or ~clang~) to be present in -your computer. How to install a C compiler depends on the OS that you use. - -**** C Compiler for Windows - -One of the easiest ways to install a C compiler in Windows is to use [[https://www.msys2.org/][MSYS2]] as at the time of this writing: - -1. Download and use the installer in the official MSYS2 website -2. Run MSYS2 and in its terminal, type the following and answer "Y" to - proceed -- this will install ~gcc~ in your PC: - - #+BEGIN_SRC bash - pacman -S gcc - #+END_SRC - -4. On Windows, add ~C:\msys64\usr\bin~ (command =where gcc= in MSYS2 terminal - can tell you the correct path) to ~PATH~ in your environmental variables - -5. Launch Emacs and call ~M-x org-roam-db-autosync-mode~ (launch Emacs after - defining the path, so that Emacs can recognize it) - -This will automatically start compiling ~emacsql-sqlite~; you should see a -message in minibuffer. It may take a while until compilation completes. Once -complete, you should see a new file ~emacsql-sqlite.exe~ created in a subfolder -named ~sqlite~ under ~emacsql-sqlite~ installation folder. It's typically in -your Emacs configuration folder like this: -~/.config/emacs/elpa/emacsql-sqlite-20190727.1710/sqlite~ - * Getting Started ** The Org-roam Node @@ -459,18 +425,18 @@ can set ~org-roam-node-display-template~ as such: ** How to cache Org-roam uses a sqlite database to perform caching, but there are multiple Emacs -libraries that can be used. The default used by Org-roam is ~emacs-sqlite~. -Below the pros and cons of each package is used: +libraries that can be used. The default used by Org-roam is +[[https://github.com/magit/emacsql/blob/main/emacsql-sqlite-builtin.el][~emacs-sqlite-builtin~]]. Below the pros and cons of each package is used: -[[https://github.com/skeeto/emacsql][**emacs-sqlite**]] +[[https://melpa.org/#/emacsql-sqlite-builtin][**emacsql-sqlite-builtin**]] -The default option used by Org-roam. This library is the most mature and -well-supported and is imported by default in Org-roam. +~emacsql-sqlite-builtin~ uses the in-built SQLite support for Emacs 29 and +later. This is the default option if you are using a version of Emacs that +supports it. -One downside of using ~emacs-sqlite~ is that using it requires compilation and -can cause issues in some environments (especially Windows). If you have issues -producing the customized binary required by ~emacs-sqlite~, consider using -~emacs-sqlite3~. +#+begin_src emacs-lisp + (setq org-roam-database-connector 'sqlite-builtin) +#+end_src [[https://github.com/cireu/emacsql-sqlite3][**emacs-sqlite3**]] @@ -489,24 +455,12 @@ To use ~emacsql-sqlite3~, ensure that the package is installed, and set: [[https://melpa.org/#/emacsql-sqlite-module][**emacssql-sqlite-module**]] (previously emacsql-libsqlite3) ~emacs-sqlite-module~ is a relatively young package which uses an Emacs module that -exposes parts of the SQLite C API to Emacs Lisp, instead of using subprocess as -~emacsql-sqlite~ does. It is expected to be a more performant drop-in -replacement for ~emacs-sqlite~. +exposes parts of the SQLite C API to Emacs Lisp. #+begin_src emacs-lisp (setq org-roam-database-connector 'sqlite-module) #+end_src -[[https://melpa.org/#/emacsql-sqlite-builtin][**emacsql-sqlite-builtin**]] - -~emacsql-sqlite-builtin~ uses the in-built SQLite support for Emacs 29 and -later. This is the recommended option if you are using a version of Emacs that -supports it. - -#+begin_src emacs-lisp - (setq org-roam-database-connector 'sqlite-builtin) -#+end_src - ** What to cache By default, all nodes (any headline or file with an ID) are cached by Org-roam. @@ -1672,21 +1626,6 @@ to the publishing directory. Example code follows: (kill-buffer (file-name-nondirectory svg)) (setq my-publish-time 0))))) #+end_src -** I'm seeing this "Selecting deleted buffer" error. What do I do? - -The "selecting deleted buffer" error usually occurs when you don't have a -working ~emacsql-sqlite~ executable. Org-roam relies on this executable to -function properly, and doesn't catch this error. This issue is most commonly -seen on Windows setups. You can browse through the various GitHub issues posted -about this [[https://github.com/org-roam/org-roam/issues?q=is%3Aissue+selecting+deleted][here]]. - -To fix this, you can try the following: - -1. If on Windows, try replacing your system binary with [[https://github.com/nobiot/emacsql-sqlite.exe][this one]] that has been proven - to work -2. Use the ~emacsql-sqlite3~ option rather than compiling your own emacsql - binary (see [[*How to cache][How to cache]]). - * Developer's Guide to Org-roam ** Org-roam's Design Principle diff --git a/org-roam.texi b/org-roam.texi index 5db1ebb..dbf4f5f 100644 --- a/org-roam.texi +++ b/org-roam.texi @@ -59,6 +59,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU General Public License for more details. @end quotation + @end ifnottex @menu @@ -92,15 +93,6 @@ Installation * Installing from MELPA:: * Installing from Source:: -* Installation Troubleshooting:: - -Installation Troubleshooting - -* C Compiler:: - -C Compiler - -* C Compiler for Windows:: Getting Started @@ -196,7 +188,6 @@ FAQ * How do I migrate from Roam Research?:: * How to migrate from Org-roam v1?:: * How do I publish my notes with an Internet-friendly graph?:: -* I'm seeing this ``Selecting deleted buffer'' error. What do I do?: I'm seeing this ``Selecting deleted buffer'' error What do I do?. How do I publish my notes with an Internet-friendly graph? @@ -244,7 +235,6 @@ Org-roam provides these benefits over other tooling: @item @strong{Privacy and Security:} Your personal wiki belongs only to you, entirely offline and in your control. Encrypt your notes with GPG@. - @item @strong{Longevity of Plain Text:} Unlike web solutions like Roam Research, the notes are first and foremost plain Org-mode files -- Org-roam simply builds an @@ -252,17 +242,14 @@ auxiliary 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. The notes are still functional even if Org-roam ceases to exist. - @item @strong{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 pull request. - @item @strong{Leverage the Org-mode ecosystem:} Over the decades, 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 @strong{Built on Emacs:} Emacs is also a fantastic interface for editing text, and Org-roam inherits many of the powerful text-navigation and editing packages @@ -367,7 +354,6 @@ development repository. @menu * Installing from MELPA:: * Installing from Source:: -* Installation Troubleshooting:: @end menu @node Installing from MELPA @@ -446,22 +432,16 @@ dependencies that it requires. These include: @itemize @item dash - @item f - @item s - @item org - @item emacsql - @item emacsql-sqlite - @item magit-section @end itemize @@ -496,10 +476,8 @@ You can also use one of the default locations, such as: @itemize @item @emph{usr/local/share/info} - @item @emph{usr/share/info} - @item @emph{usr/local/share/info} @end itemize @@ -514,62 +492,6 @@ file: install-info /path/to/my/info/files/org-roam.info /path/to/my/info/files/dir @end example -@node Installation Troubleshooting -@section Installation Troubleshooting - -@menu -* C Compiler:: -@end menu - -@node C Compiler -@subsection C Compiler - -Org-roam relies on an Emacs package called @code{emacsql} and @code{emacsql-sqlite} to -work with the @code{sqlite} database. Both of them should be installed automatically -in your Emacs environment as a prerequisite for Org-roam when you install it. - -@code{emacsql-sqlite} requires a C compiler (e.g. @code{gcc} or @code{clang}) to be present in -your computer. How to install a C compiler depends on the OS that you use. - -@menu -* C Compiler for Windows:: -@end menu - -@node C Compiler for Windows -@unnumberedsubsubsec C Compiler for Windows - -One of the easiest ways to install a C compiler in Windows is to use @uref{https://www.msys2.org/, MSYS2} as at the time of this writing: - -@itemize -@item -Download and use the installer in the official MSYS2 website - -@item -Run MSYS2 and in its terminal, type the following and answer ``Y'' to -proceed -- this will install @code{gcc} in your PC: - -@example -pacman -S gcc -@end example - - -@item -On Windows, add @code{C:\msys64\usr\bin} (command @samp{where gcc} in MSYS2 terminal -can tell you the correct path) to @code{PATH} in your environmental variables - - -@item -Launch Emacs and call @code{M-x org-roam-db-autosync-mode} (launch Emacs after -defining the path, so that Emacs can recognize it) -@end itemize - -This will automatically start compiling @code{emacsql-sqlite}; you should see a -message in minibuffer. It may take a while until compilation completes. Once -complete, you should see a new file @code{emacsql-sqlite.exe} created in a subfolder -named @code{sqlite} under @code{emacsql-sqlite} installation folder. It's typically in -your Emacs configuration folder like this: -@code{/.config/emacs/elpa/emacsql-sqlite-20190727.1710/sqlite} - @node Getting Started @chapter Getting Started @@ -608,13 +530,12 @@ For example, with this example file content: We create two nodes: -@itemize +@enumerate @item A file node ``Foo'' with id @code{foo}. - @item A headline node ``Bar'' with id @code{bar}. -@end itemize +@end enumerate Headlines without IDs will not be considered Org-roam nodes. Org IDs can be added to files or headlines via the interactive command @code{M-x org-id-get-create}. @@ -675,11 +596,9 @@ functions for creating nodes: @item @code{org-roam-node-insert}: creates a node if it does not exist, and inserts a link to the node at point. - @item @code{org-roam-node-find}: creates a node if it does not exist, and visits the node. - @item @code{org-roam-capture}: creates a node if it does not exist, and restores the current window configuration upon completion. @@ -706,10 +625,12 @@ Org-roam provides (see @ref{Completion}). @section Customizing Node Completions Node selection is achieved via the @code{completing-read} interface, typically -through `org-roam-node-read`. The presentation of these nodes are governed by +through @code{org-roam-node-read}. The presentation of these nodes are governed by @code{org-roam-node-display-template}. -@defvar org-roam-node-display-template +@itemize +@item +Variable: org-roam-node-display-template Configures display formatting for Org-roam node. @@ -739,7 +660,7 @@ as many characters as possible and will be aligned accordingly. A closure can also be assigned to this variable in which case the closure is evaluated and the return value is used as the template. The closure must evaluate to a valid template string. -@end defvar +@end itemize If you're using a vertical completion framework, such as Ivy and Selectrum, Org-roam supports the generation of an aligned, tabular completion interface. @@ -765,18 +686,18 @@ can set @code{org-roam-node-display-template} as such: @section How to cache Org-roam uses a sqlite database to perform caching, but there are multiple Emacs -libraries that can be used. The default used by Org-roam is @code{emacs-sqlite}. -Below the pros and cons of each package is used: +libraries that can be used. The default used by Org-roam is +@uref{https://github.com/magit/emacsql/blob/main/emacsql-sqlite-builtin.el, @code{emacs-sqlite-builtin}}. Below the pros and cons of each package is used: -@uref{https://github.com/skeeto/emacsql, @strong{@strong{emacs-sqlite}}} +@uref{https://melpa.org/#/emacsql-sqlite-builtin, @strong{@strong{emacsql-sqlite-builtin}}} -The default option used by Org-roam. This library is the most mature and -well-supported and is imported by default in Org-roam. +@code{emacsql-sqlite-builtin} uses the in-built SQLite support for Emacs 29 and +later. This is the default option if you are using a version of Emacs that +supports it. -One downside of using @code{emacs-sqlite} is that using it requires compilation and -can cause issues in some environments (especially Windows). If you have issues -producing the customized binary required by @code{emacs-sqlite}, consider using -@code{emacs-sqlite3}. +@lisp +(setq org-roam-database-connector 'sqlite-builtin) +@end lisp @uref{https://github.com/cireu/emacsql-sqlite3, @strong{@strong{emacs-sqlite3}}} @@ -795,24 +716,12 @@ To use @code{emacsql-sqlite3}, ensure that the package is installed, and set: @uref{https://melpa.org/#/emacsql-sqlite-module, @strong{@strong{emacssql-sqlite-module}}} (previously emacsql-libsqlite3) @code{emacs-sqlite-module} is a relatively young package which uses an Emacs module that -exposes parts of the SQLite C API to Emacs Lisp, instead of using subprocess as -@code{emacsql-sqlite} does. It is expected to be a more performant drop-in -replacement for @code{emacs-sqlite}. +exposes parts of the SQLite C API to Emacs Lisp. @lisp (setq org-roam-database-connector 'sqlite-module) @end lisp -@uref{https://melpa.org/#/emacsql-sqlite-builtin, @strong{@strong{emacsql-sqlite-builtin}}} - -@code{emacsql-sqlite-builtin} uses the in-built SQLite support for Emacs 29 and -later. This is the recommended option if you are using a version of Emacs that -supports it. - -@lisp -(setq org-roam-database-connector 'sqlite-builtin) -@end lisp - @node What to cache @section What to cache @@ -847,7 +756,9 @@ additionally trying to process these links. Use @code{org-roam-db-extra-links-elements} to specify which additional Org AST element types to consider. -@defvar org-roam-db-extra-links-elements +@itemize +@item +Variable: org-roam-db-extra-links-elements The list of Org element types to include for parsing by Org-roam. @@ -855,21 +766,23 @@ By default, when parsing Org's AST, links within keywords and property drawers are not parsed as links. Sometimes however, it is desirable to parse and cache these links (e.g. hiding links in a property drawer). -@end defvar +@end itemize Additionally, one may want to ignore certain keys from being excluded within property drawers. For example, we would not want @code{ROAM_REFS} links to be self-referential. Hence, to exclude specific keys, we use @code{org-roam-db-extra-links-exclude-keys}. -@defvar org-roam-db-extra-links-exclude-keys +@itemize +@item +Variable: org-roam-db-extra-links-exclude-keys Keys to ignore when mapping over links. The car of the association list is the Org element type (e.g. keyword). The cdr is a list of case-insensitive strings to exclude from being treated as links. -@end defvar +@end itemize @node When to cache @section When to cache @@ -883,8 +796,10 @@ However, depending on how large your Org files are, database updating can be a slow operation. You can disable the automatic updating of the database by setting @code{org-roam-db-update-on-save} to @code{nil}. -@defvar org-roam-db-update-on-save -@end defvar +@itemize +@item +Variable: org-roam-db-update-on-save +@end itemize If t, update the Org-roam database upon saving the file. Disable this if your files are large and updating the database is slow. @@ -901,7 +816,6 @@ two main commands to use here: @code{org-roam-buffer-toggle}: Launch an Org-roam buffer that tracks the node currently at point. This means that the content of the buffer changes as the point is moved, if necessary. - @item @code{org-roam-buffer-display-dedicated}: Launch an Org-roam buffer for a specific node without visiting its file. Unlike @code{org-roam-buffer-toggle} you can have @@ -912,18 +826,22 @@ new node at point. To bring up a buffer that tracks the current node at point, call @code{M-x org-roam-buffer-toggle}. -@defun org-roam-buffer-toggle +@itemize +@item +Function: org-roam-buffer-toggle Toggle display of the @code{org-roam-buffer}. -@end defun +@end itemize To bring up a buffer that's dedicated for a specific node, call @code{M-x org-roam-buffer-display-dedicated}. -@defun org-roam-buffer-display-dedicated +@itemize +@item +Function: org-roam-buffer-display-dedicated Launch node dedicated Org-roam buffer without visiting the node itself. -@end defun +@end itemize @menu * Navigating the Org-roam Buffer:: @@ -941,13 +859,10 @@ keybindings available. Here are several of the more useful ones: @itemize @item @code{M-@{N@}}: @code{magit-section-show-level-@{N@}-all} - @item @code{n}: @code{magit-section-forward} - @item @code{}: @code{magit-section-toggle} - @item @code{}: @code{org-roam-buffer-visit-thing} @end itemize @@ -960,19 +875,17 @@ section-specific commands such as @code{org-roam-node-visit}. There are currently 3 provided widget types: -@itemize - @item - BacklinksView (preview of) nodes that link to this node - -@item - Reference LinksNodes that reference this node (see @ref{Refs}) - -@item - Unlinked referencesView nodes that contain text that match the nodes +@table @asis +@item Backlinks +View (preview of) nodes that link to this node +@item Reference Links +Nodes that reference this node (see @ref{Refs}) +@item Unlinked references +View nodes that contain text that match the nodes title/alias but are not linked -@end itemize +@end table -To configure what sections are displayed in the buffer, set ~org-roam-mode-sections. +To configure what sections are displayed in the buffer, set @code{org-roam-mode-sections}. @lisp (setq org-roam-mode-sections @@ -994,6 +907,19 @@ rendering reference links), set @code{org-roam-mode-sections} as follows: org-roam-reflinks-section)) @end lisp +The backlinks section @code{org-roam-backlinks-section} also supports a +predicate to filter backlinks, @code{:show-backlink-p}. This can be used +as follows: + +@lisp +(defun my-org-roam-show-backlink-p (backlink) + (not (member "daily" (org-roam-node-tags (org-roam-backlink-source-node backlink))))) + +(setq org-roam-mode-sections + '((org-roam-backlinks-section :unique t :show-backlink-p my-org-roam-show-backlink-p) + org-roam-reflinks-section)) +@end lisp + @node Configuring the Org-roam buffer display @section Configuring the Org-roam buffer display @@ -1016,7 +942,6 @@ for predictable navigation: @item @code{RET} navigates to thing-at-point in the current window, replacing the Org-roam buffer. - @item @code{C-u RET} navigates to thing-at-point in the other window. @end itemize @@ -1056,19 +981,14 @@ Org-roam caches most of the standard Org properties. The full list now includes: @itemize @item outline level - @item todo state - @item priority - @item scheduled - @item deadline - @item tags @end itemize @@ -1094,16 +1014,18 @@ To assign an alias to a node, add the ``ROAM@math{_ALIASES}'' property to the no Alternatively, Org-roam provides some functions to add or remove aliases. -@defun org-roam-alias-add alias +@itemize +@item +Function: org-roam-alias-add alias Add ALIAS to the node at point. When called interactively, prompt for the alias to add. -@end defun -@defun org-roam-alias-remove +@item +Function: org-roam-alias-remove Remove an alias from the node at point. -@end defun +@end itemize @node Tags @section Tags @@ -1145,16 +1067,18 @@ key and a URL at the same time. Org-roam also provides some functions to add or remove refs. -@defun org-roam-ref-add ref +@itemize +@item +Function: org-roam-ref-add ref Add REF to the node at point. When called interactively, prompt for the ref to add. -@end defun -@defun org-roam-ref-remove +@item +Function: org-roam-ref-remove Remove a ref from the node at point. -@end defun +@end itemize @node Citations @chapter Citations @@ -1224,7 +1148,6 @@ currently provides completions in two scenarios: @itemize @item When within an Org bracket link - @item Anywhere @end itemize @@ -1268,8 +1191,10 @@ to @code{t}: (setq org-roam-completion-everywhere t) @end lisp -@defvar org-roam-completion-everywhere -@end defvar +@itemize +@item +Variable: org-roam-completion-everywhere +@end itemize When non-nil, provide link completion matching outside of Org links. @@ -1322,26 +1247,21 @@ of the template are similar to @code{org-capture} templates. :unnarrowed t)) @end lisp -@itemize +@enumerate @item The template has short key @code{"d"}. If you have only one template, org-roam automatically chooses this template for you. - @item The template is given a description of @code{"default"}. - @item @code{plain} text is inserted. Other options include Org headings via @code{entry}. - @item Notice that the @code{target} that's usually in Org-capture templates is missing here. - @item @code{"%?"} is the template inserted on each call to @code{org-roam-capture-}. This template means don't insert any content, but place the cursor here. - @item @code{:target} is a compulsory specification in the Org-roam capture template. The first element of the list indicates the type of the target, the second @@ -1349,12 +1269,11 @@ element indicates the location of the captured node, and the rest of the elements indicate prefilled template that will be inserted and the position of the point will be adjusted for. The latter behavior varies from type to type of the capture target. - @item @code{:unnarrowed t} tells org-capture to show the contents for the whole file, rather than narrowing to just the entry. This is part of the Org-capture templates. -@end itemize +@end enumerate See the @code{org-roam-capture-templates} documentation for more details and customization options. @@ -1369,29 +1288,26 @@ Walkthrough}. Org-roam provides the @code{$@{foo@}} syntax for substituting variables with known strings. @code{$@{foo@}}'s substitution is performed as follows: -@itemize +@enumerate @item If @code{foo} is a function, @code{foo} is called with the current node as its argument. - @item Else if @code{org-roam-node-foo} is a function, @code{foo} is called with the current node as its argument. The @code{org-roam-node-} prefix defines many of Org-roam's node accessors such as @code{org-roam-node-title} and @code{org-roam-node-level}. - @item Else look up @code{org-roam-capture--info} for @code{foo}. This is an internal variable that is set before the capture process begins. - @item If none of the above applies, read a string using @code{completing-read}. -@itemize +@enumerate @item Org-roam also provides the @code{$@{foo=default_val@}} syntax, where if a default value is provided, will be the initial value for the @code{foo} key during minibuffer completion. -@end itemize -@end itemize +@end enumerate +@end enumerate One can check the list of available keys for nodes by inspecting the @code{org-roam-node} struct. At the time of writing, it is: @@ -1447,13 +1363,12 @@ On a high-level, external calls are passed to Emacs via @code{emacsclient}. @code{org-protocol} intercepts these and runs custom actions based on the protocols registered. Hence, to use @code{org-protocol}, once must: -@itemize +@enumerate @item launch the @code{emacsclient} process - @item Register @code{org-protocol://} as a valid scheme-handler -@end itemize +@end enumerate The instructions for the latter for each operating system is detailed below. @@ -1511,32 +1426,30 @@ See @uref{https://www.chromium.org/administrators/linux-quick-start, here} for m For Mac OS, we need to create our own application. -@itemize +@enumerate @item Launch Script Editor - @item Use the following script, paying attention to the path to @code{emacsclient}: -@end itemize +@end enumerate @lisp on open location this_URL set EC to "/usr/local/bin/emacsclient --no-wait " set filePath to quoted form of this_URL - do shell script EC & filePath + do shell script EC & filePath & " &> /dev/null &" tell application "Emacs" to activate end open location @end lisp -@itemize +@enumerate @item Save the script in @code{/Applications/OrgProtocolClient.app}, changing the script type to ``Application'', rather than ``Script''. - @item Edit @code{/Applications/OrgProtocolClient.app/Contents/Info.plist}, adding the following before the last @code{} tag: -@end itemize +@end enumerate @example CFBundleURLTypes @@ -1552,10 +1465,10 @@ following before the last @code{} tag: @end example -@itemize +@enumerate @item Save the file, and run the @code{OrgProtocolClient.app} to register the protocol. -@end itemize +@end enumerate To disable the ``confirm'' prompt in Chrome, you can also make Chrome show a checkbox to tick, so that the @code{OrgProtocol} app will be used @@ -1576,6 +1489,27 @@ defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandle Then restart your computer. +If you're using the @uref{https://formulae.brew.sh/formula/emacs, Emacs Homebrew formula}, you may need one of the following additional configurations: + +@enumerate +@item +Add option `-c` to `emacsclient` in the script, and start emacs from command line with `emacs --daemon` +@end enumerate + +@lisp +on open location this_URL + set EC to "/usr/local/bin/emacsclient -c --no-wait " + set filePath to quoted form of this_URL + do shell script EC & filePath & " &> /dev/null &" + tell application "Emacs" to activate +end open location +@end lisp + +@enumerate +@item +Add `(server-start)` in .emacs (in this case you do not need option `-c` for `emacsclient` in the script, and you do not need to start emacs with `emacs --daemon` +@end enumerate + @itemize @item @anchor{Testing org-protocol}Testing org-protocol @@ -1676,8 +1610,10 @@ generating images using @uref{https://graphviz.org/, Graphviz}. The graph can al The entry point to graph creation is @code{org-roam-graph}. -@defun org-roam-graph & optional arg node -@end defun +@itemize +@item +Function: org-roam-graph & optional arg node +@end itemize Build and display a graph for NODE@. ARG may be any of the following values: @@ -1685,32 +1621,33 @@ ARG may be any of the following values: @itemize @item @code{nil} show the full graph. - @item @code{integer} an integer argument @code{N} will show the graph for the connected components to node up to @code{N} steps away. @end itemize -@defopt org-roam-graph-executable + +@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 @code{neato} in place of @code{dot}, which generates a more compact graph layout. -@end defopt -@defopt org-roam-graph-viewer +@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: -@itemize +@enumerate @item A string, which is a path to the program used - @item a function accepting a single argument: the graph file path. -@end itemize +@end enumerate @code{nil} uses @code{view-file} to view the graph. @@ -1723,7 +1660,7 @@ the second option to set the browser and network file path: (let ((org-roam-graph-viewer "/mnt/c/Program Files/Mozilla Firefox/firefox.exe")) (org-roam-graph--open (concat "file://///wsl$/Ubuntu" file))))) @end lisp -@end defopt +@end itemize @menu * Graph Options:: @@ -1736,29 +1673,31 @@ 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. -@defopt org-roam-graph-filetype +@itemize +@item +User Option: org-roam-graph-filetype The file type to generate for graphs. This defaults to @code{"svg"}. -@end defopt -@defopt org-roam-graph-extra-config +@item +User Option: org-roam-graph-extra-config Extra options passed to graphviz for the digraph (The ``G'' attributes). Example: @code{'~(("rankdir" . "LR"))} -@end defopt -@defopt org-roam-graph-node-extra-config +@item +User Option: org-roam-graph-node-extra-config An alist of options to style the nodes. The car of the alist node type such as @code{"id"}, or @code{"http"}. The cdr of the list is another alist of Graphviz node options (the ``N'' attributes). -@end defopt -@defopt org-roam-graph-edge-extra-config +@item +User Option: org-roam-graph-edge-extra-config Extra options for edges in the graphviz output (The ``E'' attributes). Example: @code{'(("dir" . "back"))} -@end defopt +@end itemize @node org-roam-dailies @section org-roam-dailies @@ -1776,15 +1715,17 @@ Org-journal with @code{org-roam-dailies}. For @code{org-roam-dailies} to work, you need to define two variables: -@defvar @code{org-roam-dailies-directory} +@itemize +@item +Variable: @code{org-roam-dailies-directory} Path to daily-notes. This path is relative to @code{org-roam-directory}. -@end defvar -@defvar @code{org-roam-dailies-capture-templates} +@item +Variable: @code{org-roam-dailies-capture-templates} Capture templates for daily-notes in Org-roam. -@end defvar +@end itemize Here is a sane default configuration: @@ -1805,35 +1746,41 @@ See @ref{The Templating System} for creating new templates. @code{org-roam-dailies} provides these interactive functions: -@defun @code{org-roam-dailies-capture-today} &optional goto +@itemize +@item +Function: @code{org-roam-dailies-capture-today} &optional goto Create an entry in the daily note for today. When @code{goto} is non-nil, go to the note without creating an entry. -@end defun -@defun @code{org-roam-dailies-goto-today} +@item +Function: @code{org-roam-dailies-goto-today} Find the daily note for today, creating it if necessary. -@end defun +@end itemize There are variants of those commands for @code{-yesterday} and @code{-tomorrow}: -@defun @code{org-roam-dailies-capture-yesterday} n &optional goto +@itemize +@item +Function: @code{org-roam-dailies-capture-yesterday} n &optional goto Create an entry in the daily note for yesterday. With numeric argument @code{n}, use the daily note @code{n} days in the past. -@end defun -@defun @code{org-roam-dailies-goto-yesterday} +@item +Function: @code{org-roam-dailies-goto-yesterday} With numeric argument N, use the daily-note N days in the future. -@end defun +@end itemize There are also commands which allow you to use Emacs’s @code{calendar} to find the date -@defun @code{org-roam-dailies-capture-date} +@itemize +@item +Function: @code{org-roam-dailies-capture-date} Create an entry in the daily note for a date using the calendar. @@ -1841,29 +1788,29 @@ Prefer past dates, unless @code{prefer-future} is non-nil. With a 'C-u' prefix or when @code{goto} is non-nil, go the note without creating an entry. -@end defun -@defun @code{org-roam-dailies-goto-date} +@item +Function: @code{org-roam-dailies-goto-date} Find the daily note for a date using the calendar, creating it if necessary. Prefer past dates, unless @code{prefer-future} is non-nil. -@end defun -@defun @code{org-roam-dailies-find-directory} +@item +Function: @code{org-roam-dailies-find-directory} Find and open @code{org-roam-dailies-directory}. -@end defun -@defun @code{org-roam-dailies-goto-previous-note} +@item +Function: @code{org-roam-dailies-goto-previous-note} When in an daily-note, find the previous one. -@end defun -@defun @code{org-roam-dailies-goto-next-note} +@item +Function: @code{org-roam-dailies-goto-next-note} When in an daily-note, find the next one. -@end defun +@end itemize @node org-roam-export @section org-roam-export @@ -2065,7 +2012,6 @@ Org-mode, and sync your cards to Anki via @uref{https://github.com/FooSoft/anki- * How do I migrate from Roam Research?:: * How to migrate from Org-roam v1?:: * How do I publish my notes with an Internet-friendly graph?:: -* I'm seeing this ``Selecting deleted buffer'' error. What do I do?: I'm seeing this ``Selecting deleted buffer'' error What do I do?. @end menu @node How do I have more than one Org-roam directory? @@ -2110,15 +2056,14 @@ This situation arises when, for example, one would like to create a note titled The solution is dependent on the mini-buffer completion framework in use. Here are the solutions: -@itemize - @item - Ivycall @code{ivy-immediate-done}, typically bound to @code{C-M-j}. Alternatively, +@table @asis +@item Ivy +call @code{ivy-immediate-done}, typically bound to @code{C-M-j}. Alternatively, set @code{ivy-use-selectable-prompt} to @code{t}, so that ``bar'' is now selectable. - -@item - HelmOrg-roam should provide a selectable ``[?] bar'' candidate at the top of +@item Helm +Org-roam should provide a selectable ``[?] bar'' candidate at the top of the candidate list. -@end itemize +@end table @node How can I stop Org-roam from creating IDs everywhere? @section How can I stop Org-roam from creating IDs everywhere? @@ -2150,28 +2095,23 @@ provides a good overview of what's new in v2 and how to migrate. Essentially, to migrate notes from v1 to v2, one must: -@itemize +@enumerate @item Add IDs to all existing notes. These are located in top-level property drawers (Although note that in v2, not all files need to have IDs). - @item Update the Org-roam database to conform to the new schema. - @item Replace @code{#+ROAM_KEY} into the @code{ROAM_REFS} property - @item Replace @code{#+ROAM_ALIAS} into the @code{ROAM_ALIASES} property - @item Move @code{#+ROAM_TAGS} into the @code{#+FILETAGS} property for file-level nodes, and the @code{ROAM_TAGS} property for headline nodes - @item Replace existing file links with ID links. -@end itemize +@end enumerate @node How do I publish my notes with an Internet-friendly graph? @section How do I publish my notes with an Internet-friendly graph? @@ -2183,18 +2123,16 @@ Likewise, it defaults to displaying the graph in Emacs which has the exact same caveats. This problem is solvable in the following way using org-mode's native @uref{https://orgmode.org/manual/Publishing.html, publishing} capability: -@itemize +@enumerate @item configure org-mode to publish your org-roam notes as a project. - @item create a function that overrides the default org-protocol link creation function(@samp{org-roam-default-link-builder}). - @item create a hook that's called at the end of graph creation to copy the generated graph to the appropriate place. -@end itemize +@end enumerate The example code below is used to publish to a local directory where a separate shell script copies the files to the remote site. @@ -2209,16 +2147,14 @@ separate shell script copies the files to the remote site. @subsection Configure org-mode for publishing This has two steps: -@itemize +@enumerate @item Setting of a @emph{roam} project that publishes your notes. - @item Configuring the @emph{sitemap.html} generation. - @item Setting up @samp{org-publish} to generate the graph. -@end itemize +@end enumerate This will require code like the following: @lisp @@ -2276,27 +2212,6 @@ to the publishing directory. Example code follows: (setq my-publish-time 0))))) @end lisp -@node I'm seeing this ``Selecting deleted buffer'' error What do I do? -@section I'm seeing this ``Selecting deleted buffer'' error. What do I do? - -The ``selecting deleted buffer'' error usually occurs when you don't have a -working @code{emacsql-sqlite} executable. Org-roam relies on this executable to -function properly, and doesn't catch this error. This issue is most commonly -seen on Windows setups. You can browse through the various GitHub issues posted -about this @uref{https://github.com/org-roam/org-roam/issues?q=is%3Aissue+selecting+deleted, here}. - -To fix this, you can try the following: - -@itemize -@item -If on Windows, try replacing your system binary with @uref{https://github.com/nobiot/emacsql-sqlite.exe, this one} that has been proven -to work - -@item -Use the @code{emacsql-sqlite3} option rather than compiling your own emacsql -binary (see @ref{How to cache}). -@end itemize - @node Developer's Guide to Org-roam @chapter Developer's Guide to Org-roam @@ -2330,14 +2245,12 @@ not limited to: @itemize @item link graph traversal and visualization - @item Instantaneous SQL-like queries on headlines @itemize @item What are my TODOs, scheduled for X, or due by Y@? @end itemize - @item Accessing the properties of a node, such as its tags, refs, TODO state or priority @@ -2360,7 +2273,6 @@ the following functionalities: @itemize @item Access to Org-roam's database - @item Usage/modification of Org-roam's interactive commands @end itemize @@ -2369,16 +2281,15 @@ Org-roam provides no guarantees that extensions will continue to function as Org-roam evolves, but by following these simple rules, extensions can be made robust to local changes in Org-roam. -@itemize +@enumerate @item Extensions should not modify the database schema. Any extension that requires the caching of additional data should make a request upstream to Org-roam. - @item Extensions requiring access to the database should explicitly state support for the database version (@code{org-roam-db-version}), and only conditionally load when support is available. -@end itemize +@end enumerate @menu * Accessing the Database:: @@ -2408,13 +2319,15 @@ that extensions/customizations are robust to change, extensions should only use The node interface is cleanly defined using @code{cl-defstruct}. The primary method to access nodes is @code{org-roam-node-at-point} and @code{org-roam-node-read}: -@defun org-roam-node-at-point &optional assert +@itemize +@item +Function: org-roam-node-at-point &optional assert Return the node at point. If ASSERT, throw an error if there is no node at point. -@end defun -@defun org-roam-node-read &optional initial-input filter-fn sort-fn +@item +Function: org-roam-node-read &optional initial-input filter-fn sort-fn require-match Read and return an `org-roam-node'. @@ -2425,7 +2338,7 @@ filtered out. SORT-FN is a function to sort nodes. See @code{org-roam-node-read-sort-by-file-mtime} for an example sort function. If REQUIRE-MATCH, the minibuffer prompt will require a match. -@end defun +@end itemize Once you obtain the node, you can use the accessors for the node, e.g. @code{org-roam-node-id} or @code{org-roam-node-todo}. @@ -2452,7 +2365,9 @@ Org-roam applies some patching over Org's capture system to smooth out the user experience, and sometimes it is desirable to use Org-roam's capturing system instead. The exposed function to be used in extensions is @code{org-roam-capture-}: -@defun org-roam-capture- &key goto keys node info props templates +@itemize +@item +Function: org-roam-capture- &key goto keys node info props templates Main entry point. GOTO and KEYS correspond to `org-capture' arguments. @@ -2460,7 +2375,7 @@ INFO is a plist for filling up Org-roam's capture templates. NODE is an `org-roam-node' construct containing information about the node. PROPS is a plist containing additional Org-roam properties for each template. TEMPLATES is a list of org-roam templates. -@end defun +@end itemize An example of an extension using @code{org-roam-capture-} is @code{org-roam-dailies} itself: @@ -2488,43 +2403,36 @@ When GOTO is non-nil, go the note without creating an entry." @node Note-taking Workflows @section Note-taking Workflows +@table @asis +@item Books @itemize - @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 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 Threads +@itemize @item @uref{https://news.ycombinator.com/item?id=22473209, Ask HN: How to Take Good Notes} @end itemize - -@item - Videos@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 itemize +@end table @node Ecosystem @section Ecosystem @@ -2549,5 +2457,5 @@ When GOTO is non-nil, go the note without creating an entry." @printindex vr -Emacs 29.0.50 (Org mode 9.6) -@bye \ No newline at end of file +Emacs 29.4 (Org mode 9.7.19) +@bye