diff --git a/runtime/lua/man.lua b/runtime/lua/man.lua index 61950f184e..90a6fe1087 100644 --- a/runtime/lua/man.lua +++ b/runtime/lua/man.lua @@ -646,8 +646,21 @@ function M.init_pager() local _, sect, err = pcall(parse_ref, ref) vim.b.man_sect = err ~= nil and sect or '' - if not fn.bufname('%'):match('man://') then -- Avoid duplicate buffers, E95. - vim.cmd.file({ 'man://' .. fn.fnameescape(ref):lower(), mods = { silent = true } }) + local man_bufname = 'man://' .. fn.fnameescape(ref):lower() + + -- Raw manpage into (:Man!) overlooks `match('man://')` condition, + -- so if the buffer already exists, create new with a non existing name. + if vim.fn.bufexists(man_bufname) == 1 then + local new_bufname = man_bufname + for i = 1, 100 do + if vim.fn.bufexists(new_bufname) == 0 then + break + end + new_bufname = ('%s?new=%s'):format(man_bufname, i) + end + vim.cmd.file({ new_bufname, mods = { silent = true } }) + elseif not fn.bufname('%'):match('man://') then -- Avoid duplicate buffers, E95. + vim.cmd.file({ man_bufname, mods = { silent = true } }) end set_options() diff --git a/test/functional/plugin/man_spec.lua b/test/functional/plugin/man_spec.lua index f357aab4d6..a77879aa7d 100644 --- a/test/functional/plugin/man_spec.lua +++ b/test/functional/plugin/man_spec.lua @@ -228,6 +228,24 @@ describe(':Man', function() matches('quit works!!', fn.system(args, { 'manpage contents' })) end) + it('raw manpage into (:Man!) creates a new buffer #30132', function() + local args = { + nvim_prog, + '--headless', + '+Man! foo', + '+echo bufname()', + '+enew', + '+Man! foo', + '+echo bufname()', + '+enew', + '+Man! foo', + '+echo bufname()', + '+q', + } + local out = fn.system(args, { 'manpage contents' }) + assert(out and out:match('man://%?new=%d')) + end) + it('reports non-existent man pages for absolute paths', function() skip(is_ci('cirrus')) local actual_file = tmpname()