1
0

Compare commits

...

5 Commits

Author SHA1 Message Date
Stefan Rakel
699f021c43 Fix not saving bookmarks on delete 2026-01-09 10:00:30 +01:00
Stefan Rakel
7ec4a474d7 Don't save globals anymore 2026-01-08 11:34:52 +01:00
Stefan Rakel
b97e491437 Remove tab naming and save bookmarks in file 2025-12-18 10:33:38 +01:00
Stefan Rakel
7514fa653f Add function to show tabname 2025-12-18 08:25:18 +01:00
Stefan Rakel
63cf649210 Save bookmarks in session 2025-12-18 08:22:06 +01:00

View File

@@ -1,99 +1,56 @@
local Bookmarks = {} local Bookmarks = {}
local H = { local H = {
state = {
bookmarks = {}, bookmarks = {},
bookmarksFilePath = ".bookmarks", },
} }
function Bookmarks.setup() function Bookmarks.setup()
_G.Bookmarks = Bookmarks _G.Bookmarks = Bookmarks
vim.opt.sessionoptions:append("globals")
-- Attach to mini.sessions
if MiniSessions then
local oldWriteFunction = MiniSessions.config.hooks.pre.write
MiniSessions.config.hooks.pre.write = function(data)
if oldWriteFunction then
oldWriteFunction(data)
end
Bookmarks.updateTabNames()
end
local oldReadFunction = MiniSessions.config.hooks.post.read
MiniSessions.config.hooks.post.read = function(data)
if oldReadFunction then
oldReadFunction(data)
end
Bookmarks.loadTabNames()
end
end
local augroup = vim.api.nvim_create_augroup("bookmark.nvim", {clear=true}) local augroup = vim.api.nvim_create_augroup("bookmark.nvim", {clear=true})
vim.api.nvim_create_autocmd( vim.api.nvim_create_autocmd(
{"DirChanged"}, {"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 = {"*"}, pattern = {"*"},
callback = H.saveBookmarks, callback = function()
H.loadBookmarks()
end,
group = augroup, group = augroup,
} }
) )
end 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() function H.loadBookmarks()
--clear current bookmarks H.state = {bookmarks = {}}
H.bookmarks = {} local path = H.getSavePath()
H.bookmarksFilePath = ".bookmarks" local file = io.open(path, "r")
local path = vim.fs.find(".bookmarks", {upward = true, type="file"})[1] if not file then
if not path then
return return
end end
H.bookmarksFilePath = path local content = file:read("*a")
local file = io.open(H.bookmarksFilePath, "r")
if file then
local fileContent = file:read("*a")
file:close() file:close()
if fileContent and fileContent ~= "" then H.state = vim.json.decode(content)
H.bookmarks = vim.json.decode(fileContent)
end
else
vim.notify("Failed to load Bookmarks")
end
end end
function H.saveBookmarks() function H.saveBookmarks()
if #H.bookmarks > 0 or vim.fn.filereadable(H.bookmarksFilePath) == 1 then local path = H.getSavePath()
local file = io.open(H.bookmarksFilePath, "w") local file = io.open(path, "w")
if file then if not file then
file:write(vim.json.encode(H.bookmarks)) return
file:flush() end
file:write(vim.json.encode(H.state))
file:close() file:close()
else
vim.notify("Failed to save Bookmarks")
end
end
end end
function Bookmarks.addBookmark() function Bookmarks.addBookmark()
@@ -101,15 +58,16 @@ function Bookmarks.addBookmark()
if input and input ~= "" then if input and input ~= "" then
local file = vim.api.nvim_buf_get_name(0) local file = vim.api.nvim_buf_get_name(0)
local cursor = vim.api.nvim_win_get_cursor(0) local cursor = vim.api.nvim_win_get_cursor(0)
table.insert(H.bookmarks, {name = input, file = file, cursor = cursor}) table.insert(H.state.bookmarks, {name = input, file = file, cursor = cursor})
H.saveBookmarks()
vim.notify("Bookmark \"" .. input .. "\" added") vim.notify("Bookmark \"" .. input .. "\" added")
end end
end) end)
end end
function Bookmarks.selectBookmark(action, on_choice) function Bookmarks.selectBookmark(action, on_choice)
if H.bookmarks and #H.bookmarks > 0 then if H.state.bookmarks and #H.state.bookmarks > 0 then
vim.ui.select(H.bookmarks, {prompt = action .." Bookmark", format_item = function(item) return item.name end}, on_choice) vim.ui.select(H.state.bookmarks, {prompt = action .." Bookmark", format_item = function(item) return item.name end}, on_choice)
else else
vim.notify("No bookmarks set or loaded") vim.notify("No bookmarks set or loaded")
end end
@@ -118,7 +76,8 @@ end
function Bookmarks.deleteBookmark() function Bookmarks.deleteBookmark()
Bookmarks.selectBookmark("Delete", function(bookmark, idx) Bookmarks.selectBookmark("Delete", function(bookmark, idx)
if idx then if idx then
table.remove(H.bookmarks, idx) table.remove(H.state.bookmarks, idx)
H.saveBookmarks()
vim.notify("Deleted bookmark \"".. bookmark.name .. "\"") vim.notify("Deleted bookmark \"".. bookmark.name .. "\"")
end end
end) end)
@@ -135,32 +94,4 @@ function Bookmarks.jumpToBookmark()
end)) end))
end end
-- Tab naming
function Bookmarks.nameTab()
vim.ui.input({prompt = "Name this tab", default = vim.t.bookmark_tabname}, function(input)
if input and input ~= "" then
vim.t.bookmark_tabname = input
vim.cmd.redrawtabline()
end
end)
end
function Bookmarks.updateTabNames()
local names = {}
for i, tabid in ipairs(vim.api.nvim_list_tabpages()) do
names[i] = vim.t[tabid].bookmark_tabname
end
vim.g.Bookmark_tabnames = vim.json.encode(names)
end
function Bookmarks.loadTabNames()
local tabnames = vim.g.Bookmark_tabnames
if tabnames then
tabnames = vim.json.decode(tabnames)
for k,v in pairs(tabnames) do
vim.t[k].bookmark_tabname = v
end
end
end
return Bookmarks return Bookmarks