A little extra tweaking so builtin_print_help looks better

The terminal width magic that __fish_print_help learned doesn't help
when builtin_print_help runs it in a subshell. Instead, add an
undocumented --tty-width flag to __fish_print_help that's used to pass
the terminal width.
This commit is contained in:
Kevin Ballard 2014-10-10 00:11:23 -07:00
parent ac8c5910eb
commit 76c6985f82
2 changed files with 22 additions and 4 deletions

View file

@ -220,7 +220,14 @@ wcstring builtin_help_get(parser_t &parser, const wchar_t *name)
wcstring_list_t lst;
wcstring out;
const wcstring name_esc = escape_string(name, 1);
const wcstring cmd = format_string(L"__fish_print_help %ls", name_esc.c_str());
wcstring cmd = format_string(L"__fish_print_help %ls", name_esc.c_str());
if (!builtin_out_redirect && isatty(1))
{
// since we're using a subshell, __fish_print_help can't tell we're in
// a terminal. Tell it ourselves.
int cols = common_get_width();
cmd = format_string(L"__fish_print_help --tty-width %d %ls", cols, name_esc.c_str());
}
if (exec_subshell(cmd, lst, false /* don't apply exit status */) >= 0)
{
for (size_t i=0; i<lst.size(); i++)

View file

@ -1,4 +1,11 @@
function __fish_print_help --description "Print help message for the specified fish function or builtin" --argument item
# special support for builtin_help_get()
set -l tty_width
if test "$item" = "--tty-width"
set tty_width $argv[2]
set item $argv[3]
end
if test "$item" = '.'
set item source
end
@ -12,19 +19,23 @@ function __fish_print_help --description "Print help message for the specified f
# Render help output, save output into the variable 'help'
set -l help
set -l cols
set -l rLL
if command test -t 1
if test "$tty_width" -gt 0
set cols $tty_width
else if command test -t 1
# We want to simulate `man`'s dynamic line length, because
# defaulting to 80 kind of sucks.
# Note: using `command test` instead of `test` because `test -t 1`
# doesn't seem to work right.
# Note: grab the size from the stdout terminal in case it's somehow
# different than the stdin of fish.
set -l cols
# use fd 3 to copy our stdout because we need to pipe the output of stty
begin
# use fd 3 to copy our stdout because we need to pipe the output of stty
stty size 0<&3 | read _ cols
end 3<&1
end
if test -n "$cols"
set cols (expr $cols - 4) # leave a bit of space on the right
set rLL -rLL=$cols[1]n
end