1
0
Files
bookmark.nvim/lua/bookmark.lua

116 lines
2.7 KiB
Lua

local bookmarksFilePath = ".bookmarks"
local M = {}
local H = {
bookmarks = {},
}
function M.setup()
local augroup = vim.api.nvim_create_augroup("bookmark.nvim", {clear=true})
vim.api.nvim_create_autocmd(
{"DirChanged"},
{
pattern = {"global"},
callback = H.loadBookmarks,
group = augroup,
}
)
vim.api.nvim_create_autocmd(
{"DirChangedPre"},
{
pattern = {"global"},
callback = H.saveBookmarks,
group = augroup,
}
)
vim.api.nvim_create_autocmd(
{"SessionWritePost"},
{
callback = H.saveBookmarks,
group = augroup,
}
)
vim.api.nvim_create_autocmd(
{"VimLeavePre"},
{
pattern = {"*"},
callback = H.saveBookmarks,
group = augroup,
}
)
end
function H.loadBookmarks()
--clear current bookmarks
H.bookmarks = {}
bookmarksFilePath = ".bookmarks"
local path = vim.fs.find(".bookmarks", {upward = true, type="file"})[1]
if not path then
return
end
bookmarksFilePath = path
local file = io.open(bookmarksFilePath, "r")
if file then
local fileContent = file:read("*a")
file:close()
if fileContent and fileContent ~= "" then
H.bookmarks = vim.json.decode(fileContent)
end
else
vim.notify("Failed to load Bookmarks")
end
end
function H.saveBookmarks()
if #H.bookmarks > 0 or vim.fn.filereadable(bookmarksFilePath) == 1 then
local file = io.open(bookmarksFilePath, "w")
if file then
file:write(vim.json.encode(H.bookmarks))
file:flush()
file:close()
else
vim.notify("Failed to load Bookmarks")
end
end
end
function M.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.bookmarks, {name = input, file = file, cursor = cursor})
vim.notify("Bookmark \"" .. input .. "\" added")
end
end)
end
function M.selectBookmark(action, on_choice)
if H.bookmarks and #H.bookmarks > 0 then
vim.ui.select(H.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 M.deleteBookmark()
M.selectBookmark("Delete", function(bookmark, idx)
if idx then
table.remove(H.bookmarks, idx)
vim.notify("Deleted bookmark \"".. bookmark.name .. "\"")
end
end)
end
function M.jumpToBookmark()
M.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 M