diff options
-rw-r--r-- | builtin.cpp | 9 | ||||
-rw-r--r-- | share/functions/__fish_print_help.fish | 17 |
2 files changed, 22 insertions, 4 deletions
diff --git a/builtin.cpp b/builtin.cpp index a01c2519..e4f276f9 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -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++) diff --git a/share/functions/__fish_print_help.fish b/share/functions/__fish_print_help.fish index 46246e34..0af723ba 100644 --- a/share/functions/__fish_print_help.fish +++ b/share/functions/__fish_print_help.fish @@ -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 |