From 6a1bfce9dfca4eaa93219feddbb0eaf08414e466 Mon Sep 17 00:00:00 2001 From: Elflare <271374942@qq.com> Date: Sat, 29 Nov 2025 14:33:19 +0800 Subject: [PATCH] - Added `back_to_list` keymap (default ``) to return to the list view easily. - Configured buffers to be transient (`bufhidden=wipe`, `buflisted=false`) to keep the buffer list clean. --- lua/memos/init.lua | 3 ++- lua/memos/ui.lua | 57 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/lua/memos/init.lua b/lua/memos/init.lua index e6e5d6e..1d37837 100644 --- a/lua/memos/init.lua +++ b/lua/memos/init.lua @@ -7,7 +7,7 @@ M.config = { page_size = 50, -- 【新增】窗口配置 window = { - enable_float = false, -- 默认为 false,设为 true 则开启浮动窗口 + enable_float = true, -- 默认为 false,设为 true 则开启浮动窗口 width = 0.85, -- 宽度占屏幕比例 height = 0.85, -- 高度占屏幕比例 border = "rounded", -- 边框样式: "single", "double", "rounded", "solid", "shadow" @@ -29,6 +29,7 @@ M.config = { -- 在编辑和创建窗口中的快捷键 buffer = { save = "ms", + back_to_list = '' }, }, } diff --git a/lua/memos/ui.lua b/lua/memos/ui.lua index e3e4963..1f1b4ce 100644 --- a/lua/memos/ui.lua +++ b/lua/memos/ui.lua @@ -48,11 +48,23 @@ function M.render_memos(data, append) end) end +function M.return_to_list() + local current_edit_buf = vim.api.nvim_get_current_buf() + + -- 1. 先重新显示列表 (这会将当前窗口的内容切换回列表 Buffer) + M.show_memos_list(current_filter) + + -- 2. 然后安全地销毁刚才那个编辑 Buffer (force = true 忽略未保存修改) + if vim.api.nvim_buf_is_valid(current_edit_buf) then + vim.cmd("bwipeout! " .. current_edit_buf) + end +end + function M.setup_buffer_for_editing() vim.bo.buftype = "nofile" vim.bo.bufhidden = "wipe" vim.bo.swapfile = false - vim.bo.buflisted = true + vim.bo.buflisted = false vim.bo.filetype = "markdown" vim.b.memos_original_content = table.concat(vim.api.nvim_buf_get_lines(0, 0, -1, false), "\n") @@ -77,6 +89,16 @@ function M.setup_buffer_for_editing() "MemosSave", { noremap = true, silent = true } ) + -- 【新增】绑定返回列表快捷键 + if config.keymaps.buffer.back_to_list and config.keymaps.buffer.back_to_list ~= "" then + vim.api.nvim_buf_set_keymap( + 0, + "n", + config.keymaps.buffer.back_to_list, + 'lua require("memos.ui").return_to_list()', + { noremap = true, silent = true } + ) + end end if config.auto_save then @@ -214,13 +236,16 @@ local function create_float_window(buf) title_pos = "center", } - return vim.api.nvim_open_win(buf, true, opts) + local win = vim.api.nvim_open_win(buf, true, opts) + -- 关键:标记这个窗口是 Memos 的专用窗口 + vim.api.nvim_win_set_var(win, "memos_window", true) + return win end function M.show_memos_list(filter) current_filter = filter local should_create_buf = true - + -- 检查 buffer 是否存在且有效 if buf_id and vim.api.nvim_buf_is_valid(buf_id) then should_create_buf = false @@ -231,6 +256,8 @@ function M.show_memos_list(filter) vim.bo[buf_id].swapfile = false vim.bo[buf_id].filetype = "memos_list" vim.bo[buf_id].modifiable = false + vim.bo[buf_id].buflisted = false + vim.bo[buf_id].bufhidden = "wipe" end -- 检查该 buffer 是否已经在一个窗口中打开 @@ -238,11 +265,27 @@ function M.show_memos_list(filter) if win_id ~= -1 then vim.api.nvim_set_current_win(win_id) else - -- 【修改】根据配置决定打开方式 if config.window and config.window.enable_float then - create_float_window(buf_id) + -- 【新增】查找是否已经存在 Memos 浮动窗口 + local found_win = nil + for _, w in ipairs(vim.api.nvim_list_wins()) do + local s, v = pcall(vim.api.nvim_win_get_var, w, "memos_window") + if s and v == true and vim.api.nvim_win_is_valid(w) then + found_win = w + break + end + end + + if found_win then + -- 如果找到了,就复用它,直接切换 buffer + vim.api.nvim_set_current_win(found_win) + vim.api.nvim_set_current_buf(buf_id) + else + -- 没找到才新建 + create_float_window(buf_id) + end else - -- 传统方式:直接切换到该 buffer + -- 非浮动模式,直接切换 buffer vim.api.nvim_set_current_buf(buf_id) end end @@ -291,7 +334,7 @@ function M.show_memos_list(filter) local list_keymaps = config.keymaps.list set_keymap(list_keymaps.edit_memo, 'lua require("memos.ui").edit_selected_memo()') set_keymap(list_keymaps.vsplit_edit_memo, 'lua require("memos.ui").edit_selected_memo_in_vsplit()') - set_keymap(list_keymaps.quit, "bdelete!") + set_keymap(list_keymaps.quit, "bwipeout!") set_keymap(list_keymaps.search_memos, 'lua require("memos.ui").search_memos()') set_keymap(list_keymaps.refresh_list, 'lua require("memos.ui").show_memos_list()') set_keymap(list_keymaps.next_page, 'lua require("memos.ui").load_next_page()')