mirror of
https://github.com/org-roam/org-roam
synced 2025-08-03 12:27:23 -05:00
Compare commits
160 Commits
Author | SHA1 | Date | |
---|---|---|---|
eca07277ce | |||
48158e67d4 | |||
278e3df95d | |||
48d2c199ac | |||
7f7ba857de | |||
cf368ab4d8 | |||
43dbad1f62 | |||
040913151f | |||
1a964520f2 | |||
39276362d7 | |||
1168c9b6da | |||
92e02b5d14 | |||
26b90b28e3 | |||
f4376f39a9 | |||
898c6c8178 | |||
30599cc3e8 | |||
9d5a34d0f4 | |||
5bf3e596c8 | |||
14f83bdb07 | |||
81e7a5b231 | |||
1756ec6441 | |||
c61f7e20f2 | |||
563252a6f6 | |||
fdaf07da43 | |||
5d25c4552d | |||
c46d153fd3 | |||
0cd4bc05c5 | |||
c5e0c6b9fa | |||
721689d5b5 | |||
d36d3185ae | |||
3ad43b0823 | |||
b2594b84ae | |||
3440e647c0 | |||
1d28b07a7c | |||
195669ad10 | |||
47feff5a8b | |||
7200364d31 | |||
873a314746 | |||
91c905d7e3 | |||
f9a9f15a8b | |||
9ddadc9c25 | |||
d0fab34287 | |||
e3281fc31f | |||
5ee38f2d89 | |||
2e220f511e | |||
1581d875ce | |||
50cc81c76d | |||
f95cea7067 | |||
41a1970c6f | |||
8818f50f41 | |||
ea6bd215fc | |||
a05b1ebcc3 | |||
214f9df844 | |||
4f5a82e291 | |||
4d0b5734c8 | |||
4cd0fe4e41 | |||
1eefc264f5 | |||
525a58dd86 | |||
4a9401dd40 | |||
dd2406ec92 | |||
c4189ffa04 | |||
e3d101f495 | |||
2cced712fa | |||
cce2db8b5a | |||
2147adf95c | |||
d2654f6023 | |||
78b518efd3 | |||
1b5e55b6c4 | |||
4b45f1dbf5 | |||
e0aee184a7 | |||
eae97487dc | |||
f5a9dfab9b | |||
7844827757 | |||
74f12ee8aa | |||
055669817a | |||
1fc08b4428 | |||
cfe3b19a73 | |||
1bc1559743 | |||
265182a698 | |||
4b4ebf76c7 | |||
3bc174a6f0 | |||
8091f4598e | |||
1267a43043 | |||
8ff09b4b6d | |||
2499c7e220 | |||
d816250614 | |||
47763f49fd | |||
9961a22a8c | |||
f390593cfb | |||
59c18c0e8c | |||
3df3b6519c | |||
b47b76aa41 | |||
abb36d11ef | |||
e55a38530d | |||
80bc19cbda | |||
85b3e488b2 | |||
5a9f765a49 | |||
1c7c5b3b9b | |||
4266a81b51 | |||
36940e1eef | |||
176aac67e6 | |||
376ff71616 | |||
232921b9a1 | |||
9e2998c580 | |||
e44b84b791 | |||
5e63bf32ed | |||
e62bda799a | |||
46975107a2 | |||
b388fd3db2 | |||
e0cefa7377 | |||
fca1777648 | |||
1722fae9af | |||
3727f015cd | |||
a85205e7bc | |||
b4927abbd7 | |||
ad5fca5440 | |||
3efe315ff1 | |||
d68d1f8ebb | |||
c70f2d5f54 | |||
d3206b797a | |||
dee540b62f | |||
46fd2a9a68 | |||
c1bfa99ace | |||
9bc80ff9f7 | |||
1912beebc3 | |||
f8f7e6009c | |||
689f559080 | |||
3ca2d9f4ca | |||
cd0850f1c1 | |||
11e15594cc | |||
f6e84caf72 | |||
11d239d661 | |||
7df50c14ec | |||
a723199d68 | |||
1bbfb0cdc9 | |||
69d4f05a13 | |||
4cad2cf6e6 | |||
e698ed7f53 | |||
0132546e56 | |||
a8e2544435 | |||
1ad3539c54 | |||
5b773b687b | |||
08aa5c630d | |||
e05ee1240d | |||
65d99e998c | |||
ea3f5d00a0 | |||
7680663205 | |||
d0819aeffb | |||
bd4b9d41e8 | |||
4142300501 | |||
487025aa2f | |||
bd3c97bb30 | |||
265a3054be | |||
8bb2465e61 | |||
c3a5544da9 | |||
963692f353 | |||
d01f7b2daf | |||
8a99febd0b | |||
b5786edb30 | |||
dce8c47d6e |
6
.dir-locals.el
Normal file
6
.dir-locals.el
Normal file
@ -0,0 +1,6 @@
|
||||
;;; Directory Local Variables
|
||||
;;; For more information see (info "(emacs) Directory Variables")
|
||||
|
||||
((emacs-lisp-mode
|
||||
(eval . (require 'org-roam-dev))
|
||||
(sentence-end-double-space . nil)))
|
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [jethrokuan, zaeph]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
23
.github/ISSUE_TEMPLATE/bug_report.md
vendored
23
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,14 +1,15 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Something's not working.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: 'jethrokuan'
|
||||
title: ""
|
||||
labels: ""
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
### Description
|
||||
|
||||
#### Steps to Reproduce
|
||||
|
||||
<!--
|
||||
Example:
|
||||
|
||||
@ -18,13 +19,25 @@ Example:
|
||||
...
|
||||
-->
|
||||
|
||||
#### Backtrace
|
||||
<!--
|
||||
Will help us track and understand issues faster.
|
||||
How to provide a backtrace:
|
||||
1. M-x toggle-debug-on-error
|
||||
2. Trigger error. The debugger buffer should pop up.
|
||||
3. Copy the contents of the debugger buffer and paste here
|
||||
-->
|
||||
|
||||
#### Expected Results
|
||||
|
||||
<!-- Example: File A is there -->
|
||||
|
||||
#### Actual Results
|
||||
|
||||
<!-- Example: File A is missing -->
|
||||
|
||||
### Versions
|
||||
- Emacs (`C-h v emacs-version`): vX.X.X
|
||||
### Environment
|
||||
|
||||
<!-- Please M-x org-roam-diagnostics and paste results here -->
|
||||
|
||||
- Org-roam commit: https://github.com/jethrokuan/org-roam/commit/commithashhere
|
||||
|
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,9 +1,9 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Create a feature request to improve Org-roam
|
||||
title: ''
|
||||
labels: 'enhancement'
|
||||
assignees: 'jethrokuan'
|
||||
title: ""
|
||||
labels: "enhancement"
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
### Brief Abstract
|
||||
@ -13,4 +13,5 @@ assignees: 'jethrokuan'
|
||||
### Proposed Implementation (if any)
|
||||
|
||||
### Please check the following:
|
||||
|
||||
- [ ] No similar feature requests
|
||||
|
31
.github/workflows/docs.yml
vendored
Normal file
31
.github/workflows/docs.yml
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
# * docs.yml --- Build the documentation and publish to Github Pages
|
||||
|
||||
name: "Docs"
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get install texinfo
|
||||
|
||||
- name: Build docs
|
||||
continue-on-error: false
|
||||
run: make html
|
||||
|
||||
- name: Deploy 🚀
|
||||
uses: JamesIves/github-pages-deploy-action@releases/v3
|
||||
with:
|
||||
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
BRANCH: gh-pages # The branch the action should deploy to.
|
||||
FOLDER: doc # The folder the action should deploy.
|
||||
CLEAN: true
|
7
.github/workflows/test.yml
vendored
7
.github/workflows/test.yml
vendored
@ -29,7 +29,6 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@ -55,9 +54,11 @@ jobs:
|
||||
# The "all" rule is not used, because it treats compilation warnings
|
||||
# as failures, so linting and testing are run as separate steps.
|
||||
|
||||
# org-roam-compat is excluded from linting because it contains
|
||||
# symbols/aliases from other packages
|
||||
- name: Lint
|
||||
continue-on-error: true
|
||||
run: ./makem.sh -vv --sandbox $SANDBOX_DIR lint
|
||||
continue-on-error: false
|
||||
run: ./makem.sh -vv --sandbox $SANDBOX_DIR --exclude org-roam-compat.el lint
|
||||
|
||||
- name: Test
|
||||
if: always() # Run test even if linting fails.
|
||||
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -1,2 +1,15 @@
|
||||
/.sandbox/
|
||||
**/*.elc
|
||||
/doc/dir
|
||||
/doc/*.info
|
||||
/doc/*.pdf
|
||||
/doc/*.epub
|
||||
/doc/META_INF/
|
||||
/doc/OEBPS/
|
||||
/doc/dir
|
||||
/doc/epub.xml
|
||||
/doc/org-roam/
|
||||
/doc/mimetype
|
||||
/doc/stats/
|
||||
/config.mk
|
||||
/doc/manual/
|
||||
|
5
BACKERS.md
Normal file
5
BACKERS.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Backers
|
||||
|
||||
Many thanks to the following backers, your contributions are greatly appreciated!
|
||||
|
||||
- Nathan Tran
|
224
CHANGELOG.md
224
CHANGELOG.md
@ -1,5 +1,72 @@
|
||||
# Changelog
|
||||
|
||||
## 1.2.0 (12-06-2020)
|
||||
|
||||
In this release, we improved the linking process by achieving feature parity between links to files and links to headlines. Before, we used the `file:foo::*bar` format to link to the headline `bar` in file `foo`, but this was prone to breakage upon renaming the file or modifying the headline. This is not the case anymore. Now, we use `org-id` to create IDs for those headlines, which are then stored in our database to compute the relationships and jump around. Note that this will work even if you’re not using `org-id` in your global configuration for Org-mode.
|
||||
|
||||
This is a major step forward. Supporting the in-file structure of Org-mode files means that we can interface with many of its core-features like TODOs, properties, priorities, etc. UX will have to be figured out, but this release ushers in a new age in terms of functionalities.
|
||||
|
||||
We also add `org-roam-unlinked-references`, which naively finds text that could be references to the current Org-roam file.
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [#701](https://github.com/org-roam/org-roam/pull/701) Use `emacsql-sqlite3` instead of `emacsql-sqlite` for better Windows compatibility. This requires the presence of the standard `sqlite3` binary on your machine.
|
||||
- [#750](https://github.com/org-roam/org-roam/pull/750) Deprecate `org-roam-buffer-no-delete-other-windows` in favour of `org-roam-buffer-window-parameters`.
|
||||
|
||||
### Features
|
||||
|
||||
- [#787](https://github.com/org-roam/org-roam/pull/787) Add `org-roam-unlinked-references`
|
||||
- [#783](https://github.com/org-roam/org-roam/pull/783) Add support for headlines
|
||||
- [#757](https://github.com/org-roam/org-roam/pull/757) Roam global properties are now case-insensitive
|
||||
- [#680](https://github.com/org-roam/org-roam/pull/680) , [#703](https://github.com/org-roam/org-roam/pull/703), [#708](https://github.com/org-roam/org-roam/pull/708) Add `org-roam-doctor` checkers for `ROAM_*` properties
|
||||
- [#664](https://github.com/org-roam/org-roam/pull/664) Add support for shelling out to `rg` and `find` in `org-roam--list-files`
|
||||
- [#679](https://github.com/org-roam/org-roam/pull/679), [#683](https://github.com/org-roam/org-roam/pull/683) Building of the graph now happens in a separate process
|
||||
|
||||
### Bugfixes
|
||||
- [#714](https://github.com/org-roam/org-roam/pull/714) No longer print citelinks in backlinks buffer if there is no `ROAM_KEY` property or `org-ref` is not installed
|
||||
- [#759](https://github.com/org-roam/org-roam/pull/759), [#760](https://github.com/org-roam/org-roam/pull/760) Tags are only added to the tags table if there are actually tags present
|
||||
- [#700](https://github.com/org-roam/org-roam/pull/700), [#733](https://github.com/org-roam/org-roam/pull/733) Allow symlinks within the `org-roam` directory
|
||||
|
||||
## 1.1.1 (18-05-2020)
|
||||
|
||||
In this release, we added two new features:
|
||||
|
||||
1. `org-roam-doctor`: a linting system that helps you discover possible problems with your Org-roam files. This is in the spirit of keeping notes in top quality.
|
||||
2. A tagging system: one can now use sub-directories, and the `#+roam_tags` key add additional meta data to notes. For more information, see [here](https://org-roam.github.io/org-roam/manual/Tags.html#Tags).
|
||||
|
||||
As usual, this release comes with a multitude of bug-fixes and refactorings.
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [#523](https://github.com/org-roam/org-roam/pull/523) remove `org-roam-completion-fuzzy-match` in favor of using completion mechanism's configuration options directly
|
||||
- [#547](https://github.com/org-roam/org-roam/pull/547) Deprecate `org-roam-db--maybe-update`, in favour of `org-roam-db--update-maybe`
|
||||
- [#604](https://github.com/org-roam/org-roam/pull/604) Deprecate `org-roam-title-include-subdirs`, `org-roam-title-subdir-format` `org-roam-title-subdir-separator`, for a more general tagging system built on subdirectories
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- [#509](https://github.com/org-roam/org-roam/pull/509) fix backup files being tracked in database
|
||||
- [#509](https://github.com/org-roam/org-roam/pull/509) fix external org files being tracked in database
|
||||
- [#537](https://github.com/org-roam/org-roam/pull/537) quote graphviz node and edge configuration options to allow multi-word configurations
|
||||
- [#545](https://github.com/org-roam/org-roam/pull/545) fix `org-roam--extract-links` to ensure that multiple citations (`cite:key1,key2`) are split correctly
|
||||
- [#547](https://github.com/org-roam/org-roam/pull/547) Fix unlinked citations
|
||||
- [#660](https://github.com/org-roam/org-roam/pull/660) fix rename-file advice not working for renaming to directories
|
||||
- [#660](https://github.com/org-roam/org-roam/pull/660) fix links breaking within file on file movement
|
||||
|
||||
### Features
|
||||
|
||||
- [#538](https://github.com/org-roam/org-roam/pull/538) Optionally use text in first headline as title
|
||||
- [#553](https://github.com/org-roam/org-roam/pull/553) Add prefix argument to `org-roam-db-build-cache` for forcing rebuilds
|
||||
- [#560](https://github.com/org-roam/org-roam/pull/560) Apply 'error face to distinguish broken links
|
||||
- [#570](https://github.com/org-roam/org-roam/pull/570) Add `org-roam-doctor` to diagnose org-roam files
|
||||
- [#625](https://github.com/org-roam/org-roam/pull/625) Add `org-roam-title-sources` to control how titles are retrieved within notes
|
||||
- [#604](https://github.com/org-roam/org-roam/pull/604) Add a tagging system. `org-roam-tag-sources` controls how tags are retrieved from notes
|
||||
|
||||
### Internal Changes
|
||||
|
||||
- [#547](https://github.com/org-roam/org-roam/pull/547) Added `type` column to the `refs` table
|
||||
- [#606](https://github.com/org-roam/org-roam/pull/606) Added `org-roam-dev.el` for developer coding standards
|
||||
- [#622](https://github.com/org-roam/org-roam/pull/622) Online documentation now points to the Org-based documentation
|
||||
|
||||
## 1.1.0 (21-04-2020)
|
||||
|
||||
To the average user, this release is mainly a bugfix release with additional options to customize. However, the changes made to the source is significant. Most notably, in this release:
|
||||
@ -8,31 +75,35 @@ To the average user, this release is mainly a bugfix release with additional opt
|
||||
2. [@kljohann](https://github.com/kljohann) did some fantastic work on graph generation: allowing building images for connected components within the graph up to a specified distance
|
||||
3. We also started supporting `org-ref` natively: cite links now show up in both the graph and the org-roam buffer.
|
||||
|
||||
In the coming months, you can expect work on bigger projects (e.g. revamping the org-roam buffer).
|
||||
|
||||
In the coming months, you can expect work on bigger projects (e.g. revamping the org-roam buffer).
|
||||
|
||||
### Breaking Changes
|
||||
* [#385](https://github.com/jethrokuan/org-roam/pull/385) Deprecate `org-roam-graph-node-shape` in favour of `org-roam-graph-node-extra-config`.
|
||||
* [#473](https://github.com/jethrokuan/org-roam/pull/473) Deprecate `org-roam-date-filename-format` and `org-roam-date-title-format`, in favour of `org-roam-dailies-capture-templates`.
|
||||
|
||||
- [#385](https://github.com/org-roam/org-roam/pull/385) Deprecate `org-roam-graph-node-shape` in favour of `org-roam-graph-node-extra-config`.
|
||||
- [#473](https://github.com/org-roam/org-roam/pull/473) Deprecate `org-roam-date-filename-format` and `org-roam-date-title-format`, in favour of `org-roam-dailies-capture-templates`.
|
||||
|
||||
### New Features
|
||||
* [#350](https://github.com/jethrokuan/org-roam/pull/350) Add `org-roam-db-location` to customize location of org-roam database.
|
||||
* [#359](https://github.com/jethrokuan/org-roam/pull/359) Add `org-roam-verbose` to allow or silence printing of information.
|
||||
* [#374](https://github.com/jethrokuan/org-roam/pull/374) Add support for `org-ref` `cite:` links
|
||||
* [#380](https://github.com/jethrokuan/org-roam/pull/380) Allow `org-roam-buffer-position` to also be `top` or `bottom`
|
||||
* [#385](https://github.com/jethrokuan/org-roam/pull/385) Add `org-roam-graph-node-extra-config` to configure Graphviz nodes
|
||||
* [#398](https://github.com/jethrokuan/org-roam/pull/398), [#418](https://github.com/jethrokuan/org-roam/pull/418) Add graph building for connected components
|
||||
* [#435](https://github.com/jethrokuan/org-roam/pull/435) Add `org-roam-graph-edge-extra-config` to configure Graphviz edges
|
||||
* [#439](https://github.com/jethrokuan/org-roam/pull/439) Add support for `org-ref` citations to display as edges in graph. Add `org-roam-graph-edge-cites-extra-config` to configure these edges
|
||||
* [#465](https://github.com/jethrokuan/org-roam/pull/465) Add `org-roam-file-extensions` to allow detection of org files with different file extensions
|
||||
* [#488](https://github.com/jethrokuan/org-roam/pull/488) Allow a function for `org-roam-graph-viewer`
|
||||
* [#491](https://github.com/jethrokuan/org-roam/pull/491) Use TITLE as description when linking before first heading
|
||||
|
||||
- [#350](https://github.com/org-roam/org-roam/pull/350) Add `org-roam-db-location` to customize location of org-roam database.
|
||||
- [#359](https://github.com/org-roam/org-roam/pull/359) Add `org-roam-verbose` to allow or silence printing of information.
|
||||
- [#374](https://github.com/org-roam/org-roam/pull/374) Add support for `org-ref` `cite:` links
|
||||
- [#380](https://github.com/org-roam/org-roam/pull/380) Allow `org-roam-buffer-position` to also be `top` or `bottom`
|
||||
- [#385](https://github.com/org-roam/org-roam/pull/385) Add `org-roam-graph-node-extra-config` to configure Graphviz nodes
|
||||
- [#398](https://github.com/org-roam/org-roam/pull/398), [#418](https://github.com/org-roam/org-roam/pull/418) Add graph building for connected components
|
||||
- [#435](https://github.com/org-roam/org-roam/pull/435) Add `org-roam-graph-edge-extra-config` to configure Graphviz edges
|
||||
- [#439](https://github.com/org-roam/org-roam/pull/439) Add support for `org-ref` citations to display as edges in graph. Add `org-roam-graph-edge-cites-extra-config` to configure these edges
|
||||
- [#465](https://github.com/org-roam/org-roam/pull/465) Add `org-roam-file-extensions` to allow detection of org files with different file extensions
|
||||
- [#488](https://github.com/org-roam/org-roam/pull/488) Allow a function for `org-roam-graph-viewer`
|
||||
- [#491](https://github.com/org-roam/org-roam/pull/491) Use TITLE as description when linking before first heading
|
||||
|
||||
### Bugfixes
|
||||
* [#470](https://github.com/jethrokuan/org-roam/pull/470) Add workaround for undocumented `file-truename` behaviour in `org-roam--org-roam-file-p`.
|
||||
|
||||
- [#470](https://github.com/org-roam/org-roam/pull/470) Add workaround for undocumented `file-truename` behaviour in `org-roam--org-roam-file-p`.
|
||||
|
||||
### Internal Changes
|
||||
* [#363](https://github.com/jethrokuan/org-roam/pull/363), [#473](https://github.com/jethrokuan/org-roam/pull/473) Modularize org-roam features.
|
||||
* [#497](https://github.com/jethrokuan/org-roam/pull/497) Simplify `org-roam--list-files` implementation
|
||||
|
||||
- [#363](https://github.com/org-roam/org-roam/pull/363), [#473](https://github.com/org-roam/org-roam/pull/473) Modularize org-roam features.
|
||||
- [#497](https://github.com/org-roam/org-roam/pull/497) Simplify `org-roam--list-files` implementation
|
||||
|
||||
## 1.0.0 (23-03-2020)
|
||||
|
||||
@ -40,16 +111,18 @@ Org-roam is now on MELPA! We have squashed most of the bugs, and Org-roam has
|
||||
been stable for the most part.
|
||||
|
||||
### New Features
|
||||
* [#269](https://github.com/jethrokuan/org-roam/pull/269) Add `org-roam-graphviz-extra-options`
|
||||
* [#257](https://github.com/jethrokuan/org-roam/pull/257) Add a company-backend `company-org-roam`
|
||||
* [#284](https://github.com/jethrokuan/org-roam/pull/284), [#289](https://github.com/jethrokuan/org-roam/pull/289) Configurable `org-roam-completion-system` with options `'default`, `'ido`, `'ivy` and `'helm`
|
||||
* [#289](https://github.com/jethrokuan/org-roam/pull/289) Add customizable `org-roam-fuzzy-match` to allow fuzzy-matching of candidates
|
||||
* [#290](https://github.com/jethrokuan/org-roam/pull/290) Add `org-roam-date-title-format` and `org-roam-date-filename-format` for customizing Org-roam's date files
|
||||
* [#296](https://github.com/jethrokuan/org-roam/pull/296) Allow multiple exclusion matchers in `org-roam-graph-exclude-matcher`
|
||||
|
||||
- [#269](https://github.com/org-roam/org-roam/pull/269) Add `org-roam-graphviz-extra-options`
|
||||
- [#257](https://github.com/org-roam/org-roam/pull/257) Add a company-backend `company-org-roam`
|
||||
- [#284](https://github.com/org-roam/org-roam/pull/284), [#289](https://github.com/org-roam/org-roam/pull/289) Configurable `org-roam-completion-system` with options `'default`, `'ido`, `'ivy` and `'helm`
|
||||
- [#289](https://github.com/org-roam/org-roam/pull/289) Add customizable `org-roam-fuzzy-match` to allow fuzzy-matching of candidates
|
||||
- [#290](https://github.com/org-roam/org-roam/pull/290) Add `org-roam-date-title-format` and `org-roam-date-filename-format` for customizing Org-roam's date files
|
||||
- [#296](https://github.com/org-roam/org-roam/pull/296) Allow multiple exclusion matchers in `org-roam-graph-exclude-matcher`
|
||||
|
||||
### Bugfixes
|
||||
* [#293](https://github.com/jethrokuan/org-roam/pull/293) Fix capture templates not working as expected for `org-roam-find-file`
|
||||
* [#275](https://github.com/jethrokuan/org-roam/pull/275) Fix database rebuild when `org-roam-directory` is set locally
|
||||
|
||||
- [#293](https://github.com/org-roam/org-roam/pull/293) Fix capture templates not working as expected for `org-roam-find-file`
|
||||
- [#275](https://github.com/org-roam/org-roam/pull/275) Fix database rebuild when `org-roam-directory` is set locally
|
||||
|
||||
## 1.0.0-rc1 (06-03-2020)
|
||||
|
||||
@ -59,82 +132,95 @@ backing storage has been changed to a SQLite database, and a
|
||||
templating system using `org-capture` is introduced.
|
||||
|
||||
### Breaking Changes
|
||||
* [#200](https://github.com/jethrokuan/org-roam/pull/200) Move Org-roam cache into a SQLite database.
|
||||
* [#203](https://github.com/jethrokuan/org-roam/pull/203) Roam protocol is deprecated, in favour of extending org-roam-protocol.
|
||||
|
||||
- [#200](https://github.com/org-roam/org-roam/pull/200) Move Org-roam cache into a SQLite database.
|
||||
- [#203](https://github.com/org-roam/org-roam/pull/203) Roam protocol is deprecated, in favour of extending org-roam-protocol.
|
||||
|
||||
### New Features
|
||||
* [#182](https://github.com/jethrokuan/org-roam/pull/182) Support file name aliases via `#+ROAM_ALIAS`.
|
||||
* [#216](https://github.com/jethrokuan/org-roam/pull/216) Adds templating functionality by extending org-capture.
|
||||
* [#232](https://github.com/jethrokuan/org-roam/pull/232) Adds a prefix key to `org-roam-show-graph`, to generate graph without opening it.
|
||||
* [#233](https://github.com/jethrokuan/org-roam/pull/233) Adds `org-roam-graph-exclude-matcher`, which allows exclusion of nodes from graph.
|
||||
* [#247](https://github.com/jethrokuan/org-roam/pull/247) Add `org-roam-backlink` face, which allows customizing backlinks appearance
|
||||
* [#259](https://github.com/jethrokuan/org-roam/pull/259) Add optional initial-prompt to `org-roam-find-file`
|
||||
|
||||
- [#182](https://github.com/org-roam/org-roam/pull/182) Support file name aliases via `#+ROAM_ALIAS`.
|
||||
- [#216](https://github.com/org-roam/org-roam/pull/216) Adds templating functionality by extending org-capture.
|
||||
- [#232](https://github.com/org-roam/org-roam/pull/232) Adds a prefix key to `org-roam-show-graph`, to generate graph without opening it.
|
||||
- [#233](https://github.com/org-roam/org-roam/pull/233) Adds `org-roam-graph-exclude-matcher`, which allows exclusion of nodes from graph.
|
||||
- [#247](https://github.com/org-roam/org-roam/pull/247) Add `org-roam-backlink` face, which allows customizing backlinks appearance
|
||||
- [#259](https://github.com/org-roam/org-roam/pull/259) Add optional initial-prompt to `org-roam-find-file`
|
||||
|
||||
### Bugfixes
|
||||
* [#207](https://github.com/jethrokuan/org-roam/pull/207), [#221](https://github.com/jethrokuan/org-roam/pull/221) small bugfixes to Org-roam graph generation
|
||||
* [#230](https://github.com/jethrokuan/org-roam/pull/230) remove nonspacing marks from filenames, to prevent cross-platform errors
|
||||
|
||||
- [#207](https://github.com/org-roam/org-roam/pull/207), [#221](https://github.com/org-roam/org-roam/pull/221) small bugfixes to Org-roam graph generation
|
||||
- [#230](https://github.com/org-roam/org-roam/pull/230) remove nonspacing marks from filenames, to prevent cross-platform errors
|
||||
|
||||
### New Contributors
|
||||
* [@acowley][https://github.com/acowley]
|
||||
* [@teesloane][https://github.com/teesloane]
|
||||
|
||||
- [@acowley][https://github.com/acowley]
|
||||
- [@teesloane][https://github.com/teesloane]
|
||||
|
||||
## 0.1.2 (2020-02-21)
|
||||
|
||||
### Breaking Changes
|
||||
* [#143](https://github.com/jethrokuan/org-roam/pull/143) `org-roam-mode` is now a global mode. The installation instructions have changed accordingly.
|
||||
* [#103](https://github.com/jethrokuan/org-roam/pull/103) Change `org-roam-file-format` to a function: `org-roam-file-name-function` to allow more flexible file name customizaton. Also changes `org-roam-use-timestamp-as-filename` to `org-roam-filename-noconfirm` to better describe what it does.
|
||||
|
||||
- [#143](https://github.com/org-roam/org-roam/pull/143) `org-roam-mode` is now a global mode. The installation instructions have changed accordingly.
|
||||
- [#103](https://github.com/org-roam/org-roam/pull/103) Change `org-roam-file-format` to a function: `org-roam-file-name-function` to allow more flexible file name customizaton. Also changes `org-roam-use-timestamp-as-filename` to `org-roam-filename-noconfirm` to better describe what it does.
|
||||
|
||||
### New Features
|
||||
* [#145](https://github.com/jethrokuan/org-roam/pull/145) `org-roam-show-graph`: Fallback to Emacs SVG viewer
|
||||
* [#141](https://github.com/jethrokuan/org-roam/pull/141) add variable `org-roam-new-file-directory` for new Org-roam files
|
||||
* [#138](https://github.com/jethrokuan/org-roam/pull/138) add `org-roam-switch-to-buffer`
|
||||
* [#124](https://github.com/jethrokuan/org-roam/pull/124), [#141](https://github.com/jethrokuan/org-roam/pull/141) Maintain cache consistency on file rename and delete
|
||||
* [#87](https://github.com/jethrokuan/org-roam/pull/87), [#90](https://github.com/jethrokuan/org-roam/pull/90) Support encrypted Org files
|
||||
* [#110](https://github.com/jethrokuan/org-roam/pull/110) Add prefix to `org-roam-insert`, for inserting titles down-cased
|
||||
* [#99](https://github.com/jethrokuan/org-roam/pull/99) Add keybinding so that `<return>` or `mouse-1` in the backlinks buffer visits the source file of the backlink at point
|
||||
|
||||
- [#145](https://github.com/org-roam/org-roam/pull/145) `org-roam-show-graph`: Fallback to Emacs SVG viewer
|
||||
- [#141](https://github.com/org-roam/org-roam/pull/141) add variable `org-roam-new-file-directory` for new Org-roam files
|
||||
- [#138](https://github.com/org-roam/org-roam/pull/138) add `org-roam-switch-to-buffer`
|
||||
- [#124](https://github.com/org-roam/org-roam/pull/124), [#141](https://github.com/org-roam/org-roam/pull/141) Maintain cache consistency on file rename and delete
|
||||
- [#87](https://github.com/org-roam/org-roam/pull/87), [#90](https://github.com/org-roam/org-roam/pull/90) Support encrypted Org files
|
||||
- [#110](https://github.com/org-roam/org-roam/pull/110) Add prefix to `org-roam-insert`, for inserting titles down-cased
|
||||
- [#99](https://github.com/org-roam/org-roam/pull/99) Add keybinding so that `<return>` or `mouse-1` in the backlinks buffer visits the source file of the backlink at point
|
||||
|
||||
### Changes
|
||||
|
||||
* [#108](https://github.com/jethrokuan/org-roam/pull/108) Locally overwrite the link following behaviour in the org-roam-buffer to open files in the same window `org-roam` was called from
|
||||
- [#108](https://github.com/org-roam/org-roam/pull/108) Locally overwrite the link following behaviour in the org-roam-buffer to open files in the same window `org-roam` was called from
|
||||
|
||||
### Bugfixes
|
||||
* [#86](https://github.com/jethrokuan/org-roam/pull/86) Fix `org-roam--parse-content` incorrect `:to` computation for nested files
|
||||
* [#98](https://github.com/jethrokuan/org-roam/pull/98) Fix `org-roam--find-file` picking up temporary files
|
||||
* [#136](https://github.com/jethrokuan/org-roam/pull/136) Misc bugfixes
|
||||
|
||||
- [#86](https://github.com/org-roam/org-roam/pull/86) Fix `org-roam--parse-content` incorrect `:to` computation for nested files
|
||||
- [#98](https://github.com/org-roam/org-roam/pull/98) Fix `org-roam--find-file` picking up temporary files
|
||||
- [#136](https://github.com/org-roam/org-roam/pull/136) Misc bugfixes
|
||||
|
||||
### Internal
|
||||
* [#122](https://github.com/jethrokuan/org-roam/pull/122), [#128](https://github.com/jethrokuan/org-roam/pull/128) Improve performance of post-command-hook
|
||||
* [#92](https://github.com/jethrokuan/org-roam/pull/92), [#105](https://github.com/jethrokuan/org-roam/pull/105) Add tests for core functionality
|
||||
|
||||
- [#122](https://github.com/org-roam/org-roam/pull/122), [#128](https://github.com/org-roam/org-roam/pull/128) Improve performance of post-command-hook
|
||||
- [#92](https://github.com/org-roam/org-roam/pull/92), [#105](https://github.com/org-roam/org-roam/pull/105) Add tests for core functionality
|
||||
|
||||
### New Contributors
|
||||
* [@frigge](https://github.com/frigge)
|
||||
* [@juergenhoetzel](https://github.com/juergenhoetzel)
|
||||
* [@chip2n](https://github.com/chip2n)
|
||||
* [@l3kn](https://github.com/l3kn)
|
||||
* [@jdormit](https://github.com/jdormit)
|
||||
* [@herbertjones](https://github.com/herbertjones)
|
||||
* [@CeleritasCelery](https://github.com/CeleritasCelery)
|
||||
* [@daniel-koudouna](https://github.com/daniel-koudouna)
|
||||
|
||||
- [@frigge](https://github.com/frigge)
|
||||
- [@juergenhoetzel](https://github.com/juergenhoetzel)
|
||||
- [@chip2n](https://github.com/chip2n)
|
||||
- [@l3kn](https://github.com/l3kn)
|
||||
- [@jdormit](https://github.com/jdormit)
|
||||
- [@herbertjones](https://github.com/herbertjones)
|
||||
- [@CeleritasCelery](https://github.com/CeleritasCelery)
|
||||
- [@daniel-koudouna](https://github.com/daniel-koudouna)
|
||||
|
||||
## 0.1.1 (2020-02-15)
|
||||
|
||||
Mostly a documentation/cleanup release.
|
||||
|
||||
### New Features
|
||||
* [#62](https://github.com/jethrokuan/org-roam/pull/62) Add the options `org-roam-use-timestamps-as-filename` and `org-roam-file-format`, more in documentation.
|
||||
|
||||
- [#62](https://github.com/org-roam/org-roam/pull/62) Add the options `org-roam-use-timestamps-as-filename` and `org-roam-file-format`, more in documentation.
|
||||
|
||||
### Breaking Changes
|
||||
* [#62](https://github.com/jethrokuan/org-roam/pull/62) The ID (file-name) workflow is no longer first-class, but a fallback when titles don't exist.
|
||||
|
||||
- [#62](https://github.com/org-roam/org-roam/pull/62) The ID (file-name) workflow is no longer first-class, but a fallback when titles don't exist.
|
||||
|
||||
### Changes
|
||||
* [#66](https://github.com/jethrokuan/org-roam/pull/66), [#68](https://github.com/jethrokuan/org-roam/pull/68): Improved the quality of the package in preparation of submission to MELPA
|
||||
* [#73](https://github.com/jethrokuan/org-roam/pull/73): Added CI to the project via Github Issues (Thanks [@alphapapa](https://github.com/alphapapa/) for scripts and setup)
|
||||
* [#69](https://github.com/jethrokuan/org-roam/pull/69), [#72](https://github.com/jethrokuan/org-roam/pull/72), [#75](https://github.com/jethrokuan/org-roam/pull/75): Major cleanup and de-duplication of code
|
||||
|
||||
- [#66](https://github.com/org-roam/org-roam/pull/66), [#68](https://github.com/org-roam/org-roam/pull/68): Improved the quality of the package in preparation of submission to MELPA
|
||||
- [#73](https://github.com/org-roam/org-roam/pull/73): Added CI to the project via Github Issues (Thanks [@alphapapa](https://github.com/alphapapa/) for scripts and setup)
|
||||
- [#69](https://github.com/org-roam/org-roam/pull/69), [#72](https://github.com/org-roam/org-roam/pull/72), [#75](https://github.com/org-roam/org-roam/pull/75): Major cleanup and de-duplication of code
|
||||
|
||||
### Bugfixes
|
||||
* [#67](https://github.com/jethrokuan/org-roam/pull/67): Fixed `org-roam--make-file` not creating files with extensions
|
||||
* [#71](https://github.com/jethrokuan/org-roam/pull/71), [#78](https://github.com/jethrokuan/org-roam/pull/78): Fixed `org-roam-insert` not inserting correct paths
|
||||
* [#82](https://github.com/jethrokuan/org-roam/pull/82): Fixed nested Org-roam files not being detected as part of Org-roam
|
||||
|
||||
- [#67](https://github.com/org-roam/org-roam/pull/67): Fixed `org-roam--make-file` not creating files with extensions
|
||||
- [#71](https://github.com/org-roam/org-roam/pull/71), [#78](https://github.com/org-roam/org-roam/pull/78): Fixed `org-roam-insert` not inserting correct paths
|
||||
- [#82](https://github.com/org-roam/org-roam/pull/82): Fixed nested Org-roam files not being detected as part of Org-roam
|
||||
|
||||
<!-- Local Variables: -->
|
||||
<!-- eval: (auto-fill-mode -1) -->
|
||||
|
14
Makefile
14
Makefile
@ -54,3 +54,17 @@ endif
|
||||
.DEFAULT: init
|
||||
init:
|
||||
@./makem.sh $(DEBUG) $(VERBOSE) $(SANDBOX) $(INSTALL_DEPS) $(INSTALL_LINTERS)
|
||||
|
||||
docs:
|
||||
@$(MAKE) -C doc all
|
||||
|
||||
html:
|
||||
@$(MAKE) -C doc html-dir
|
||||
|
||||
install: install-docs
|
||||
|
||||
install-docs: docs
|
||||
@$(MAKE) -C doc install-docs
|
||||
|
||||
install-info: info
|
||||
@$(MAKE) -C doc install-info
|
||||
|
32
README.md
32
README.md
@ -1,6 +1,5 @@
|
||||
[![License GPL 3][badge-license]](http://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
[](https://org-roam.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://img.shields.io/github/v/release/jethrokuan/org-roam)
|
||||
[](https://img.shields.io/github/v/release/org-roam/org-roam)
|
||||
[](https://melpa.org/#/org-roam)
|
||||
|
||||
## Synopsis
|
||||
@ -22,20 +21,20 @@ describing Org-roam and the concepts behind it:
|
||||
|
||||
[](http://www.youtube.com/watch?v=Lg61ocfxk3c "Making Connections in your Notes")
|
||||
|
||||
As of February 2020, it is in a very early stage of development.
|
||||
|
||||
Important links:
|
||||
|
||||
- **[Documentation][docs]**
|
||||
- **[Org-roam Slack][slack]**
|
||||
- **[Discourse][discourse]**
|
||||
- **[Slack][slack]**
|
||||
|
||||
## A Preview
|
||||
|
||||
Here's a screenshot of `org-roam`. The `org-roam` buffer shows
|
||||
backlinks for the active org buffer in the left window, as well as the
|
||||
surrounding content in the backlink file. The database is built once,
|
||||
and updated incrementally. The graph is generated from the link
|
||||
structure, and can be used to navigate to the respective files.
|
||||
Here's a screencast of Org-roam. The `org-roam-buffer` (window on the
|
||||
right) shows backlinks for the active Org-roam buffer (window on the
|
||||
left), as well as the surrounding content in the backlink file. The
|
||||
database is built once, and updated incrementally. The graph is
|
||||
generated from the link structure, and can be used to navigate to the
|
||||
respective files.
|
||||
|
||||

|
||||
|
||||
@ -51,7 +50,7 @@ Here's a sample configuration with using `use-package`:
|
||||
|
||||
```emacs-lisp
|
||||
(use-package org-roam
|
||||
:hook
|
||||
:hook
|
||||
(after-init . org-roam-mode)
|
||||
:custom
|
||||
(org-roam-directory "/path/to/org-files/")
|
||||
@ -63,9 +62,15 @@ Here's a sample configuration with using `use-package`:
|
||||
(("C-c n i" . org-roam-insert))))
|
||||
```
|
||||
|
||||
`org-roam-graph` by default expects to find the `dot` executable
|
||||
from the `graphviz` package in the `exec-path`.
|
||||
Ensure `graphviz` is installed and found if you want to use this
|
||||
feature or customize your configuration for `org-roam-graph` to use a
|
||||
different tool.
|
||||
|
||||
For more detailed installation and configuration instructions (including for
|
||||
Doom and Spacemacs users), please see [the
|
||||
documentation](https://org-roam.readthedocs.io/en/master/installation/).
|
||||
documentation][docs].
|
||||
|
||||
## Knowledge Bases using Org-roam
|
||||
|
||||
@ -90,5 +95,6 @@ General Public License, Version 3
|
||||
[roamresearch]: https://www.roamresearch.com/
|
||||
[org]: https://orgmode.org/
|
||||
[badge-license]: https://img.shields.io/badge/license-GPL_3-green.svg
|
||||
[docs]: https://org-roam.readthedocs.io/
|
||||
[docs]: https://org-roam.github.io/org-roam/manual/
|
||||
[discourse]: https://org-roam.discourse.group/
|
||||
[slack]: https://join.slack.com/t/orgroam/shared_invite/zt-deoqamys-043YQ~s5Tay3iJ5QRI~Lxg
|
||||
|
106
default.mk
Normal file
106
default.mk
Normal file
@ -0,0 +1,106 @@
|
||||
TOP := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
|
||||
## User options ######################################################
|
||||
#
|
||||
# You can override these settings in "config.mk" or on the command
|
||||
# line.
|
||||
#
|
||||
# You might also want to set LOAD_PATH. If you do, then it must
|
||||
# contain "-L .".
|
||||
#
|
||||
# If you don't do so, then the default is set in the "Load-Path"
|
||||
# section below. The default assumes that all dependencies are
|
||||
# installed either at "../<DEPENDENCY>", or when using package.el
|
||||
# at "ELPA_DIR/<DEPENDENCY>-<HIGHEST-VERSION>".
|
||||
|
||||
sharedir ?= $(HOME)/.local/share
|
||||
lispdir ?= $(sharedir)/emacs/site-lisp/org-roam
|
||||
infodir ?= $(sharedir)/info
|
||||
docdir ?= $(sharedir)/doc/org-roam
|
||||
statsdir ?= $(TOP)/doc/stats
|
||||
|
||||
CP ?= install -p -m 644
|
||||
MKDIR ?= install -p -m 755 -d
|
||||
RMDIR ?= rm -rf
|
||||
TAR ?= tar
|
||||
SED ?= sed
|
||||
|
||||
EMACSBIN ?= emacs
|
||||
BATCH = $(EMACSBIN) -Q --batch $(LOAD_PATH)
|
||||
|
||||
INSTALL_INFO ?= $(shell command -v ginstall-info || printf install-info)
|
||||
MAKEINFO ?= makeinfo
|
||||
MANUAL_HTML_ARGS ?= --css-ref /assets/page.css
|
||||
|
||||
## Files #############################################################
|
||||
|
||||
PKG = org-roam
|
||||
PACKAGES = org-roam
|
||||
|
||||
TEXIPAGES = $(addsuffix .texi,$(PACKAGES))
|
||||
INFOPAGES = $(addsuffix .info,$(PACKAGES))
|
||||
HTMLFILES = $(addsuffix .html,$(PACKAGES))
|
||||
HTMLDIRS = $(PACKAGES)
|
||||
PDFFILES = $(addsuffix .pdf,$(PACKAGES))
|
||||
EPUBFILES = $(addsuffix .epub,$(PACKAGES))
|
||||
|
||||
ELS = org-roam-buffer.el
|
||||
ELS += org-roam-capture.el
|
||||
ELS += org-roam-compat.el
|
||||
ELS += org-roam-completion.el
|
||||
ELS += org-roam-dailies.el
|
||||
ELS += org-roam-db.el
|
||||
ELS += org-roam.el
|
||||
ELS += org-roam-graph.el
|
||||
ELS += org-roam-macs.el
|
||||
ELS += org-roam-protocol.el
|
||||
ELCS = $(ELS:.el=.elc)
|
||||
ELMS = org-roam.el $(filter-out $(addsuffix .el,$(PACKAGES)),$(ELS))
|
||||
ELGS = org-roam-autoloads.el org-roam-version.el
|
||||
|
||||
## Versions ##########################################################
|
||||
|
||||
VERSION ?= $(shell test -e $(TOP).git && git describe --tags --abbrev=0 | cut -c2-)
|
||||
|
||||
EMACS_VERSION = 26.1
|
||||
|
||||
EMACSOLD := $(shell $(BATCH) --eval \
|
||||
"(and (version< emacs-version \"$(EMACS_VERSION)\") (princ \"true\"))")
|
||||
ifeq "$(EMACSOLD)" "true"
|
||||
$(error At least version $(EMACS_VERSION) of Emacs is required)
|
||||
endif
|
||||
|
||||
## Load-Path #########################################################
|
||||
|
||||
ifndef LOAD_PATH
|
||||
|
||||
ELPA_DIR ?= $(HOME)/.emacs.d/elpa
|
||||
|
||||
SYSTYPE := $(shell $(EMACSBIN) -Q --batch --eval "(princ system-type)")
|
||||
ifeq ($(SYSTYPE), windows-nt)
|
||||
CYGPATH := $(shell cygpath --version 2>/dev/null)
|
||||
endif
|
||||
|
||||
LOAD_PATH = -L $(TOP)
|
||||
|
||||
# When making changes here, then don't forget to adjust "Makefile",
|
||||
# ".travis.yml", ".github/ISSUE_TEMPLATE/bug_report.md",
|
||||
# `magit-emacs-Q-command' and the "Installing from the Git Repository"
|
||||
# info node accordingly. Also don't forget to "rgrep \b<pkg>\b".
|
||||
|
||||
endif # ifndef LOAD_PATH
|
||||
|
||||
ifndef ORG_LOAD_PATH
|
||||
ORG_LOAD_PATH = $(LOAD_PATH)
|
||||
ORG_LOAD_PATH += -L $(TOP)../ox-texinfo-plus
|
||||
ORG_LOAD_PATH += -L $(TOP)../org-mode/contrib/lisp
|
||||
ORG_LOAD_PATH += -L $(TOP)../org-mode/lisp
|
||||
endif
|
||||
|
||||
## Publish ###########################################################
|
||||
|
||||
PUBLISH_TARGETS ?= html html-dir pdf epub
|
||||
|
||||
DOCBOOK_XSL ?= /usr/share/xml/docbook/stylesheet/docbook-xsl/epub/docbook.xsl
|
||||
|
||||
EPUBTRASH = epub.xml META-INF OEBPS
|
0
doc/.nojekyll
Normal file
0
doc/.nojekyll
Normal file
37
doc/AUTHORS.md
Normal file
37
doc/AUTHORS.md
Normal file
@ -0,0 +1,37 @@
|
||||
Authors
|
||||
=======
|
||||
|
||||
The following people have contributed to Org-Roam.
|
||||
|
||||
Names below are sorted alphabetically.
|
||||
|
||||
Author
|
||||
------
|
||||
|
||||
- Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
Maintainers
|
||||
----------
|
||||
|
||||
- Jethro Kuan <jethrokuan95@gmail.com>
|
||||
- Leo Vivier <leo.vivier+dev@gmail.com>
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
- Alexey Shmalko <rasen.dubi@gmail.com>
|
||||
- James Ravn <james@r-vn.org>
|
||||
- Jethro Kuan <jethrokuan95@gmail.com>
|
||||
- Johann Klähn <johann@jklaehn.de>
|
||||
- Josh English <josh@joshenglish.com>
|
||||
- Jürgen Hötzel <juergen@archlinux.org>
|
||||
- Langston Barrett <langston.barrett@gmail.com>
|
||||
- Leo Vivier <leo.vivier+dev@gmail.com>
|
||||
- Michael Glaesemann <grzm@seespotcode.net>
|
||||
- Michael Herold <github@michaeljherold.com>
|
||||
- Noboru <noboru.ota@gmail.com>
|
||||
- N V <44036031+progfolio@users.noreply.github.com>
|
||||
- Rafael Accácio Nogueira <raccacio@poli.ufrj.br>
|
||||
- Roland Coeurjoly <rolandcoeurjoly@gmail.com>
|
||||
- Sayan <dit7ya@users.noreply.github.com>
|
||||
- Tim Quelch <tim@quelch.name>
|
130
doc/Makefile
Normal file
130
doc/Makefile
Normal file
@ -0,0 +1,130 @@
|
||||
-include ../config.mk
|
||||
include ../default.mk
|
||||
|
||||
###################################################################
|
||||
MANUAL_HTML_ARGS = --css-ref assets/page.css
|
||||
|
||||
.PHONY: texi install clean AUTHORS.md stats
|
||||
|
||||
all: info
|
||||
|
||||
## Build #############################################################
|
||||
|
||||
info: $(INFOPAGES) dir
|
||||
html: $(HTMLFILES)
|
||||
pdf: $(PDFFILES)
|
||||
epub: $(EPUBFILES)
|
||||
|
||||
%.info: %.texi
|
||||
@printf "Generating $@\n"
|
||||
@$(MAKEINFO) --no-split $< -o $@
|
||||
|
||||
dir: org-roam.info
|
||||
@printf "Generating dir\n"
|
||||
@echo $^ | xargs -n 1 $(INSTALL_INFO) --dir=$@
|
||||
|
||||
%.html: %.texi
|
||||
@printf "Generating $@\n"
|
||||
@$(MAKEINFO) --html --no-split $(MANUAL_HTML_ARGS) $<
|
||||
|
||||
html-dir:
|
||||
@printf "Generating org-roam/*.html\n"
|
||||
@$(MAKEINFO) --html $(MANUAL_HTML_ARGS) org-roam.texi
|
||||
mv org-roam manual
|
||||
cp -r assets manual
|
||||
cp -r images manual
|
||||
|
||||
%.pdf: %.texi
|
||||
@printf "Generating $@\n"
|
||||
@texi2pdf --clean $< > /dev/null
|
||||
|
||||
%.epub: %.texi
|
||||
@printf "Generating $@\n"
|
||||
@$(MAKEINFO) --docbook $< -o epub.xml
|
||||
@xsltproc $(DOCBOOK_XSL) epub.xml 2> /dev/null
|
||||
@echo "application/epub+zip" > mimetype
|
||||
@zip -X --quiet --recurse-paths -0 $@ mimetype
|
||||
@zip -X --quiet --recurse-paths -9 --no-dir-entries $@ META-INF OEBPS
|
||||
@$(RMDIR) $(EPUBTRASH)
|
||||
|
||||
## Install ###########################################################
|
||||
|
||||
install: install-info install-docs
|
||||
|
||||
install-docs: install-info
|
||||
@$(MKDIR) $(DESTDIR)$(docdir)
|
||||
$(CP) AUTHORS.md $(DESTDIR)$(docdir)
|
||||
|
||||
install-info: info
|
||||
@$(MKDIR) $(DESTDIR)$(infodir)
|
||||
$(CP) $(INFOPAGES) $(DESTDIR)$(infodir)
|
||||
|
||||
## Clean #############################################################
|
||||
|
||||
clean:
|
||||
@printf "Cleaning doc/*...\n"
|
||||
@$(RMDIR) dir $(INFOPAGES) $(HTMLFILES) $(HTMLDIRS) $(PDFFILES)
|
||||
@$(RMDIR) $(EPUBFILES) $(EPUBTRASH)
|
||||
|
||||
## Release management ################################################
|
||||
|
||||
ORG_ARGS = --batch -Q $(ORG_LOAD_PATH)
|
||||
ORG_ARGS += -l ox-extra -l ox-texinfo+
|
||||
ORG_ARGS += --eval "(or (require 'org-man nil t) (require 'ol-man))"
|
||||
ORG_EVAL = --eval "(ox-extras-activate '(ignore-headlines))"
|
||||
ORG_EVAL += --eval "(setq indent-tabs-mode nil)"
|
||||
ORG_EVAL += --eval "(setq org-src-preserve-indentation nil)"
|
||||
ORG_EVAL += --funcall org-texinfo-export-to-texinfo
|
||||
|
||||
# This target first bumps version strings in the Org source. The
|
||||
# necessary tools might be missing so other targets do not depend
|
||||
# on this target and it has to be run explicitly when appropriate.
|
||||
#
|
||||
# AMEND=t make texi Update manual to be amended to HEAD.
|
||||
# VERSION=N make texi Update manual for release.
|
||||
#
|
||||
texi:
|
||||
@$(EMACSBIN) $(ORG_ARGS) $(PKG).org $(ORG_EVAL)
|
||||
@printf "\n" >> $(PKG).texi
|
||||
@rm -f $(PKG).texi~
|
||||
|
||||
stats:
|
||||
@printf "Generating statistics\n"
|
||||
@gitstats -c style=/assets/stats.css -c max_authors=999 $(TOP) $(statsdir)
|
||||
|
||||
authors: AUTHORS.md
|
||||
|
||||
AUTHORS.md:
|
||||
@printf "Generating AUTHORS.md..."
|
||||
@test -e $(TOP).git \
|
||||
&& (printf "$$AUTHORS_HEADER\n" > $@ \
|
||||
&& git log --pretty=format:'- %aN <%aE>' | sort -u >> $@ \
|
||||
&& printf "done\n" ; ) \
|
||||
|| printf "FAILED (non-fatal)\n"
|
||||
|
||||
# Templates ##########################################################
|
||||
|
||||
define AUTHORS_HEADER
|
||||
Authors
|
||||
=======
|
||||
|
||||
The following people have contributed to Org-Roam.
|
||||
|
||||
Names below are sorted alphabetically.
|
||||
|
||||
Author
|
||||
------
|
||||
|
||||
- Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
Maintainers
|
||||
----------
|
||||
|
||||
- Jethro Kuan <jethrokuan95@gmail.com>
|
||||
- Leo Vivier <leo.vivier+dev@gmail.com>
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
endef
|
||||
export AUTHORS_HEADER
|
@ -1,41 +0,0 @@
|
||||
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.
|
||||
|
||||
## File Aliases
|
||||
|
||||
Suppose you want a note to be referred to by different names (e.g.
|
||||
"World War 2", "WWII"). You may specify such aliases using the
|
||||
`#+ROAM_ALIAS` attribute:
|
||||
|
||||
```org
|
||||
#+TITLE: World War 2
|
||||
#+ROAM_ALIAS: "WWII" "World War II"
|
||||
```
|
||||
|
||||
|
||||
## 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:
|
||||
|
||||
```org
|
||||
#+TITLE: Google
|
||||
#+ROAM_KEY: https://www.google.com/
|
||||
```
|
||||
|
||||
These keys come in useful for when taking website notes, using the
|
||||
`roam-ref` protocol (see [Roam Protocol](roam_protocol.md)).
|
||||
|
||||
Alternatively, add a ref for notes for a specific paper, using its
|
||||
[org-ref](https://github.com/jkitchin/org-ref) citation key:
|
||||
|
||||
```org
|
||||
#+TITLE: Neural Ordinary Differential Equations
|
||||
#+ROAM_KEY: cite:chen18_neural_ordin_differ_equat
|
||||
```
|
||||
|
||||
The backlinks buffer will show any cites of this key: e.g.
|
||||
|
||||

|
442
doc/assets/page.css
Normal file
442
doc/assets/page.css
Normal file
@ -0,0 +1,442 @@
|
||||
/* Import Inter font */
|
||||
/* More info at https://github.com/xz/fonts */
|
||||
@import url("https://fonts.xz.style/serve/inter.css");
|
||||
|
||||
:root {
|
||||
--nc-font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif,
|
||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
--nc-font-mono: "Courier New", Courier, "Ubuntu Mono", "Liberation Mono",
|
||||
monospace;
|
||||
--nc-tx-1: #000000;
|
||||
--nc-tx-2: #1a1a1a;
|
||||
--nc-bg-1: #ffffff;
|
||||
--nc-bg-2: #f6f8fa;
|
||||
--nc-bg-3: #e5e7eb;
|
||||
--nc-lk-1: #0070f3;
|
||||
--nc-lk-2: #0366d6;
|
||||
--nc-lk-tx: #ffffff;
|
||||
--nc-ac-1: #79ffe1;
|
||||
--nc-ac-tx: #0c4047;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--nc-tx-1: #ffffff;
|
||||
--nc-tx-2: #eeeeee;
|
||||
--nc-bg-1: #000000;
|
||||
--nc-bg-2: #111111;
|
||||
--nc-bg-3: #222222;
|
||||
--nc-lk-1: #3291ff;
|
||||
--nc-lk-2: #0070f3;
|
||||
--nc-lk-tx: #ffffff;
|
||||
--nc-ac-1: #7928ca;
|
||||
--nc-ac-tx: #ffffff;
|
||||
}
|
||||
}
|
||||
|
||||
* {
|
||||
/* Reset margins and padding */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
address,
|
||||
area,
|
||||
article,
|
||||
aside,
|
||||
audio,
|
||||
blockquote,
|
||||
datalist,
|
||||
details,
|
||||
dl,
|
||||
fieldset,
|
||||
figure,
|
||||
form,
|
||||
input,
|
||||
iframe,
|
||||
img,
|
||||
meter,
|
||||
nav,
|
||||
ol,
|
||||
optgroup,
|
||||
option,
|
||||
output,
|
||||
p,
|
||||
pre,
|
||||
progress,
|
||||
ruby,
|
||||
section,
|
||||
table,
|
||||
textarea,
|
||||
ul,
|
||||
video {
|
||||
/* Margins for most elements */
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
html,
|
||||
input,
|
||||
select,
|
||||
button {
|
||||
/* Set body font family and some finicky elements */
|
||||
font-family: var(--nc-font-sans);
|
||||
}
|
||||
|
||||
body {
|
||||
/* Center body in page */
|
||||
margin: 0 auto;
|
||||
max-width: 750px;
|
||||
padding: 2rem;
|
||||
border-radius: 6px;
|
||||
overflow-x: hidden;
|
||||
background: var(--nc-bg-1);
|
||||
|
||||
/* Main body text */
|
||||
color: var(--nc-tx-2);
|
||||
font-size: 1.03rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
::selection {
|
||||
/* Set background color for selected text */
|
||||
background: var(--nc-ac-1);
|
||||
color: var(--nc-ac-tx);
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
line-height: 1;
|
||||
color: var(--nc-tx-1);
|
||||
padding-top: 0.875rem;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3 {
|
||||
color: var(--nc-tx-1);
|
||||
padding-bottom: 2px;
|
||||
margin-bottom: 8px;
|
||||
border-bottom: 1px solid var(--nc-bg-2);
|
||||
}
|
||||
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.85rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.55rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--nc-lk-1);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--nc-lk-2);
|
||||
}
|
||||
|
||||
abbr:hover {
|
||||
/* Set the '?' cursor while hovering an abbreviation */
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
padding: 1.5rem;
|
||||
background: var(--nc-bg-2);
|
||||
border-left: 5px solid var(--nc-bg-3);
|
||||
}
|
||||
|
||||
abbr {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
blockquote *:last-child {
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
header {
|
||||
background: var(--nc-bg-2);
|
||||
border-bottom: 1px solid var(--nc-bg-3);
|
||||
padding: 2rem 1.5rem;
|
||||
|
||||
/* This sets the right and left margins to cancel out the body's margins. It's width is still the same, but the background stretches across the page's width. */
|
||||
|
||||
margin: -2rem calc(0px - (50vw - 50%)) 2rem;
|
||||
|
||||
/* Shorthand for:
|
||||
|
||||
margin-top: -2rem;
|
||||
margin-bottom: 2rem;
|
||||
|
||||
margin-left: calc(0px - (50vw - 50%));
|
||||
margin-right: calc(0px - (50vw - 50%)); */
|
||||
|
||||
padding-left: calc(50vw - 50%);
|
||||
padding-right: calc(50vw - 50%);
|
||||
}
|
||||
|
||||
header h1,
|
||||
header h2,
|
||||
header h3 {
|
||||
padding-bottom: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
header > *:first-child {
|
||||
margin-top: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
header > *:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.button,
|
||||
button,
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
input[type="button"] {
|
||||
font-size: 1rem;
|
||||
display: inline-block;
|
||||
padding: 6px 12px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
background: var(--nc-lk-1);
|
||||
color: var(--nc-lk-tx);
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
color: var(--nc-lk-tx);
|
||||
}
|
||||
|
||||
.button[disabled],
|
||||
button[disabled],
|
||||
input[type="submit"][disabled],
|
||||
input[type="reset"][disabled],
|
||||
input[type="button"][disabled] {
|
||||
cursor: default;
|
||||
opacity: 0.5;
|
||||
|
||||
/* Set the [X] cursor while hovering a disabled link */
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.button:focus,
|
||||
.button:hover,
|
||||
button:focus,
|
||||
button:hover,
|
||||
input[type="submit"]:focus,
|
||||
input[type="submit"]:hover,
|
||||
input[type="reset"]:focus,
|
||||
input[type="reset"]:hover,
|
||||
input[type="button"]:focus,
|
||||
input[type="button"]:hover {
|
||||
background: var(--nc-lk-2);
|
||||
}
|
||||
|
||||
code,
|
||||
pre,
|
||||
kbd,
|
||||
samp {
|
||||
/* Set the font family for monospaced elements */
|
||||
font-family: var(--nc-font-mono);
|
||||
}
|
||||
|
||||
code,
|
||||
samp,
|
||||
kbd,
|
||||
pre {
|
||||
/* The main preformatted style. This is changed slightly across different cases. */
|
||||
background: var(--nc-bg-2);
|
||||
border: 1px solid var(--nc-bg-3);
|
||||
border-radius: 4px;
|
||||
padding: 3px 6px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
kbd {
|
||||
/* Makes the kbd element look like a keyboard key */
|
||||
border-bottom: 3px solid var(--nc-bg-3);
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 1rem 1.4rem;
|
||||
max-width: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
pre code {
|
||||
/* When <code> is in a <pre>, reset it's formatting to blend in */
|
||||
background: inherit;
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
code pre {
|
||||
/* When <pre> is in a <code>, reset it's formatting to blend in */
|
||||
display: inline;
|
||||
background: inherit;
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
details {
|
||||
/* Make the <details> look more "clickable" */
|
||||
padding: 0.6rem 1rem;
|
||||
background: var(--nc-bg-2);
|
||||
border: 1px solid var(--nc-bg-3);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
summary {
|
||||
/* Makes the <summary> look more like a "clickable" link with the pointer cursor */
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
details[open] {
|
||||
/* Adjust the <details> padding while open */
|
||||
padding-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
details[open] summary {
|
||||
/* Adjust the <details> padding while open */
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
details[open] > *:last-child {
|
||||
/* Resets the bottom margin of the last element in the <details> while <details> is opened. This prevents double margins/paddings. */
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dd::before {
|
||||
/* Add an arrow to data table definitions */
|
||||
content: "→ ";
|
||||
}
|
||||
|
||||
hr {
|
||||
/* Reset the border of the <hr> separator, then set a better line */
|
||||
border: 0;
|
||||
border-bottom: 1px solid var(--nc-bg-3);
|
||||
margin: 1rem auto;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
margin-top: 1rem;
|
||||
padding: 2rem;
|
||||
border: 1px solid var(--nc-bg-3);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
legend {
|
||||
padding: auto 0.5rem;
|
||||
}
|
||||
|
||||
textarea {
|
||||
/* Don't let the <textarea> extend off the screen naturally or when dragged by the user */
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
/* Replace the browser default padding */
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-top: 0.4rem;
|
||||
}
|
||||
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol,
|
||||
ol ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 3px 6px;
|
||||
background: var(--nc-ac-1);
|
||||
color: var(--nc-ac-tx);
|
||||
}
|
||||
|
||||
textarea,
|
||||
select,
|
||||
input {
|
||||
padding: 6px 12px;
|
||||
margin-bottom: 0.5rem;
|
||||
background: var(--nc-bg-2);
|
||||
color: var(--nc-tx-2);
|
||||
|
||||
/* Set a border of the same color as the main background. It isn't visible on idle, but prevents the cell from growing in size when a darker border is set on focus. */
|
||||
border: 1px solid var(--nc-bg-2);
|
||||
border-radius: 4px;
|
||||
box-shadow: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
textarea:focus,
|
||||
select:focus,
|
||||
input[type]:focus {
|
||||
border: 1px solid var(--nc-bg-3);
|
||||
|
||||
/* Reset any browser default outlines */
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* Customizations */
|
||||
.menu-comment {
|
||||
font-weight: bold;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 1.2rem;
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
---
|
||||
title: "Comparing Org-roam With Other Packages"
|
||||
metaTitle: "Comparing Org-roam With Other Packages"
|
||||
metaDescription: "Comparing Org-roam With Other Packages"
|
||||
---
|
||||
|
||||
# Org-brain
|
||||
|
||||
# Zetteldeft
|
||||
|
||||
# Org-zettelkasten
|
@ -1,142 +0,0 @@
|
||||
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 `M-x
|
||||
customize-group org-roam`.
|
||||
|
||||
## Setting the Org-roam Directory
|
||||
|
||||
Set `org-roam-directory` to the folder containing all your Org files:
|
||||
|
||||
```emacs-lisp
|
||||
(setq org-roam-directory "/path/to/org/")
|
||||
```
|
||||
|
||||
Every Org file, at any level of nesting, within `/path/to/org/` is
|
||||
considered part of the Org-roam ecosystem.
|
||||
|
||||
### Having More Than One Org-roam Directory
|
||||
|
||||
Emacs supports directory-local variables, allowing the value of
|
||||
`org-roam-directory` to be different in different directories. It does
|
||||
this by checking for a file named `.dir-locals.el`.
|
||||
|
||||
To add support for multiple directories, override the
|
||||
`org-roam-directory` variable using directory-local variables. This is
|
||||
what `.dir-locals.el` may contain:
|
||||
|
||||
```emacs-lisp
|
||||
((nil . ((org-roam-directory . "/path/to/here/"))))
|
||||
```
|
||||
|
||||
All files within that directory will be treated as their own separate
|
||||
set of Org-roam files. Remember to run `org-roam-db-build-cache` from a
|
||||
file within that directory, at least once.
|
||||
|
||||
## Org-roam Buffer
|
||||
|
||||
The Org-roam buffer defaults to popping up from the right. You may
|
||||
choose to set it to pop up from the left with `(setq
|
||||
org-roam-buffer-position 'left)`.
|
||||
|
||||
The Org-roam buffer name can also be renamed: e.g. `(setq
|
||||
org-roam-buffer "*my-buffer-name*")`.
|
||||
|
||||
The Org-roam buffer width is adjustable via `org-roam-buffer-width`.
|
||||
The value of `org-roam-buffer-width` set as a percentage of the total
|
||||
frame width. For example:
|
||||
|
||||
```emacs-lisp
|
||||
(setq org-roam-buffer-width 0.4)
|
||||
```
|
||||
|
||||
Will result in the Org-roam buffer taking up 40% of the screen width.
|
||||
|
||||
You can change backlinks appearance in the buffer by customizing
|
||||
`org-roam-backlink` face (`M-x customize-face org-roam-backlink`).
|
||||
|
||||
## Org-roam Links
|
||||
|
||||
By default, links are inserted with the title as the link description.
|
||||
This can make them hard to distinguish from external links. You may
|
||||
choose add special indicators for Org-roam links by tweaking
|
||||
`org-roam-link-title-format`, for example:
|
||||
|
||||
```emacs-lisp
|
||||
(setq org-roam-link-title-format "R:%s")
|
||||
```
|
||||
|
||||
If your version of Org is at least `9.2`, you may also choose to
|
||||
simply style the link differently, by customizing `org-roam-link` face
|
||||
(`M-x customize-face org-roam-link`).
|
||||
|
||||
## Org-roam Files
|
||||
|
||||
Org-roam files are created and prefilled using Org-roam's templating
|
||||
system. The templating system is customizable, and the system is
|
||||
described in detail in the [Org-roam Template](templating.md) page.
|
||||
|
||||
### Encryption
|
||||
|
||||
Encryption (via GPG) can be enabled for all new files by setting
|
||||
`org-roam-encrypt-files` to `t`. When enabled, new files are created
|
||||
with the `.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.
|
||||
|
||||
## Org-roam Graph Viewer
|
||||
|
||||
Org-roam generates an SVG image using
|
||||
[Graphviz](https://graphviz.org/). To setup graph navigation, see the
|
||||
[Graph Setup](graph_setup.md) page.
|
||||
|
||||
Org-roam tries its best to locate the Graphviz executable from your
|
||||
`PATH`, but if it fails to do so, you may set it manually:
|
||||
|
||||
```
|
||||
(setq org-roam-graph-executable "/path/to/dot")
|
||||
```
|
||||
|
||||
You may also choose to use `neato` in place of `dot`, which generates a more compact graph layout.
|
||||
|
||||
```
|
||||
(setq org-roam-graph-executable "/path/to/neato")
|
||||
(setq org-roam-graph-extra-config '(("overlap" . "false")))
|
||||
```
|
||||
|
||||
Org-roam also attempts to use Firefox (located on `PATH`) to view the
|
||||
SVG, you may choose to set it to any compatible program:
|
||||
|
||||
```
|
||||
(setq org-roam-graph-viewer "/path/to/image-viewer")
|
||||
```
|
||||
|
||||
### Excluding Nodes and Edges
|
||||
One may want to exclude certain files to declutter the graph. You can do so by setting `org-roam-graph-exclude-matcher`.
|
||||
|
||||
```
|
||||
(setq org-roam-graph-exclude-matcher '("private" "dailies"))
|
||||
```
|
||||
|
||||
This setting excludes all files whose path contain "private" or "dailies".
|
||||
|
||||
## Org-roam Completion System
|
||||
|
||||
Org-roam offers completion when choosing note titles etc.
|
||||
The completion system is configurable. The default setting,
|
||||
|
||||
```
|
||||
(setq org-roam-completion-system 'default)
|
||||
```
|
||||
|
||||
uses Emacs' standard `completing-read`. If you prefer [Helm](https://emacs-helm.github.io/helm/), use
|
||||
|
||||
```
|
||||
(setq org-roam-completion-system 'helm)
|
||||
```
|
||||
|
||||
Other options included `'ido`, and `'ivy'`.
|
85
doc/css/styles.css
Normal file
85
doc/css/styles.css
Normal file
@ -0,0 +1,85 @@
|
||||
body {
|
||||
margin: 20px;
|
||||
background: #303030;
|
||||
color: #f5f5f5;
|
||||
font-size: 1.6rem;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.nav {
|
||||
margin-top: 5rem;
|
||||
}
|
||||
|
||||
.nav-item a {
|
||||
/* color: #797979; */
|
||||
color: #bebebe;
|
||||
text-decoration: none;
|
||||
font-family: "Consolas", "Monaco", "Menlo", monospace;
|
||||
}
|
||||
|
||||
.nav-item a:hover {
|
||||
cursor: pointer;
|
||||
/* color: #4d4a4a; */
|
||||
color: #dcdcdc;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.hero {
|
||||
color: #f5f5f5;
|
||||
}
|
||||
|
||||
.hero div {
|
||||
margin-bottom: 5rem;
|
||||
}
|
||||
|
||||
.hero h3 {
|
||||
/* font-family: "Edelsans", sans-serif; */
|
||||
font-size: 5rem;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.hero h5 {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 0;
|
||||
/* font-weight: 200; */
|
||||
font-weight: 250;
|
||||
}
|
||||
|
||||
.grid-demo-col {
|
||||
background: #e4e4e4;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #cd86ff;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #dbb9f3;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
font-size: 1.5rem;
|
||||
color: #f5f5f5;
|
||||
text-decoration: none;
|
||||
font-weight: 250;
|
||||
}
|
||||
|
||||
.header {
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
#footer {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
#footer h5 {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
134
doc/ecosystem.md
134
doc/ecosystem.md
@ -1,134 +0,0 @@
|
||||
A number of packages work well combined with Org-Roam:
|
||||
|
||||
## Deft
|
||||
|
||||
[Deft][deft] provides a nice interface for browsing and filtering
|
||||
org-roam notes.
|
||||
|
||||
```emacs-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/"))
|
||||
```
|
||||
|
||||
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 `org-roam`'s
|
||||
functionality. Here I'm using [el-patch](https://github.com/raxod502/el-patch):
|
||||
|
||||
```emacs-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))))
|
||||
```
|
||||
|
||||
The Deft interface can slow down quickly when the number of files get
|
||||
huge. [Notdeft][notdeft] is a fork of Deft that uses an external
|
||||
search engine and indexer.
|
||||
|
||||
## Org-journal
|
||||
|
||||
[Org-journal](https://github.com/bastibe/org-journal) is a more powerful
|
||||
alternative to the simple function `org-roam-dailies-today`. It provides better
|
||||
journaling capabilities, and a nice calendar interface to see all dated entries.
|
||||
|
||||
```emacs-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"))
|
||||
```
|
||||
|
||||
## Note-taking Add-ons
|
||||
|
||||
These are some plugins that make note-taking in Org-mode more
|
||||
enjoyable.
|
||||
|
||||
### Org-download
|
||||
|
||||
[Org-download][org-download] lets you screenshot and yank images from
|
||||
the web into your notes:
|
||||
|
||||

|
||||
|
||||
```emacs-lisp
|
||||
(use-package org-download
|
||||
:after org
|
||||
:bind
|
||||
(:map org-mode-map
|
||||
(("s-Y" . org-download-screenshot)
|
||||
("s-y" . org-download-yank))))
|
||||
```
|
||||
|
||||
### mathpix.el
|
||||
|
||||
[mathpix.el][mathpix-el] uses [Mathpix's](https://mathpix.com/) API to convert clips into
|
||||
latex equations:
|
||||
|
||||

|
||||
|
||||
```emacs-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))
|
||||
```
|
||||
|
||||
### Org-noter / Interleave
|
||||
|
||||
[Org-noter][org-noter] and [Interleave][interleave] are both projects
|
||||
that allow synchronised annotation of documents (PDF, EPUB etc.)
|
||||
within Org-mode.
|
||||
|
||||
### Org-ref
|
||||
|
||||
[Org-ref][org-ref] does citation and bibliography management in
|
||||
Org-mode, and a great tool for scientific notes.
|
||||
|
||||
### Spaced Repetition
|
||||
|
||||
[Org-fc][org-fc] is a spaced repetition system that scales well with a
|
||||
large number of files. Other alternatives include
|
||||
[org-drill][org-drill], and [pamparam][pamparam].
|
||||
|
||||
[deft]: https://jblevins.org/projects/deft/
|
||||
[notdeft]: https://github.com/hasu/notdeft
|
||||
[org-download]: https://github.com/abo-abo/org-download
|
||||
[mathpix-el]: https://github.com/jethrokuan/mathpix.el
|
||||
[org-noter]: https://github.com/weirdNox/org-noter
|
||||
[interleave]: https://github.com/rudolfochrist/interleave
|
||||
[org-ref]: https://github.com/jkitchin/org-ref
|
||||
[org-fc]: https://github.com/l3kn/org-fc/
|
||||
[org-drill]: https://orgmode.org/worg/org-contrib/org-drill.html
|
||||
[pamparam]: https://github.com/abo-abo/pamparam
|
15
doc/htmlxref.cnf
Normal file
15
doc/htmlxref.cnf
Normal file
@ -0,0 +1,15 @@
|
||||
# https://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref-Configuration.html
|
||||
|
||||
EMACS = https://www.gnu.org/software/emacs/manual
|
||||
|
||||
auth mono ${EMACS}/html_mono/auth.html
|
||||
auth node ${EMACS}/html_node/auth/
|
||||
|
||||
ediff mono ${EMACS}/html_mono/ediff.html
|
||||
ediff node ${EMACS}/html_node/ediff/
|
||||
|
||||
elisp mono ${EMACS}/html_mono/elisp.html
|
||||
elisp node ${EMACS}/html_node/elisp/
|
||||
|
||||
emacs mono ${EMACS}/html_mono/emacs.html
|
||||
emacs node ${EMACS}/html_node/emacs/
|
BIN
doc/images/org-roam-bibtex.gif
Normal file
BIN
doc/images/org-roam-bibtex.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 MiB |
BIN
doc/img/logo.png
Normal file
BIN
doc/img/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 85 KiB |
BIN
doc/img/screenshot.png
Normal file
BIN
doc/img/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 272 KiB |
175
doc/index.html
Normal file
175
doc/index.html
Normal file
@ -0,0 +1,175 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="An Effortless PKM System." />
|
||||
<meta name="author" content="Org-roam Contributors" />
|
||||
|
||||
<title>Org-roam</title>
|
||||
|
||||
<link rel="stylesheet" href="https://unpkg.com/wingcss" />
|
||||
<link rel="stylesheet" type="text/css" href="./css/styles.css" />
|
||||
|
||||
<script src="https://code.iconify.design/1/1.0.6/iconify.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<section class="hero container center text-center">
|
||||
<div>
|
||||
<img src="./img/logo.png" alt="Org-roam Logo" height="200" />
|
||||
<h3>Org-roam</h3>
|
||||
<h5>A plain-text personal knowledge management system.</h5>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="container center">
|
||||
<div>
|
||||
<img src="./img/screenshot.png" alt="screenshot" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="features" class="container center">
|
||||
<div>
|
||||
<h3 class="header">FEATURES</h3>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h5 class="left">
|
||||
<iconify-icon data-icon="fxemoji:lock"></iconify-icon>
|
||||
Private and Secure
|
||||
</h5>
|
||||
<p class="content">
|
||||
Edit your personal wiki completely offline, entirely in your
|
||||
control. Encrypt your notes with GPG. Take lasting notes in
|
||||
plain-text.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h5 class="left">
|
||||
<iconify-icon data-icon="flat-color-icons:link"></iconify-icon>
|
||||
Make Connections
|
||||
</h5>
|
||||
<p class="content">
|
||||
Connect notes and thoughts together with ease using backlinks.
|
||||
Discover surprising and previously unseen connections in your
|
||||
notes with the built-in graph visualization.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h5 class="left">
|
||||
<iconify-icon data-icon="twemoji:puzzle-piece"></iconify-icon>
|
||||
Extensible and Powerful
|
||||
</h5>
|
||||
<p class="content">
|
||||
Leverage Emacs' fantastic text-editing interface, and the mature
|
||||
Emacs and Org-mode ecosystem of packages.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h5 class="left">
|
||||
<iconify-icon data-icon="logos:git-icon"></iconify-icon>
|
||||
Free and Open Source
|
||||
</h5>
|
||||
<p class="content">
|
||||
Org-roam is licensed under the GNU General Public License version
|
||||
3 or later. You are free to extend its functionality and
|
||||
contribute back. Find
|
||||
us <a href="https://github.com/org-roam/org-roam">here</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="links" class="container">
|
||||
<div>
|
||||
<h3 class="header">LINKS</h3> New to Emacs and Org-mode, and trying to
|
||||
find your way around? Org-roam has an inclusive community of users
|
||||
passionate about Personal Knowledge Management -- we're happy to help!
|
||||
You can find us on Discourse and Slack.
|
||||
|
||||
<ul>
|
||||
<li>Read our documentation within Emacs, or on the <a href="https://org-roam.github.io/org-roam/manual/">Online Manual</a></li>
|
||||
<li>Participate in our forum discussions on <a href="https://org-roam.discourse.group">Discourse</a></li>
|
||||
<li>Chat with us on <a href="https://join.slack.com/t/orgroam/shared_invite/zt-deoqamys-043YQ~s5Tay3iJ5QRI~Lxg">Slack</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="footer" class="row container">
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<h5 class="header">Ecosystem</h5>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://github.com/org-roam/org-roam-bibtex"
|
||||
>org-roam-bibtex</a
|
||||
>
|
||||
</div>
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://github.com/org-roam/org-roam-server"
|
||||
>org-roam-server</a
|
||||
>
|
||||
</div>
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://github.com/org-roam/company-org-roam"
|
||||
>company-org-roam</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<h5 class="header">Resources</h5>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://github.com/org-roam/org-roam/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc"
|
||||
>Open Issues</a
|
||||
>
|
||||
</div>
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://github.com/org-roam/org-roam/releases"
|
||||
>Releases</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<h5 class="header">Connect</h5>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://join.slack.com/t/orgroam/shared_invite/zt-deoqamys-043YQ~s5Tay3iJ5QRI~Lxg"
|
||||
>Slack</a
|
||||
>
|
||||
</div>
|
||||
<div class="row">
|
||||
<a
|
||||
class="content footer-links"
|
||||
href="https://org-roam.discourse.group/"
|
||||
>Discourse</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
62
doc/index.md
62
doc/index.md
@ -1,62 +0,0 @@
|
||||
![org-roam][org-roam-intro-image]
|
||||
|
||||
## What is Org-roam?
|
||||
|
||||
Org-roam is a [Roam][roamresearch] replica built around the
|
||||
all-powerful [Org-mode][org].
|
||||
|
||||
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
|
||||
[the appendix](notetaking_workflow.md).
|
||||
|
||||
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.
|
||||
|
||||
## Why use Org-roam?
|
||||
|
||||
##### Private and Secure
|
||||
|
||||
Edit your personal wiki completely offline, entirely in your control.
|
||||
Encrypt your notes with GPG.
|
||||
|
||||
##### Longevity
|
||||
|
||||
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.
|
||||
|
||||
##### 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.
|
||||
|
||||
##### Leverage 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.
|
||||
|
||||
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.
|
||||
|
||||
There are several packages that are similar to Org-roam, see the
|
||||
[Comparison](comparison.md) page for a detailed comparison.
|
||||
|
||||
## Project Status
|
||||
|
||||
As of March 2020, most of the core functionality and interfaces have
|
||||
stabilized, and a stable release is near.
|
||||
|
||||
[org-roam-intro-image]: images/org-roam-intro.png
|
||||
[roamresearch]: https://www.roamresearch.com/
|
||||
[org]: https://orgmode.org/
|
@ -1,195 +0,0 @@
|
||||
## Basic Install and Configuration
|
||||
|
||||
Org-roam is now available on MELPA, so you can install it via the following
|
||||
command:
|
||||
|
||||
```
|
||||
M-x package-install RET org-roam RET
|
||||
```
|
||||
|
||||
Alternatively, you may use package managers such as [straight][straight] or
|
||||
[quelpa][quelpa] to install the package.
|
||||
|
||||
The recommended method of configuration is to use [use-package][use-package].
|
||||
|
||||
```emacs-lisp
|
||||
(use-package org-roam
|
||||
:hook
|
||||
(after-init . org-roam-mode)
|
||||
:custom
|
||||
(org-roam-directory "/path/to/org-files/")
|
||||
:bind (:map org-roam-mode-map
|
||||
(("C-c n l" . org-roam)
|
||||
("C-c n f" . org-roam-find-file)
|
||||
("C-c n b" . org-roam-switch-to-buffer)
|
||||
("C-c n g" . org-roam-graph))
|
||||
:map org-mode-map
|
||||
(("C-c n i" . org-roam-insert))))
|
||||
```
|
||||
|
||||
Or without `use-package`:
|
||||
|
||||
```emacs-lisp
|
||||
(require 'org-roam)
|
||||
(define-key org-roam-mode-map (kbd "C-c n l") #'org-roam)
|
||||
(define-key org-roam-mode-map (kbd "C-c n f") #'org-roam-find-file)
|
||||
(define-key org-roam-mode-map (kbd "C-c n b") #'org-roam-switch-to-buffer)
|
||||
(define-key org-roam-mode-map (kbd "C-c n g") #'org-roam-graph)
|
||||
(define-key org-mode-map (kbd "C-c n i") #'org-roam-insert)
|
||||
(org-roam-mode +1)
|
||||
```
|
||||
|
||||
The [Configuration](configuration.md) page details some of the common
|
||||
configuration options available.
|
||||
|
||||
### Completion
|
||||
|
||||
Link auto-completion is offered via
|
||||
[company-org-roam](https://github.com/jethrokuan/company-org-roam/), refer to
|
||||
the documentation there for further details.
|
||||
|
||||
## Spacemacs
|
||||
|
||||
If you are using Spacemacs, install org-roam by creating a simple layer that
|
||||
wraps Org-roam. Paste the following into a new file
|
||||
`~/.emacs.d/private/org-roam/packages.el`.
|
||||
|
||||
```emacs-lisp
|
||||
(defconst org-roam-packages
|
||||
'(org-roam))
|
||||
|
||||
(defun org-roam/init-org-roam ()
|
||||
(use-package org-roam
|
||||
:hook
|
||||
(after-init . org-roam-mode)
|
||||
:custom
|
||||
(org-roam-directory "/path/to/org-files/")
|
||||
:init
|
||||
(progn
|
||||
(spacemacs/declare-prefix "ar" "org-roam")
|
||||
(spacemacs/set-leader-keys
|
||||
"arl" 'org-roam
|
||||
"art" 'org-roam-dailies-today
|
||||
"arf" 'org-roam-find-file
|
||||
"arg" 'org-roam-graph)
|
||||
|
||||
(spacemacs/declare-prefix-for-mode 'org-mode "mr" "org-roam")
|
||||
(spacemacs/set-leader-keys-for-major-mode 'org-mode
|
||||
"rl" 'org-roam
|
||||
"rt" 'org-roam-dailies-today
|
||||
"rb" 'org-roam-switch-to-buffer
|
||||
"rf" 'org-roam-find-file
|
||||
"ri" 'org-roam-insert
|
||||
"rg" 'org-roam-graph))))
|
||||
```
|
||||
|
||||
Next, append `org-roam` to the `dotspacemacs-configuration-layers`
|
||||
list in your `.spacemacs` configuration file. Reload (`SPC f e R`) or
|
||||
restart Emacs to load `org-roam`. It's functions are available under
|
||||
the prefix `SPC a r` and `, r` when visiting an org-mode buffer.
|
||||
|
||||
If you also have the ranger layer installed, the prefix 'ar' conflict
|
||||
with that of the ranger layer. You might want to change it to 'aor'
|
||||
(also change the 'ar' to 'aor' in the other key-binding declarations)
|
||||
|
||||
## Doom Emacs
|
||||
|
||||
[Doom Emacs][doom] has a `+roam` flag on its `org` module for easy
|
||||
installation and configuration. Simply add the flag to the `org` section
|
||||
of your `~/.doom.d/init.el` and run `~/.emacs.d/bin/doom sync`.
|
||||
|
||||
[use-package]: https://github.com/jwiegley/use-package
|
||||
[straight]: https://github.com/raxod502/straight.el
|
||||
[quelpa]: https://github.com/quelpa/quelpa
|
||||
[doom]: https://github.com/hlissner/doom-emacs
|
||||
[doom-getting-started]: https://github.com/hlissner/doom-emacs/blob/develop/docs/getting_started.org#configuring-packages
|
||||
|
||||
## Windows
|
||||
|
||||
On Windows, if you follow the installation instructions above, you will likely get the error message: **"No EmacSQL SQLite binary available, aborting"**, and `org-roam` won't start properly.
|
||||
|
||||
You need to do some additional steps to get `org-roam` to work.
|
||||
|
||||
Essentially, you will need to have a binary file for `emacsql-sqlite` so that your Emacs can work with `sqlite` database -- `org-roam` uses it to track backlinks. The following options have been reported to work by Windows users in the community.
|
||||
|
||||
Option 1. **Windows Subsystem for Linux (WSL)**
|
||||
: This option lets you use Linux on your Windows machine. It's Linux, so you don't need to do anything specific for Windows.
|
||||
|
||||
Option 2. **mingw-x64**
|
||||
: Use mingw-x64. You would spend a bit of time to download it, and get familiar with how it works. You should be able to use Linux tools within your Windows [more contribution welcome].
|
||||
|
||||
Option 3. **scoop**
|
||||
: Use [scoop](https://scoop.sh/) to install a couple of software tools (make and gcc) and manually compile a binary (`.exe`) file yourself. Find a short step-by-step guide below.
|
||||
|
||||
Option 4. **emacsql-sqlite3**
|
||||
: Use another Emacs package called [`emacsql-sqlite3`](https://github.com/cireu/emacsql-sqlite3). You can download an [official binary](https://sqlite.org/download.html) for `sqlite3`. `emacsql-sqlite3` lets you use it. For this option to work, you need to adjust the `org-roam` source code, and get your modified version to work in your Emacs environment. Find a suggestion below.
|
||||
|
||||
### scoop
|
||||
**Step 1.** In PowerShell, install `scoop` ([instruction here](https://scoop.sh/)).
|
||||
|
||||
```powershell
|
||||
iwr -useb get.scoop.sh | iex
|
||||
```
|
||||
|
||||
**Step 2.** In PowerShell, install `make` and `gcc` via scoop
|
||||
|
||||
```powershell
|
||||
scoop install make gcc
|
||||
```
|
||||
|
||||
**Step 3.** In Emacs, install the `emacsql-sqlite` package for your Emacs if it is not done yet.
|
||||
|
||||
**Step 4.** In PowerShell, move to the directory where `emacsql.c` is stored.
|
||||
|
||||
With MELPA, it is likely to be under your ELPA folder:
|
||||
|
||||
```
|
||||
~\AppData\Roaming\.emacs.d\elpa\emacsql-sqlite-20190727.1710\sqlite
|
||||
```
|
||||
|
||||
With Doom Emacs, it should be under your `.emacs\.local`:
|
||||
|
||||
```
|
||||
~\.emacs.d\.local\straight\build\emacsql-sqlite\sqlite
|
||||
```
|
||||
|
||||
Check the files via `dir` command. You should see these files:
|
||||
|
||||
```powershell
|
||||
Mode LastWriteTime Length Name
|
||||
---- ------------- ------ ----
|
||||
-a---- 22/03/2020 12:10 PM 5170 emacsql.c
|
||||
-a---- 22/03/2020 12:10 PM 439 Makefile
|
||||
-a---- 22/03/2020 12:10 PM 7516138 sqlite3.c
|
||||
-a---- 22/03/2020 12:10 PM 526684 sqlite3.h
|
||||
```
|
||||
|
||||
**Step 5.** Compile the `.exe` file with `make`
|
||||
|
||||
```powershell
|
||||
make emacsql-sqlite CC=gcc LDLIBS=
|
||||
```
|
||||
|
||||
You will see the process triggered with lots of text automatically scrolling down; it may take a couple of minutes for compilation to finish.
|
||||
|
||||
Once compilation is done, check that `emacsql-sqlite.exe` has been added to the directory.
|
||||
|
||||
**Step 6.** Relaunch Emacs, use `org-roam`
|
||||
|
||||
When you start `org-roam` (e.g. via `org-roam-mode`), now you should no longer see the "No EmacSQL SQLite binary available, aborting" error. You are good to go.
|
||||
|
||||
|
||||
### emacsql-sqlite3
|
||||
|
||||
1. In Emacs, install the `emacsql-sqlite3` package
|
||||
|
||||
2. Using your text editor, etc. modify `org-roam-db.el`:
|
||||
|
||||
1. Replace `(require 'emacsql-sqlite)` with `(require 'emacsql-sqlite3)`
|
||||
|
||||
2. Comment/deactivate the complete `(defconst org-roam-db--sqlite-available-p ... )`
|
||||
|
||||
3. In `(defun org-roam-db ...`, replace `emacsql-sqlite`
|
||||
with `emacsql-sqlite3`
|
||||
|
||||
3. If you compile `.el` files, ensure to replace `org-roam-db.elc` with the new source you modified.
|
@ -1,24 +0,0 @@
|
||||
## Recommended Books
|
||||
- [How to Take Smart Notes][1]
|
||||
|
||||
## Articles
|
||||
- [How to Take Smart Notes in Org-mode - Jethro Kuan][7]
|
||||
- [The Zettelkasten Method - LessWrong 2.0][3]
|
||||
- [Building a second brain in Roam][4]
|
||||
- [Roam: Why I Love It and How I Use It][5]
|
||||
- [Adam Keesling's Twitter Thread][6]
|
||||
|
||||
## Threads
|
||||
- [Ask HN: How to Take Good Notes][8]
|
||||
|
||||
## What to Do With Your Notes
|
||||
- [How to Use Roam to Outline a New Article in Under 20 Minutes][2]
|
||||
|
||||
[1]: https://www.goodreads.com/book/show/34507927-how-to-take-smart-notes?ac=1&from_search=true&qid=6L8iEE1FIA&rank=1
|
||||
[2]: https://www.youtube.com/watch?v=RvWic15iXjk
|
||||
[3]: https://www.lesswrong.com/posts/NfdHG6oHBJ8Qxc26s/the-zettelkasten-method-1
|
||||
[4]: https://reddit.com/r/RoamResearch/comments/eho7de/building_a_second_brain_in_roamand_why_you_might
|
||||
[5]: https://www.nateliason.com/blog/roam
|
||||
[6]: https://twitter.com/adam_keesling/status/1196864424725774336?s=20
|
||||
[7]: https://blog.jethro.dev/posts/how_to_take_smart_notes_org/
|
||||
[8]: https://news.ycombinator.com/item?id=22473209
|
1047
doc/org-roam.org
Normal file
1047
doc/org-roam.org
Normal file
File diff suppressed because it is too large
Load Diff
1360
doc/org-roam.texi
Normal file
1360
doc/org-roam.texi
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,61 +0,0 @@
|
||||
While exporting your documents to another format such as HTML -- whether using Org's in-built export or ox-hugo -- you can add a backlinks section which would display the backlinks to the current file. This is done via org-export's preprocessing hooks. See more at [Advanced Export Configuration (The Org Manual)](https://orgmode.org/manual/Advanced-Export-Configuration.html#Advanced-Export-Configuration).
|
||||
|
||||
Following are two different configs that might be suitable for different use-cases. Add one of these snippets in your Emacs init file.
|
||||
|
||||
### Only Backlinks
|
||||
|
||||
This will display only the backlinks and not the contents.
|
||||
|
||||
```emacs-lisp
|
||||
(defun my/org-roam--backlinks-list (file)
|
||||
(if (org-roam--org-roam-file-p file)
|
||||
(--reduce-from
|
||||
(concat acc (format "- [[file:%s][%s]]\n"
|
||||
(file-relative-name (car it) org-roam-directory)
|
||||
(org-roam--get-title-or-slug (car it))))
|
||||
"" (org-roam-db-query [:select [from] :from links :where (= to $s1)] file))
|
||||
""))
|
||||
|
||||
(defun my/org-export-preprocessor (backend)
|
||||
(let ((links (my/org-roam--backlinks-list (buffer-file-name))))
|
||||
(unless (string= links "")
|
||||
(save-excursion
|
||||
(goto-char (point-max))
|
||||
(insert (concat "\n* Backlinks\n") links)))))
|
||||
|
||||
(add-hook 'org-export-before-processing-hook 'my/org-export-preprocessor)
|
||||
```
|
||||
|
||||
### Backlinks and Contents
|
||||
|
||||
This would insert both backlinks and the contents, just like the org-roam buffer. This might be especially useful if you host a web version of your personal knowledgebase and want to browse the files along with the backlinks from mobile devices.
|
||||
|
||||
```emacs-lisp
|
||||
(defun my/org-roam--backlinks-list-with-content (file)
|
||||
(with-temp-buffer
|
||||
(if-let* ((backlinks (org-roam--get-backlinks file))
|
||||
(grouped-backlinks (--group-by (nth 0 it) backlinks)))
|
||||
(progn
|
||||
(insert (format "\n\n* %d Backlinks\n"
|
||||
(length backlinks)))
|
||||
(dolist (group grouped-backlinks)
|
||||
(let ((file-from (car group))
|
||||
(bls (cdr group)))
|
||||
(insert (format "** [[file:%s][%s]]\n"
|
||||
file-from
|
||||
(org-roam--get-title-or-slug file-from)))
|
||||
(dolist (backlink bls)
|
||||
(pcase-let ((`(,file-from _ ,props) backlink))
|
||||
(insert (s-trim (s-replace "\n" " " (plist-get props :content))))
|
||||
(insert "\n\n")))))))
|
||||
(buffer-string)))
|
||||
|
||||
(defun my/org-export-preprocessor (backend)
|
||||
(let ((links (my/org-roam--backlinks-list-with-content (buffer-file-name))))
|
||||
(unless (string= links "")
|
||||
(save-excursion
|
||||
(goto-char (point-max))
|
||||
(insert (concat "\n* Backlinks\n") links)))))
|
||||
|
||||
(add-hook 'org-export-before-processing-hook 'my/org-export-preprocessor)
|
||||
```
|
@ -1,2 +0,0 @@
|
||||
mkdocs-material==4.6.2
|
||||
pymdown-extensions==6.3
|
@ -1,161 +0,0 @@
|
||||
## What is Roam protocol?
|
||||
|
||||
Org-roam extending `org-protocol` with 2 protocols: the `roam-file`
|
||||
and `roam-ref` protocol.
|
||||
|
||||
## The `roam-file` protocol
|
||||
|
||||
This is a simple protocol that opens the path specified by the `file`
|
||||
key (e.g. `org-protocol://roam-file?file=/tmp/file.org`). This is used
|
||||
in the generated graph.
|
||||
|
||||
## The `roam-ref` Protocol
|
||||
|
||||
This protocol finds or creates a new note with a given `ROAM_KEY` (see
|
||||
[Anatomy](anatomy.md)):
|
||||
|
||||

|
||||
|
||||
To use this, create a Firefox bookmarklet as follows:
|
||||
|
||||
```javascript
|
||||
javascript:location.href =
|
||||
'org-protocol:/roam-ref?template=r&ref='
|
||||
+ encodeURIComponent(location.href)
|
||||
+ '&title='
|
||||
+ encodeURIComponent(document.title)
|
||||
```
|
||||
|
||||
where `template` is the template key for a template in
|
||||
`org-roam-capture-ref-templates`. More documentation on the templating
|
||||
system can be found [here](templating.md).
|
||||
|
||||
These templates should contain a `#+ROAM_KEY: ${ref}` in it.
|
||||
|
||||
## Setting up Org-roam protocol
|
||||
|
||||
To enable org-roam's protocol extensions, you have to add the
|
||||
following to your init file:
|
||||
|
||||
```emacs-lisp
|
||||
(require 'org-roam-protocol)
|
||||
```
|
||||
|
||||
The instructions for setting up `org-protocol` can be found
|
||||
[here][org-protocol-inst], but they are reproduced below.
|
||||
|
||||
We will also need to create a desktop application for `emacsclient`.
|
||||
The instructions for various platforms are shown below:
|
||||
|
||||
## Linux
|
||||
|
||||
Create a desktop application. I place mine in
|
||||
`~/.local/share/applications/org-protocol.desktop`:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=Org-Protocol
|
||||
Exec=emacsclient %u
|
||||
Icon=emacs-icon
|
||||
Type=Application
|
||||
Terminal=false
|
||||
MimeType=x-scheme-handler/org-protocol
|
||||
```
|
||||
|
||||
Associate `org-protocol://` links with the desktop application by
|
||||
running in your shell:
|
||||
|
||||
```bash
|
||||
xdg-mime default org-protocol.desktop x-scheme-handler/org-protocol
|
||||
```
|
||||
|
||||
To disable the "confirm" prompt in Chrome, you can also make Chrome
|
||||
show a checkbox to tick, so that the `Org-Protocol Client` app will be used
|
||||
without confirmation. To do this, run in a shell:
|
||||
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
and then restart Chrome (for example, by navigating to <chrome://restart>) to
|
||||
make the new policy take effect.
|
||||
|
||||
See [here](https://www.chromium.org/administrators/linux-quick-start)
|
||||
for more info on the `/etc/opt/chrome/policies/managed` directory and
|
||||
[here](https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExternalProtocolDialogShowAlwaysOpenCheckbox)
|
||||
for information on the `ExternalProtocolDialogShowAlwaysOpenCheckbox`
|
||||
policy.
|
||||
|
||||
|
||||
## Mac OS
|
||||
|
||||
One solution is to use
|
||||
[Platypus](https://github.com/sveinbjornt/Platypus). Here are the
|
||||
instructions for setting up with Platypus and Chrome:
|
||||
|
||||
1. Install and launch Platypus (with [Homebrew](https://brew.sh/)):
|
||||
|
||||
```sh
|
||||
brew cask install platypus
|
||||
```
|
||||
2. Create a script `launch_emacs.sh`:
|
||||
|
||||
```
|
||||
#!/usr/bin/env bash
|
||||
/usr/local/bin/emacsclient --no-wait $1
|
||||
```
|
||||
|
||||
3. Create a Platypus app with the following settings:
|
||||
|
||||
```
|
||||
| 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 |
|
||||
```
|
||||
|
||||
Inside `Settings`:
|
||||
|
||||
```
|
||||
| Setting | Value |
|
||||
|--------------------------------+----------------|
|
||||
| Accept dropped files | true |
|
||||
| Register as URI scheme handler | true |
|
||||
| Protocol | "org-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
|
||||
without confirmation. To do this, run in a shell:
|
||||
|
||||
```sh
|
||||
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true
|
||||
```
|
||||
|
||||
|
||||
##### Note for Emacs Mac Port
|
||||
|
||||
If you're using [Emacs Mac Port](https://github.com/railwaycat/homebrew-emacsmacport), it
|
||||
registered its `Emacs.app` as the default handler for the URL scheme
|
||||
`org-protocol`. We have to make our `OrgProtocol.app` the default
|
||||
handler instead (replace `org.yourusername.OrgProtocol` with your app
|
||||
identifier):
|
||||
|
||||
```
|
||||
$ defaults write com.apple.LaunchServices/com.apple.launchservices.secure LSHandlers -array-add \
|
||||
'{"LSHandlerPreferredVersions" = { "LSHandlerRoleAll" = "-"; }; LSHandlerRoleAll = "org.yourusername.OrgProtocol"; LSHandlerURLScheme = "org-protocol";}'
|
||||
```
|
||||
|
||||
Then restart your computer.
|
||||
|
||||
[org-protocol-inst]: https://orgmode.org/worg/org-contrib/org-protocol.html
|
@ -1,119 +0,0 @@
|
||||
Rather than creating blank files on `org-roam-insert` and
|
||||
`org-roam-find-file`, it is may be desirable to prefill the file with
|
||||
content. This may include:
|
||||
|
||||
- Time of creation
|
||||
- File it was created from
|
||||
- Clipboard content
|
||||
- Any other data you may want to input manually
|
||||
|
||||
This requires a complex template insertion system, but fortunately,
|
||||
Org ships with a powerful one: `org-capture`. However, org-capture was
|
||||
not designed for such use. Org-roam abuses `org-capture` to some
|
||||
extent, extending its syntax. To first understand how org-roam's
|
||||
templating system works, it may be useful to look into org-capture.
|
||||
|
||||
## Org-roam Templates
|
||||
|
||||
The org-roam capture template extends org-capture's template with 2
|
||||
additional properties:
|
||||
|
||||
1. `:file-name`: This is the file name template used when a new note
|
||||
is created.
|
||||
2. `:head`: This is the template that is inserted on initial note
|
||||
creation.
|
||||
|
||||
### Org-roam Template Expansion
|
||||
|
||||
Org-roam's template definitions also extend org-capture's template
|
||||
syntax, to allow prefilling of strings. In many scenarios,
|
||||
`org-roam--capture` is passed a mapping between variables and strings.
|
||||
For example, during `org-roam-insert`, a title is prompted for. If the
|
||||
title doesn't already exist, we would like to create a new file,
|
||||
without prompting for the title again.
|
||||
|
||||
Variables passed are expanded with the `${var}` syntax. For example,
|
||||
during `org-roam-insert`, `${title}` is prefilled for expansion. Any
|
||||
variables that do not contain strings, are prompted for values using
|
||||
`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 [org-capture's documentation
|
||||
page](https://orgmode.org/manual/Template-expansion.html#Template-expansion).
|
||||
|
||||
For example, take the template: `"%<%Y%m%d%H%M%S>-${title}"`, with the title
|
||||
`"Foo"`. The template is first expanded into `%<%Y%m%d%H%M%S>-Foo`. Then
|
||||
org-capture expands `%<%Y%m%d%H%M%S>` with timestamp: e.g.
|
||||
`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 `%(EXP)` template
|
||||
expansion to call `format-time-string` directly to provide its third
|
||||
argument to specify UTC.
|
||||
|
||||
``` emacs-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)
|
||||
```
|
||||
|
||||
Similarly, if you want to change how titles are transformed into
|
||||
slugs, you can override `org-roam--title-to-slug`. For example, to use
|
||||
hyphens instead of underscores:
|
||||
|
||||
|
||||
``` emacs-lisp
|
||||
(defun org-roam--title-to-slug (title)
|
||||
"Convert TITLE to a filename-suitable slug. Uses hyphens rather than underscores."
|
||||
(cl-flet* ((nonspacing-mark-p (char)
|
||||
(eq 'Mn (get-char-code-property char 'general-category)))
|
||||
(strip-nonspacing-marks (s)
|
||||
(apply #'string (seq-remove #'nonspacing-mark-p
|
||||
(ucs-normalize-NFD-string s))))
|
||||
(cl-replace (title pair)
|
||||
(replace-regexp-in-string (car pair) (cdr pair) title)))
|
||||
(let* ((pairs `(("[^[:alnum:][:digit:]]" . "-") ;; convert anything not alphanumeric
|
||||
("--*" . "-") ;; remove sequential underscores
|
||||
("^-" . "") ;; remove starting underscore
|
||||
("-$" . ""))) ;; remove ending underscore
|
||||
(slug (-reduce-from #'cl-replace (strip-nonspacing-marks title) pairs)))
|
||||
(s-downcase slug))))
|
||||
```
|
||||
|
||||
This templating system is used throughout org-roam templates.
|
||||
|
||||
### Template examples
|
||||
|
||||
Here I walkthrough the default template, reproduced below.
|
||||
|
||||
```
|
||||
("d" "default" plain (function org-roam--capture-get-point)
|
||||
"%?"
|
||||
:file-name "%<%Y%m%d%H%M%S>-${slug}"
|
||||
:head "#+TITLE: ${title}\n"
|
||||
:unnarrowed t)
|
||||
```
|
||||
|
||||
1. The template has short key `"d"`. If you have only one template,
|
||||
org-roam automatically chooses this template for you.
|
||||
2. The template is given a description of `"default"`.
|
||||
3. `plain` text is inserted. Other options include Org headings via
|
||||
`entry`.
|
||||
4. `(function org-roam--capture-get-point)` should not be changed.
|
||||
5. `"%?"` is the template inserted on each call to `org-roam--capture`.
|
||||
This template means don't insert any content, but place the cursor
|
||||
here.
|
||||
6. `: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
|
||||
`/path/to/org-roam-directory/20200213032037-foo.org`.
|
||||
7. `:head` contains the initial template to be inserted (once only),
|
||||
at the beginning of the file. Here, the title global attribute is
|
||||
inserted.
|
||||
8. `:unnarrowed t` tells org-capture to show the contents for the
|
||||
whole file, rather than narrowing to just the entry.
|
||||
|
||||
Other options you may want to learn about include `:immediate-finish`.
|
70
doc/tour.md
70
doc/tour.md
@ -1,70 +0,0 @@
|
||||
Org-roam was built to support a workflow that was not possible with
|
||||
vanilla Org-mode. This flow is modelled after the [Zettelkasten
|
||||
method][zettelkasten], and many of [Roam Research][roam]'s workflows.
|
||||
It is crucial to understand that Org-roam does not auto-magically make
|
||||
note-taking better -- it's changing the note-taking workflow that
|
||||
does.
|
||||
|
||||
To understand more about the methods and madness, the [Note-Taking
|
||||
Workflow][appendix:ntw] page contains a page of useful references. The
|
||||
author has also written [a post][jethro-blog-post] about how he uses
|
||||
Org-roam.
|
||||
|
||||
## Activating Org-roam
|
||||
|
||||
Org-roam's entry point is the global minor `org-roam-mode`. This sets
|
||||
up Emacs with several hooks, for keeping the org-roam cache
|
||||
consistently updated, as well as showing the backlinks buffer.
|
||||
|
||||
The cache is a sqlite database named `org-roam.db`, which resides at
|
||||
the root of the `org-roam-directory`. Activating `org-roam-mode`
|
||||
builds the cache, which may take a while the first time, but is
|
||||
generally instantaneous in subsequent runs. To build the cache
|
||||
manually again, run `M-x org-roam-db-build-cache`.
|
||||
|
||||
## Finding a Note
|
||||
|
||||
`org-roam-find-file` shows the list of titles for notes that reside in
|
||||
`org-roam-directory`. Selecting a note title will bring you to the
|
||||
corresponding note. Entering a title of a note that does not yet exist
|
||||
will create a new note with that title.
|
||||
|
||||

|
||||
|
||||
Note that in the above image, the [ivy](https://github.com/abo-abo/swiper)
|
||||
completion frontend is used. The default frontend has some usability issues with
|
||||
non-matching candidates (e.g. when you want to enter a title of a new note,
|
||||
there is no completion candidate), so either `ivy` or `helm` is recommended.
|
||||
|
||||
## Inserting Links
|
||||
|
||||
`org-roam-insert` insert links to existing (or new) notes. Entering a
|
||||
non-existent title will also create a new note with that title.
|
||||
|
||||

|
||||
|
||||
Good usage of Org-roam requires liberally linking files. This allows
|
||||
the build-up of a dense knowledge graph.
|
||||
|
||||
## The Org-roam Buffer
|
||||
|
||||
The Org-roam buffer is often displayed in the side window. It shows
|
||||
backlinks for the currently active Org-roam note, along with some
|
||||
surrounding context.
|
||||
|
||||

|
||||
|
||||
## Exporting the Graph
|
||||
|
||||
Org-roam also uses Graphviz to generate a graph, 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
|
||||
described in the [Roam Protocol][appendix:roam-protocol] page.
|
||||
|
||||

|
||||
|
||||
[zettelkasten]: https://zettelkasten.de/
|
||||
[appendix:ntw]: notetaking_workflow.md
|
||||
[appendix:roam-protocol]: roam_protocol.md
|
||||
[roam]: https://www.roamresearch.com/
|
||||
[jethro-blog-post]: https://blog.jethro.dev/posts/how_to_take_smart_notes_org/
|
7
makem.sh
7
makem.sh
@ -155,7 +155,8 @@ function elisp-checkdoc-file {
|
||||
(when makem-checkdoc-errors-p
|
||||
(kill-emacs 1))))
|
||||
|
||||
(setq checkdoc-spellcheck-documentation-flag t)
|
||||
(setq sentence-end-double-space nil)
|
||||
(setq checkdoc-spellcheck-documentation-flag nil)
|
||||
(makem-checkdoc-files-and-exit)
|
||||
EOF
|
||||
echo $file
|
||||
@ -325,7 +326,7 @@ function dirnames {
|
||||
|
||||
function filter-files-exclude-default {
|
||||
# Filter out paths (STDIN) which should be excluded by default.
|
||||
egrep -v "(/\.cask/|-autoloads.el|.dir-locals)"
|
||||
egrep -v "(/\.cask/|-autoloads.el|-macs.el|.dir-locals)"
|
||||
}
|
||||
|
||||
function filter-files-exclude-args {
|
||||
@ -694,7 +695,7 @@ function lint {
|
||||
lint-checkdoc
|
||||
lint-compile
|
||||
lint-declare
|
||||
lint-indent
|
||||
# lint-indent
|
||||
lint-package
|
||||
lint-regexps
|
||||
}
|
||||
|
40
mkdocs.yml
40
mkdocs.yml
@ -1,40 +0,0 @@
|
||||
site_name: "Org-roam"
|
||||
repo_url: https://github.com/jethrokuan/org-roam/
|
||||
edit_uri: edit/master/doc/
|
||||
copyright: "Copyright (C) 2020 Jethro Kuan and contributors"
|
||||
docs_dir: doc
|
||||
extra:
|
||||
social:
|
||||
- type: 'slack'
|
||||
link: 'https://join.slack.com/t/orgroam/shared_invite/zt-clh0g0tx-j8xg1kVxnrWdKt16gmSGPQ'
|
||||
nav:
|
||||
- Home: index.md
|
||||
- A Tour of Org-roam: tour.md
|
||||
- Installation: installation.md
|
||||
- Configuration: configuration.md
|
||||
- Anatomy of an Org-roam file: anatomy.md
|
||||
- The Templating System: templating.md
|
||||
- Ecosystem: ecosystem.md
|
||||
- Similar Packages: comparison.md
|
||||
- "Appendix: Note-taking Workflow": notetaking_workflow.md
|
||||
- "Appendix: Roam Protocol": roam_protocol.md
|
||||
- "Appendix: Org Export": org_export.md
|
||||
markdown_extensions:
|
||||
- admonition
|
||||
- pymdownx.betterem:
|
||||
smart_enable: all
|
||||
- pymdownx.caret
|
||||
- pymdownx.critic
|
||||
- pymdownx.details
|
||||
- pymdownx.mark
|
||||
- pymdownx.smartsymbols
|
||||
- pymdownx.superfences
|
||||
- pymdownx.tasklist:
|
||||
custom_checkbox: true
|
||||
- pymdownx.tilde
|
||||
|
||||
theme:
|
||||
name: 'material'
|
||||
palette:
|
||||
primary: 'deep purple'
|
||||
accent: 'deep purple'
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-buffer.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-buffer.el --- Metadata buffer -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -40,11 +40,15 @@
|
||||
(defvar org-return-follows-link)
|
||||
(defvar org-roam-backlinks-mode)
|
||||
(defvar org-roam-last-window)
|
||||
(defvar org-ref-cite-types) ;; in org-ref-core.el
|
||||
(defvar org-roam-mode)
|
||||
|
||||
(declare-function org-roam-db--ensure-built "org-roam-db")
|
||||
(declare-function org-roam--extract-ref "org-roam")
|
||||
(declare-function org-roam--get-title-or-slug "org-roam")
|
||||
(declare-function org-roam--get-backlinks "org-roam")
|
||||
(declare-function org-roam-backlinks-mode "org-roam")
|
||||
(declare-function org-roam-mode "org-roam")
|
||||
|
||||
(defcustom org-roam-buffer-position 'right
|
||||
"Position of `org-roam' buffer.
|
||||
@ -84,10 +88,10 @@ Has an effect if and only if `org-roam-buffer-position' is `top' or `bottom'."
|
||||
:type 'hook
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-buffer-no-delete-other-windows nil
|
||||
"The `no-delete-other-windows' parameter of the `org-roam-buffer' window.
|
||||
When non-nil, the window will not be closed when deleting other windows."
|
||||
:type 'boolean
|
||||
(defcustom org-roam-buffer-window-parameters nil
|
||||
"Additional window parameters for the `org-roam-buffer' side window.
|
||||
For example: (setq org-roam-buffer-window-parameters '((no-other-window . t)))"
|
||||
:type '(alist)
|
||||
:group 'org-roam)
|
||||
|
||||
(defvar org-roam-buffer--current nil
|
||||
@ -100,32 +104,44 @@ When non-nil, the window will not be closed when deleting other windows."
|
||||
'font-lock-face
|
||||
'org-document-title)))
|
||||
|
||||
(defun org-roam-buffer--pluralize (string number)
|
||||
"Conditionally pluralize STRING if NUMBER is above 1."
|
||||
(let ((l (pcase number
|
||||
((pred (listp)) (length number))
|
||||
((pred (integerp)) number)
|
||||
(wrong-type (signal 'wrong-type-argument
|
||||
`((listp integerp)
|
||||
,wrong-type))))))
|
||||
(concat string (when (> l 1) "s"))))
|
||||
|
||||
(defun org-roam-buffer--insert-citelinks ()
|
||||
"Insert citation backlinks for the current buffer."
|
||||
(if-let* ((roam-key (with-temp-buffer
|
||||
(when-let ((org-ref-p (require 'org-ref nil t)) ;; Ensure that org-ref is present
|
||||
(ref (cdr (with-temp-buffer
|
||||
(insert-buffer-substring org-roam-buffer--current)
|
||||
(org-roam--extract-ref)))
|
||||
(key-backlinks (org-roam--get-backlinks (s-chop-prefix "cite:" roam-key)))
|
||||
(grouped-backlinks (--group-by (nth 0 it) key-backlinks)))
|
||||
(progn
|
||||
(insert (format "\n\n* %d Cite backlinks\n"
|
||||
(length key-backlinks)))
|
||||
(dolist (group grouped-backlinks)
|
||||
(let ((file-from (car group))
|
||||
(bls (cdr group)))
|
||||
(insert (format "** [[file:%s][%s]]\n"
|
||||
file-from
|
||||
(org-roam--get-title-or-slug file-from)))
|
||||
(dolist (backlink bls)
|
||||
(pcase-let ((`(,file-from _ ,props) backlink))
|
||||
(insert (propertize
|
||||
(s-trim (s-replace "\n" " "
|
||||
(plist-get props :content)))
|
||||
'help-echo "mouse-1: visit backlinked note"
|
||||
'file-from file-from
|
||||
'file-from-point (plist-get props :point)))
|
||||
(insert "\n\n"))))))
|
||||
(insert "\n\n* No cite backlinks!")))
|
||||
(org-roam--extract-ref)))))
|
||||
(if-let* ((key-backlinks (org-roam--get-backlinks ref))
|
||||
(grouped-backlinks (--group-by (nth 0 it) key-backlinks)))
|
||||
(progn
|
||||
(insert (let ((l (length key-backlinks)))
|
||||
(format "\n\n* %d %s\n"
|
||||
l (org-roam-buffer--pluralize "Cite backlink" l))))
|
||||
(dolist (group grouped-backlinks)
|
||||
(let ((file-from (car group))
|
||||
(bls (cdr group)))
|
||||
(insert (format "** [[file:%s][%s]]\n"
|
||||
file-from
|
||||
(org-roam--get-title-or-slug file-from)))
|
||||
(dolist (backlink bls)
|
||||
(pcase-let ((`(,file-from _ ,props) backlink))
|
||||
(insert (propertize
|
||||
(s-trim (s-replace "\n" " "
|
||||
(plist-get props :content)))
|
||||
'help-echo "mouse-1: visit backlinked note"
|
||||
'file-from file-from
|
||||
'file-from-point (plist-get props :point)))
|
||||
(insert "\n\n"))))))
|
||||
(insert "\n\n* No cite backlinks!"))))
|
||||
|
||||
(defun org-roam-buffer--insert-backlinks ()
|
||||
"Insert the org-roam-buffer backlinks string for the current buffer."
|
||||
@ -133,8 +149,9 @@ When non-nil, the window will not be closed when deleting other windows."
|
||||
(backlinks (org-roam--get-backlinks file-path))
|
||||
(grouped-backlinks (--group-by (nth 0 it) backlinks)))
|
||||
(progn
|
||||
(insert (format "\n\n* %d Backlinks\n"
|
||||
(length backlinks)))
|
||||
(insert (let ((l (length backlinks)))
|
||||
(format "\n\n* %d %s\n"
|
||||
l (org-roam-buffer--pluralize "Backlink" l))))
|
||||
(dolist (group grouped-backlinks)
|
||||
(let ((file-from (car group))
|
||||
(bls (cdr group)))
|
||||
@ -178,6 +195,7 @@ When non-nil, the window will not be closed when deleting other windows."
|
||||
(run-hooks 'org-roam-buffer-prepare-hook)
|
||||
(read-only-mode 1)))))
|
||||
|
||||
|
||||
(cl-defun org-roam-buffer--update-maybe (&key redisplay)
|
||||
"Reconstructs `org-roam-buffer'.
|
||||
This needs to be quick or infrequent, because this is run at
|
||||
@ -226,8 +244,7 @@ Valid states are 'visible, 'exists and 'none."
|
||||
|
||||
(defun org-roam-buffer--get-create ()
|
||||
"Set up the `org-roam' buffer at `org-roam-buffer-position'."
|
||||
(let ((window (get-buffer-window))
|
||||
(position
|
||||
(let ((position
|
||||
(if (member org-roam-buffer-position '(right left top bottom))
|
||||
org-roam-buffer-position
|
||||
(let ((text-quoting-style 'grave))
|
||||
@ -235,21 +252,24 @@ Valid states are 'visible, 'exists and 'none."
|
||||
"Invalid org-roam-buffer-position: %s. Defaulting to \\='right"
|
||||
org-roam-buffer-position))
|
||||
'right)))
|
||||
(-> (get-buffer-create org-roam-buffer)
|
||||
(display-buffer-in-side-window
|
||||
`((side . ,position)
|
||||
(window-parameters . ((no-delete-other-windows . ,org-roam-buffer-no-delete-other-windows)))))
|
||||
(select-window))
|
||||
(pcase position
|
||||
((or 'right 'left)
|
||||
(org-roam-buffer--set-width (round (* (frame-width) org-roam-buffer-width))))
|
||||
((or 'top 'bottom)
|
||||
(org-roam-buffer--set-height (round (* (frame-height) org-roam-buffer-height)))))
|
||||
(select-window window)))
|
||||
(save-selected-window
|
||||
(-> (get-buffer-create org-roam-buffer)
|
||||
(display-buffer-in-side-window
|
||||
`((side . ,position)
|
||||
(window-parameters . ,org-roam-buffer-window-parameters)))
|
||||
(select-window))
|
||||
(pcase position
|
||||
((or 'right 'left)
|
||||
(org-roam-buffer--set-width
|
||||
(round (* (frame-width) org-roam-buffer-width))))
|
||||
((or 'top 'bottom)
|
||||
(org-roam-buffer--set-height
|
||||
(round (* (frame-height) org-roam-buffer-height))))))))
|
||||
|
||||
(defun org-roam-buffer-toggle-display ()
|
||||
"Toggle display of the `org-roam-buffer'."
|
||||
(interactive)
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(setq org-roam-last-window (get-buffer-window))
|
||||
(pcase (org-roam-buffer--visibility)
|
||||
('visible (delete-window (get-buffer-window org-roam-buffer)))
|
||||
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-capture.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-capture.el --- Capture functionality -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -33,21 +33,24 @@
|
||||
(require 'org-capture)
|
||||
(require 'dash)
|
||||
(require 's)
|
||||
(require 'cl-lib)
|
||||
|
||||
;; Declarations
|
||||
(defvar org-roam-encrypt-files)
|
||||
(defvar org-roam-directory)
|
||||
(defvar org-roam-mode)
|
||||
(declare-function org-roam--get-title-path-completions "org-roam")
|
||||
(declare-function org-roam--get-ref-path-completions "org-roam")
|
||||
(declare-function org-roam--file-path-from-id "org-roam")
|
||||
(declare-function org-roam--format-link "org-roam")
|
||||
(declare-function org-roam--title-to-slug "org-roam")
|
||||
(declare-function org-roam-mode "org-roam")
|
||||
(declare-function org-roam-completion--completing-read "org-roam-completion")
|
||||
|
||||
(defvar org-roam-capture--file-name-default "%<%Y%m%d%H%M%S>"
|
||||
"The default file name format for Org-roam templates.")
|
||||
|
||||
(defvar org-roam-capture--header-default "#+TITLE: ${title}\n"
|
||||
(defvar org-roam-capture--header-default "#+title: ${title}\n"
|
||||
"The default capture header for Org-roam templates.")
|
||||
|
||||
(defvar org-roam-capture--file-path nil
|
||||
@ -82,7 +85,7 @@ note with the given `ref'.")
|
||||
'(("d" "default" plain (function org-roam-capture--get-point)
|
||||
"%?"
|
||||
:file-name "%<%Y%m%d%H%M%S>-${slug}"
|
||||
:head "#+TITLE: ${title}\n"
|
||||
:head "#+title: ${title}\n"
|
||||
:unnarrowed t))
|
||||
"Capture templates for Org-roam.
|
||||
The capture templates are an extension of
|
||||
@ -107,8 +110,8 @@ applies.
|
||||
'(("r" "ref" plain (function org-roam-capture--get-point)
|
||||
""
|
||||
:file-name "${slug}"
|
||||
:head "#+TITLE: ${title}
|
||||
#+ROAM_KEY: ${ref}\n"
|
||||
:head "#+title: ${title}
|
||||
#+roam_key: ${ref}\n"
|
||||
:unnarrowed t))
|
||||
"The Org-roam templates used during a capture from the roam-ref protocol.
|
||||
Details on how to specify for the template is given in `org-roam-capture-templates'.")
|
||||
@ -129,9 +132,11 @@ Details on how to specify for the template is given in `org-roam-capture-templat
|
||||
(defun org-roam-capture--in-process-p ()
|
||||
"Return non-nil if a `org-roam-capture' buffer exists."
|
||||
(cl-some (lambda (buffer)
|
||||
(and (eq (buffer-local-value 'major-mode (current-buffer)) 'org-mode)
|
||||
(plist-get (buffer-local-value 'org-capture-current-plist (current-buffer)) :org-roam)))
|
||||
(buffer-list)))
|
||||
(and (eq (buffer-local-value 'major-mode buffer)
|
||||
'org-mode)
|
||||
(plist-get (buffer-local-value 'org-capture-current-plist buffer)
|
||||
:org-roam)))
|
||||
(buffer-list)))
|
||||
|
||||
(defun org-roam-capture--fill-template (str &optional info)
|
||||
"Expands the template STR, returning the string.
|
||||
@ -262,8 +267,9 @@ This function is used solely in Org-roam's capture templates: see
|
||||
('ref
|
||||
(let ((completions (org-roam--get-ref-path-completions))
|
||||
(ref (cdr (assoc 'ref org-roam-capture--info))))
|
||||
(or (cdr (assoc ref completions))
|
||||
(org-roam-capture--new-file))))
|
||||
(if-let ((pl (cdr (assoc ref completions))))
|
||||
(plist-get pl :path)
|
||||
(org-roam-capture--new-file))))
|
||||
(_ (error "Invalid org-roam-capture-context")))))
|
||||
(org-roam-capture--expand-template)
|
||||
(org-roam-capture--put :file-path file-path)
|
||||
@ -277,23 +283,21 @@ This function is used solely in Org-roam's capture templates: see
|
||||
|
||||
(defun org-roam-capture--convert-template (template)
|
||||
"Convert TEMPLATE from Org-roam syntax to `org-capture-templates' syntax."
|
||||
(let* ((copy (copy-tree template))
|
||||
converted
|
||||
org-roam-plist
|
||||
key
|
||||
val)
|
||||
;;put positional args on converted template
|
||||
(dotimes (_ 5)
|
||||
(push (pop copy) converted))
|
||||
(while (setq key (pop copy)
|
||||
val (pop copy))
|
||||
(if (member key org-roam-capture--template-keywords)
|
||||
(progn
|
||||
(push val org-roam-plist)
|
||||
(push key org-roam-plist))
|
||||
(push key converted)
|
||||
(push val converted)))
|
||||
(append (nreverse converted) `(:org-roam ,org-roam-plist))))
|
||||
(pcase template
|
||||
(`(,_key ,_description) template)
|
||||
(`(,key ,description ,type ,target . ,rest)
|
||||
(let ((converted `(,key ,description ,type ,target
|
||||
,(unless (keywordp (car rest)) (pop rest))))
|
||||
org-roam-plist
|
||||
options)
|
||||
(while rest
|
||||
(let* ((key (pop rest))
|
||||
(val (pop rest))
|
||||
(custom (member key org-roam-capture--template-keywords)))
|
||||
(push val (if custom org-roam-plist options))
|
||||
(push key (if custom org-roam-plist options))))
|
||||
(append converted options `(:org-roam ,org-roam-plist))))
|
||||
(_ (user-error "Invalid capture template format: %s" template))))
|
||||
|
||||
(defun org-roam-capture--find-file-h ()
|
||||
"Opens the newly created template file.
|
||||
@ -311,12 +315,13 @@ Suitable for moving point."
|
||||
:group 'org-roam
|
||||
:type 'hook)
|
||||
|
||||
(defun org-roam--capture (&optional goto keys)
|
||||
(defun org-roam-capture--capture (&optional goto keys)
|
||||
"Create a new file, and return the path to the edited file.
|
||||
The templates are defined at `org-roam-capture-templates'. The
|
||||
GOTO and KEYS argument have the same functionality as
|
||||
`org-capture'."
|
||||
(let ((org-capture-templates (mapcar #'org-roam-capture--convert-template org-roam-capture-templates)))
|
||||
(let ((org-capture-templates (mapcar #'org-roam-capture--convert-template org-roam-capture-templates))
|
||||
org-capture-templates-contexts)
|
||||
(when (= (length org-capture-templates) 1)
|
||||
(setq keys (caar org-capture-templates)))
|
||||
(add-hook 'org-capture-after-finalize-hook #'org-roam-capture--save-file-maybe-h)
|
||||
@ -327,17 +332,24 @@ GOTO and KEYS argument have the same functionality as
|
||||
"Launches an `org-capture' process for a new or existing note.
|
||||
This uses the templates defined at `org-roam-capture-templates'."
|
||||
(interactive)
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(when (org-roam-capture--in-process-p)
|
||||
(user-error "Nested Org-roam capture processes not supported"))
|
||||
(let* ((completions (org-roam--get-title-path-completions))
|
||||
(title (org-roam-completion--completing-read "File: " completions))
|
||||
(file-path (cdr (assoc title completions))))
|
||||
(title-with-keys (org-roam-completion--completing-read "File: "
|
||||
completions))
|
||||
(res (cdr (assoc title-with-keys completions)))
|
||||
(title (or (plist-get res :title) title-with-keys))
|
||||
(file-path (plist-get res :path)))
|
||||
(let ((org-roam-capture--info (list (cons 'title title)
|
||||
(cons 'slug (org-roam--title-to-slug title))
|
||||
(cons 'file file-path)))
|
||||
(org-roam-capture--context 'capture))
|
||||
(setq org-roam-capture-additional-template-props (list :capture-fn 'org-roam-capture))
|
||||
(org-roam--capture))))
|
||||
(condition-case err
|
||||
(org-roam-capture--capture)
|
||||
(error (user-error "%s. Please adjust `org-roam-capture-templates'"
|
||||
(error-message-string err)))))))
|
||||
|
||||
(provide 'org-roam-capture)
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-compat.el --- Compatibility Code -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-compat.el --- Compatibility Code -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -71,17 +71,25 @@
|
||||
"org-roam 1.0.0")
|
||||
(define-obsolete-function-alias 'org-roam-graph-build 'org-roam-graph
|
||||
"org-roam 1.0.0")
|
||||
(define-obsolete-function-alias 'org-roam-find-index 'org-roam-jump-to-index
|
||||
"org-roam 1.1.0")
|
||||
(define-obsolete-function-alias 'org-roam--pluralize 'org-roam-buffer--pluralize
|
||||
"org-roam 1.1.0")
|
||||
(define-obsolete-function-alias 'org-roam--capture 'org-roam-capture--capture
|
||||
"org-roam 1.1.0")
|
||||
(define-obsolete-function-alias 'org-roam-db--maybe-update 'org-roam-db--update-maybe
|
||||
"org-roam 1.1.0")
|
||||
|
||||
(when (version< (org-version) "9.3")
|
||||
(defalias 'org-link-make-string 'org-make-link-string))
|
||||
|
||||
;;;; Variables
|
||||
(define-obsolete-variable-alias 'org-roam-graphviz-extra-options
|
||||
'org-roam-graph-extra-config "org-roam 1.0.0")
|
||||
(define-obsolete-variable-alias 'org-roam-grapher-extra-options
|
||||
'org-roam-graph-extra-config "org-roam 1.0.0")
|
||||
(make-obsolete-variable 'org-roam-graph-node-shape 'org-roam-graph-node-extra-config "org-roam 1.0.0")
|
||||
(defcustom org-roam-graph-node-shape "ellipse"
|
||||
"Shape of graph nodes."
|
||||
:type 'string
|
||||
:group 'org-roam)
|
||||
(define-obsolete-variable-alias 'org-roam-graph-node-shape
|
||||
'org-roam-graph-node-extra-config "org-roam 1.0.0")
|
||||
(define-obsolete-variable-alias 'org-roam--db-connection
|
||||
'org-roam-db--connection "org-roam 1.0.0")
|
||||
(define-obsolete-variable-alias 'org-roam--current-buffer
|
||||
@ -90,6 +98,8 @@
|
||||
'org-roam-dailies-capture-templates "org-roam 1.0.0")
|
||||
(define-obsolete-variable-alias 'org-roam-date-filename-format
|
||||
'org-roam-dailies-capture-templates "org-roam 1.0.0")
|
||||
(make-obsolete-variable 'org-roam-buffer-no-delete-other-windows
|
||||
'org-roam-buffer-window-parameters "org-roam 1.1.1")
|
||||
|
||||
(provide 'org-roam-compat)
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-completion.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-completion.el --- Completion features -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -47,11 +47,6 @@
|
||||
(function :tag "Custom function"))
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-completion-fuzzy-match nil
|
||||
"Whether to fuzzy match Org-roam's completion candidates."
|
||||
:type 'boolean
|
||||
:group 'org-roam)
|
||||
|
||||
(defun org-roam-completion--helm-candidate-transformer (candidates _source)
|
||||
"Transforms CANDIDATES for Helm-based completing read.
|
||||
SOURCE is not used."
|
||||
@ -82,9 +77,7 @@ Return user choice."
|
||||
:require-match require-match
|
||||
:action (prog1 action
|
||||
(setq action nil))
|
||||
:caller 'org-roam--completing-read
|
||||
:re-builder (if org-roam-completion-fuzzy-match 'ivy--regex-fuzzy
|
||||
'regexp-quote))
|
||||
:caller 'org-roam--completing-read)
|
||||
(user-error "Please install ivy from \
|
||||
https://github.com/abo-abo/swiper")))
|
||||
((eq org-roam-completion-system 'helm)
|
||||
@ -96,8 +89,7 @@ https://github.com/emacs-helm/helm"))
|
||||
:candidates (mapcar #'car choices)
|
||||
:filtered-candidate-transformer
|
||||
(and (not require-match)
|
||||
#'org-roam-completion--helm-candidate-transformer)
|
||||
:fuzzy-match org-roam-completion-fuzzy-match))
|
||||
#'org-roam-completion--helm-candidate-transformer)))
|
||||
(buf (concat "*org-roam "
|
||||
(s-downcase (s-chop-suffix ":" (s-trim prompt)))
|
||||
"*")))
|
||||
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-dialies.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-dailies.el --- Daily notes for Org-roam -*- coding: utf-8; lexical-binding: t; -*-
|
||||
;;;
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -34,17 +34,20 @@
|
||||
;;; Library Requires
|
||||
(require 'org-capture)
|
||||
(require 'org-roam-capture)
|
||||
(require 'org-roam-macs)
|
||||
|
||||
(defvar org-roam-dailies-capture-templates
|
||||
'(("d" "daily" plain (function org-roam-capture--get-point)
|
||||
""
|
||||
:immediate-finish t
|
||||
:file-name "%<%Y-%m-%d>"
|
||||
:head "#+TITLE: %<%Y-%m-%d>"))
|
||||
:head "#+title: %<%Y-%m-%d>"))
|
||||
"Capture templates for daily notes in Org-roam.")
|
||||
|
||||
;; Declarations
|
||||
(defvar org-roam-mode)
|
||||
(declare-function org-roam--file-path-from-id "org-roam")
|
||||
(declare-function org-roam-mode "org-roam")
|
||||
|
||||
(defun org-roam-dailies--file-for-time (time)
|
||||
"Create and find file for TIME."
|
||||
@ -52,24 +55,28 @@
|
||||
(org-roam-capture--info (list (cons 'time time)))
|
||||
(org-roam-capture--context 'dailies))
|
||||
(add-hook 'org-capture-after-finalize-hook #'org-roam-capture--find-file-h)
|
||||
(org-roam--capture)))
|
||||
(org-roam--with-template-error 'org-roam-dailies-capture-templates
|
||||
(org-roam-capture--capture))))
|
||||
|
||||
(defun org-roam-dailies-today ()
|
||||
"Create and find the daily note for today."
|
||||
(interactive)
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(org-roam-dailies--file-for-time (current-time)))
|
||||
|
||||
(defun org-roam-dailies-tomorrow (n)
|
||||
"Create and find the daily note for tomorrow.
|
||||
With numeric argument N, use N days in the future."
|
||||
(interactive "p")
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(org-roam-dailies--file-for-time (time-add (* n 86400) (current-time))))
|
||||
|
||||
(defun org-roam-dailies-yesterday (n)
|
||||
"Create and find the file for yesterday.
|
||||
With numeric argument N, use N days in the past."
|
||||
(interactive "p")
|
||||
(org-roam-tomorrow (- n)))
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(org-roam-dailies-tomorrow (- n)))
|
||||
|
||||
(defun org-roam-dailies-date ()
|
||||
"Create the file for any date using the calendar interface."
|
||||
@ -78,4 +85,5 @@ With numeric argument N, use N days in the past."
|
||||
(org-roam-dailies--file-for-time time)))
|
||||
|
||||
(provide 'org-roam-dailies)
|
||||
|
||||
;;; org-roam-dailies.el ends here
|
||||
|
297
org-roam-db.el
297
org-roam-db.el
@ -1,12 +1,12 @@
|
||||
;;; org-roam-db.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-db.el --- Org-roam database API -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -33,21 +33,26 @@
|
||||
;;;; Library Requires
|
||||
(eval-when-compile (require 'subr-x))
|
||||
(require 'emacsql)
|
||||
(require 'emacsql-sqlite)
|
||||
(require 'emacsql-sqlite3)
|
||||
(require 'seq)
|
||||
(require 'org-roam-macs)
|
||||
|
||||
(defvar org-roam-directory)
|
||||
(defvar org-roam-verbose)
|
||||
(defvar org-roam-file-name)
|
||||
|
||||
(declare-function org-roam--extract-titles "org-roam")
|
||||
(declare-function org-roam--extract-ref "org-roam")
|
||||
(declare-function org-roam--extract-links "org-roam")
|
||||
(declare-function org-roam--list-files "org-roam")
|
||||
(declare-function org-roam-buffer--update-maybe "org-roam-buffer")
|
||||
(declare-function org-roam--org-roam-file-p "org-roam")
|
||||
(declare-function org-roam--extract-titles "org-roam")
|
||||
(declare-function org-roam--extract-ref "org-roam")
|
||||
(declare-function org-roam--extract-tags "org-roam")
|
||||
(declare-function org-roam--extract-headlines "org-roam")
|
||||
(declare-function org-roam--extract-links "org-roam")
|
||||
(declare-function org-roam--list-all-files "org-roam")
|
||||
(declare-function org-roam-buffer--update-maybe "org-roam-buffer")
|
||||
|
||||
;;;; Options
|
||||
(defcustom org-roam-db-location nil
|
||||
"Location of the Org-roam database.
|
||||
"The full path to file where the Org-roam database is stored.
|
||||
If this is non-nil, the Org-roam sqlite database is saved here.
|
||||
|
||||
It is the user's responsibility to set this correctly, especially
|
||||
@ -55,11 +60,7 @@ when used with multiple Org-roam instances."
|
||||
:type 'string
|
||||
:group 'org-roam)
|
||||
|
||||
(defconst org-roam-db--version 2)
|
||||
(defconst org-roam-db--sqlite-available-p
|
||||
(with-demoted-errors "Org-roam initialization: %S"
|
||||
(emacsql-sqlite-ensure-binary)
|
||||
t))
|
||||
(defconst org-roam-db--version 6)
|
||||
|
||||
(defvar org-roam-db--connection (make-hash-table :test #'equal)
|
||||
"Database connection to Org-roam database.")
|
||||
@ -67,8 +68,7 @@ when used with multiple Org-roam instances."
|
||||
;;;; Core Functions
|
||||
(defun org-roam-db--get ()
|
||||
"Return the sqlite db file."
|
||||
(interactive "P")
|
||||
(or org-roam-db-location
|
||||
(or org-roam-db-location
|
||||
(expand-file-name "org-roam.db" org-roam-directory)))
|
||||
|
||||
(defun org-roam-db--get-connection ()
|
||||
@ -85,7 +85,7 @@ Performs a database upgrade when required."
|
||||
(let* ((db-file (org-roam-db--get))
|
||||
(init-db (not (file-exists-p db-file))))
|
||||
(make-directory (file-name-directory db-file) t)
|
||||
(let ((conn (emacsql-sqlite db-file)))
|
||||
(let ((conn (emacsql-sqlite3 db-file)))
|
||||
(set-process-query-on-exit-flag (emacsql-process conn) nil)
|
||||
(puthash (file-truename org-roam-directory)
|
||||
conn
|
||||
@ -93,7 +93,7 @@ Performs a database upgrade when required."
|
||||
(when init-db
|
||||
(org-roam-db--init conn))
|
||||
(let* ((version (caar (emacsql conn "PRAGMA user_version")))
|
||||
(version (org-roam-db--maybe-update conn version)))
|
||||
(version (org-roam-db--update-maybe conn version)))
|
||||
(cond
|
||||
((> version org-roam-db--version)
|
||||
(emacsql-close conn)
|
||||
@ -119,7 +119,11 @@ SQL can be either the emacsql vector representation, or a string."
|
||||
'((files
|
||||
[(file :unique :primary-key)
|
||||
(hash :not-null)
|
||||
(last-modified :not-null)])
|
||||
(meta :not-null)])
|
||||
|
||||
(headlines
|
||||
[(id :unique :primary-key)
|
||||
(file :not-null)])
|
||||
|
||||
(links
|
||||
[(from :not-null)
|
||||
@ -127,13 +131,18 @@ SQL can be either the emacsql vector representation, or a string."
|
||||
(type :not-null)
|
||||
(properties :not-null)])
|
||||
|
||||
(tags
|
||||
[(file :unique :primary-key)
|
||||
(tags)])
|
||||
|
||||
(titles
|
||||
[(file :not-null)
|
||||
titles])
|
||||
|
||||
(refs
|
||||
[(ref :unique :not-null)
|
||||
(file :not-null)])))
|
||||
(file :not-null)
|
||||
(type :not-null)])))
|
||||
|
||||
(defun org-roam-db--init (db)
|
||||
"Initialize database DB with the correct schema and user version."
|
||||
@ -142,16 +151,16 @@ SQL can be either the emacsql vector representation, or a string."
|
||||
(emacsql db [:create-table $i1 $S2] table schema))
|
||||
(emacsql db (format "PRAGMA user_version = %s" org-roam-db--version))))
|
||||
|
||||
(defun org-roam-db--maybe-update (db version)
|
||||
(defun org-roam-db--update-maybe (db version)
|
||||
"Upgrades the database schema for DB, if VERSION is old."
|
||||
(emacsql-with-transaction db
|
||||
'ignore
|
||||
(when (= version 1)
|
||||
(progn
|
||||
(warn "No good way to perform a DB upgrade, rebuilding from scratch...")
|
||||
(delete-file (org-roam-db--get))
|
||||
(org-roam-db-build-cache)))
|
||||
version))
|
||||
(if (< version org-roam-db--version)
|
||||
(progn
|
||||
(org-roam-message (format "Upgrading the Org-roam database from version %d to version %d"
|
||||
version org-roam-db--version))
|
||||
(org-roam-db-build-cache t))))
|
||||
version)
|
||||
|
||||
(defun org-roam-db--close (&optional db)
|
||||
"Closes the database connection for database DB.
|
||||
@ -185,32 +194,27 @@ the current `org-roam-directory'."
|
||||
"Clears all entries in the caches."
|
||||
(interactive)
|
||||
(when (file-exists-p (org-roam-db--get))
|
||||
(org-roam-db-query [:delete :from files])
|
||||
(org-roam-db-query [:delete :from titles])
|
||||
(org-roam-db-query [:delete :from links])
|
||||
(org-roam-db-query [:delete :from refs])))
|
||||
|
||||
(dolist (table (mapcar #'car org-roam-db--table-schemata))
|
||||
(org-roam-db-query `[:delete :from ,table]))))
|
||||
|
||||
(defun org-roam-db--clear-file (&optional filepath)
|
||||
"Remove any related links to the file at FILEPATH.
|
||||
This is equivalent to removing the node from the graph."
|
||||
(let* ((path (or filepath
|
||||
(buffer-file-name)))
|
||||
(file (file-truename path)))
|
||||
(org-roam-db-query [:delete :from files
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(org-roam-db-query [:delete :from links
|
||||
:where (= from $s1)]
|
||||
file)
|
||||
(org-roam-db-query [:delete :from titles
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(org-roam-db-query [:delete :from refs
|
||||
:where (= file $s1)]
|
||||
file)))
|
||||
(let ((file (file-truename (or filepath
|
||||
(buffer-file-name (buffer-base-buffer))))))
|
||||
(dolist (table (mapcar #'car org-roam-db--table-schemata))
|
||||
(org-roam-db-query `[:delete :from ,table
|
||||
:where (= ,(if (eq table 'links) 'from 'file) $s1)]
|
||||
file))))
|
||||
|
||||
;;;;; Insertion
|
||||
(defun org-roam-db--insert-meta (file hash meta)
|
||||
"Insert HASH and META for a FILE into the Org-roam cache."
|
||||
(org-roam-db-query
|
||||
[:insert :into files
|
||||
:values $v1]
|
||||
(list (vector file hash meta))))
|
||||
|
||||
(defun org-roam-db--insert-links (links)
|
||||
"Insert LINKS into the Org-roam cache."
|
||||
(org-roam-db-query
|
||||
@ -225,12 +229,27 @@ This is equivalent to removing the node from the graph."
|
||||
:values $v1]
|
||||
(list (vector file titles))))
|
||||
|
||||
(defun org-roam-db--insert-headlines (headlines)
|
||||
"Insert HEADLINES into the Org-roam cache."
|
||||
(org-roam-db-query
|
||||
[:insert :into headlines
|
||||
:values $v1]
|
||||
headlines))
|
||||
|
||||
(defun org-roam-db--insert-tags (file tags)
|
||||
"Insert TAGS for a FILE into the Org-roam cache."
|
||||
(org-roam-db-query
|
||||
[:insert :into tags
|
||||
:values $v1]
|
||||
(list (vector file tags))))
|
||||
|
||||
(defun org-roam-db--insert-ref (file ref)
|
||||
"Insert REF for FILE into the Org-roam cache."
|
||||
(org-roam-db-query
|
||||
[:insert :into refs
|
||||
:values $v1]
|
||||
(list (vector ref file))))
|
||||
(let ((key (cdr ref))
|
||||
(type (car ref)))
|
||||
(org-roam-db-query
|
||||
[:insert :into refs :values $v1]
|
||||
(list (vector key file type)))))
|
||||
|
||||
;;;;; Fetching
|
||||
(defun org-roam-db--get-current-files ()
|
||||
@ -253,12 +272,12 @@ This is equivalent to removing the node from the graph."
|
||||
If the file does not have any connections, nil is returned."
|
||||
(let* ((query "WITH RECURSIVE
|
||||
links_of(file, link) AS
|
||||
(WITH roamlinks AS (SELECT * FROM links WHERE \"type\" = '\"roam\"'),
|
||||
(WITH filelinks AS (SELECT * FROM links WHERE \"type\" = '\"file\"'),
|
||||
citelinks AS (SELECT * FROM links
|
||||
JOIN refs ON links.\"to\" = refs.\"ref\"
|
||||
AND links.\"type\" = '\"cite\"')
|
||||
SELECT \"from\", \"to\" FROM roamlinks UNION
|
||||
SELECT \"to\", \"from\" FROM roamlinks UNION
|
||||
SELECT \"from\", \"to\" FROM filelinks UNION
|
||||
SELECT \"to\", \"from\" FROM filelinks UNION
|
||||
SELECT \"file\", \"from\" FROM citelinks UNION
|
||||
SELECT \"from\", \"file\" FROM citelinks),
|
||||
connected_component(file) AS
|
||||
@ -270,16 +289,17 @@ If the file does not have any connections, nil is returned."
|
||||
files))
|
||||
|
||||
(defun org-roam-db--links-with-max-distance (file max-distance)
|
||||
"Return all files reachable from/connected to FILE in at most MAX-DISTANCE steps,
|
||||
including the file itself. If the file does not have any connections, nil is returned."
|
||||
"Return all files connected to FILE in at most MAX-DISTANCE steps.
|
||||
This includes the file itself. If the file does not have any
|
||||
connections, nil is returned."
|
||||
(let* ((query "WITH RECURSIVE
|
||||
links_of(file, link) AS
|
||||
(WITH roamlinks AS (SELECT * FROM links WHERE \"type\" = '\"roam\"'),
|
||||
(WITH filelinks AS (SELECT * FROM links WHERE \"type\" = '\"file\"'),
|
||||
citelinks AS (SELECT * FROM links
|
||||
JOIN refs ON links.\"to\" = refs.\"ref\"
|
||||
AND links.\"type\" = '\"cite\"')
|
||||
SELECT \"from\", \"to\" FROM roamlinks UNION
|
||||
SELECT \"to\", \"from\" FROM roamlinks UNION
|
||||
SELECT \"from\", \"to\" FROM filelinks UNION
|
||||
SELECT \"to\", \"from\" FROM filelinks UNION
|
||||
SELECT \"file\", \"from\" FROM citelinks UNION
|
||||
SELECT \"from\", \"file\" FROM citelinks),
|
||||
-- Links are traversed in a breadth-first search. In order to calculate the
|
||||
@ -302,13 +322,36 @@ including the file itself. If the file does not have any connections, nil is re
|
||||
files))
|
||||
|
||||
;;;;; Updating
|
||||
(defun org-roam-db--update-meta ()
|
||||
"Update the metadata of the current buffer into the cache."
|
||||
(let* ((file (file-truename (buffer-file-name)))
|
||||
(attr (file-attributes file))
|
||||
(atime (file-attribute-access-time attr))
|
||||
(mtime (file-attribute-modification-time attr))
|
||||
(hash (secure-hash 'sha1 (current-buffer))))
|
||||
(org-roam-db-query [:delete :from files
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(org-roam-db--insert-meta file hash (list :atime atime :mtime mtime))))
|
||||
|
||||
(defun org-roam-db--update-titles ()
|
||||
"Update the title of the current buffer into the cache."
|
||||
(let ((file (file-truename (buffer-file-name))))
|
||||
(let* ((file (file-truename (buffer-file-name)))
|
||||
(title (org-roam--extract-titles)))
|
||||
(org-roam-db-query [:delete :from titles
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(org-roam-db--insert-titles file (org-roam--extract-titles))))
|
||||
(org-roam-db--insert-titles file title)))
|
||||
|
||||
(defun org-roam-db--update-tags ()
|
||||
"Update the tags of the current buffer into the cache."
|
||||
(let ((file (file-truename (buffer-file-name)))
|
||||
(tags (org-roam--extract-tags)))
|
||||
(org-roam-db-query [:delete :from tags
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(when tags
|
||||
(org-roam-db--insert-tags file tags))))
|
||||
|
||||
(defun org-roam-db--update-refs ()
|
||||
"Update the ref of the current buffer into the cache."
|
||||
@ -319,7 +362,7 @@ including the file itself. If the file does not have any connections, nil is re
|
||||
(when-let ((ref (org-roam--extract-ref)))
|
||||
(org-roam-db--insert-ref file ref))))
|
||||
|
||||
(defun org-roam-db--update-cache-links ()
|
||||
(defun org-roam-db--update-links ()
|
||||
"Update the file links of the current buffer in the cache."
|
||||
(let ((file (file-truename (buffer-file-name))))
|
||||
(org-roam-db-query [:delete :from links
|
||||
@ -328,53 +371,87 @@ including the file itself. If the file does not have any connections, nil is re
|
||||
(when-let ((links (org-roam--extract-links)))
|
||||
(org-roam-db--insert-links links))))
|
||||
|
||||
(defun org-roam-db--update-headlines ()
|
||||
"Update the file headlines of the current buffer into the cache."
|
||||
(let* ((file (file-truename (buffer-file-name))))
|
||||
(org-roam-db-query [:delete :from headlines
|
||||
:where (= file $s1)]
|
||||
file)
|
||||
(when-let ((headlines (org-roam--extract-headlines)))
|
||||
(org-roam-db--insert-headlines headlines))))
|
||||
|
||||
(defun org-roam-db--update-file (&optional file-path)
|
||||
"Update Org-roam cache for FILE-PATH."
|
||||
(let (buf)
|
||||
(if file-path
|
||||
(setq buf (find-file-noselect file-path))
|
||||
(setq buf (current-buffer)))
|
||||
(with-current-buffer buf
|
||||
(save-excursion
|
||||
(org-roam-db--update-titles)
|
||||
(org-roam-db--update-refs)
|
||||
(org-roam-db--update-cache-links)
|
||||
(org-roam-buffer--update-maybe :redisplay t)))))
|
||||
(when (org-roam--org-roam-file-p file-path)
|
||||
(let ((buf (or (and file-path
|
||||
(find-file-noselect file-path t))
|
||||
(current-buffer))))
|
||||
(with-current-buffer buf
|
||||
(save-excursion
|
||||
(org-roam-db--update-meta)
|
||||
(org-roam-db--update-tags)
|
||||
(org-roam-db--update-titles)
|
||||
(org-roam-db--update-refs)
|
||||
(org-roam-db--update-headlines)
|
||||
(org-roam-db--update-links)
|
||||
(org-roam-buffer--update-maybe :redisplay t))))))
|
||||
|
||||
;;;;; org-roam-db-build-cache
|
||||
(defun org-roam-db-build-cache ()
|
||||
"Build the cache for `org-roam-directory'."
|
||||
(interactive)
|
||||
(defun org-roam-db-build-cache (&optional force)
|
||||
"Build the cache for `org-roam-directory'.
|
||||
If FORCE, force a rebuild of the cache from scratch."
|
||||
(interactive "P")
|
||||
(when force (delete-file (org-roam-db--get)))
|
||||
(org-roam-db--close) ;; Force a reconnect
|
||||
(org-roam-db) ;; To initialize the database, no-op if already initialized
|
||||
(let* ((org-roam-files (org-roam--list-files org-roam-directory))
|
||||
(let* ((org-roam-files (org-roam--list-all-files))
|
||||
(current-files (org-roam-db--get-current-files))
|
||||
(time (current-time))
|
||||
all-files all-links all-titles all-refs)
|
||||
all-files all-headlines all-links all-titles all-refs all-tags)
|
||||
;; Two-step building
|
||||
;; First step: Rebuild files and headlines
|
||||
(dolist (file org-roam-files)
|
||||
(org-roam--with-temp-buffer
|
||||
(insert-file-contents file)
|
||||
(let ((contents-hash (secure-hash 'sha1 (current-buffer))))
|
||||
(unless (string= (gethash file current-files)
|
||||
contents-hash)
|
||||
(org-roam-db--clear-file file)
|
||||
(setq all-files
|
||||
(cons (vector file contents-hash time) all-files))
|
||||
(when-let (links (org-roam--extract-links file))
|
||||
(setq all-links (append links all-links)))
|
||||
(let ((titles (org-roam--extract-titles)))
|
||||
(setq all-titles (cons (vector file titles) all-titles)))
|
||||
(when-let ((ref (org-roam--extract-ref)))
|
||||
(setq all-refs (cons (vector ref file) all-refs))))
|
||||
(remhash file current-files))))
|
||||
(dolist (file (hash-table-keys current-files))
|
||||
;; These files are no longer around, remove from cache...
|
||||
(org-roam-db--clear-file file))
|
||||
(let* ((attr (file-attributes file))
|
||||
(atime (file-attribute-access-time attr))
|
||||
(mtime (file-attribute-modification-time attr)))
|
||||
(org-roam--with-temp-buffer file
|
||||
(let ((contents-hash (secure-hash 'sha1 (current-buffer))))
|
||||
(unless (string= (gethash file current-files)
|
||||
contents-hash)
|
||||
(org-roam-db--clear-file file)
|
||||
(push (vector file contents-hash (list :atime atime :mtime mtime))
|
||||
all-files)
|
||||
(when-let (headlines (org-roam--extract-headlines file))
|
||||
(push headlines all-headlines)))))))
|
||||
(when all-files
|
||||
(org-roam-db-query
|
||||
[:insert :into files
|
||||
:values $v1]
|
||||
all-files))
|
||||
(when all-headlines
|
||||
(org-roam-db-query
|
||||
[:insert :into headlines
|
||||
:values $v1]
|
||||
all-headlines))
|
||||
;; Second step: Rebuild the rest
|
||||
(dolist (file org-roam-files)
|
||||
(org-roam--with-temp-buffer file
|
||||
(let ((contents-hash (secure-hash 'sha1 (current-buffer))))
|
||||
(unless (string= (gethash file current-files)
|
||||
contents-hash)
|
||||
(when-let (links (org-roam--extract-links file))
|
||||
(push links all-links))
|
||||
(when-let (tags (org-roam--extract-tags file))
|
||||
(push (vector file tags) all-tags))
|
||||
(let ((titles (org-roam--extract-titles)))
|
||||
(push (vector file titles)
|
||||
all-titles))
|
||||
(when-let* ((ref (org-roam--extract-ref))
|
||||
(type (car ref))
|
||||
(key (cdr ref)))
|
||||
(setq all-refs (cons (vector key file type) all-refs))))
|
||||
(remhash file current-files))))
|
||||
(dolist (file (hash-table-keys current-files))
|
||||
;; These files are no longer around, remove from cache...
|
||||
(org-roam-db--clear-file file))
|
||||
(when all-links
|
||||
(org-roam-db-query
|
||||
[:insert :into links
|
||||
@ -385,23 +462,31 @@ including the file itself. If the file does not have any connections, nil is re
|
||||
[:insert :into titles
|
||||
:values $v1]
|
||||
all-titles))
|
||||
(when all-tags
|
||||
(org-roam-db-query
|
||||
[:insert :into tags
|
||||
:values $v1]
|
||||
all-tags))
|
||||
(when all-refs
|
||||
(org-roam-db-query
|
||||
[:insert :into refs
|
||||
:values $v1]
|
||||
all-refs))
|
||||
(let ((stats (list :files (length all-files)
|
||||
:headlines (length all-headlines)
|
||||
:links (length all-links)
|
||||
:tags (length all-tags)
|
||||
:titles (length all-titles)
|
||||
:refs (length all-refs)
|
||||
:deleted (length (hash-table-keys current-files)))))
|
||||
(when org-roam-verbose
|
||||
(message "files: %s, links: %s, titles: %s, refs: %s, deleted: %s"
|
||||
(plist-get stats :files)
|
||||
(plist-get stats :links)
|
||||
(plist-get stats :titles)
|
||||
(plist-get stats :refs)
|
||||
(plist-get stats :deleted)))
|
||||
(org-roam-message "files: %s, headlines: %s, links: %s, tags: %s, titles: %s, refs: %s, deleted: %s"
|
||||
(plist-get stats :files)
|
||||
(plist-get stats :headlines)
|
||||
(plist-get stats :links)
|
||||
(plist-get stats :tags)
|
||||
(plist-get stats :titles)
|
||||
(plist-get stats :refs)
|
||||
(plist-get stats :deleted))
|
||||
stats)))
|
||||
|
||||
(provide 'org-roam-db)
|
||||
|
39
org-roam-dev.el
Normal file
39
org-roam-dev.el
Normal file
@ -0,0 +1,39 @@
|
||||
;;; org-roam-dev.el --- Org-roam development code -mode -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 3, or (at your option)
|
||||
;; any later version.
|
||||
;;
|
||||
;; This program 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.
|
||||
;;
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
;; Boston, MA 02110-1301, USA.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; This library provides code for org-roam developers.
|
||||
;; It is intended to be loaded before editing org-roam source files.
|
||||
;; It ensures consistent application of various developer settings.
|
||||
;;
|
||||
;;; Code:
|
||||
(require 'emacsql)
|
||||
(emacsql-fix-vector-indentation)
|
||||
(provide 'org-roam-dev)
|
||||
|
||||
;;; org-roam-dev.el ends here
|
308
org-roam-doctor.el
Normal file
308
org-roam-doctor.el
Normal file
@ -0,0 +1,308 @@
|
||||
;;; org-roam-doctor.el --- Linter for Org-roam files -*- coding: utf-8; lexical-binding: t; -*-
|
||||
;;
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 3, or (at your option)
|
||||
;; any later version.
|
||||
;;
|
||||
;; This program 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.
|
||||
;;
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
;; Boston, MA 02110-1301, USA.
|
||||
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; This library provides `org-roam-doctor', a utility for diagnosing and fixing
|
||||
;; Org-roam files. Running `org-roam-doctor' launches a list of checks defined
|
||||
;; by `org-roam-doctor--checkers'. Every checker is an instance of
|
||||
;; `org-roam-doctor-checker'.
|
||||
;;
|
||||
;; Each checker is given the Org parse tree (AST), and is expected to return a
|
||||
;; list of errors. The checker can also provide "actions" for auto-fixing errors
|
||||
;; (see `org-roam-doctor--remove-link' for an example).
|
||||
;;
|
||||
;; The UX experience is inspired by both org-lint and checkdoc, and their code
|
||||
;; is heavily referenced.
|
||||
;;
|
||||
;;; Code:
|
||||
;; Library Requires
|
||||
(require 'cl-lib)
|
||||
(require 'org)
|
||||
(require 'org-element)
|
||||
(require 's)
|
||||
(require 'dash)
|
||||
(require 'org-roam-macs)
|
||||
|
||||
(declare-function org-roam-insert "org-roam")
|
||||
(declare-function org-roam--get-roam-buffers "org-roam")
|
||||
(declare-function org-roam--list-all-files "org-roam")
|
||||
(declare-function org-roam--org-roam-file-p "org-roam")
|
||||
(declare-function org-roam--str-to-list "org-roam")
|
||||
(declare-function org-roam-mode "org-roam")
|
||||
|
||||
(defvar org-roam-verbose)
|
||||
(defvar org-roam-mode)
|
||||
|
||||
(cl-defstruct (org-roam-doctor-checker (:copier nil))
|
||||
(name 'missing-checker-name)
|
||||
(description "")
|
||||
(actions nil))
|
||||
|
||||
(defconst org-roam-doctor--checkers
|
||||
(list
|
||||
(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))))
|
||||
(make-org-roam-doctor-checker
|
||||
:name 'org-roam-doctor-check-roam-props
|
||||
:description "Check #+roam_* properties.")
|
||||
(make-org-roam-doctor-checker
|
||||
:name 'org-roam-doctor-check-tags
|
||||
:description "Check #+roam_tags.")
|
||||
(make-org-roam-doctor-checker
|
||||
:name 'org-roam-doctor-check-alias
|
||||
:description "Check #+roam_alias.")))
|
||||
|
||||
(defconst org-roam-doctor--supported-roam-properties
|
||||
'("roam_tags" "roam_alias" "roam_key")
|
||||
"List of supported Org-roam properties.")
|
||||
|
||||
(defun org-roam-doctor-check-roam-props (ast)
|
||||
"Checker for detecting invalid #+roam_* properties.
|
||||
AST is the org-element parse tree."
|
||||
(let (reports)
|
||||
(org-element-map ast 'keyword
|
||||
(lambda (kw)
|
||||
(let ((key (org-element-property :key kw)))
|
||||
(when (and (string-prefix-p "ROAM_" key t)
|
||||
(not (member (downcase key) org-roam-doctor--supported-roam-properties)))
|
||||
(push
|
||||
`(,(org-element-property :begin kw)
|
||||
,(concat "Possible mispelled key: "
|
||||
(prin1-to-string key)
|
||||
"\nOrg-roam supports the following keys: "
|
||||
(s-join ", " org-roam-doctor--supported-roam-properties)))
|
||||
reports)))))
|
||||
reports))
|
||||
|
||||
(defun org-roam-doctor-check-tags (ast)
|
||||
"Checker for detecting invalid #+roam_tags.
|
||||
AST is the org-element parse tree."
|
||||
(let (reports)
|
||||
(org-element-map ast 'keyword
|
||||
(lambda (kw)
|
||||
(when (string-collate-equalp (org-element-property :key kw) "roam_tags" nil t)
|
||||
(let ((tags (org-element-property :value kw)))
|
||||
(condition-case nil
|
||||
(org-roam--str-to-list tags)
|
||||
(error
|
||||
(push
|
||||
`(,(org-element-property :begin kw)
|
||||
,(concat "Unable to parse tags: "
|
||||
tags
|
||||
(when (s-contains? "," tags)
|
||||
"\nCheck that your tags are not comma-separated.")))
|
||||
reports)))))))
|
||||
reports))
|
||||
|
||||
(defun org-roam-doctor-check-alias (ast)
|
||||
"Checker for detecting invalid #+roam_alias.
|
||||
AST is the org-element parse tree."
|
||||
(let (reports)
|
||||
(org-element-map ast 'keyword
|
||||
(lambda (kw)
|
||||
(when (string-collate-equalp (org-element-property :key kw) "roam_alias" nil t)
|
||||
(let ((aliases (org-element-property :value kw)))
|
||||
(condition-case nil
|
||||
(org-roam--str-to-list aliases)
|
||||
(error
|
||||
(push
|
||||
`(,(org-element-property :begin kw)
|
||||
,(concat "Unable to parse aliases: "
|
||||
aliases
|
||||
(when (s-contains? "," aliases)
|
||||
"\nCheck that your aliases are not comma-separated.")))
|
||||
reports)))))))
|
||||
reports))
|
||||
|
||||
(defun org-roam-doctor-broken-links (ast)
|
||||
"Checker for detecting broken links.
|
||||
AST is the org-element parse tree."
|
||||
(let (reports)
|
||||
(org-element-map ast 'link
|
||||
(lambda (l)
|
||||
(when (equal "file" (org-element-property :type l))
|
||||
(let ((file (org-element-property :path l)))
|
||||
(or (file-exists-p file)
|
||||
(file-remote-p file)
|
||||
(push
|
||||
`(,(org-element-property :begin l)
|
||||
,(format (if (org-element-lineage l '(link))
|
||||
"Link to non-existent image file \"%s\"\
|
||||
in link description"
|
||||
"Link to non-existent local file \"%s\"")
|
||||
file))
|
||||
reports))))))
|
||||
reports))
|
||||
|
||||
(defun org-roam-doctor--check (buffer checkers)
|
||||
"Check BUFFER for errors.
|
||||
CHECKERS is the list of checkers used."
|
||||
(with-current-buffer buffer
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(let* ((ast (org-element-parse-buffer))
|
||||
(errors (sort (cl-mapcan
|
||||
(lambda (c)
|
||||
(mapcar
|
||||
(lambda (report)
|
||||
(list (set-marker (make-marker) (car report))
|
||||
(nth 1 report) c))
|
||||
(save-excursion
|
||||
(funcall
|
||||
(org-roam-doctor-checker-name c)
|
||||
ast))))
|
||||
checkers)
|
||||
#'car-less-than-car)))
|
||||
(dolist (e errors)
|
||||
(pcase-let ((`(,m ,msg ,checker) e))
|
||||
(switch-to-buffer buffer)
|
||||
(goto-char m)
|
||||
(org-reveal)
|
||||
(undo-boundary)
|
||||
(org-roam-doctor--resolve msg checker)
|
||||
(set-marker m nil)))
|
||||
errors))))
|
||||
|
||||
;;; Actions
|
||||
(defun org-roam-doctor--recursive-edit ()
|
||||
"Launch into a recursive edit."
|
||||
(message "When you're done editing press C-M-c to continue.")
|
||||
(recursive-edit))
|
||||
|
||||
(defun org-roam-doctor--skip ()
|
||||
"Skip the current error."
|
||||
(org-roam-message "Skipping..."))
|
||||
|
||||
(defun org-roam-doctor--replace-link ()
|
||||
"Replace the current link with a new link."
|
||||
(save-match-data
|
||||
(unless (org-in-regexp org-link-bracket-re 1)
|
||||
(user-error "No link at point"))
|
||||
(let ((orig (buffer-string))
|
||||
(p (point)))
|
||||
(condition-case nil
|
||||
(save-excursion
|
||||
(replace-match "")
|
||||
(org-roam-insert))
|
||||
(quit (progn
|
||||
(replace-buffer-contents orig)
|
||||
(goto-char p)))))))
|
||||
|
||||
(defun org-roam-doctor--replace-link-keep-label ()
|
||||
"Replace the current link with a new link, keeping the current link's label."
|
||||
(save-match-data
|
||||
(unless (org-in-regexp org-link-bracket-re 1)
|
||||
(user-error "No link at point"))
|
||||
(let ((orig (buffer-string))
|
||||
(p (point)))
|
||||
(condition-case nil
|
||||
(save-excursion
|
||||
(let ((label (if (match-end 2)
|
||||
(match-string-no-properties 2)
|
||||
(org-link-unescape (match-string-no-properties 1)))))
|
||||
(replace-match "")
|
||||
(org-roam-insert nil nil label)))
|
||||
(quit (progn
|
||||
(replace-buffer-contents orig)
|
||||
(goto-char p)))))))
|
||||
|
||||
(defun org-roam-doctor--remove-link ()
|
||||
"Unlink the text at point."
|
||||
(unless (org-in-regexp org-link-bracket-re 1)
|
||||
(user-error "No link at point"))
|
||||
(save-excursion
|
||||
(let ((label (if (match-end 2)
|
||||
(match-string-no-properties 2)
|
||||
(org-link-unescape (match-string-no-properties 1)))))
|
||||
(delete-region (match-beginning 0) (match-end 0))
|
||||
(insert label))))
|
||||
|
||||
(defun org-roam-doctor--resolve (msg checker)
|
||||
"Resolve an error.
|
||||
MSG is the error that was found, which is displayed in a help buffer.
|
||||
CHECKER is a org-roam-doctor checker instance."
|
||||
(let ((actions (org-roam-doctor-checker-actions checker))
|
||||
c)
|
||||
(push '("e" . ("Edit" . org-roam-doctor--recursive-edit)) actions)
|
||||
(push '("s" . ("Skip" . org-roam-doctor--skip)) actions)
|
||||
(with-output-to-temp-buffer "*Org-roam-doctor Help*"
|
||||
(mapc #'princ
|
||||
(list "Error message:\n " msg "\n\n"))
|
||||
(dolist (action actions)
|
||||
(princ (format "[%s]: %s\n"
|
||||
(car action)
|
||||
(cadr action))))
|
||||
(princ "\n\n"))
|
||||
(shrink-window-if-larger-than-buffer
|
||||
(get-buffer-window "*Org-roam-doctor Help*"))
|
||||
(message "Press key for command:")
|
||||
(unwind-protect
|
||||
(progn
|
||||
(cl-loop
|
||||
do (setq c (char-to-string (read-char-exclusive)))
|
||||
until (assoc c actions)
|
||||
do (message "Please enter a valid key for command:"))
|
||||
(funcall (cddr (assoc c actions)))
|
||||
(redisplay))
|
||||
(when (get-buffer-window "*Org-roam-doctor Help*")
|
||||
(delete-window (get-buffer-window "*Org-roam-doctor Help*"))
|
||||
(kill-buffer "*Org-roam-doctor Help*")))))
|
||||
|
||||
;;;###autoload
|
||||
(defun org-roam-doctor (&optional checkall)
|
||||
"Perform a check on the current buffer to ensure cleanliness.
|
||||
If CHECKALL, run the check for all Org-roam files."
|
||||
(interactive "P")
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(let ((files (if checkall
|
||||
(org-roam--list-all-files)
|
||||
(unless (org-roam--org-roam-file-p)
|
||||
(user-error "Not in an org-roam file"))
|
||||
`(,(buffer-file-name)))))
|
||||
(org-roam-doctor-start files org-roam-doctor--checkers)))
|
||||
|
||||
(defun org-roam-doctor-start (files checkers)
|
||||
"Lint FILES using CHECKERS."
|
||||
(save-window-excursion
|
||||
(let ((existing-buffers (org-roam--get-roam-buffers)))
|
||||
(dolist (f files)
|
||||
(let ((buf (find-file-noselect f)))
|
||||
(org-roam-doctor--check buf checkers)
|
||||
(unless (memq buf existing-buffers)
|
||||
(save-buffer buf)
|
||||
(kill-buffer buf))))))
|
||||
(org-roam-message "Linting completed."))
|
||||
|
||||
(provide 'org-roam-doctor)
|
||||
|
||||
;;; org-roam-doctor.el ends here
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-graph.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-graph.el --- Graphing API -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -37,8 +37,10 @@
|
||||
|
||||
;;;; Declarations
|
||||
(defvar org-roam-directory)
|
||||
(defvar org-roam-mode)
|
||||
(declare-function org-roam--org-roam-file-p "org-roam")
|
||||
(declare-function org-roam--path-to-slug "org-roam")
|
||||
(declare-function org-roam-mode "org-roam")
|
||||
|
||||
;;;; Options
|
||||
(defcustom org-roam-graph-viewer (executable-find "firefox")
|
||||
@ -53,8 +55,8 @@ It may be one of the following:
|
||||
(const :tag "view-file"))
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-graph-executable (executable-find "dot")
|
||||
"Path to graphing executable."
|
||||
(defcustom org-roam-graph-executable "dot"
|
||||
"Path to graphing executable, or its name."
|
||||
:type 'string
|
||||
:group 'org-roam)
|
||||
|
||||
@ -65,14 +67,20 @@ Example:
|
||||
:type '(alist)
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-graph-node-extra-config nil
|
||||
(defcustom org-roam-graph-node-extra-config
|
||||
'(("shape" . "underline")
|
||||
("style" . "rounded,filled")
|
||||
("fillcolor" . "#EEEEEE")
|
||||
("color" . "#C9C9C9")
|
||||
("fontcolor" . "#111111"))
|
||||
"Extra options for graphviz nodes.
|
||||
Example:
|
||||
'((\"color\" . \"skyblue\"))"
|
||||
:type '(alist)
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-graph-edge-extra-config nil
|
||||
(defcustom org-roam-graph-edge-extra-config
|
||||
'(("color" . "#333333"))
|
||||
"Extra options for graphviz edges.
|
||||
Example:
|
||||
'((\"dir\" . \"back\"))"
|
||||
@ -91,6 +99,19 @@ Example:
|
||||
:type 'number
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-graph-shorten-titles 'truncate
|
||||
"Determines how long titles appear in graph nodes.
|
||||
Recognized values are the symbols `truncate' and `wrap', in which
|
||||
cases the title will be truncated or wrapped, respectively, if it
|
||||
is longer than `org-roam-graph-max-title-length'.
|
||||
|
||||
All other values including nil will have no effect."
|
||||
:type '(choice
|
||||
(const :tag "truncate" truncate)
|
||||
(const :tag "wrap" wrap)
|
||||
(const :tag "no" nil))
|
||||
:group 'org-roam)
|
||||
|
||||
(defcustom org-roam-graph-exclude-matcher nil
|
||||
"Matcher for excluding nodes from the generated graph.
|
||||
Any nodes and links for file paths matching this string is
|
||||
@ -144,7 +165,7 @@ The Org-roam database titles table is read, to obtain the list of titles.
|
||||
The links table is then read to obtain all directed links, and formatted
|
||||
into a digraph."
|
||||
(org-roam-db--ensure-built)
|
||||
(org-roam--with-temp-buffer
|
||||
(org-roam--with-temp-buffer nil
|
||||
(let* ((nodes (org-roam-db-query node-query))
|
||||
(edges-query
|
||||
`[:with selected :as [:select [file] :from ,node-query]
|
||||
@ -154,7 +175,8 @@ into a digraph."
|
||||
`[:with selected :as [:select [file] :from ,node-query]
|
||||
:select :distinct [file from]
|
||||
:from links :inner :join refs :on (and (= links:to refs:ref)
|
||||
(= links:type "cite"))
|
||||
(= links:type "cite")
|
||||
(= refs:type "cite"))
|
||||
:where (and (in file selected) (in from selected))])
|
||||
(edges (org-roam-db-query edges-query))
|
||||
(edges-cites (org-roam-db-query edges-cites-query)))
|
||||
@ -163,7 +185,8 @@ into a digraph."
|
||||
(insert (org-roam-graph--dot-option option) ";\n"))
|
||||
(dolist (attribute '("node" "edge"))
|
||||
(insert (format " %s [%s];\n" attribute
|
||||
(mapconcat #'org-roam-graph--dot-option
|
||||
(mapconcat (lambda (var)
|
||||
(org-roam-graph--dot-option var nil "\""))
|
||||
(symbol-value
|
||||
(intern (concat "org-roam-graph-" attribute "-extra-config")))
|
||||
","))))
|
||||
@ -171,7 +194,10 @@ into a digraph."
|
||||
(let* ((file (xml-escape-string (car node)))
|
||||
(title (or (caadr node)
|
||||
(org-roam--path-to-slug file)))
|
||||
(shortened-title (s-truncate org-roam-graph-max-title-length title))
|
||||
(shortened-title (pcase org-roam-graph-shorten-titles
|
||||
(`truncate (s-truncate org-roam-graph-max-title-length title))
|
||||
(`wrap (s-word-wrap org-roam-graph-max-title-length title))
|
||||
(_ title)))
|
||||
(node-properties
|
||||
`(("label" . ,(s-replace "\"" "\\\"" shortened-title))
|
||||
("URL" . ,(concat "org-protocol://roam-file?file=" (url-hexify-string file)))
|
||||
@ -193,21 +219,31 @@ into a digraph."
|
||||
(insert "}")
|
||||
(buffer-string))))
|
||||
|
||||
(defun org-roam-graph--build (&optional node-query)
|
||||
"Generate a graph showing the relations between nodes in NODE-QUERY."
|
||||
(unless org-roam-graph-executable
|
||||
(user-error "Can't find %s executable. Please check if it is in your path"
|
||||
(defun org-roam-graph--build (&optional node-query callback)
|
||||
"Generate a graph showing the relations between nodes in NODE-QUERY.
|
||||
Execute CALLBACK when process exits successfully.
|
||||
CALLBACK is passed the graph file as its sole argument."
|
||||
(unless (stringp org-roam-graph-executable)
|
||||
(user-error "`org-roam-graph-executable' is not a string"))
|
||||
(unless (executable-find org-roam-graph-executable)
|
||||
(user-error (concat "Cannot find executable \"%s\" to generate the graph. "
|
||||
"Please adjust `org-roam-graph-executable'")
|
||||
org-roam-graph-executable))
|
||||
(let* ((node-query (or node-query
|
||||
`[:select [file titles]
|
||||
:from titles
|
||||
`[:select [file titles] :from titles
|
||||
,@(org-roam-graph--expand-matcher 'file t)]))
|
||||
(graph (org-roam-graph--dot node-query))
|
||||
(temp-dot (make-temp-file "graph." nil ".dot" graph))
|
||||
(temp-graph (make-temp-file "graph." nil ".svg")))
|
||||
(call-process org-roam-graph-executable nil 0 nil
|
||||
temp-dot "-Tsvg" "-o" temp-graph)
|
||||
temp-graph))
|
||||
(org-roam-message "building graph")
|
||||
(make-process
|
||||
:name "*org-roam-graph--build-process*"
|
||||
:buffer "*org-roam-graph--build-process*"
|
||||
:command `(,org-roam-graph-executable ,temp-dot "-Tsvg" "-o" ,temp-graph)
|
||||
:sentinel (when callback
|
||||
(lambda (process _event)
|
||||
(when (= 0 (process-exit-status process))
|
||||
(funcall callback temp-graph)))))))
|
||||
|
||||
(defun org-roam-graph--open (file)
|
||||
"Open FILE using `org-roam-graph-viewer' with `view-file' as a fallback."
|
||||
@ -216,15 +252,16 @@ into a digraph."
|
||||
(if (executable-find org-roam-graph-viewer)
|
||||
(condition-case err
|
||||
(call-process org-roam-graph-viewer nil 0 nil file)
|
||||
((error (user-error "Failed to open org-roam graph: %s" err))))
|
||||
(error (user-error "Failed to open org-roam graph: %s" err)))
|
||||
(user-error "Executable not found: \"%s\"" org-roam-graph-viewer)))
|
||||
((pred functionp) (funcall org-roam-graph-viewer file))
|
||||
('nil (view-file file))
|
||||
(_ (signal 'wrong-type-argument `((functionp stringp null) ,org-roam-graph-viewer)))))
|
||||
|
||||
(defun org-roam-graph--build-connected-component (file &optional max-distance)
|
||||
(defun org-roam-graph--build-connected-component (file &optional max-distance callback)
|
||||
"Build a graph of nodes connected to FILE.
|
||||
If MAX-DISTANCE is non-nil, limit nodes to MAX-DISTANCE steps."
|
||||
If MAX-DISTANCE is non-nil, limit nodes to MAX-DISTANCE steps.
|
||||
CALLBACK is passed to `org-roam-graph--build'."
|
||||
(let* ((file (file-truename file))
|
||||
(files (or (if (and max-distance (>= max-distance 0))
|
||||
(org-roam-db--links-with-max-distance file max-distance)
|
||||
@ -233,7 +270,7 @@ If MAX-DISTANCE is non-nil, limit nodes to MAX-DISTANCE steps."
|
||||
(query `[:select [file titles]
|
||||
:from titles
|
||||
:where (in file [,@files])]))
|
||||
(org-roam-graph--build query)))
|
||||
(org-roam-graph--build query callback)))
|
||||
|
||||
;;;; Commands
|
||||
;;;###autoload
|
||||
@ -248,17 +285,17 @@ ARG may be any of the following values:
|
||||
- `\\[universal-argument]' - build the graph for FILE.
|
||||
- `\\[universal-argument]' -N build the graph for FILE limiting nodes to N steps."
|
||||
(interactive "P")
|
||||
(let ((file (or file (buffer-file-name))))
|
||||
(unless file
|
||||
(user-error "Cannot build graph for nil file. Is current buffer visiting a file?"))
|
||||
(unless (org-roam--org-roam-file-p file)
|
||||
(user-error "\"%s\" is not an org-roam file" file))
|
||||
(unless org-roam-mode (org-roam-mode))
|
||||
(let ((file (or file (buffer-file-name (buffer-base-buffer)))))
|
||||
(unless (or (not arg) (equal arg '(16)))
|
||||
(unless file
|
||||
(user-error "Cannot build graph for nil file. Is current buffer visiting a file?"))
|
||||
(unless (org-roam--org-roam-file-p file)
|
||||
(user-error "\"%s\" is not an org-roam file" file)))
|
||||
(pcase arg
|
||||
('nil (org-roam-graph--open (org-roam-graph--build node-query)))
|
||||
('(4) (org-roam-graph--open (org-roam-graph--build-connected-component file)))
|
||||
((pred integerp) (let ((graph (org-roam-graph--build-connected-component (buffer-file-name) (abs arg))))
|
||||
(when (>= arg 0)
|
||||
(org-roam-graph--open graph))))
|
||||
('nil (org-roam-graph--build node-query #'org-roam-graph--open))
|
||||
('(4) (org-roam-graph--build-connected-component file nil #'org-roam-graph--open))
|
||||
((pred integerp) (org-roam-graph--build-connected-component file (abs arg) (when (>= arg 0) #'org-roam-graph--open)))
|
||||
('(16) (org-roam-graph--build node-query))
|
||||
('- (org-roam-graph--build-connected-component file))
|
||||
(_ (user-error "Unrecognized ARG: %s" arg)))))
|
||||
|
@ -1,12 +1,12 @@
|
||||
;;; org-roam-macs.el --- Roam Research replica with Org-mode -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-macs.el --- Macros/utility functions -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite "1.0.0"))
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (dash "2.13") (f "0.17.2") (s "1.12.0") (org "9.3") (emacsql "3.0.0") (emacsql-sqlite3 "1.0.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
@ -27,22 +27,47 @@
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
;; This library implements macros used throughout org-roam
|
||||
;; This library implements macros and utility functions used throughout
|
||||
;; org-roam.
|
||||
;;
|
||||
;;
|
||||
;;; Code:
|
||||
;;;; Library Requires
|
||||
|
||||
(defmacro org-roam--with-temp-buffer (&rest body)
|
||||
(defvar org-roam-verbose)
|
||||
|
||||
(defmacro org-roam--with-temp-buffer (file &rest body)
|
||||
"Execute BODY within a temp buffer.
|
||||
Like `with-temp-buffer', but propagates `org-roam-directory'."
|
||||
(declare (indent 0) (debug t))
|
||||
Like `with-temp-buffer', but propagates `org-roam-directory'.
|
||||
If FILE, set `org-roam-temp-file-name' to file and insert its contents."
|
||||
(declare (indent 1) (debug t))
|
||||
(let ((current-org-roam-directory (make-symbol "current-org-roam-directory")))
|
||||
`(let ((,current-org-roam-directory org-roam-directory))
|
||||
(with-temp-buffer
|
||||
(let ((org-roam-directory ,current-org-roam-directory))
|
||||
(when ,file
|
||||
(insert-file-contents ,file)
|
||||
(setq-local org-roam-file-name ,file))
|
||||
,@body)))))
|
||||
|
||||
(defmacro org-roam--with-template-error (templates &rest body)
|
||||
"Eval BODY, and point to TEMPLATES on error.
|
||||
Provides more informative error messages so that users know where
|
||||
to look.
|
||||
|
||||
\(fn TEMPLATES BODY...)"
|
||||
(declare (debug (form body)) (indent 1))
|
||||
`(condition-case err
|
||||
,@body
|
||||
(error (user-error "%s. Please adjust `%s'"
|
||||
(error-message-string err)
|
||||
,templates))))
|
||||
|
||||
(defun org-roam-message (format-string &rest args)
|
||||
"Pass FORMAT-STRING and ARGS to `message' when `org-roam-verbose' is t."
|
||||
(when org-roam-verbose
|
||||
(apply #'message `(,(concat "(org-roam) " format-string) ,@args))))
|
||||
|
||||
(provide 'org-roam-macs)
|
||||
|
||||
;;; org-roam-macs.el ends here
|
||||
|
@ -1,10 +1,10 @@
|
||||
;;; org-roam-protocol.el --- Protocol handler for roam:// links -*- coding: utf-8; lexical-binding: t -*-
|
||||
;;; org-roam-protocol.el --- Protocol handler for roam:// links -*- coding: utf-8; lexical-binding: t; -*-
|
||||
|
||||
;; Copyright © 2020 Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; Author: Jethro Kuan <jethrokuan95@gmail.com>
|
||||
;; URL: https://github.com/jethrokuan/org-roam
|
||||
;; URL: https://github.com/org-roam/org-roam
|
||||
;; Keywords: org-mode, roam, convenience
|
||||
;; Version: 1.1.0
|
||||
;; Version: 1.2.0
|
||||
;; Package-Requires: ((emacs "26.1") (org "9.3"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
@ -62,8 +62,9 @@ It opens or creates a note with the given ref.
|
||||
(org-roam-capture--info decoded-alist)
|
||||
(template (cdr (assoc 'template decoded-alist))))
|
||||
(raise-frame)
|
||||
(org-roam--capture nil template)
|
||||
(message "Item captured.")))
|
||||
(org-roam--with-template-error 'org-roam-capture-ref-templates
|
||||
(org-roam-capture--capture nil template))
|
||||
(org-roam-message "Item captured.")))
|
||||
nil)
|
||||
|
||||
(defun org-roam-protocol-open-file (info)
|
||||
|
1479
org-roam.el
1479
org-roam.el
File diff suppressed because it is too large
Load Diff
@ -1,2 +1,2 @@
|
||||
#+ROAM_ALIAS: "a1" "a 2"
|
||||
#+TITLE: t1
|
||||
#+roam_alias: "a1" "a 2"
|
||||
#+title: t1
|
||||
|
@ -1,3 +1,3 @@
|
||||
#+TITLE: Bar
|
||||
#+title: Bar
|
||||
|
||||
This is file bar. Bar links to [[file:nested/bar.org][Nested Bar]].
|
||||
|
1
tests/roam-files/base.org
Normal file
1
tests/roam-files/base.org
Normal file
@ -0,0 +1 @@
|
||||
#+title: Base
|
@ -1,4 +1,4 @@
|
||||
#+TITLE: Foo
|
||||
#+title: Foo
|
||||
|
||||
This is the foo file. It contains a link to [[file:bar.org][Bar]].
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
#+TITLE: Nested Bar
|
||||
#+title: Nested Bar
|
||||
|
||||
This file is nested, 1 level deeper. It links to both [[file:../foo.org][Foo]] and [[file:foo.org][Nested Foo]].
|
||||
|
1
tests/roam-files/nested/deeply/deeply_nested_file.org
Normal file
1
tests/roam-files/nested/deeply/deeply_nested_file.org
Normal file
@ -0,0 +1 @@
|
||||
#+title: Deeply Nested File
|
@ -1,3 +1,3 @@
|
||||
#+TITLE: Nested Foo
|
||||
#+title: Nested Foo
|
||||
|
||||
This file has no links.
|
||||
|
@ -1,3 +1,5 @@
|
||||
no title in this file :O
|
||||
|
||||
links to itself, with no title: [[file:no-title.org][no-title]]
|
||||
|
||||
* Headline title
|
||||
|
3
tests/roam-files/tags/no_tag.org
Normal file
3
tests/roam-files/tags/no_tag.org
Normal file
@ -0,0 +1,3 @@
|
||||
#+title: Tagless File
|
||||
|
||||
This file has no tags, and should not yield any tags on extracting via ~#+roam_tags~.
|
4
tests/roam-files/tags/tag.org
Normal file
4
tests/roam-files/tags/tag.org
Normal file
@ -0,0 +1,4 @@
|
||||
#+roam_tags: "t1" "t2 with space" t3
|
||||
#+title: Tags
|
||||
|
||||
This file is used to test functionality for =(org-roam--extract-tags)=
|
1
tests/roam-files/titles/aliases.org
Normal file
1
tests/roam-files/titles/aliases.org
Normal file
@ -0,0 +1 @@
|
||||
#+roam_alias: "roam" "alias"
|
4
tests/roam-files/titles/combination.org
Normal file
4
tests/roam-files/titles/combination.org
Normal file
@ -0,0 +1,4 @@
|
||||
#+title: TITLE PROP
|
||||
#+roam_alias: "roam" "alias"
|
||||
|
||||
* Headline
|
1
tests/roam-files/titles/headline.org
Normal file
1
tests/roam-files/titles/headline.org
Normal file
@ -0,0 +1 @@
|
||||
* Headline
|
1
tests/roam-files/titles/title.org
Normal file
1
tests/roam-files/titles/title.org
Normal file
@ -0,0 +1 @@
|
||||
#+title: Title
|
@ -1,3 +1,3 @@
|
||||
#+TITLE: Unlinked
|
||||
#+title: Unlinked
|
||||
|
||||
Nothing links here :(
|
||||
|
@ -1 +1 @@
|
||||
#+ROAM_KEY: https://google.com/
|
||||
#+roam_key: https://google.com/
|
||||
|
@ -1,4 +1,4 @@
|
||||
;;; test-org-roam.el --- Tests for org-roam -*- lexical-binding: t; -*-
|
||||
;;; test-org-roam.el --- Tests for Org-roam -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2020 Jethro Kuan
|
||||
|
||||
@ -19,291 +19,274 @@
|
||||
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
;;;; Requirements
|
||||
|
||||
(require 'buttercup)
|
||||
(require 'with-simulated-input)
|
||||
(require 'org-roam)
|
||||
(require 'dash)
|
||||
|
||||
(defun org-roam-test-abs-path (file-path)
|
||||
(defun test-org-roam--abs-path (file-path)
|
||||
"Get absolute FILE-PATH from `org-roam-directory'."
|
||||
(file-truename (expand-file-name file-path org-roam-directory)))
|
||||
|
||||
(defun org-roam-test-find-new-file (path)
|
||||
(defun test-org-roam--find-file (path)
|
||||
"PATH."
|
||||
(let ((path (org-roam-test-abs-path path)))
|
||||
(let ((path (test-org-roam--abs-path path)))
|
||||
(make-directory (file-name-directory path) t)
|
||||
(find-file path)))
|
||||
|
||||
(defvar org-roam-test-directory (file-truename (concat default-directory "tests/roam-files"))
|
||||
(defvar test-org-roam-directory (file-truename (concat default-directory "tests/roam-files"))
|
||||
"Directory containing org-roam test org files.")
|
||||
|
||||
(defun org-roam-test-init ()
|
||||
(defun test-org-roam--init ()
|
||||
"."
|
||||
(org-roam-db--close)
|
||||
(let ((original-dir org-roam-test-directory)
|
||||
(let ((original-dir test-org-roam-directory)
|
||||
(new-dir (expand-file-name (make-temp-name "org-roam") temporary-file-directory)))
|
||||
(copy-directory original-dir new-dir)
|
||||
(setq org-roam-directory new-dir)
|
||||
(org-roam-mode +1)))
|
||||
(org-roam-mode +1)
|
||||
(sleep-for 2)))
|
||||
|
||||
(defun test-org-roam--teardown ()
|
||||
(org-roam-mode -1)
|
||||
(delete-file (org-roam-db--get))
|
||||
(org-roam-db--close))
|
||||
|
||||
(describe "org-roam--str-to-list"
|
||||
(it "nil"
|
||||
(expect (org-roam--str-to-list nil)
|
||||
:to-be
|
||||
nil))
|
||||
(it "\"multi word\" prop 123"
|
||||
(expect (org-roam--str-to-list "\"multi word\" prop 123")
|
||||
:to-equal
|
||||
'("multi word" "prop" "123")))
|
||||
(it "prop \"multi word\" 123"
|
||||
(expect (org-roam--str-to-list "\"multi word\" prop 123")
|
||||
:to-equal
|
||||
'("multi word" "prop" "123")))
|
||||
(it "errors on bad input"
|
||||
(expect (org-roam--str-to-list 1)
|
||||
:to-throw)
|
||||
(expect (org-roam--str-to-list "\"hello")
|
||||
:to-throw)))
|
||||
|
||||
(describe "Title extraction"
|
||||
:var (org-roam-title-sources)
|
||||
(before-all
|
||||
(test-org-roam--init))
|
||||
|
||||
(after-all
|
||||
(test-org-roam--teardown))
|
||||
|
||||
(cl-flet
|
||||
((test (fn file)
|
||||
(let ((buf (find-file-noselect
|
||||
(test-org-roam--abs-path file))))
|
||||
(with-current-buffer buf
|
||||
(funcall fn)))))
|
||||
(it "extracts title from title property"
|
||||
(expect (test #'org-roam--extract-titles-title
|
||||
"titles/title.org")
|
||||
:to-equal
|
||||
'("Title"))
|
||||
(expect (test #'org-roam--extract-titles-title
|
||||
"titles/aliases.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-title
|
||||
"titles/headline.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-title
|
||||
"titles/combination.org")
|
||||
:to-equal
|
||||
'("TITLE PROP")))
|
||||
|
||||
(it "extracts alias"
|
||||
(expect (test #'org-roam--extract-titles-alias
|
||||
"titles/title.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-alias
|
||||
"titles/aliases.org")
|
||||
:to-equal
|
||||
'("roam" "alias"))
|
||||
(expect (test #'org-roam--extract-titles-alias
|
||||
"titles/headline.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-alias
|
||||
"titles/combination.org")
|
||||
:to-equal
|
||||
'("roam" "alias")))
|
||||
|
||||
(it "extracts headlines"
|
||||
(expect (test #'org-roam--extract-titles-alias
|
||||
"titles/title.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-headline
|
||||
"titles/aliases.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-titles-headline
|
||||
"titles/headline.org")
|
||||
:to-equal
|
||||
'("Headline"))
|
||||
(expect (test #'org-roam--extract-titles-headline
|
||||
"titles/combination.org")
|
||||
:to-equal
|
||||
'("Headline")))
|
||||
|
||||
(describe "uses org-roam-title-sources correctly"
|
||||
(it "'((title headline) alias)"
|
||||
(expect (let ((org-roam-title-sources '((title headline) alias)))
|
||||
(test #'org-roam--extract-titles
|
||||
"titles/combination.org"))
|
||||
:to-equal
|
||||
'("TITLE PROP" "roam" "alias")))
|
||||
(it "'((headline title) alias)"
|
||||
(expect (let ((org-roam-title-sources '((headline title) alias)))
|
||||
(test #'org-roam--extract-titles
|
||||
"titles/combination.org"))
|
||||
:to-equal
|
||||
'("Headline" "roam" "alias")))
|
||||
(it "'(headline alias title)"
|
||||
(expect (let ((org-roam-title-sources '(headline alias title)))
|
||||
(test #'org-roam--extract-titles
|
||||
"titles/combination.org"))
|
||||
:to-equal
|
||||
'("Headline" "roam" "alias" "TITLE PROP"))))))
|
||||
|
||||
(describe "Tag extraction"
|
||||
:var (org-roam-tag-sources)
|
||||
(before-all
|
||||
(test-org-roam--init))
|
||||
|
||||
(after-all
|
||||
(test-org-roam--teardown))
|
||||
|
||||
(cl-flet
|
||||
((test (fn file)
|
||||
(let* ((fname (test-org-roam--abs-path file))
|
||||
(buf (find-file-noselect fname)))
|
||||
(with-current-buffer buf
|
||||
(funcall fn fname)))))
|
||||
(it "extracts from prop"
|
||||
(expect (test #'org-roam--extract-tags-prop
|
||||
"tags/tag.org")
|
||||
:to-equal
|
||||
'("t1" "t2 with space" "t3"))
|
||||
(expect (test #'org-roam--extract-tags-prop
|
||||
"tags/no_tag.org")
|
||||
:to-equal
|
||||
nil))
|
||||
|
||||
(it "extracts from all directories"
|
||||
(expect (test #'org-roam--extract-tags-all-directories
|
||||
"base.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-tags-all-directories
|
||||
"tags/tag.org")
|
||||
:to-equal
|
||||
'("tags"))
|
||||
(expect (test #'org-roam--extract-tags-all-directories
|
||||
"nested/deeply/deeply_nested_file.org")
|
||||
:to-equal
|
||||
'("nested" "deeply")))
|
||||
|
||||
(it "extracts from last directory"
|
||||
(expect (test #'org-roam--extract-tags-last-directory
|
||||
"base.org")
|
||||
:to-equal
|
||||
nil)
|
||||
(expect (test #'org-roam--extract-tags-last-directory
|
||||
"tags/tag.org")
|
||||
:to-equal
|
||||
'("tags"))
|
||||
(expect (test #'org-roam--extract-tags-last-directory
|
||||
"nested/deeply/deeply_nested_file.org")
|
||||
:to-equal
|
||||
'("deeply")))
|
||||
|
||||
(describe "uses org-roam-tag-sources correctly"
|
||||
(it "'(prop)"
|
||||
(expect (let ((org-roam-tag-sources '(prop)))
|
||||
(test #'org-roam--extract-tags
|
||||
"tags/tag.org"))
|
||||
:to-equal
|
||||
'("t1" "t2 with space" "t3")))
|
||||
(it "'(prop all-directories)"
|
||||
(expect (let ((org-roam-tag-sources '(prop all-directories)))
|
||||
(test #'org-roam--extract-tags
|
||||
"tags/tag.org"))
|
||||
:to-equal
|
||||
'("t1" "t2 with space" "t3" "tags"))))))
|
||||
|
||||
;;; Tests
|
||||
(describe "org-roam-db-build-cache"
|
||||
(it "initializes correctly"
|
||||
(org-roam-test-init)
|
||||
(org-roam-db-build-cache)
|
||||
(xdescribe "org-roam-db-build-cache"
|
||||
(before-each
|
||||
(test-org-roam--init))
|
||||
|
||||
(after-each
|
||||
(test-org-roam--teardown))
|
||||
|
||||
(it "initializes correctly"
|
||||
;; Cache
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from files])) :to-be 8)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links])) :to-be 5)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from titles])) :to-be 8)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from titles
|
||||
:where titles :is-null])) :to-be 2)
|
||||
:where titles :is-null])) :to-be 1)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from refs])) :to-be 1)
|
||||
|
||||
;; TODO Test files
|
||||
|
||||
;; Links
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 1)
|
||||
(test-org-roam--abs-path "foo.org"))) :to-be 1)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "nested/bar.org"))) :to-be 2)
|
||||
(test-org-roam--abs-path "nested/bar.org"))) :to-be 2)
|
||||
|
||||
;; Links -- File-to
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links
|
||||
:where (= to $s1)]
|
||||
(org-roam-test-abs-path "nested/foo.org"))) :to-be 1)
|
||||
(test-org-roam--abs-path "nested/foo.org"))) :to-be 1)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links
|
||||
:where (= to $s1)]
|
||||
(org-roam-test-abs-path "nested/bar.org"))) :to-be 1)
|
||||
(test-org-roam--abs-path "nested/bar.org"))) :to-be 1)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count) :from links
|
||||
:where (= to $s1)]
|
||||
(org-roam-test-abs-path "unlinked.org"))) :to-be 0)
|
||||
(test-org-roam--abs-path "unlinked.org"))) :to-be 0)
|
||||
;; TODO Test titles
|
||||
(expect (org-roam-db-query [:select * :from titles])
|
||||
:to-have-same-items-as
|
||||
(list (list (org-roam-test-abs-path "alias.org")
|
||||
(list (list (test-org-roam--abs-path "alias.org")
|
||||
(list "t1" "a1" "a 2"))
|
||||
(list (org-roam-test-abs-path "bar.org")
|
||||
(list (test-org-roam--abs-path "bar.org")
|
||||
(list "Bar"))
|
||||
(list (org-roam-test-abs-path "foo.org")
|
||||
(list (test-org-roam--abs-path "foo.org")
|
||||
(list "Foo"))
|
||||
(list (org-roam-test-abs-path "nested/bar.org")
|
||||
(list (test-org-roam--abs-path "nested/bar.org")
|
||||
(list "Nested Bar"))
|
||||
(list (org-roam-test-abs-path "nested/foo.org")
|
||||
(list (test-org-roam--abs-path "nested/foo.org")
|
||||
(list "Nested Foo"))
|
||||
(list (org-roam-test-abs-path "no-title.org") nil)
|
||||
(list (org-roam-test-abs-path "web_ref.org") nil)
|
||||
(list (org-roam-test-abs-path "unlinked.org")
|
||||
(list (test-org-roam--abs-path "no-title.org")
|
||||
(list "Headline title"))
|
||||
(list (test-org-roam--abs-path "web_ref.org") nil)
|
||||
(list (test-org-roam--abs-path "unlinked.org")
|
||||
(list "Unlinked"))))
|
||||
|
||||
(expect (org-roam-db-query [:select * :from refs])
|
||||
:to-have-same-items-as
|
||||
(list (list "https://google.com/" (org-roam-test-abs-path "web_ref.org"))))
|
||||
(list (list "https://google.com/" (test-org-roam--abs-path "web_ref.org") "website")))
|
||||
|
||||
;; Expect rebuilds to be really quick (nothing changed)
|
||||
(expect (org-roam-db-build-cache)
|
||||
:to-equal
|
||||
(list :files 0 :links 0 :titles 0 :refs 0 :deleted 0))))
|
||||
|
||||
(describe "org-roam-insert"
|
||||
(before-each
|
||||
(org-roam-test-init)
|
||||
(org-roam-db--clear)
|
||||
(org-roam-db-build-cache))
|
||||
|
||||
(it "temp1 -> foo"
|
||||
(let ((buf (org-roam-test-find-new-file "temp1.org")))
|
||||
(with-current-buffer buf
|
||||
(with-simulated-input
|
||||
"Foo RET"
|
||||
(org-roam-insert nil))))
|
||||
(expect (buffer-string) :to-match (regexp-quote "file:foo.org")))
|
||||
|
||||
(it "temp2 -> nested/foo"
|
||||
(let ((buf (org-roam-test-find-new-file "temp2.org")))
|
||||
(with-current-buffer buf
|
||||
(with-simulated-input
|
||||
"Nested SPC Foo RET"
|
||||
(org-roam-insert nil))))
|
||||
(expect (buffer-string) :to-match (regexp-quote "file:nested/foo.org")))
|
||||
|
||||
(it "nested/temp3 -> foo"
|
||||
(let ((buf (org-roam-test-find-new-file "nested/temp3.org")))
|
||||
(with-current-buffer buf
|
||||
(with-simulated-input
|
||||
"Foo RET"
|
||||
(org-roam-insert nil))))
|
||||
(expect (buffer-string) :to-match (regexp-quote "file:../foo.org")))
|
||||
|
||||
(it "a/b/temp4 -> nested/foo"
|
||||
(let ((buf (org-roam-test-find-new-file "a/b/temp4.org")))
|
||||
(with-current-buffer buf
|
||||
(with-simulated-input
|
||||
"Nested SPC Foo RET"
|
||||
(org-roam-insert nil))))
|
||||
(expect (buffer-string) :to-match (regexp-quote "file:../../nested/foo.org"))))
|
||||
|
||||
(describe "rename file updates cache"
|
||||
(before-each
|
||||
(org-roam-test-init)
|
||||
(org-roam-db--clear)
|
||||
(org-roam-db-build-cache))
|
||||
|
||||
(it "foo -> new_foo"
|
||||
(rename-file (org-roam-test-abs-path "foo.org")
|
||||
(org-roam-test-abs-path "new_foo.org"))
|
||||
;; Cache should be cleared of old file
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from titles
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from refs
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
|
||||
;; Cache should be updated
|
||||
(expect (org-roam-db-query [:select [to]
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "new_foo.org"))
|
||||
:to-have-same-items-as
|
||||
(list (list (org-roam-test-abs-path "bar.org"))))
|
||||
(expect (org-roam-db-query [:select [from]
|
||||
:from links
|
||||
:where (= to $s1)]
|
||||
(org-roam-test-abs-path "new_foo.org"))
|
||||
:to-have-same-items-as
|
||||
(list (list (org-roam-test-abs-path "nested/bar.org"))))
|
||||
|
||||
;; Links are updated
|
||||
(expect (with-temp-buffer
|
||||
(insert-file-contents (org-roam-test-abs-path "nested/bar.org"))
|
||||
(buffer-string))
|
||||
:to-match
|
||||
(regexp-quote "[[file:../new_foo.org][Foo]]")))
|
||||
|
||||
(it "foo -> foo with spaces"
|
||||
(rename-file (org-roam-test-abs-path "foo.org")
|
||||
(org-roam-test-abs-path "foo with spaces.org"))
|
||||
;; Cache should be cleared of old file
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from titles
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from refs
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
|
||||
;; Cache should be updated
|
||||
(expect (org-roam-db-query [:select [to]
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "foo with spaces.org"))
|
||||
:to-have-same-items-as
|
||||
(list (list (org-roam-test-abs-path "bar.org"))))
|
||||
(expect (org-roam-db-query [:select [from]
|
||||
:from links
|
||||
:where (= to $s1)]
|
||||
(org-roam-test-abs-path "foo with spaces.org"))
|
||||
:to-have-same-items-as
|
||||
(list (list (org-roam-test-abs-path "nested/bar.org"))))
|
||||
|
||||
;; Links are updated
|
||||
(expect (with-temp-buffer
|
||||
(insert-file-contents (org-roam-test-abs-path "nested/bar.org"))
|
||||
(buffer-string))
|
||||
:to-match
|
||||
(regexp-quote "[[file:../foo with spaces.org][Foo]]")))
|
||||
|
||||
(it "no-title -> meaningful-title"
|
||||
(rename-file (org-roam-test-abs-path "no-title.org")
|
||||
(org-roam-test-abs-path "meaningful-title.org"))
|
||||
;; File has no forward links
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "no-title.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "meaningful-title.org"))) :to-be 1)
|
||||
|
||||
;; Links are updated with the appropriate name
|
||||
(expect (with-temp-buffer
|
||||
(insert-file-contents (org-roam-test-abs-path "meaningful-title.org"))
|
||||
(buffer-string))
|
||||
:to-match
|
||||
(regexp-quote "[[file:meaningful-title.org][meaningful-title]]")))
|
||||
|
||||
(it "web_ref -> hello"
|
||||
(expect (org-roam-db-query
|
||||
[:select [file] :from refs
|
||||
:where (= ref $s1)]
|
||||
"https://google.com/")
|
||||
:to-equal
|
||||
(list (list (org-roam-test-abs-path "web_ref.org"))))
|
||||
(rename-file (org-roam-test-abs-path "web_ref.org")
|
||||
(org-roam-test-abs-path "hello.org"))
|
||||
(expect (org-roam-db-query
|
||||
[:select [file] :from refs
|
||||
:where (= ref $s1)]
|
||||
"https://google.com/")
|
||||
:to-equal (list (list (org-roam-test-abs-path "hello.org"))))
|
||||
(expect (caar (org-roam-db-query
|
||||
[:select [ref] :from refs
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "web_ref.org")))
|
||||
:to-equal nil)))
|
||||
|
||||
(describe "delete file updates cache"
|
||||
(before-each
|
||||
(org-roam-test-init)
|
||||
(org-roam-db--clear)
|
||||
(org-roam-db-build-cache)
|
||||
(sleep-for 1))
|
||||
|
||||
(it "delete foo"
|
||||
(delete-file (org-roam-test-abs-path "foo.org"))
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from titles
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from refs
|
||||
:where (= file $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0)
|
||||
(expect (caar (org-roam-db-query [:select (funcall count)
|
||||
:from links
|
||||
:where (= from $s1)]
|
||||
(org-roam-test-abs-path "foo.org"))) :to-be 0))
|
||||
|
||||
(it "delete web_ref"
|
||||
(expect (org-roam-db-query [:select * :from refs])
|
||||
:to-have-same-items-as
|
||||
(list (list "https://google.com/" (org-roam-test-abs-path "web_ref.org"))))
|
||||
(delete-file (org-roam-test-abs-path "web_ref.org"))
|
||||
(expect (org-roam-db-query [:select * :from refs])
|
||||
:to-have-same-items-as
|
||||
(list))))
|
||||
(list :files 0 :links 0 :tags 0 :titles 0 :refs 0 :deleted 0))))
|
||||
|
||||
(provide 'test-org-roam)
|
||||
|
||||
|
Reference in New Issue
Block a user