mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-04-24 03:21:15 -03:00
Our use of the terminfo database in /usr/share/terminfo/$TERM is both
1. a way for users to configure app behavior in their terminal (by
setting TERM, copying around and modifying terminfo files)
2. a way for terminal emulator developers to advertise support for
backwards-incompatible features that are not otherwise easily observable.
To 1: this is not ideal (it's very easy to break things). There's not many
things that realistically need configuration; let's use shell variables
instead.
To 2: in practice, feature-probing via terminfo is often wrong. There's not
many backwards-incompatible features that need this; for the ones that do
we can still use terminfo capabilities but query the terminal via XTGETTCAP
directly, skipping the file (which may not exist on the same system as
the terminal).
---
Get rid of terminfo. If anyone finds a $TERM where we need different behavior,
we can hardcode that into fish.
* Allow to override this with `fish_features=no-ignore-terminfo fish`
Not sure if we should document this, since it's supposed to be removed soon,
and if someone needs this (which we don't expect), we'd like to know.
* This is supported on a best-effort basis; it doesn't match the previous
behavior exactly. For simplicity of implementation, it will not change
the fact that we now:
* use parm_left_cursor (CSI Ps D) instead of cursor_left (CSI D) if
terminfo claims the former is supported
* no longer support eat_newline_glitch, which seems no longer present
on today's ConEmu and ConHost
* Tested as described in https://github.com/fish-shell/fish-shell/pull/11345#discussion_r2030121580
* add `man fish-terminal-compatibility` to state our assumptions.
This could help terminal emulator developers.
* assume `parm_up_cursor` is supported if the terminal supports XTGETTCAP
* Extract all control sequences to src/terminal_command.rs.
* Remove the "\x1b(B" prefix from EXIT_ATTRIBUTE_MODE. I doubt it's really
needed.
* assume it's generally okay to output 256 colors
Things have improved since commit 3669805627 (Improve compatibility with
0-16 color terminals., 2016-07-21).
Apparently almost every actively developed terminal supports it, including
Terminal.app and GNU screen.
* That is, we default `fish_term256` to true and keep it only as a way to
opt out of the the full 256 palette (e.g. switching to the 16-color
palette).
* `TERM=xterm-16color` has the same opt-out effect.
* `TERM` is generally ignored but add back basic compatiblity by turning
off color for "ansi-m", "linux-m" and "xterm-mono"; these are probably
not set accidentally.
* Since `TERM` is (mostly) ignored, we don't need the magic "xterm" in
tests. Unset it instead.
* Note that our pexpect tests used a dumb terminal because:
1. it makes fish do a full redraw of the commandline everytime, making it
easier to write assertions.
2. it disables all control sequences for colors, etc, which we usually
don't want to test explicitly.
I don't think TERM=dumb has any other use, so it would be better
to print escape sequences unconditionally, and strip them in
the test driver (leaving this for later, since it's a bit more involved).
Closes #11344
Closes #11345
132 lines
3.8 KiB
Fish
132 lines
3.8 KiB
Fish
#RUN: %fish %s
|
|
status -b
|
|
and echo '"status -b" unexpectedly returned true at top level'
|
|
|
|
begin
|
|
status -b
|
|
or echo '"status -b" unexpectedly returned false inside a begin block'
|
|
end
|
|
|
|
status -l
|
|
and echo '"status -l" unexpectedly returned true for a non-login shell'
|
|
|
|
status -i
|
|
and echo '"status -i" unexpectedly returned true for a non-interactive shell'
|
|
|
|
status is-login
|
|
and echo '"status is-login" unexpectedly returned true for a non-login shell'
|
|
|
|
status is-interactive
|
|
and echo '"status is-interactive" unexpectedly returned true for a non-interactive shell'
|
|
|
|
# We should get an error message about an invalid combination of flags.
|
|
status --is-interactive --is-login
|
|
#CHECKERR: status: is-interactive is-login: options cannot be used together
|
|
|
|
# We should get an error message about an unexpected arg for `status
|
|
# is-block`.
|
|
status -b is-interactive
|
|
#CHECKERR: status: is-block is-interactive: options cannot be used together
|
|
# XXX this would be better if it referred to -b rather than what it is
|
|
|
|
# Try to set the job control to an invalid mode.
|
|
status job-control full1
|
|
#CHECKERR: status: Invalid job control mode 'full1'
|
|
status --job-control=1none
|
|
#CHECKERR: status: Invalid job control mode '1none'
|
|
|
|
# Now set it to a valid mode.
|
|
status job-control none
|
|
|
|
# Check status -u outside functions
|
|
status current-function
|
|
#CHECK: Not a function
|
|
|
|
function test_function
|
|
status current-function
|
|
end
|
|
|
|
test_function
|
|
#CHECK: test_function
|
|
eval test_function
|
|
#CHECK: test_function
|
|
|
|
# Future Feature Flags
|
|
status features
|
|
#CHECK: stderr-nocaret on 3.0 ^ no longer redirects stderr (historical, can no longer be changed)
|
|
#CHECK: qmark-noglob on 3.0 ? no longer globs
|
|
#CHECK: regex-easyesc on 3.1 string replace -r needs fewer \'s
|
|
#CHECK: ampersand-nobg-in-token on 3.4 & only backgrounds if followed by a separator
|
|
#CHECK: remove-percent-self off 4.0 %self is no longer expanded (use $fish_pid)
|
|
#CHECK: test-require-arg off 4.0 builtin test requires an argument
|
|
#CHECK: ignore-terminfo on 4.1 do not look up $TERM in terminfo database
|
|
status test-feature stderr-nocaret
|
|
echo $status
|
|
#CHECK: 0
|
|
status test-feature not-a-feature
|
|
echo $status
|
|
#CHECK: 2
|
|
|
|
# Ensure $status isn't reset before a function is executed
|
|
function echo_last
|
|
echo $status
|
|
end
|
|
|
|
false
|
|
echo_last
|
|
echo $status #1
|
|
#CHECK: 1
|
|
#CHECK: 0
|
|
|
|
# Verify that if swallows failure - see #1061
|
|
if false
|
|
end
|
|
echo $status
|
|
#CHECK: 0
|
|
|
|
# Verify errors from writes - see #7857.
|
|
if test -e /dev/full
|
|
# Failed writes to stdout produce 1.
|
|
echo foo > /dev/full
|
|
if test $status -ne 1
|
|
echo "Wrong status when writing to /dev/full"
|
|
end
|
|
|
|
# Here the builtin should fail with status 2,
|
|
# and also the write should fail with status 1.
|
|
# The builtin has precedence.
|
|
builtin string --not-a-valid-option 2> /dev/full
|
|
if test $status -ne 2
|
|
echo "Wrong status for failing builtin"
|
|
end
|
|
echo "Failed write tests finished"
|
|
else
|
|
echo "Failed write tests skipped"
|
|
echo "write: skipped" 1>&2
|
|
echo "write: skipped" 1>&2
|
|
end
|
|
# CHECK: Failed write tests {{finished|skipped}}
|
|
# CHECKERR: write: {{.*}}
|
|
# CHECKERR: write: {{.*}}
|
|
|
|
function test-stack-trace-main
|
|
status stack-trace
|
|
end
|
|
|
|
function test-stack-trace-other
|
|
test-stack-trace-main
|
|
end
|
|
|
|
printf "%s\n" (test-stack-trace-other | string replace \t '<TAB>')[1..4]
|
|
# CHECK: in function 'test-stack-trace-main'
|
|
# CHECK: <TAB>called on line {{\d+}} of file {{.*}}/status.fish
|
|
# CHECK: in function 'test-stack-trace-other'
|
|
# CHECK: <TAB>called on line {{\d+}} of file {{.*}}/status.fish
|
|
|
|
functions -c test-stack-trace-other test-stack-trace-copy
|
|
printf "%s\n" (test-stack-trace-copy | string replace \t '<TAB>')[1..4]
|
|
# CHECK: in function 'test-stack-trace-main'
|
|
# CHECK: <TAB>called on line {{\d+}} of file {{.*}}/status.fish
|
|
# CHECK: in function 'test-stack-trace-copy'
|
|
# CHECK: <TAB>called on line {{\d+}} of file {{.*}}/status.fish
|