Refactor options to separate file

Options were previously set ad-hoc in the initialize function, but
re-set and overwritten at various places.

Options now live in one central module (options.lua), where they
directly access the neovim options set, and re-access them on any run.

That means options can be changed while the plugin is running and it
will use their newer versions, without requiring any re-initialization.
This commit is contained in:
Marty Oehme 2020-10-30 16:04:23 +01:00
parent e96b454b23
commit ece30350c2
Signed by: Marty
GPG key ID: B7538B8F50A1C800
6 changed files with 106 additions and 41 deletions

View file

@ -1,18 +1,7 @@
local ZK = {} local ZK = {}
local ls = require 'zettelkasten.list' local ls = require 'zettelkasten.list'
local o = require 'zettelkasten.options'
function ZK.init(vimapi)
vim = vimapi or vim
ZK.options = {
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",
-- TODO zettel_anchor_pattern = regex? -> needs custom creation function in `create_anchor`
}
end
-- entrypoint for pressing the zettel key when the cursor -- entrypoint for pressing the zettel key when the cursor
-- is either on an existing link (it will then -- is either on an existing link (it will then
@ -42,15 +31,13 @@ end
-- and the text cleaned up to be useful in a link. -- and the text cleaned up to be useful in a link.
function ZK.create_link(text, date) function ZK.create_link(text, date)
text = text or "" text = text or ""
local o = ZK.options
if text == "" then if text == "" then
text = "" .. ZK.create_anchor(date) text = "" .. ZK.create_anchor(date)
else else
text = text:lower():gsub(" ", "-") text = text:lower():gsub(" ", "-")
text = "" .. ZK.create_anchor(date) .. (o.anchor_separator or "_") .. text = "" .. ZK.create_anchor(date) .. o.anchor().separator .. text
text
end end
return text .. (o.zettel_extension or ".md") return text .. o.zettel().extension
end end
-- Returns all zettel in path as a -- Returns all zettel in path as a
@ -62,7 +49,6 @@ function ZK.get_zettel_list(path, recursive)
end end
return { return {
init = ZK.init,
zettel_link_create = ZK.zettel_link_create, zettel_link_create = ZK.zettel_link_create,
create_anchor = ZK.create_anchor, create_anchor = ZK.create_anchor,
create_link = ZK.create_link, create_link = ZK.create_link,

View file

@ -2,7 +2,8 @@ ZK = require 'zettelkasten.init'
Test_date = {year = 2019, month = 10, day = 29, hour = 16, min = 45} Test_date = {year = 2019, month = 10, day = 29, hour = 16, min = 45}
describe("Zettelkasten", function() describe("Zettelkasten", function()
before_each(function() ZK.init({g = {}, b = {}}) end) before_each(function() _G.vim = {g = {}, b = {}} end)
after_each(function() _G.vim = nil end)
describe("anchor creation", function() describe("anchor creation", function()
it("should return zettel anchor from time passed in", function() it("should return zettel anchor from time passed in", function()
@ -42,21 +43,29 @@ describe("Zettelkasten", function()
ZK.create_link("yes indeed a space", Test_date)) ZK.create_link("yes indeed a space", Test_date))
end) end)
it( it("should add contents of g:zettel_anchor_separator variable to link",
"should place the contents of g:zettel_anchor_separator variable in link", function()
function() vim.g.zettel_anchor_separator = "SEP"
vim = {g = {zettel_anchor_separator = "SEP"}, b = {}} assert.same("1910291645SEParated.md",
ZK.init(vim) ZK.create_link("arated", Test_date))
assert.same("1910291645SEParated.md", end)
ZK.create_link("arated", Test_date)) it("should add contents of b:zettel_anchor_separator variable to link",
end) function()
vim.b.zettel_anchor_separator = "---"
assert.same("1910291645---arated.md",
ZK.create_link("arated", Test_date))
end)
it("should append the filetype set in g:zettel_extension", function() it("should append the filetype set in g:zettel_extension", function()
vim = {g = {zettel_extension = ".something"}, b = {}} vim.g.zettel_extension = ".something"
ZK.init(vim)
assert.same("1910291645_theworld.something", assert.same("1910291645_theworld.something",
ZK.create_link("theworld", Test_date)) ZK.create_link("theworld", Test_date))
end) end)
it("should append the filetype set in b:zettel_extension", function()
vim.b.zettel_extension = ".somethingelse"
assert.same("1910291645_theworld.somethingelse",
ZK.create_link("theworld", Test_date))
end)
end) end)
end) end)

View file

@ -35,8 +35,11 @@ end
-- Take a list of zettel as an optional variable, without which -- Take a list of zettel as an optional variable, without which
-- it will use the (recursive) results of the zettel_root directory. -- it will use the (recursive) results of the zettel_root directory.
function ls.get_zettel(anchor, all) function ls.get_zettel(anchor, all)
if not all then all = ls.get_anchors_and_paths('somepath') end
return all[anchor] return all[anchor]
end end
function ls.open_zettel(anchor, all) end
return ls return ls

View file

@ -1,4 +1,4 @@
ls = require'zettelkasten.list' local ls = require 'zettelkasten.list'
-- these tests, I suppose, only work on unix due to the file structure -- these tests, I suppose, only work on unix due to the file structure
local function simple_api_mock(files) local function simple_api_mock(files)
@ -13,20 +13,14 @@ local function simple_api_mock(files)
return true return true
end end
end, end,
fs_scandir_next = function() fs_scandir_next = function() return table.remove(files) end
return table.remove(files)
end
} }
} }
end end
describe("get_anchors_and_paths", function() describe("get_anchors_and_paths", function()
before_each(function() before_each(function() get_api_mock = simple_api_mock end)
get_api_mock = simple_api_mock after_each(function() _G.vim = nil end)
end)
after_each(function()
_G.vim = nil
end)
it("should return anchor-keyed table pointing to filename of zettel", it("should return anchor-keyed table pointing to filename of zettel",
function() function()
@ -136,19 +130,37 @@ describe("get_anchors_and_paths", function()
["2345678901"] = "2345678901 another.wiki" ["2345678901"] = "2345678901 another.wiki"
} }
assert.same(expected, ls.get_anchors_and_paths('mydirectory', false, vim.g)) assert.same(expected,
ls.get_anchors_and_paths('mydirectory', false, vim.g))
end) end)
it("should default to the zettel root dir",
function() pending("not implemented") end)
end) end)
describe("get_zettel", function() describe("get_zettel", function()
it("should return the correct zettel by id", function() it("should return the correct zettel by id", function()
local file_list = { local file_list = {
["1910291645"] = "1910291645 myfile.md", ["1910291645"] = "1910291645 myfile.md",
["2345678901"] = "2345678901 another.md", ["2345678901"] = "2345678901 another.md"
} }
_G.vim = simple_api_mock(file_list) _G.vim = simple_api_mock(file_list)
assert.same("1910291645 myfile.md", ls.get_zettel("1910291645", file_list)) assert.same("1910291645 myfile.md",
ls.get_zettel("1910291645", file_list))
end)
it("should default to the zettel root dir if no list passed in", function()
local file_list = {"1910291645 myfile.wiki", "2345678901 another.wiki"}
_G.vim = simple_api_mock(file_list)
pending("not implemented")
assert.same("1910291645 myfile.wiki", ls.get_zettel("1910291645"))
end) end)
end) end)
describe("open_zettel", function()
it("should set the current buffer to the zettel passed in as anchor",
function() pending("not implemented") end)
end)

