fish-shell/tests/checks/tmux-prompt.fish
Johannes Altmanninger 5ba21cd290 Send repaint requests through the input queue again
Another consequence of a583fe723 ("commandline -f foo" to skip queue
and execute immediately, 2024-04-08) is that "commandline -f repaint"
will paint the prompt with the current value of $status which might be
set from a shell command in a the currently executing binding, instead of
waiting for the top-level status. This is wrong, at least historically. It
surfaces in bindings like alt-w which always paint a status value of [1]
when on single-lines commandlines.

Another regression is that a redundant repaint in a signal handler outputs
an extra prompt.

Fix both by making repaint commands go over the input queue again.  This way,
they are always run with a good commandline state.  There is no need to
repaint immediately because I don't think anyone has a data dependency on it
(we currently don't expose the prompt string), it's only for rendering.
2024-04-19 12:05:27 +02:00

38 lines
899 B
Fish

#RUN: %fish %s
#REQUIRES: command -v tmux
set -g isolated_tmux_fish_extra_args -C '
function fish_prompt
printf "prompt $status_generation> <status=$status> <$prompt_var> "
set prompt_var ''
end
function on_prompt_var --on-variable prompt_var
commandline -f repaint
end
function token-info
__fish_echo echo "current token is <$(commandline -t)>"
end
bind ctrl-g token-info
'
isolated-tmux-start
isolated-tmux capture-pane -p
# CHECK: prompt 0> <status=0> <>
set -q CI && set sleep sleep 10
set -U prompt_var changed
tmux-sleep
isolated-tmux send-keys Enter
# CHECK: prompt 0> <status=0> <changed>
isolated-tmux send-keys echo Space 123
tmux-sleep
isolated-tmux send-keys C-g
# CHECK: prompt 0> <status=0> <> echo 123
# CHECK: current token is <123>
# CHECK: prompt 0> <status=0> <> echo 123
tmux-sleep
isolated-tmux capture-pane -p