Simple neovim zettelkasten functionality as a lua plugin.
Marty Oehme
9dcd2556ba
Renamed to 'files.lua' since it is the only module actively working on the underlying filesystem so far -- gathering existing files and zettel in the directories. |
||
---|---|---|
autoload | ||
lua/zettelkasten | ||
plugin | ||
.gitignore | ||
.tmux.session | ||
README.md |
Zettelkasten.nvim
To develop / debug:
start neovim with nvim --cmd "set rtp+=$(pwd)" .
to automatically load the files in project dir as if they were on path
next up: [ ] fix link following:
- empty space (e.g. in link text, or link itself) disrupts link regex search
- line-end following breaks if cursor is in the MIDDLE of the link
- extract anchor from link/string (anchor.lua)
- probably stop hardcoding anchor regex, make an option
- implement custom anchor creation function to go with custom regex
- opening zettel should use generated link table for full filename anchor search
- need a default zettel directory to look in
- link following order should be:
- look up & follow anchor
- look for filename in current dir (or relative/absolute link loc)
- implement fallback to filename in any of zettel subdirs
TODO: needed functionality
- note creation (new anchor)
- create anchor
- unique anchor creation
- create link (md / wiki)
- create anchor
- note listing (anchors / titles, no anchor)
- list anchors
- list filenames
- link following (to existing anchor)
- fallback to filename if anchor invalid / not found
- link creation (to existing note)
- list existing
- create link (md / wiki)
- link switching (point to another existing note)
- note search (title / full-text)
- jump to zettel (open existing anchor)
- select by anchor
- select by (fuzzy) title match
- options
- zettel anchor separator
- zettel extension
- link style (wiki/markdown)
- custom link style?
- link detection/following (under word, next on line)
- recursive dir lookup for zettel
- zettel anchor regex
TODO: nice-to-haves
- refactor parsers (md/wiki) to be tables of functions/regex in options, so e.g. valid link detection can call
options.parser.isValidLink(link)
or transformationoptions.parser.styleLink(anchor, text)
- use unified parser model (e.g. containing
turn-to-link()
,parse-link()
) function - enable custom parser supply
- use unified parser model (e.g. containing
- completion engine (e.g. for
completion-nvim
, look in completion_buffers/completion-tags for reference) - zettel caching for big directories
- backlinks (via rg for filename anchor?)
- keep tree of notes cached?
- zettel maintenance
- fix malformed anchors
- fix-link function which looks for most similar file to be found and renames file/link automatically (after confirmation)
- add missing anchors
- 'rename' anchor (goes against stability?)
- recognize duplicate anchors (in directory, when listing, etc)
- provide option to rename and automatically change backlinks
- fix malformed anchors
- zettel 'lens' (preview first headline + content of linked zettel through floating window etc, on keypress)
- support both md-style and wiki-style links at the same time
- file/directory exception list for gathering files, which will be ignored
- 'strict' mode only matching and following valid anchor links
TODO: maintenance
-
remove hard-coding of option vimnames in tests, now that we can dynamically change this through a single table
-
anchor creation
- must be unique
- default: 10 digits, usually current date+time (YYMMDDHHmm)
- but, if multiple links created within one minute (or other circumstances), this would duplicate
- thus, duplicate-check before creating a new anchor
- if duplicated, generate first non-duplicated link (recursive?)
- try to move backwards through minutes not forward
- i.e. if 2030101200 exists move to 2030101159, 2030101158, ...
- if moving backwards, we do not take away id space from future note creation
- if moving forwards, every zettel created within a minute would delay next zettel creation another minute
Options
atm:
anchor_separator = vim.g["zettel_anchor_separator"] or vim.b["zettel_anchor_separator"] or "_",
zettel_extension = vim.g["zettel_extension"] or vim.b["zettel_extension"] or ".md",
zettel_root = vim.g["zettel_root"] or vim.b["zettel_root"] or "~/documents/notes",