Jakub Okoński ae0d7e8e45
fix(start): don't count ft=jj buffers for persistence (#90)
## Description

Don't count `ft=jj` buffers towards those that need persisting

## Related Issue(s)

https://github.com/LazyVim/LazyVim/discussions/5545
2025-02-25 19:16:59 +01:00

147 lines
3.4 KiB
Lua

local Config = require("persistence.config")
local uv = vim.uv or vim.loop
local M = {}
M._active = false
local e = vim.fn.fnameescape
---@param opts? {branch?: boolean}
function M.current(opts)
opts = opts or {}
local name = vim.fn.getcwd():gsub("[\\/:]+", "%%")
if Config.options.branch and opts.branch ~= false then
local branch = M.branch()
if branch and branch ~= "main" and branch ~= "master" then
name = name .. "%%" .. branch:gsub("[\\/:]+", "%%")
end
end
return Config.options.dir .. name .. ".vim"
end
function M.setup(opts)
Config.setup(opts)
M.start()
end
function M.fire(event)
vim.api.nvim_exec_autocmds("User", {
pattern = "Persistence" .. event,
})
end
-- Check if a session is active
function M.active()
return M._active
end
function M.start()
M._active = true
vim.api.nvim_create_autocmd("VimLeavePre", {
group = vim.api.nvim_create_augroup("persistence", { clear = true }),
callback = function()
M.fire("SavePre")
if Config.options.need > 0 then
local bufs = vim.tbl_filter(function(b)
if vim.bo[b].buftype ~= "" or vim.bo[b].filetype == "gitcommit" or vim.bo[b].filetype == "gitrebase" or vim.bo[b].filetype == "jj" then
return false
end
return vim.api.nvim_buf_get_name(b) ~= ""
end, vim.api.nvim_list_bufs())
if #bufs < Config.options.need then
return
end
end
M.save()
M.fire("SavePost")
end,
})
end
function M.stop()
M._active = false
pcall(vim.api.nvim_del_augroup_by_name, "persistence")
end
function M.save()
vim.cmd("mks! " .. e(M.current()))
end
---@param opts? { last?: boolean }
function M.load(opts)
opts = opts or {}
---@type string
local file
if opts.last then
file = M.last()
else
file = M.current()
if vim.fn.filereadable(file) == 0 then
file = M.current({ branch = false })
end
end
if file and vim.fn.filereadable(file) ~= 0 then
M.fire("LoadPre")
vim.cmd("silent! source " .. e(file))
M.fire("LoadPost")
end
end
---@return string[]
function M.list()
local sessions = vim.fn.glob(Config.options.dir .. "*.vim", true, true)
table.sort(sessions, function(a, b)
return uv.fs_stat(a).mtime.sec > uv.fs_stat(b).mtime.sec
end)
return sessions
end
function M.last()
return M.list()[1]
end
function M.select()
---@type { session: string, dir: string, branch?: string }[]
local items = {}
local have = {} ---@type table<string, boolean>
for _, session in ipairs(M.list()) do
if uv.fs_stat(session) then
local file = session:sub(#Config.options.dir + 1, -5)
local dir, branch = unpack(vim.split(file, "%%", { plain = true }))
dir = dir:gsub("%%", "/")
if jit.os:find("Windows") then
dir = dir:gsub("^(%w)/", "%1:/")
end
if not have[dir] then
have[dir] = true
items[#items + 1] = { session = session, dir = dir, branch = branch }
end
end
end
vim.ui.select(items, {
prompt = "Select a session: ",
format_item = function(item)
return vim.fn.fnamemodify(item.dir, ":p:~")
end,
}, function(item)
if item then
vim.fn.chdir(item.dir)
M.load()
end
end)
end
--- get current branch name
---@return string?
function M.branch()
if uv.fs_stat(".git") then
local ret = vim.fn.systemlist("git branch --show-current")[1]
return vim.v.shell_error == 0 and ret or nil
end
end
return M