From 5ff42e4f200403c8c626fdd71b1c18d42075b6b1 Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 22 Jun 2026 11:38:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(pick):=20ft=20filetype=20=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=BD=9C=E7=94=A8=E5=88=B0=E7=9B=AE=E6=A0=87=20buffer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit choose 回调执行时 picker 浮窗仍是当前窗口,原 vim.bo.filetype = item 会把 filetype 设到 picker 自己的 buffer 上,用户 buffer 纹丝不动 (:set ft? 显示空)。 两处问题: - item 类型:mini.pick 传入的是 table,需构造 {text=ft} 形态并取 .text - buffer 上下文:用 MiniPick.get_picker_state().windows.target 拿目标窗口, 显式在其 buffer 上设 filetype --- lua/plugins/pick.lua | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lua/plugins/pick.lua b/lua/plugins/pick.lua index cd690de..9835ed9 100644 --- a/lua/plugins/pick.lua +++ b/lua/plugins/pick.lua @@ -136,13 +136,23 @@ end, { desc = "Buffer 列表" }) -- 显示所有可用的文件类型列表,选择后设置当前 buffer 的 filetype。 lazy.on_keys("pick", "ft", "n", M.load_pick, function() local MiniPick = require("mini.pick") + -- mini.pick 会把 item 规范化后再传给 choose,不能直接用原始字符串。 + -- 这里显式构造 { text = ft } 形态的 item,choose 中取 .text 拿到 filetype 字符串。 local filetypes = vim.fn.getcompletion("", "filetype") + local items = vim.tbl_map(function(ft) + return { text = ft } + end, filetypes) MiniPick.start({ source = { name = "Filetypes", - items = filetypes, + items = items, choose = function(item) - vim.bo.filetype = item + -- choose 执行时 picker 浮窗仍是当前窗口,vim.bo 默认作用于 picker 自己的 buffer。 + -- 必须用 picker_state.windows.target 拿到用户原本的窗口,在其 buffer 上设 filetype。 + local state = MiniPick.get_picker_state() + local win = state and state.windows and state.windows.target + local target_buf = win and vim.api.nvim_win_get_buf(win) or 0 + vim.bo[target_buf].filetype = item.text end, }, })