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