From ce49d2b657b6ff1582969b9665fad77b96ad88ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Dosko=C4=8Dil?= <30779172+Dook97@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:37:16 +0100 Subject: [PATCH 1/2] feat(extra): add manpages picker --- lua/mini/extra.lua | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/lua/mini/extra.lua b/lua/mini/extra.lua index ff2ddb10..f7ddaffd 100644 --- a/lua/mini/extra.lua +++ b/lua/mini/extra.lua @@ -1627,6 +1627,60 @@ MiniExtra.pickers.visit_labels = function(local_opts, opts) return H.pick_start(items, { source = default_source }, opts) end +--- Man pages picker +--- +--- Pick from system manpages. +--- +---@param local_opts __extra_pickers_local_opts +--- Possible fields: +--- - `(string)` - one of "all" (all man sections) or section string. +--- Default: "all". +---@param opts __extra_pickers_opts +MiniExtra.pickers.man = function(local_opts, opts) + local pick = H.validate_pick("man") + local_opts = vim.tbl_deep_extend("force", { scope = "all" }, local_opts or {}) + + local load_man = function(item) + local keyword, cmd, section, desc = item:match("^((.-)%s*%(([^)]+)%).-)%s+%-%s+(.*)$") + local width = vim.api.nvim_win_get_width(0) + cmd = vim.split(cmd, ",")[1] + vim.cmd(string.format("silent re! 2>&- MANWIDTH=%s man %s %s", width, section, cmd)) + vim.cmd("Man!") + vim.cmd("norm gg0") + end + + local choose = function(item, splitmode) + vim.cmd(splitmode or "new") + load_man(item) + local win = vim.api.nvim_get_current_win() + vim.schedule(function() vim.api.nvim_set_current_win(win) end) + end + + local preview = function(buf_id, item) + vim.api.nvim_buf_call(buf_id, function() load_man(item) end) + end + + local map_custom = function(char, splitmode) + local f = function() + choose(pick.get_picker_matches().current, splitmode) + return true + end + return { char = char, func = f } + end + + local conf_maps = pick.config.mappings + local mappings = { + choose_in_split = "", show_man_in_split = map_custom(conf_maps.choose_in_split, "new"), + choose_in_vsplit = "", show_man_in_vsplit = map_custom(conf_maps.choose_in_vsplit, "vnew"), + choose_in_tabpage = "", show_man_in_tabpage = map_custom(conf_maps.choose_in_tabpage, "tabnew"), + } + + local cmd = { "man", "-kls", local_opts.scope == "all" and "" or local_opts.scope, "" } + local source = { name = "Manpages", choose = choose, preview = preview } + opts = vim.tbl_deep_extend("force", { source = source, mappings = mappings }, opts or {}) + return pick.builtin.cli({ command = cmd }, opts) +end + -- Helper data ================================================================ -- Module default config H.default_config = MiniExtra.config From 5cd5ef9c40f1384ed71eb12594367f52905c87ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Dosko=C4=8Dil?= <30779172+Dook97@users.noreply.github.com> Date: Tue, 6 Jan 2026 14:17:56 +0100 Subject: [PATCH 2/2] fixup! feat(extra): add manpages picker --- lua/mini/extra.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lua/mini/extra.lua b/lua/mini/extra.lua index f7ddaffd..a6b896af 100644 --- a/lua/mini/extra.lua +++ b/lua/mini/extra.lua @@ -1632,13 +1632,9 @@ end --- Pick from system manpages. --- ---@param local_opts __extra_pickers_local_opts ---- Possible fields: ---- - `(string)` - one of "all" (all man sections) or section string. ---- Default: "all". ---@param opts __extra_pickers_opts MiniExtra.pickers.man = function(local_opts, opts) local pick = H.validate_pick("man") - local_opts = vim.tbl_deep_extend("force", { scope = "all" }, local_opts or {}) local load_man = function(item) local keyword, cmd, section, desc = item:match("^((.-)%s*%(([^)]+)%).-)%s+%-%s+(.*)$") @@ -1675,10 +1671,9 @@ MiniExtra.pickers.man = function(local_opts, opts) choose_in_tabpage = "", show_man_in_tabpage = map_custom(conf_maps.choose_in_tabpage, "tabnew"), } - local cmd = { "man", "-kls", local_opts.scope == "all" and "" or local_opts.scope, "" } local source = { name = "Manpages", choose = choose, preview = preview } opts = vim.tbl_deep_extend("force", { source = source, mappings = mappings }, opts or {}) - return pick.builtin.cli({ command = cmd }, opts) + return pick.builtin.cli({ command = { "man", "-kl", "" } }, opts) end -- Helper data ================================================================