1
0
Files
bookmark.nvim/lua/bookmark.lua
2025-12-18 10:33:38 +01:00

101 lines
2.5 KiB
Lua

local Bookmarks = {}
local H = {
state = {
bookmarks = {},
},
}
function Bookmarks.setup()
_G.Bookmarks = Bookmarks
--Ensure our data is saved in the session
vim.opt.sessionoptions:append("globals")
local augroup = vim.api.nvim_create_augroup("bookmark.nvim", {clear=true})
vim.api.nvim_create_autocmd(
{"DirChanged"},
{
pattern = {"*"},
callback = function()
H.loadBookmarks()
end,
group = augroup,
}
)
end
function H.getSavePath()
local cwd = vim.fs.normalize(vim.fn.getcwd())
local filename = string.gsub(cwd, "[/:]", "%%")
local statePath = vim.fs.normalize(vim.fn.stdpath("state"))
statePath = vim.fs.joinpath(statePath, "bookmark")
vim.fn.mkdir(statePath, "p")
local filePath = vim.fs.joinpath(statePath, filename)
return filePath
end
function H.loadBookmarks()
H.state = {bookmarks = {}}
local path = H.getSavePath()
local file = io.open(path, "r")
if not file then
return
end
local content = file:read("*a")
file:close()
H.state = vim.json.decode(content)
end
function H.saveBookmarks()
local path = H.getSavePath()
local file = io.open(path, "w")
if not file then
return
end
file:write(vim.json.encode(H.state))
file:close()
end
function Bookmarks.addBookmark()
vim.ui.input({prompt= "Name of bookmark", default= vim.fn.bufname()}, function(input)
if input and input ~= "" then
local file = vim.api.nvim_buf_get_name(0)
local cursor = vim.api.nvim_win_get_cursor(0)
table.insert(H.state.bookmarks, {name = input, file = file, cursor = cursor})
H.saveBookmarks()
vim.notify("Bookmark \"" .. input .. "\" added")
end
end)
end
function Bookmarks.selectBookmark(action, on_choice)
if H.state.bookmarks and #H.state.bookmarks > 0 then
vim.ui.select(H.state.bookmarks, {prompt = action .." Bookmark", format_item = function(item) return item.name end}, on_choice)
else
vim.notify("No bookmarks set or loaded")
end
end
function Bookmarks.deleteBookmark()
Bookmarks.selectBookmark("Delete", function(bookmark, idx)
if idx then
table.remove(H.state.bookmarks, idx)
H.saveBookmark()
vim.notify("Deleted bookmark \"".. bookmark.name .. "\"")
end
end)
end
function Bookmarks.jumpToBookmark()
Bookmarks.selectBookmark("Jump to",vim.schedule_wrap(function(item)
if item then
vim.cmd("edit " .. item.file)
vim.api.nvim_win_set_cursor(0, item.cursor)
--set jump in jumplist
vim.cmd("normal! m'")
end
end))
end
return Bookmarks