File: SETTLE_MANUAL.md

package info (click to toggle)
settle 0.40.1-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,024 kB
  • sloc: makefile: 42; sh: 1
file content (370 lines) | stat: -rw-r--r-- 12,998 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
# settle

Settle is a Zettelkasten note manager. All notes are written in Markdown and are
stored locally.

Note that `settle` does not edit the files it handles directly. Therefore,
you're probably going to want to use (or write) a plugin for your favourite
editor, such as [settle.vim](https://github.com/xylous/settle.vim) for Vim and
Neovim.

#### Table of contents

<details><summary>Click to expand</summary>

- [Synopsis](#synopsis)
- [Options](#options)
- [Commands](#commands)
    - [the `query` command](#the-query-command)
        - [examples](#examples-of-the-query-command)
    - [the `sync` command](#the-sync-command)
        - [examples](#examples-of-the-sync-command)
- [Configuration](#configuration)
- [Templates](#templates)
    - [Template placeholders](#template-placeholders)
- [Setting up shell autocompletion](#shell-autocompletion)
    - [bash](#bash)
    - [zsh](#zsh)
    - [fish](#fish)
- [License and credits](#license-and-credits)

</details>

## Synopsis

```
settle [--help | -h | --version | -v]
settle {sync | -S} [-p | -c | -u | -g | -m | -n]
settle {query | -Q} [-t | -p | -g | -x | -l | -b | -o | -f | -s | --graph]
settle ls ['tags' | 'projects' | 'ghosts' | 'path']
```

## Options

- `-h`, `--help` - Print usage information

- `-V`, `--version` - Print version information

## Commands

- `help` - print usage information broadly or, if a subcommand is given, usage
    information for said subcommand

- `compl <SHELL>` - generate autocompletion file for a certain shell (currently
    supported: zsh, bash, fish) (see: [section on shell
    autocompletion](#shell-autocompletion))

- `ls <OBJECT>` - list things that don't directly involve notes. Possible
    arguments:
    - `path` -  print the path to the Zettelkasten
    - `tags` -  print all existing tags
    - `projects` - print all existing projects
    - `ghosts` - print notes that have links pointed to them, but don't exist

- `query` or `-Q` (described below)

- `sync` or `-S` (described below)

All warnings and errors are printed to `stderr`, so you can suppress them (e.g.
`2>/dev/null`).

##### A short briefing on regular expressions (REGEX)

Regex is a useful tool that `settle` has support for, because it provides
wildcards and patterns which allow matching multiple strings. See [this regular
expression specification](http://www.math.clemson.edu/~warner/M865/RegexBasics.html) for
all supported patterns. But here are a few of the most useful characters you're
going to use:

- `.` - match any single character
- `*` - match the previous character zero or more times
- `+` - match the previous character one or more times

If you wanted to match a literal `.`, `*` or `+`, you'd have to escape them with
a backslash: `\.`, `\*` and `\+` respectively.

Here are some examples:

- `.*` matches *anything*, even empty strings
- `f+` matches the character `f` one or more times
- `.*foo.*` matches any string containing the word `foo`

### The query command

The `query` command is used for getting information related to the notes in the
Zettelkasten - most of the time, by returning those that match a given set of
criteria.

Note that the various options listed here all compound - that is to say, every
option acts as a criteria for querying. `settle query --title "Foo.*" --tag
"bar"` will only return notes whose titles starts with `Foo` AND have the tag
`bar`, not notes whose titles start with `Foo` OR have the tag `bar`. By
default, when no filter parameter is applied (that is to say, `settle query` is
ran without options), all notes are returned.

Here are the query flags:

- `-t | --title <REGEX>` - keep Zettel whose title matches `<REGEX>`

- `-p | --project <REGEX>` - keep Zettel that are in projects that match `<REGEX>`

- `-g | --tag <REGEX>` - keep Zettel that have at least one tag that matches `<REGEX>`

- `-x | --text <REGEX>` - keep Zettel whose text contents match `<REGEX>`. Note
    that this unlocks the `%a` format option (see below)

- `-l | --links <REGEX>` - keep Zettel to which the notes whose titles match
    `<REGEX>` have links pointing to

- `-b | --backlinks <REGEX>` - keep Zettel which have a link pointing to the
    notes whose title match `<REGEX>`

- `-o | --loners` - keep Zettel that have no links pointing to other notes AND
    have no links pointing to them.

- `-e | --exact` - disable ALL regular expressions and make every match literal

- `-f | --format <FORMAT>` - print according to `<FORMAT>`, which has the
    following flags:
    - `%t` - the title of the note
    - `%p` - the project [name] of the note
    - `%P` - the absolute path to the Zettel
    - `%l` - the (forward) links of the Zettel
    - `%b` - the backlinks of the Zettel; note that since `settle` only stores
        forward links in the database, fetching backlinks is a little bit more
        time consuming
    - `%a` - the first match that `settle` found while filtering the Zettel with
        the `--text` option. This may not be that useful for exact matches, but
        it's extremely useful when using regex. Note that, when your query is
        enclosed with two `.*` on both ends, such as `".*example.*"`, the entire
        matched line is printed; the practical application is giving your
        queries a (somewhat limited) context.

- `-s | --link_sep <SEPARATOR>` - specify the separator used between both forward
    links and backlinks, when several have to be printed consequently. Default
    value is ` | `

- `--graph` - transform the output into [DOT
    format](https://en.wikipedia.org/wiki/DOT_(graph_description_language),
    where the nodes are the individual Zettel titles and the edges are links.
    You can then run the file through e.g. Graphviz or `xdot` (or anything that
    can read DOT for that matter) to render the graph into an image, or, rather,
    explore the graph interactively.

    NOTE: all direct (immediate) links that the notes in the query results have
    *will appear* on the graph.

##### Examples of the query command

- `settle query --text "sample" --loners` returns all notes that contain `sample`
    in their text and that aren't linked with any other note in the
    Zettelkasten.

- `settle query --project "" --title ".*word.*"` returns all notes that are in
    the main Zettelkasten (the empty-string project) and have the word `word`
    within their title.

- `settle query --project main --title ".*word.*"` is exactly the same as above,
    but uses the project-alias `main`.

- `settle query --formatting "[%p] %t" --link_sep " | "` is the same as the
    default format. Note that, since no links are printed, the separator is
    actually never used for this format.

- `settle query --tag "literature" --links "Neurons"` returns all notes that
    have the `literature` tag and link to a note called *precisely* `Neurons`
    (note the absence of regex wildcards)

- `settle query --format "[%P]\t%l" --link_sep "\t" --title "Note.*"` takes
    every Zettel whose title starts with `Note` and prints their absolute path
    between square brackets, but also their forward links, which are separated
    with tabs.

- `settle query --graph 1>graph.gv` prints DOT output of the entire Zettelkasten
    to a file called `graph.gv`

- `settle query --graph --tag "neurology"` prints a DOT graph of all Zettel
    who have the `neurology` tag.

- `settle query --text ".*search.*" --format "%t (%a)"` not only prints every
    Zettel that contains the word `search` in it, but it also prints every line
    containing that word.

### The sync command

The `sync` command is used for changing things related to notes - be it creating
new ones, updating their metadata in the database, moving them from a project to
another project, or renaming them.

Note that, unlike the query command, the options that do take arguments here
don't work with regex (except `--move`). Matches here need to be exact, since
we're dealing with more or less precise database changes. Also, unless
specified otherwise, most/all options are mutually exclusive.

Here are the options for this command:

- `-p | --project <PROJECT>` - specify project (NOTE: by itself, this option
    doesn't do anything)

- `-c | --create <TITLE>` - create a new Zettel with the provided title. If the
    `--project` flag is provided, then make it part of that project; if not,
    then add it to the main Zettelkasten project. This operation may only fail
    if there is already an entry in the database with the same title.

- `-u | --update <PATH>` - update a note's metadata, given its path (relative or
    absolute) on the filesystem. If the file is not part of the Zettelkasten or
    doesn't exist, then an error is returned.

- `-g | --generate` - generate the entire database; that is to say, every
    Zettel's metadata is updated (or added, if they weren't in the database
    already)

- `-m | --move <REGEX>` - move all Zettel whose title matches `<REGEX>` to the
    project specified by the `--project` option

- `-n | --rename <FROM> <TO>` - rename `<FROM>` to `<TO>`, preserving the
    project and making all the links that pointed to the old title point to the
    new one instead. If there is no Zettel with `<FROM>` as title, or if there
    already is a note with `<TO>` as a title, then an error is returned.

##### Examples of the sync command

- `settle sync --generate` (re)generates the database from the notes in the
    Zettelkasten directory

- `settle sync --create "My super interesting note"` creates a note called `My
    super interesting note` inside the main Zettelkasten project

- `settle sync --create "A novel idea" --project "inbox"` creates a note called
    `A novel idea` inside the `inbox` project

- assuming that the Zettelkasten directory is at `$HOME/zettelkasten`, then
    `settle sync --update "$HOME/zettelkasten/My super interesting note"` updates
    the metadata of `My super interesting note` in the database

- `settle sync --move "My super interesting note" --project "inbox"` moves the
    note `My super interesting note` to the `inbox` project

- `settle sync --rename "My super interesting note" "My less interesting note"`
    renames `My super interesting note` to `My less interesting note`

## Configuration

The location of the configuration file may be influenced by environment
variables:

1. if `$SETTLE_CONFIG` is set: `$SETTLE_CONFIG`
2. if `$XDG_CONFIG_HOME` is set: `$XDG_CONFIG_HOME/settle/settle.yaml`
3. default: `$HOME/.config/settle/settle.yaml`

A generic configuration file is automatically created when `settle` is ran with
any command (except `compl`), if it doesn't already exist.

### Configuration properties

- `zettelkasten` - directory where the notes are stored

    If you don't specify an absolute path, e.g. `notes`, it's assumed you want
    your Zettelkasten to be at `~/notes`. You can also use paths containing
    environment variables or paths starting with a tilde (`~`)

- `template` - path to Zettel template

    If empty, or if the path is invalid, then templates won't be used. You can
    use paths containing environment variables, or a leading tilde (`~`).

## Templates

Template files are used when creating new Zettel. The text they contain gets put
inside said new note, replacing variables.

### Template placeholders

- `${TITLE}` - replaced with the title of the note
- `${DATE}` - replaced with the output of `date +%Y-%m-%d`

### Example template

```md
# ${TITLE}



### References

- ${DATE}:
```

## Shell autocompletion

Shell completions can be generated by the user at runtime, by using the `compl`
subcommand. In most cases, you'll need to create a directory for user-defined
completions, then add `settle`'s output to it.

If you want XDG compliance, you probably know what you're doing, so just replace
a few things here and there.

### bash

Add the following text to the `~/.bash_completion` file:

```bash
for comp_file in ~/.bash_completion.d/*; do
    [[ -f "${comp_file}" ]] && . "${comp_file}"
done
```

And then run the following commands:

```bash
mkdir ~/.bash_completion.d
settle compl bash >~/.bash_completion.d/settle
```

### zsh

In your terminal, run:

```zsh
mkdir ~/.zsh_completion.d
settle compl zsh >~/.zsh_completion.d/_settle
```

Then add this line in your zshrc:

```zsh
fpath=(${HOME}/.zsh_completion.d $fpath)
```

### fish

Run the following commands:

```fish
mkdir -p ~/.config/fish/completions
settle compl fish >~/.config/fish/completions/settle.fish
```

### nushell

From inside nushell, you can generate the completion file by running:

```
settle compl nu | save ~/.config/nushell/settle.nu
```

(Note that `settle compl nushell` also works; `nushell` is just an alias for
`nu`)

And then you'll need to add the following line to your `config.nu`, so that the
completions are sourced on every shell startup:

```
source ~/.config/nushell/settle.nu
```

## License & Credits

[Licensed under MIT](../LICENSE)

Written by xylous \<xylous.e@gmail.com\>