mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-23 07:20:04 +08:00
feat(zettelkasten): add zettelkasten layer
This commit is contained in:
parent
efb59af888
commit
342c658509
44
autoload/SpaceVim/layers/zettelkasten.vim
Normal file
44
autoload/SpaceVim/layers/zettelkasten.vim
Normal file
@ -0,0 +1,44 @@
|
||||
"=============================================================================
|
||||
" zettelkasten.vim --- zettelkasten layer for SpaceVim
|
||||
" Copyright (c) 2016-2019 Wang Shidong & Contributors
|
||||
" Author: Wang Shidong < wsdjeg@outlook.com >
|
||||
" URL: https://spacevim.org
|
||||
" License: GPLv3
|
||||
"=============================================================================
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#plugins() abort
|
||||
let plugins = []
|
||||
call add(plugins, [g:_spacevim_root_dir . 'bundle/vim-zettelkasten',
|
||||
\ {
|
||||
\ 'merged' : 0,
|
||||
\ }])
|
||||
return plugins
|
||||
endfunction
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#health() abort
|
||||
call SpaceVim#layers#zettelkasten#plugins()
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#loadable() abort
|
||||
|
||||
return has('nvim')
|
||||
|
||||
endfunction
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#config() abort
|
||||
let g:_spacevim_mappings_space.m.z = {'name' : '+zettelkasten'}
|
||||
call SpaceVim#mapping#space#def('nnoremap', ['m', 'z', 'n'], 'ZkNew', 'create-new-zettel-note', 1)
|
||||
endfunction
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#set_variable(var) abort
|
||||
let g:zettelkasten_directory = get(a:var,
|
||||
\ 'zettel_dir',
|
||||
\ '')
|
||||
endfunction
|
||||
|
||||
function! SpaceVim#layers#zettelkasten#get_options() abort
|
||||
|
||||
return ['zettel_dir']
|
||||
|
||||
endfunction
|
24
bundle/vim-zettelkasten/LICENSE
vendored
Normal file
24
bundle/vim-zettelkasten/LICENSE
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <https://unlicense.org>
|
70
bundle/vim-zettelkasten/README.md
vendored
Normal file
70
bundle/vim-zettelkasten/README.md
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
# vim-zettelkasten
|
||||
|
||||
`vim-zettelkasten` is a [Zettelkasten](https://zettelkasten.de) note taking plugin.
|
||||
|
||||
It is based on [zettelkasten.nvim@fe174666](https://github.com/Furkanzmc/zettelkasten.nvim/tree/fe1746666e27c2fcc0e60dc2786cb9983b994759)
|
||||
|
||||
Using this plugin, you can:
|
||||
|
||||
1. Create new notes with unique IDs (`:help :ZkNew`)
|
||||
|
||||
2. List the places where a tag is used with `:tselect tag_name` or use Vim's own tag shortcuts for
|
||||
navigation.
|
||||
|
||||
3. Use `i_CTRL-X_CTRL-]` to get a list of all the tags in your notes.
|
||||
|
||||
4. Get a completion list of note references.
|
||||
|
||||
5. Use `K` command to display context for a note ID.
|
||||
|
||||
6. Use `gf` to navigate to a reference. As long as your `:help path` option is set correctly, this
|
||||
will work.
|
||||
|
||||
There's no separate file type for zettelkasten. Markdown file type is used to extend the
|
||||
functionality to make it easier to take notes.
|
||||
|
||||
For the most up to date information, please do `:help zettelkasten.txt`. I won't be updating README
|
||||
file for every single feature or update. You can also check out the
|
||||
[wiki](https://github.com/Furkanzmc/zettelkasten.nvim/wiki) for tips and tricks on how to use
|
||||
zettelkasten.nvim.
|
||||
|
||||
# Configuration
|
||||
|
||||
See `:help zettelkasten.txt` for more information.
|
||||
|
||||
# TODO
|
||||
|
||||
Potential ideas to implement in the future:
|
||||
|
||||
- [ ] A graph view (Possible with an external CLI program.)
|
||||
- [X] A sidebar (or preview window) to display the linked notes.
|
||||
- [ ] Telescope support. It's a popular plugin so it'd be useful but I don't use Telescope so
|
||||
contributions for this feature is most welcome!
|
||||
|
||||
# Project Goals
|
||||
|
||||
I started the project out of a bout of excitement for having discovered the Zettelkasten note
|
||||
taking system. I've been looking for better ways to take notes and this system seems to fulfill my
|
||||
needs. Since I love Vim, and Zettelkasten is a text based system (Which is what I love the most
|
||||
about it), I decided to create a plugin immediately.
|
||||
|
||||
My goal is not to turn this into a huge thing with custom pickers, and file types, and a gazillion
|
||||
mapping and commands. My goal is to make use of the existing Vim options/mappings/features to
|
||||
extend markdown file type so it's more convenient to navigate, discover, and write.
|
||||
|
||||
As you can see from its initial state, the only thing you need to really know about this plugin is
|
||||
the `:ZkNew` command. Everything else can be discovered as you are flexing your usual Vim muscles
|
||||
(e. `gf`, `i_CTRL-X_CTRL-]`, `CTRL-]`).
|
||||
|
||||
In true Vim philosophy, I also want to make it easier for people to extend this plugin to their own
|
||||
needs. So, all the Lua API will be nicely designed so you can interface this plugin with others
|
||||
(e.g `Telescope.nvim`) or create your own workflow easily.
|
||||
|
||||
Please also see `:help zettelkasten.nvim-101` and `:help zettelkasten-philosophy`.
|
||||
|
||||
# Related Projects
|
||||
|
||||
- [zk-nvim](https://github.com/mickael-menu/zk-nvim)
|
||||
- [zettel.vim](https://github.com/Aarleks/zettel.vim/)
|
||||
- [telekasten.nvim](https://github.com/renerocksai/telekasten.nvim)
|
||||
- [marty-oehme/zettelkasten.nvim](https://github.com/marty-oehme/zettelkasten.nvim)
|
256
bundle/vim-zettelkasten/doc/zettelkasten.txt
vendored
Normal file
256
bundle/vim-zettelkasten/doc/zettelkasten.txt
vendored
Normal file
@ -0,0 +1,256 @@
|
||||
*zettelkasten.txt* vim-zettelkasten
|
||||
|
||||
Origin Author: Furkan Uzumcu
|
||||
Maintainer: Shidong Wang <wsdjeg@outlook.com>
|
||||
|
||||
INTRODUCTION *vim-zettelkasten* *zettelkasten*
|
||||
================================================================================
|
||||
|
||||
`vim-zettelkasten` is forked from `zettelkasten.nvim`. The goal of this plugin
|
||||
is to make it easier to use the Zettelkasten note taking system:
|
||||
https://zettelkasten.de/introduction/
|
||||
|
||||
It is meant to provide the following features in a way that is consistent with
|
||||
Vim's own features:
|
||||
|
||||
1. Note ID completion
|
||||
2. ID generation
|
||||
3. Jumping to references
|
||||
4. Jumping to tags
|
||||
5. Listing tags
|
||||
|
||||
All relevant options are set automatically if they have not been set before.
|
||||
If they were set, these are the options that you can use to get the best
|
||||
experience. These options may change, make sure the check the filetype file: >
|
||||
|
||||
setlocal tagfunc=v:lua.zettelkasten.tagfunc
|
||||
setlocal isfname+=-,:
|
||||
setlocal iskeyword+=:,-
|
||||
setlocal suffixesadd+=.md
|
||||
setlocal keywordprg=:ZkHover
|
||||
setlocal completefunc=v:lua.zettelkasten.completefunc
|
||||
|
||||
ZETTELKASTEN.NVIM 101 *zettelkasten.nvim-101*
|
||||
================================================================================
|
||||
|
||||
The plugin does not introduce any new syntax for note taking. You can take
|
||||
advantage of the markdown syntax with headers, tags, and links. You can refer
|
||||
to a note by wrapping the note ID (i.e. the file name) with double angle
|
||||
brackets.
|
||||
|
||||
>
|
||||
This note refers to [[2022-02-27-06-05-03]] which was created using
|
||||
:ZkNew.
|
||||
It can also refer to an [[existing_note]]. With this approach, you won't
|
||||
be able to use `:help CTRL-]` to jump to the file buy you can still use
|
||||
`:help gf`
|
||||
|
||||
`zettelkasten.nvim` also assumes a single folder where all the notes reside.
|
||||
If you need to organize things you can use `#tags` to group them or create a
|
||||
note that will be used as a reference for other notes.
|
||||
|
||||
PHILOSOPHY *zettelkasten-philosophy*
|
||||
================================================================================
|
||||
|
||||
`zettelkasten.nvim` embraces Vim by trying its hardest to not create new
|
||||
commands or mappings. Everything this plugin provides should ideally be
|
||||
useable with existing Vim options, mappings, and commands.
|
||||
|
||||
Where possible, Lua API should be exposed so others can extend this plugin's
|
||||
functionality or create their own plugins on top of this one (e.g. telescope
|
||||
pickers.).
|
||||
|
||||
PREVIEWING NOTES *zettelkasten-preview-notes*
|
||||
================================================================================
|
||||
|
||||
To review a note, you can either use |K| mapping to execute |keywordprg| or
|
||||
use any of the preview window tag mappings to open the note in a preview
|
||||
window. Note that when the preview window commands are used (e.g |CTRL-W }|),
|
||||
|preview-window| is used. If you want to customize the preview window, use
|
||||
`preview_command` when setting up the plugin and rely on |K| command.
|
||||
|
||||
include ~
|
||||
|
||||
|include| commands can be used to see the references as well. You can use
|
||||
`[I` to display all the lines that contain the reference under the cursor.
|
||||
|
||||
MAPS *zettelkasten-maps*
|
||||
================================================================================
|
||||
|
||||
Buffer Local ~
|
||||
|
||||
*zettelkasten-[I*
|
||||
[I Lists the notes that reference the note ID under the cursor. Available
|
||||
in markdown buffers and plugin specific buffers.
|
||||
|
||||
COMMANDS *zettelkasten-commands*
|
||||
================================================================================
|
||||
|
||||
Global ~
|
||||
|
||||
ZkNew *:ZkNew*
|
||||
|
||||
Creates a new buffer with a markdown file type. If {notes_path} option was
|
||||
set with |zettelkasten-setup|, it'll change the working directory.
|
||||
|
||||
|
||||
ZkHover {-preview} {-return-lines} {note_id} *:ZkHover*
|
||||
|
||||
Implements |keywordprg|. This command is set to |keywordprg| option if
|
||||
|keywordprg| is not already set.
|
||||
|
||||
If `-preview` is passed to the command, a preview window will be used to
|
||||
show the note contents.
|
||||
|
||||
If `-return-lines` can only be used when `-preview` is used. When this
|
||||
argument is passed, this command will return the note content in a list
|
||||
instead of using `preview_command`.
|
||||
|
||||
Example: >
|
||||
setlocal keywordprg=:ZkHover\ -preview
|
||||
setlocal keywordprg=:ZkHover\ -preview\ -return-lines
|
||||
|
||||
ZkBrowse *:ZkBrowse*
|
||||
|
||||
Just a command that runs `edit zk://browser`.
|
||||
In this buffer, you can use the same short cuts that you use to navigate
|
||||
and open notes as in the markdown files.
|
||||
|
||||
LUA *zettelkasten-lua*
|
||||
================================================================================
|
||||
|
||||
setup({opts}) *zettelkasten-setup*
|
||||
|
||||
Initialize the plugin.
|
||||
|
||||
Parameters: ~
|
||||
{opts} (optional, table)
|
||||
- {notes_path} (optional, string): Defaults to an empty string. If
|
||||
provided, |:ZkNew| uses the notes path to set the working
|
||||
directory. If this is not set. you need to make sure that your
|
||||
working directory is your notes directory. Otherwise some
|
||||
features may not work.
|
||||
- {preview_command} (optional, string): The command to use to
|
||||
preview a note. This will be used with |:ZkHover -preview|
|
||||
command. The command must take one string argument as the name
|
||||
of the note file. This can be used to configure
|
||||
zettelkasten.nvim so the hover previews are (for example) shown
|
||||
in a hover window.
|
||||
- {browseformat} (optional, string): Used to format each line when
|
||||
browsing the notes. Here's the supported values:
|
||||
field meaning ~
|
||||
%f File name of the note.
|
||||
%h Note's header.
|
||||
%b Number of references to this note.
|
||||
%r Number of notes this file references.
|
||||
%t Tags in the note.
|
||||
%d Note ID.
|
||||
Default value is: `%f - %h [%r Refs] [%b B-Refs] %t`
|
||||
|
||||
keyword_expr({cword}, {opts}) *zettelkasten-keyword-expr*
|
||||
|
||||
Returns a table that contains the context for the note with the given ID
|
||||
{cword}.
|
||||
|
||||
Parameters: ~
|
||||
{cword} (string): The word under the cursor. If a note with the given
|
||||
ID cannot be found, returns an empty table.
|
||||
{opts} (optional, table)
|
||||
- {preview_note} (optional, boolean): If set to true,
|
||||
`preview_command` will be used to preview the note.
|
||||
- {return_lines} (optional, boolean): Only used when
|
||||
`preview_note` is set to `true`. When set, instead of using
|
||||
`preview_command`, it returns the note contents from the
|
||||
command.
|
||||
|
||||
Returns: ~
|
||||
{table}
|
||||
|
||||
tagfunc({pattern}, {flags}, {info}) *zettelkasten-tagfunc*
|
||||
|
||||
Implements a |tagfunc|. This function is automatically set to the
|
||||
|tagfunc| option by the plugin.
|
||||
|
||||
Returns: ~
|
||||
{table}
|
||||
|
||||
set_note_id({bufnr}) *zettelkasten-set-note-id*
|
||||
|
||||
Prepends a note ID to the first line of the current buffer. It expects to
|
||||
find a markdown header in the first line.
|
||||
|
||||
Parameters: ~
|
||||
{bufnr} (number): Current buffer, or another note buffer.
|
||||
|
||||
completefunc({base}) *zettelkasten-completefunc*
|
||||
|
||||
Implements a |complete-function|. Given a {base} note ID or title, returns
|
||||
a list of notes matching notes.
|
||||
|
||||
Parameters: ~
|
||||
{base} (string): Note ID or title.
|
||||
|
||||
show_back_references({cword}, {use_loclist}) *zettelkasten-show_back_references*
|
||||
|
||||
Presents the list of notes that reference the note with {cword} ID.
|
||||
If {use_loclist} set to true, location list will be used instead of
|
||||
quickfix list.
|
||||
|
||||
get_back_references({note_id}) *zettelkasten-get_back_references*
|
||||
|
||||
Returns a list containg an item each describing a note that references
|
||||
{note_id}.
|
||||
|
||||
Each item in the return table contains these values:
|
||||
|
||||
- {id} (string): The note ID that references {note_id}
|
||||
- {linenr} (number): The line where the reference is found.
|
||||
- {title} (string): The title of the note with {id}
|
||||
- {file_name} (string): The file name of the note with {id}
|
||||
|
||||
get_toc({note_id}, {format}) *zettelkasten-get_toc*
|
||||
|
||||
Returns a table that contains a list of notes that refer to {note_id}
|
||||
formatted according to {format}.
|
||||
|
||||
You can use this function to insert all the notes that refer to a master
|
||||
note.
|
||||
|
||||
Parameters: ~
|
||||
{note_id} (string): Note ID.
|
||||
{format} (optional, string)
|
||||
The default format is `- [%h](%d)`. Only these format options are
|
||||
supported.
|
||||
|
||||
field meaning ~
|
||||
%f File name of the note.
|
||||
%h Note's header.
|
||||
%d Note ID.
|
||||
|
||||
Returns: ~
|
||||
{table}
|
||||
|
||||
Example: ~
|
||||
Insert Table of Contents with a Command: >
|
||||
|
||||
vim.api.nvim_buf_add_user_command(0, "ZkInsertTOC", function(opts)
|
||||
vim.api.nvim_buf_set_lines(
|
||||
vim.api.nvim_get_current_buf(),
|
||||
opts.line1,
|
||||
opts.line2,
|
||||
true,
|
||||
require("zettelkasten").get_toc(opts.args)
|
||||
)
|
||||
end, {
|
||||
nargs = 1,
|
||||
range = true,
|
||||
})
|
||||
|
||||
ABOUT *zettelkasten-about*
|
||||
================================================================================
|
||||
|
||||
Grab the latest version or report a bug on GitHub:
|
||||
|
||||
https://github.com/Furkanzmc/zettelkasten.nvim
|
||||
|
||||
vim:tw=80:colorcolumn=81:et:ft=help:norl:
|
4
bundle/vim-zettelkasten/ftdetect/zettelkasten.lua
vendored
Normal file
4
bundle/vim-zettelkasten/ftdetect/zettelkasten.lua
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
vim.cmd([[augroup zettelkasten_ft]])
|
||||
vim.cmd([[au!]])
|
||||
vim.cmd([[autocmd BufNewFile,BufRead zk://browser setlocal filetype=zkbrowser]])
|
||||
vim.cmd([[augroup END]])
|
34
bundle/vim-zettelkasten/ftplugin/markdown.lua
vendored
Normal file
34
bundle/vim-zettelkasten/ftplugin/markdown.lua
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
local zk = require("zettelkasten")
|
||||
|
||||
if vim.opt_local.tagfunc:get() == "" then
|
||||
vim.opt_local.tagfunc = "v:lua.zettelkasten.tagfunc"
|
||||
end
|
||||
|
||||
if vim.opt_local.completefunc:get() == "" then
|
||||
vim.opt_local.completefunc = "v:lua.zettelkasten.completefunc"
|
||||
end
|
||||
|
||||
vim.opt.isfname:append(":")
|
||||
vim.opt.isfname:append("-")
|
||||
vim.opt_local.iskeyword:append(":")
|
||||
vim.opt_local.iskeyword:append("-")
|
||||
vim.opt_local.suffixesadd:append(".md")
|
||||
vim.opt_local.errorformat = "%f:%l: %m"
|
||||
vim.opt_local.include = "[[\\s]]"
|
||||
vim.opt_local.define = "^# \\s*"
|
||||
|
||||
if vim.opt_local.keywordprg:get() == "" then
|
||||
vim.opt_local.keywordprg = ":ZkHover"
|
||||
end
|
||||
|
||||
if vim.fn.mapcheck("[I", "n") == "" then
|
||||
vim.api.nvim_buf_set_keymap(
|
||||
0,
|
||||
"n",
|
||||
"[I",
|
||||
'<CMD>lua require("zettelkasten").show_back_references(vim.fn.expand("<cword>"))<CR>',
|
||||
{ noremap = true, silent = true, nowait = true }
|
||||
)
|
||||
end
|
||||
|
||||
require("zettelkasten").add_hover_command()
|
55
bundle/vim-zettelkasten/ftplugin/zkbrowser.lua
vendored
Normal file
55
bundle/vim-zettelkasten/ftplugin/zkbrowser.lua
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
if vim.b.did_ftp == true then
|
||||
return
|
||||
end
|
||||
|
||||
vim.opt_local.cursorline = true
|
||||
vim.opt_local.modifiable = true
|
||||
vim.opt_local.buflisted = true
|
||||
vim.opt_local.syntax = "zkbrowser"
|
||||
vim.opt_local.buftype = "nofile"
|
||||
vim.opt_local.swapfile = false
|
||||
vim.opt_local.iskeyword:append(":")
|
||||
vim.opt_local.iskeyword:append("-")
|
||||
vim.opt_local.suffixesadd:append(".md")
|
||||
vim.opt_local.errorformat = "%f:%l: %m"
|
||||
|
||||
if vim.opt_local.keywordprg:get() == "" then
|
||||
vim.opt_local.keywordprg = ":ZkHover -preview"
|
||||
end
|
||||
|
||||
if vim.opt_local.tagfunc:get() == "" then
|
||||
vim.opt_local.tagfunc = "v:lua.zettelkasten.tagfunc"
|
||||
end
|
||||
|
||||
require("zettelkasten").add_hover_command()
|
||||
|
||||
if vim.fn.mapcheck("[I", "n") == "" then
|
||||
vim.api.nvim_buf_set_keymap(
|
||||
0,
|
||||
"n",
|
||||
"[I",
|
||||
'<CMD>lua require("zettelkasten").show_back_references(vim.fn.expand("<cword>"))<CR>',
|
||||
{ noremap = true, silent = true, nowait = true }
|
||||
)
|
||||
end
|
||||
|
||||
local config = require("zettelkasten.config").get()
|
||||
if config.notes_path ~= "" then
|
||||
vim.cmd("lcd " .. config.notes_path)
|
||||
end
|
||||
|
||||
vim.api.nvim_create_autocmd({ "BufEnter" }, {
|
||||
group = vim.api.nvim_create_augroup("zettelkasten_browser_events", { clear = true }),
|
||||
buffer = vim.api.nvim_get_current_buf(),
|
||||
callback = function(opts)
|
||||
vim.opt_local.syntax = ""
|
||||
vim.api.nvim_buf_set_lines(
|
||||
0,
|
||||
vim.fn.line("$") - 1,
|
||||
-1,
|
||||
true,
|
||||
require("zettelkasten").get_note_browser_content()
|
||||
)
|
||||
vim.opt_local.syntax = "zkbrowser"
|
||||
end,
|
||||
})
|
314
bundle/vim-zettelkasten/lua/zettelkasten.lua
vendored
Normal file
314
bundle/vim-zettelkasten/lua/zettelkasten.lua
vendored
Normal file
@ -0,0 +1,314 @@
|
||||
local M = {}
|
||||
local api = vim.api
|
||||
local fn = vim.fn
|
||||
|
||||
local log_levels = vim.log.levels
|
||||
local log = require("zettelkasten.log")
|
||||
local config = require("zettelkasten.config")
|
||||
local formatter = require("zettelkasten.formatter")
|
||||
local browser = require("zettelkasten.browser")
|
||||
|
||||
local NOTE_ID_STRFTIME_FORMAT = "%Y-%m-%d-%H-%M-%S"
|
||||
|
||||
local function set_qflist(lines, action, bufnr, use_loclist, what)
|
||||
what = what or {}
|
||||
local _, local_efm = pcall(vim.api.nvim_buf_get_option, bufnr, "errorformat")
|
||||
what.efm = what.efm or local_efm
|
||||
if use_loclist then
|
||||
fn.setloclist(bufnr, lines, action, what)
|
||||
else
|
||||
fn.setqflist(lines, action, what)
|
||||
end
|
||||
end
|
||||
|
||||
local function read_note(file_path, line_count)
|
||||
local file = io.open(file_path, "r")
|
||||
assert(file ~= nil)
|
||||
assert(file:read(0) ~= nil)
|
||||
|
||||
if line_count == nil then
|
||||
return file:read("*all")
|
||||
end
|
||||
|
||||
local lines = {}
|
||||
while #lines < line_count do
|
||||
local line = file:read("*line")
|
||||
if line == nil then
|
||||
break
|
||||
end
|
||||
|
||||
table.insert(lines, line)
|
||||
end
|
||||
|
||||
return lines
|
||||
end
|
||||
|
||||
local function get_all_tags(lookup_tag)
|
||||
if lookup_tag ~= nil and #lookup_tag > 0 then
|
||||
lookup_tag = string.gsub(lookup_tag, "\\<", "")
|
||||
lookup_tag = string.gsub(lookup_tag, "\\>", "")
|
||||
end
|
||||
|
||||
local tags = browser.get_tags()
|
||||
if lookup_tag ~= nil and #lookup_tag > 0 then
|
||||
tags = vim.tbl_filter(function(tag)
|
||||
return string.match(tag.name, lookup_tag) ~= nil
|
||||
end, tags)
|
||||
end
|
||||
|
||||
return tags
|
||||
end
|
||||
|
||||
local function generate_note_id()
|
||||
return fn.strftime(NOTE_ID_STRFTIME_FORMAT)
|
||||
end
|
||||
|
||||
function M.completefunc(find_start, base)
|
||||
if find_start == 1 and base == "" then
|
||||
local pos = api.nvim_win_get_cursor(0)
|
||||
local line = api.nvim_get_current_line()
|
||||
local line_to_cursor = line:sub(1, pos[2])
|
||||
return fn.match(line_to_cursor, "\\k*$")
|
||||
end
|
||||
|
||||
local notes = vim.tbl_filter(function(note)
|
||||
return string.match(note.title, base)
|
||||
end, browser.get_notes())
|
||||
|
||||
local words = {}
|
||||
for _, ref in ipairs(notes) do
|
||||
table.insert(words, {
|
||||
word = ref.id,
|
||||
abbr = ref.title,
|
||||
dup = 0,
|
||||
empty = 0,
|
||||
kind = "[zettelkasten]",
|
||||
icase = 1,
|
||||
})
|
||||
end
|
||||
|
||||
return words
|
||||
end
|
||||
|
||||
function M.set_note_id(bufnr)
|
||||
local first_line = vim.api.nvim_buf_get_lines(bufnr, 0, 1, true)[1]
|
||||
local zk_id = generate_note_id()
|
||||
if #zk_id > 0 then
|
||||
first_line, _ = string.gsub(first_line, "# ", "")
|
||||
api.nvim_buf_set_lines(bufnr, 0, 1, true, { "# " .. zk_id .. " " .. first_line })
|
||||
vim.cmd("file " .. zk_id .. ".md")
|
||||
else
|
||||
log.notify("There's already a note with the same ID.", log_levels.ERROR, {})
|
||||
end
|
||||
end
|
||||
|
||||
function M.tagfunc(pattern, flags, info)
|
||||
local in_insert = string.match(flags, "i") ~= nil
|
||||
local pattern_provided = pattern ~= "\\<\\k\\k" or pattern == "*"
|
||||
local all_tags = {}
|
||||
if pattern_provided then
|
||||
all_tags = get_all_tags(pattern)
|
||||
else
|
||||
all_tags = get_all_tags()
|
||||
end
|
||||
|
||||
local tags = {}
|
||||
for _, tag in ipairs(all_tags) do
|
||||
table.insert(tags, {
|
||||
name = string.gsub(tag.name, "#", ""),
|
||||
filename = tag.file_name,
|
||||
cmd = tostring(tag.linenr),
|
||||
kind = "zettelkasten",
|
||||
})
|
||||
end
|
||||
|
||||
if not in_insert then
|
||||
local notes = browser.get_notes()
|
||||
for _, note in ipairs(notes) do
|
||||
if string.find(note.id, pattern, 1, true) or not pattern_provided then
|
||||
table.insert(tags, {
|
||||
name = note.id,
|
||||
filename = note.file_name,
|
||||
cmd = "1",
|
||||
kind = "zettelkasten",
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if #tags > 0 then
|
||||
return tags
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function M.keyword_expr(word, opts)
|
||||
if not word then
|
||||
return {}
|
||||
end
|
||||
|
||||
opts = opts or {}
|
||||
opts.preview_note = opts.preview_note or false
|
||||
opts.return_lines = opts.return_lines or false
|
||||
|
||||
local note = browser.get_note(word)
|
||||
if note == nil then
|
||||
log.notify("Cannot find note.", log_levels.ERROR, {})
|
||||
return {}
|
||||
end
|
||||
|
||||
local lines = {}
|
||||
if opts.preview_note and not opts.return_lines then
|
||||
vim.cmd(config.get().preview_command .. " " .. note.file_name)
|
||||
elseif opts.preview_note and opts.return_lines then
|
||||
vim.list_extend(lines, read_note(note.file_name))
|
||||
else
|
||||
table.insert(lines, note.title)
|
||||
end
|
||||
|
||||
return lines
|
||||
end
|
||||
|
||||
function M.get_back_references(note_id)
|
||||
local note = browser.get_note(note_id)
|
||||
if note == nil then
|
||||
return {}
|
||||
end
|
||||
|
||||
local title_cache = {}
|
||||
local get_title = function(id)
|
||||
if title_cache[id] ~= nil then
|
||||
return title_cache[id]
|
||||
end
|
||||
|
||||
title_cache[id] = browser.get_note(id).title
|
||||
return title_cache[id]
|
||||
end
|
||||
|
||||
local references = {}
|
||||
for _, back_reference in ipairs(note.back_references) do
|
||||
table.insert(references, {
|
||||
id = back_reference.id,
|
||||
linenr = back_reference.linenr,
|
||||
title = back_reference.title,
|
||||
file_name = back_reference.file_name,
|
||||
})
|
||||
end
|
||||
|
||||
return references
|
||||
end
|
||||
|
||||
function M.show_back_references(cword, use_loclist)
|
||||
use_loclist = use_loclist or false
|
||||
local references = M.get_back_references(cword)
|
||||
if #references == 0 then
|
||||
log.notify("No back references found.", log_levels.ERROR, {})
|
||||
return
|
||||
end
|
||||
|
||||
local lines = {}
|
||||
for _, ref in ipairs(references) do
|
||||
local line = {}
|
||||
table.insert(line, fn.fnamemodify(ref.file_name, ":."))
|
||||
table.insert(line, ":")
|
||||
table.insert(line, ref.linenr)
|
||||
table.insert(line, ": ")
|
||||
table.insert(line, ref.title)
|
||||
|
||||
table.insert(lines, table.concat(line, ""))
|
||||
end
|
||||
|
||||
set_qflist(
|
||||
{},
|
||||
" ",
|
||||
vim.api.nvim_get_current_buf(),
|
||||
use_loclist,
|
||||
{ title = "[[" .. cword .. "]] References", lines = lines }
|
||||
)
|
||||
|
||||
if use_loclist then
|
||||
vim.cmd([[botright lopen | wincmd p]])
|
||||
else
|
||||
vim.cmd([[botright copen | wincmd p]])
|
||||
end
|
||||
end
|
||||
|
||||
function M.get_toc(note_id, format)
|
||||
format = format or "- [%h](%d)"
|
||||
local references = M.get_back_references(note_id)
|
||||
local lines = {}
|
||||
for _, note in ipairs(references) do
|
||||
table.insert(lines, {
|
||||
file_name = note.file_name,
|
||||
id = note.id,
|
||||
title = note.title,
|
||||
})
|
||||
end
|
||||
|
||||
return formatter.format(lines, format)
|
||||
end
|
||||
|
||||
function M.get_note_browser_content()
|
||||
if config.get().notes_path == "" then
|
||||
log.notify("'notes_path' option is required for note browsing.", log_levels.WARN, {})
|
||||
return {}
|
||||
end
|
||||
|
||||
local all_notes = browser.get_notes()
|
||||
local lines = {}
|
||||
for _, note in ipairs(all_notes) do
|
||||
table.insert(lines, {
|
||||
file_name = note.file_name,
|
||||
id = note.id,
|
||||
references = note.references,
|
||||
back_references = note.back_references,
|
||||
tags = note.tags,
|
||||
title = note.title,
|
||||
})
|
||||
end
|
||||
|
||||
return formatter.format(lines, config.get().browseformat)
|
||||
end
|
||||
|
||||
function M.add_hover_command()
|
||||
if fn.exists(":ZkHover") == 2 then
|
||||
return
|
||||
end
|
||||
|
||||
vim.cmd(
|
||||
[[command -buffer -nargs=1 ZkHover :lua require"zettelkasten"._internal_execute_hover_cmd(<q-args>)]]
|
||||
)
|
||||
end
|
||||
|
||||
function M._internal_execute_hover_cmd(args)
|
||||
if args ~= nil and type(args) == "string" then
|
||||
args = vim.split(args, " ", true)
|
||||
else
|
||||
args = {}
|
||||
end
|
||||
|
||||
local cword = ""
|
||||
if #args == 1 then
|
||||
cword = fn.expand("<cword>")
|
||||
else
|
||||
cword = args[#args]
|
||||
end
|
||||
|
||||
local lines = M.keyword_expr(cword, {
|
||||
preview_note = vim.tbl_contains(args, "-preview"),
|
||||
return_lines = vim.tbl_contains(args, "-return-lines"),
|
||||
})
|
||||
if #lines > 0 then
|
||||
log.notify(table.concat(lines, "\n"), log_levels.INFO, {})
|
||||
end
|
||||
end
|
||||
|
||||
function M.setup(opts)
|
||||
opts = opts or {}
|
||||
opts.notes_path = opts.notes_path or ""
|
||||
|
||||
config._set(opts)
|
||||
end
|
||||
|
||||
return M
|
215
bundle/vim-zettelkasten/lua/zettelkasten/browser.lua
vendored
Normal file
215
bundle/vim-zettelkasten/lua/zettelkasten/browser.lua
vendored
Normal file
@ -0,0 +1,215 @@
|
||||
local M = {}
|
||||
local fn = vim.fn
|
||||
|
||||
local config = require("zettelkasten.config")
|
||||
|
||||
local ZK_FULL_TITLE_PATTERN = "# %d+-%d+-%d+-%d+-%d+-%d+ .+"
|
||||
local ZK_ID_PATTERN = "%d+-%d+-%d+-%d+-%d+-%d+"
|
||||
local ZK_FILE_NAME_PATTERN = "%d+-%d+-%d+-%d+-%d+-%d+.md"
|
||||
|
||||
local s_note_cache_with_file_path = {}
|
||||
local s_note_cache_with_id = {}
|
||||
|
||||
local function get_files(folder)
|
||||
local files = fn.split(fn.globpath(folder, "*.md"), "\\n")
|
||||
files = vim.tbl_filter(function(file)
|
||||
return string.match(file, ZK_FILE_NAME_PATTERN) ~= nil
|
||||
end, files)
|
||||
|
||||
return files
|
||||
end
|
||||
|
||||
local function extract_id_and_title(line)
|
||||
local zk_id = string.match(line, ZK_FULL_TITLE_PATTERN)
|
||||
if zk_id == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
zk_id = string.gsub(zk_id, "# ", "")
|
||||
local note_id = string.match(zk_id, ZK_ID_PATTERN)
|
||||
local title = vim.trim(string.gsub(zk_id, ZK_ID_PATTERN, ""))
|
||||
|
||||
return { id = note_id, title = string.gsub(title, "\r", "") }
|
||||
end
|
||||
|
||||
local function extract_references(line, linenr)
|
||||
assert(line ~= nil)
|
||||
|
||||
local references = {}
|
||||
for ref in string.gmatch(line, "(%[%[" .. ZK_ID_PATTERN .. "%]%])") do
|
||||
ref = string.gsub(ref, "%[%[", "")
|
||||
ref = string.gsub(ref, "%]%]", "")
|
||||
table.insert(references, { id = ref, linenr = linenr })
|
||||
end
|
||||
|
||||
return references
|
||||
end
|
||||
|
||||
local function extract_back_references(notes, note_id)
|
||||
assert(note_id ~= nil)
|
||||
|
||||
local back_references = {}
|
||||
for _, note in ipairs(notes) do
|
||||
if note.id == note_id then
|
||||
goto continue
|
||||
end
|
||||
|
||||
local references = note.references
|
||||
for _, ref in ipairs(references) do
|
||||
if ref.id == note_id then
|
||||
table.insert(back_references, {
|
||||
id = note.id,
|
||||
title = note.title,
|
||||
file_name = note.file_name,
|
||||
linenr = ref.linenr,
|
||||
})
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
::continue::
|
||||
end
|
||||
|
||||
return back_references
|
||||
end
|
||||
|
||||
local function extract_tags(line, linenr)
|
||||
assert(line ~= nil)
|
||||
|
||||
local tags = {}
|
||||
for tag in string.gmatch(line, "(%#%a[%w-]+)") do
|
||||
local start_pos, _ = string.find(line, tag, 1, true)
|
||||
local previous_char = string.sub(line, start_pos - 1, start_pos - 1)
|
||||
if previous_char == "" or previous_char == " " then
|
||||
table.insert(tags, { linenr = linenr, name = tag })
|
||||
end
|
||||
end
|
||||
|
||||
return tags
|
||||
end
|
||||
|
||||
local function get_note_information(file_path)
|
||||
local last_modified = fn.strftime("%Y-%m-%d.%H:%M:%S", fn.getftime(file_path))
|
||||
if
|
||||
s_note_cache_with_file_path[file_path] ~= nil
|
||||
and s_note_cache_with_file_path[file_path].last_modified == last_modified
|
||||
then
|
||||
return s_note_cache_with_file_path[file_path]
|
||||
end
|
||||
|
||||
local file = io.open(file_path, "r")
|
||||
if file:read(0) == nil then
|
||||
return nil
|
||||
end
|
||||
|
||||
local info = {
|
||||
file_name = file_path,
|
||||
last_modified = last_modified,
|
||||
tags = {},
|
||||
references = {},
|
||||
back_references = {},
|
||||
}
|
||||
|
||||
local linenr = 0
|
||||
while true do
|
||||
linenr = linenr + 1
|
||||
local line = file:read("*line")
|
||||
if line == nil then
|
||||
break
|
||||
end
|
||||
|
||||
if line == "" then
|
||||
goto continue
|
||||
end
|
||||
|
||||
if info.id == nil then
|
||||
local id_title = extract_id_and_title(line)
|
||||
if id_title then
|
||||
info = vim.tbl_extend("error", info, id_title)
|
||||
goto continue
|
||||
end
|
||||
end
|
||||
|
||||
local refs = extract_references(line, linenr)
|
||||
if refs then
|
||||
vim.list_extend(info.references, refs)
|
||||
end
|
||||
|
||||
local tags = extract_tags(line, linenr)
|
||||
if tags then
|
||||
vim.list_extend(info.tags, tags)
|
||||
end
|
||||
|
||||
::continue::
|
||||
end
|
||||
|
||||
s_note_cache_with_file_path[file_path] = info
|
||||
s_note_cache_with_id[info.id] = info
|
||||
return info
|
||||
end
|
||||
|
||||
function M.get_note(id)
|
||||
if s_note_cache_with_id[id] ~= nil then
|
||||
return s_note_cache_with_id[id]
|
||||
end
|
||||
|
||||
local _ = M.get_notes()
|
||||
|
||||
if s_note_cache_with_id[id] ~= nil then
|
||||
return s_note_cache_with_id[id]
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function M.get_notes()
|
||||
local folder = config.get().notes_path
|
||||
local files = get_files(folder)
|
||||
local all_notes = {}
|
||||
for _, file in ipairs(files) do
|
||||
table.insert(all_notes, get_note_information(file))
|
||||
end
|
||||
|
||||
for _, note in ipairs(all_notes) do
|
||||
if note.id == nil then
|
||||
goto continue
|
||||
end
|
||||
|
||||
local back_references = extract_back_references(all_notes, note.id)
|
||||
if back_references then
|
||||
-- When notes are cached, `back_references` field will have the references from before.
|
||||
-- Since the files that refer to this one might have changed, we'll overwrite it here.
|
||||
-- extract_back_references() already re-processes the references.
|
||||
note.back_references = back_references
|
||||
end
|
||||
|
||||
::continue::
|
||||
end
|
||||
|
||||
return all_notes
|
||||
end
|
||||
|
||||
function M.get_tags()
|
||||
local notes = M.get_notes()
|
||||
local tags = {}
|
||||
for _, note in ipairs(notes) do
|
||||
if #note.tags == 0 then
|
||||
goto continue
|
||||
end
|
||||
|
||||
for _, tag in ipairs(note.tags) do
|
||||
table.insert(tags, {
|
||||
linenr = tag.linenr,
|
||||
name = tag.name,
|
||||
file_name = note.file_name,
|
||||
})
|
||||
end
|
||||
|
||||
::continue::
|
||||
end
|
||||
|
||||
return tags
|
||||
end
|
||||
|
||||
return M
|
31
bundle/vim-zettelkasten/lua/zettelkasten/config.lua
vendored
Normal file
31
bundle/vim-zettelkasten/lua/zettelkasten/config.lua
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
--=============================================================================
|
||||
-- config.lua --- the config module for zettelkasten
|
||||
-- Copyright (c) 2016-2022 Wang Shidong & Contributors
|
||||
-- Author: Wang Shidong < wsdjeg@outlook.com >
|
||||
-- URL: https://spacevim.org
|
||||
-- License: GPLv3
|
||||
--=============================================================================
|
||||
local M = {}
|
||||
|
||||
|
||||
if vim.g.zettelkasten_directory and vim.g.zettelkasten_directory ~= '' then
|
||||
M.zettel_dir = vim.g.zettelkasten_directory
|
||||
else
|
||||
M.zettel_dir = '~/.zettelkasten/'
|
||||
end
|
||||
|
||||
local s_config = {
|
||||
notes_path = "",
|
||||
preview_command = "pedit",
|
||||
browseformat = "%f - %h [%r Refs] [%b B-Refs] %t",
|
||||
}
|
||||
|
||||
M.get = function()
|
||||
return s_config
|
||||
end
|
||||
|
||||
M._set = function(new_config)
|
||||
s_config = vim.tbl_extend("force", s_config, new_config)
|
||||
end
|
||||
|
||||
return M
|
54
bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua
vendored
Normal file
54
bundle/vim-zettelkasten/lua/zettelkasten/formatter.lua
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
local M = {}
|
||||
local s_formatters = {
|
||||
["%r"] = function(line)
|
||||
return #line.references
|
||||
end,
|
||||
["%b"] = function(line)
|
||||
return #line.back_references
|
||||
end,
|
||||
["%f"] = function(line)
|
||||
return vim.fn.fnamemodify(line.file_name, ":t")
|
||||
end,
|
||||
["%h"] = function(line)
|
||||
return line.title
|
||||
end,
|
||||
["%d"] = function(line)
|
||||
return line.id
|
||||
end,
|
||||
["%t"] = function(line)
|
||||
local tags = {}
|
||||
for _, tag in ipairs(line.tags) do
|
||||
if vim.tbl_contains(tags, tag.name) == false then
|
||||
table.insert(tags, tag.name)
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(tags, " ")
|
||||
end,
|
||||
}
|
||||
|
||||
local function get_format_keys(format)
|
||||
local matches = {}
|
||||
for w in string.gmatch(format, "%%%a") do
|
||||
table.insert(matches, w)
|
||||
end
|
||||
|
||||
return matches
|
||||
end
|
||||
|
||||
function M.format(lines, format)
|
||||
local formatted_lines = {}
|
||||
local modifiers = get_format_keys(format)
|
||||
for _, line in ipairs(lines) do
|
||||
local cmps = format
|
||||
for _, modifier in ipairs(modifiers) do
|
||||
cmps = string.gsub(cmps, "%" .. modifier, s_formatters[modifier](line))
|
||||
end
|
||||
|
||||
table.insert(formatted_lines, cmps)
|
||||
end
|
||||
|
||||
return formatted_lines
|
||||
end
|
||||
|
||||
return M
|
23
bundle/vim-zettelkasten/lua/zettelkasten/log.lua
vendored
Normal file
23
bundle/vim-zettelkasten/lua/zettelkasten/log.lua
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
local M = {}
|
||||
local log_levels = vim.log.levels
|
||||
local s_log_level = log_levels.INFO
|
||||
|
||||
local logger = require("spacevim.logger").derive("zettel")
|
||||
|
||||
function M.set_level(level)
|
||||
s_log_level = level
|
||||
end
|
||||
|
||||
function M.notify(msg, level, opts)
|
||||
if level >= s_log_level then
|
||||
local tag = opts.tag or "[zettelkasten]"
|
||||
vim.notify(tag .. " " .. msg, level, opts)
|
||||
end
|
||||
end
|
||||
|
||||
function M.info(msg) -- {{{
|
||||
logger.info(msg)
|
||||
end
|
||||
-- }}}
|
||||
|
||||
return M
|
31
bundle/vim-zettelkasten/plugin/zettelkasten.lua
vendored
Normal file
31
bundle/vim-zettelkasten/plugin/zettelkasten.lua
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
local api = vim.api
|
||||
local s_config = require("zettelkasten.config")
|
||||
|
||||
if vim.fn.exists(":ZkNew") == 0 then
|
||||
vim.cmd([[command ZkNew :lua _G.zettelkasten.zknew()]])
|
||||
end
|
||||
|
||||
if vim.fn.exists(":ZkBrowse") == 0 then
|
||||
vim.cmd([[command ZkBrowse :lua _G.zettelkasten.zkbrowse()]])
|
||||
end
|
||||
|
||||
_G.zettelkasten = {
|
||||
tagfunc = require("zettelkasten").tagfunc,
|
||||
completefunc = require("zettelkasten").completefunc,
|
||||
zknew = function()
|
||||
vim.cmd([[new | setlocal filetype=markdown]])
|
||||
if s_config.zettel_dir ~= "" then
|
||||
if vim.fn.isdirectory(s_config.zettel_dir) == 0 then
|
||||
vim.fn.mkdir(vim.fn.expand(s_config.zettel_dir), 'p', '0700')
|
||||
end
|
||||
vim.cmd("lcd " .. s_config.zettel_dir)
|
||||
end
|
||||
|
||||
vim.cmd("normal ggI# New Note")
|
||||
require("zettelkasten").set_note_id(vim.api.nvim_get_current_buf())
|
||||
vim.cmd("normal $")
|
||||
end,
|
||||
zkbrowse = function()
|
||||
vim.cmd("edit zk://browser")
|
||||
end,
|
||||
}
|
2
bundle/vim-zettelkasten/stylua.toml
vendored
Normal file
2
bundle/vim-zettelkasten/stylua.toml
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
indent_type = "Spaces"
|
||||
column_width = 100
|
13
bundle/vim-zettelkasten/syntax/zkbrowser.vim
vendored
Normal file
13
bundle/vim-zettelkasten/syntax/zkbrowser.vim
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
if "zkbrowser" !=# get(b:, "current_syntax", "zkbrowser")
|
||||
finish
|
||||
endif
|
||||
|
||||
syntax match ZkFileName '[0-9]\+-[0-9]\+-[0-9]\+-[0-9]\+-[0-9]\+-[0-9]\+\.md'
|
||||
syntax match ZkRefCount '\[[0-9]\+ .*\]'
|
||||
syntax match ZkTag '#\<\k\+\>'
|
||||
|
||||
highlight default link ZkFileName Label
|
||||
highlight default link ZkRefCount Link
|
||||
highlight default link ZkTag Tag
|
||||
|
||||
let b:current_syntax = "zkbrowser"
|
38
docs/layers/zettelkasten.md
Normal file
38
docs/layers/zettelkasten.md
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
title: "SpaceVim zettelkasten layer"
|
||||
description: "This layers adds extensive support for zettelkasten"
|
||||
---
|
||||
|
||||
# [Available Layers](../) >> zettelkasten
|
||||
|
||||
<!-- vim-markdown-toc GFM -->
|
||||
|
||||
- [Description](#description)
|
||||
- [Install](#install)
|
||||
- [Layer options](#layer-options)
|
||||
- [Key bindings](#key-bindings)
|
||||
|
||||
<!-- vim-markdown-toc -->
|
||||
|
||||
## Description
|
||||
|
||||
This layer adds support for zettelkasten in neovim.
|
||||
|
||||
## Install
|
||||
|
||||
To use this configuration layer, update your custom configuration file with:
|
||||
|
||||
```toml
|
||||
[[layers]]
|
||||
name = "zettelkasten"
|
||||
```
|
||||
|
||||
## Layer options
|
||||
|
||||
- `zettel_dir`: set the default zettelkasten directory
|
||||
|
||||
## Key bindings
|
||||
|
||||
| Key bindings | description |
|
||||
| ------------ | --------------- |
|
||||
| `SPC m z n` | create new note |
|
Loading…
Reference in New Issue
Block a user