fix(man): use direct lookup without manpath #40421

Problem:
On NetBSD, `man -w open` can return the exact manpage path, but `:Man`
may still fail when man directories cannot be discovered from `manpath
-q`, bare `man -w`, or `$MANPATH`.

Solution:
Fall back to the direct manpage lookup when directory discovery fails.
Add a test for resolving `open(2)` through `goto_tag()` without manpath
data.
This commit is contained in:
Josh Hirschkorn
2026-07-27 14:20:46 +01:00
committed by GitHub
parent 0b3b12da8d
commit 97a71ab484
2 changed files with 30 additions and 0 deletions

View File

@@ -510,6 +510,11 @@ local function get_paths(name, sect)
or vim.env.MANPATH
if not mandirs_raw then
-- Fall back to direct lookup ("man -w [sect] name"). NetBSD man lacks "-w". #25919
local ok, path = pcall(M._find_path, name, sect)
if ok and path then
return { path }
end
return {}, "Could not determine man directories from: 'man -w', 'manpath' or $MANPATH"
end

View File

@@ -304,6 +304,31 @@ describe(':Man', function()
)
end)
it('uses direct manpage lookup if man directories cannot be determined #25919', function()
eq(
{
{
name = 'open',
filename = 'man://open(2)',
cmd = '1',
},
},
exec_lua(function()
local man = require('man')
vim.env.MANPATH = nil
vim.npcall = function()
return nil
end
man._find_path = function(name, sect)
if name == 'open' and sect == '2' then
return '/usr/share/man/man2/open.2'
end
end
return man.goto_tag('open(2)')
end)
)
end)
it('tries variants with spaces, underscores #22503', function()
eq({
{ vim.NIL, 'NAME WITH SPACES' },