update auto save logic

This commit is contained in:
Elflare
2025-07-06 15:40:02 +08:00
parent 08b7eb6880
commit 267e31d533

View File

@@ -51,59 +51,97 @@ local function render_memos(data, append)
end end
-- 设置编辑 buffer 的通用函数 -- 设置编辑 buffer 的通用函数
-- 【新增】检查内容是否变化并自动保存的函数
function M.check_and_auto_save()
-- 检查是否存在原始内容快照
if vim.b.memos_original_content == nil then return end
local current_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n')
if vim.b.memos_original_content ~= current_content then
M.save_or_create_dispatcher()
end
end
-- 【修改】setup_buffer_for_editing 现在使用全新的自动保存逻辑
local function setup_buffer_for_editing() local function setup_buffer_for_editing()
vim.bo.buftype = 'nofile' vim.bo.buftype = 'nofile'
vim.bo.bufhidden = 'wipe' vim.bo.bufhidden = 'wipe'
vim.bo.swapfile = false vim.bo.swapfile = false
vim.bo.buflisted = true vim.bo.buflisted = true
vim.bo.filetype = 'markdown' vim.bo.filetype = 'markdown'
local save_key_string = "" -- 【新增】在 buffer 打开时,立即创建内容快照
if config.keymaps.buffer.save and config.keymaps.buffer.save ~= "" then vim.b.memos_original_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n')
save_key_string = string.format(" or %s", config.keymaps.buffer.save)
end
if vim.b.memos_memo_name then local save_key_string = ""
vim.notify("Editing memo. Use :MemosSave" .. save_key_string .. " to save.") if config.keymaps.buffer.save and config.keymaps.buffer.save ~= "" then
else save_key_string = string.format(" or %s", config.keymaps.buffer.save)
vim.notify("📝 New memo. Use :MemosSave" .. save_key_string .. " to create.") end
end
vim.api.nvim_buf_create_user_command(0, 'MemosSave', 'lua require("memos.ui").save_or_create_dispatcher()', {}) if vim.b.memos_memo_name then
if config.keymaps.buffer.save and config.keymaps.buffer.save ~= "" then vim.notify("Editing memo. Use :MemosSave" .. save_key_string .. " to save.")
vim.api.nvim_buf_set_keymap(0, 'n', config.keymaps.buffer.save, '<Cmd>MemosSave<CR>', { else
noremap = true, vim.notify("📝 New memo. Use :MemosSave" .. save_key_string .. " to create.")
silent = true end
})
end
-- 【修改】全新的、更可靠的自动保存逻辑 vim.api.nvim_buf_create_user_command(0, 'MemosSave', 'lua require("memos.ui").save_or_create_dispatcher()', {})
if config.auto_save then if config.keymaps.buffer.save and config.keymaps.buffer.save ~= "" then
local group = vim.api.nvim_create_augroup('MemosAutoSave', { vim.api.nvim_buf_set_keymap(0, 'n', config.keymaps.buffer.save, '<Cmd>MemosSave<CR>', { noremap = true, silent = true })
clear = true end
})
-- 1. 进入插入模式时,保存当前内容的快照 -- 【修改】设置新的自动命令
vim.api.nvim_create_autocmd('InsertEnter', { if config.auto_save then
group = group, local group = vim.api.nvim_create_augroup('MemosAutoSave', { clear = true })
buffer = 0, -- 离开插入模式时检查
callback = function() vim.api.nvim_create_autocmd('InsertLeave', {
vim.b.memos_original_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n') group = group,
end buffer = 0,
}) callback = M.check_and_auto_save,
})
-- 光标静止时检查
vim.api.nvim_create_autocmd('CursorHold', {
group = group,
buffer = 0,
callback = M.check_and_auto_save,
})
end
end
-- 2. 离开插入模式时,比较内容是否发生变化 -- 【修改】保存成功后,需要更新内容快照
vim.api.nvim_create_autocmd('InsertLeave', { function M.save_or_create_dispatcher()
group = group, local memo_name = vim.b.memos_memo_name
buffer = 0, local current_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n')
callback = function()
local current_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n') if current_content == '' then
if vim.b.memos_original_content ~= current_content then vim.notify("Memo is empty, not sending.", vim.log.levels.WARN)
require('memos.ui').save_or_create_dispatcher() return
end end
end
}) if memo_name then
end api.update_memo(memo_name, current_content, function(success)
if success then
vim.schedule(function()
vim.notify("✅ Memo updated successfully!")
-- 更新快照为最新内容
vim.b.memos_original_content = current_content
end)
M.refresh_list_silently()
end
end)
else
api.create_memo(current_content, function(new_memo)
if new_memo and new_memo.name then
vim.schedule(function()
vim.notify("✅ Memo created successfully!")
vim.cmd('bdelete!')
open_memo_for_edit(new_memo, 'enew')
M.refresh_list_silently()
end)
else
vim.schedule(function() vim.notify("❌ Failed to create memo.", vim.log.levels.ERROR) end)
end
end)
end
end end
-- 打开一个已存在的 Memo -- 打开一个已存在的 Memo
@@ -149,41 +187,6 @@ function M.refresh_list_silently()
end) end)
end end
function M.save_or_create_dispatcher()
local memo_name = vim.b.memos_memo_name
local content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), '\n')
if content == '' then
vim.notify("Memo is empty, not sending.", vim.log.levels.WARN)
return
end
if memo_name then
api.update_memo(memo_name, content, function(success)
if success then
vim.schedule(function()
vim.notify("✅ Memo updated successfully!")
end)
M.refresh_list_silently()
end
end)
else
api.create_memo(content, function(new_memo)
if new_memo and new_memo.name then
vim.schedule(function()
vim.notify("✅ Memo created successfully!")
vim.cmd('bdelete!') -- 强制关闭临时的 new_memo buffer
open_memo_for_edit(new_memo, 'enew') -- 用新 memo 的信息打开一个标准的编辑窗口
M.refresh_list_silently()
end)
else
vim.schedule(function()
vim.notify("❌ Failed to create memo.", vim.log.levels.ERROR)
end)
end
end)
end
end
function M.create_memo_in_buffer() function M.create_memo_in_buffer()
vim.cmd('enew') vim.cmd('enew')