View file

@ -0,0 +1,24 @@
local Opt = {}
-- setting defaults
local ZETTEL_EXTENSION = ".md"
local ANCHOR_SEPARATOR = "_"
-- TODO zettel_root = vim.g["zettel_root"] or vim.b["zettel_root"] or "~/documents/notes",
-- TODO zettel_anchor_pattern = regex? -> needs custom creation function in `create_anchor`
function Opt.zettel()
local options = {}
options.extension =
vim.g["zettel_extension"] or vim.b["zettel_extension"] or
ZETTEL_EXTENSION
return options
end
function Opt.anchor()
local options = {}
options.separator = vim.g["zettel_anchor_separator"] or
vim.b["zettel_anchor_separator"] or ANCHOR_SEPARATOR
return options
end
return Opt

View file

@ -0,0 +1,31 @@
local opt = require 'zettelkasten.options'
before_each(function() _G.vim = {g = {}, b = {}} end)
after_each(function() _G.vim = nil end)
describe("zettel options", function()
it("should return the global zettel extension if set in vim", function()
_G.vim.g.zettel_extension = ".myextension"
assert.same(".myextension", opt.zettel().extension)
end)
it("should return the buffer zettel extension if set in vim", function()
_G.vim.b.zettel_extension = ".mybufextension"
assert.same(".mybufextension", opt.zettel().extension)
end)
it("should return the default zettel extension if not set in vim",
function() assert.same(".md", opt.zettel().extension) end)
end)
describe("zettel options", function()
it("should return the global anchor separator if set in vim", function()
_G.vim.g.zettel_anchor_separator = "SEPARATE"
assert.same("SEPARATE", opt.anchor().separator)
end)
it("should return the buffer anchor separator if set in vim", function()
_G.vim.b.zettel_anchor_separator = "--"
assert.same("--", opt.anchor().separator)
end)
it("should return the default anchor separator if not set in vim",
function() assert.same("_", opt.anchor().separator) end)
end)