mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-05-23 04:51:16 -03:00
functions/man: don't export MANPATH unnecessarily
We always try to prepend our man path to $MANPATH before calling man. But this is not necessary when we're gonna display the output of "status get-file man/man1/abbr.1". Overriding man pages can cause issues like https://github.com/fish-shell/fish-shell/issues/11472 https://gitlab.com/man-db/man-db/-/merge_requests/15 which by themselves are maybe not enough reason to avoid exporting MANPATH, but given that embedded man pages might become the only choice in future (see #12037), we should reduce the scope of our custom MANPATH.
This commit is contained in:
@@ -6,38 +6,35 @@ if not command -qs man
|
||||
end
|
||||
|
||||
function man
|
||||
# Work around the "builtin" manpage that everything symlinks to,
|
||||
# by prepending our fish datadir to man. This also ensures that man gives fish's
|
||||
# man pages priority, without having to put fish's bin directories first in $PATH.
|
||||
|
||||
# Preserve the existing MANPATH, and default to the system path (the empty string).
|
||||
set -l manpath
|
||||
if set -q MANPATH
|
||||
set manpath $MANPATH
|
||||
else if set -l p (command man -p 2>/dev/null)
|
||||
# NetBSD's man uses "-p" to print the path.
|
||||
# FreeBSD's man also has a "-p" option, but that requires an argument.
|
||||
# Other mans (men?) don't seem to have it.
|
||||
#
|
||||
# Unfortunately NetBSD prints things like "/usr/share/man/man1",
|
||||
# while not allowing them as $MANPATH components.
|
||||
# What it needs is just "/usr/share/man".
|
||||
#
|
||||
# So we strip the last component.
|
||||
# This leaves a few wrong directories, but that should be harmless.
|
||||
set manpath (string replace -r '[^/]+$' '' $p)
|
||||
else
|
||||
set manpath ''
|
||||
end
|
||||
# Notice the shadowing local exported copy of the variable.
|
||||
set -lx MANPATH $manpath
|
||||
|
||||
# Prepend fish's man directory if available.
|
||||
if not __fish_is_standalone
|
||||
set -l fish_manpath $__fish_data_dir/man
|
||||
if test -d $fish_manpath
|
||||
set MANPATH $fish_manpath $MANPATH
|
||||
end
|
||||
and set -l fish_manpath (path filter -d $__fish_data_dir/man)
|
||||
# Prepend fish's man directory if available.
|
||||
|
||||
# Work around the "builtin" manpage that everything symlinks to,
|
||||
# by prepending our fish datadir to man. This also ensures that man gives fish's
|
||||
# man pages priority, without having to put fish's bin directories first in $PATH.
|
||||
|
||||
# Preserve the existing MANPATH, and default to the system path (the empty string).
|
||||
set manpath $fish_manpath (
|
||||
if set -q MANPATH
|
||||
string join -- \n $MANPATH
|
||||
else if set -l p (command man -p 2>/dev/null)
|
||||
# NetBSD's man uses "-p" to print the path.
|
||||
# FreeBSD's man also has a "-p" option, but that requires an argument.
|
||||
# Other mans (men?) don't seem to have it.
|
||||
#
|
||||
# Unfortunately NetBSD prints things like "/usr/share/man/man1",
|
||||
# while not allowing them as $MANPATH components.
|
||||
# What it needs is just "/usr/share/man".
|
||||
#
|
||||
# So we strip the last component.
|
||||
# This leaves a few wrong directories, but that should be harmless.
|
||||
string replace -r '[^/]+$' '' $p
|
||||
else
|
||||
echo ''
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
if test (count $argv) -eq 1
|
||||
@@ -54,6 +51,9 @@ function man
|
||||
(string escape --style=regex -- $basename) __fish_man
|
||||
__fish_with_status functions --erase __fish_man
|
||||
else
|
||||
set -q manpath[1]
|
||||
and set -lx MANPATH $manpath
|
||||
|
||||
command man $argv
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user