diff --git a/share/functions/__fish_cancel_commandline.fish b/share/functions/__fish_cancel_commandline.fish index 23c76aa78..79bc3b302 100644 --- a/share/functions/__fish_cancel_commandline.fish +++ b/share/functions/__fish_cancel_commandline.fish @@ -1,27 +1,30 @@ +function __fish_setup_cancel_text -v fish_color_cancel -v fish_color_normal + set -g __fish_cancel_text "^C" + if set -q fish_color_cancel + set __fish_cancel_text (echo -sn (set_color $fish_color_cancel) $__fish_cancel_text (set_color normal)) + end + if command -sq tput + # Clear to EOL (to erase any autosuggestions) + set __fish_cancel_text (echo -sn $__fish_cancel_text (tput el; or tput ce)) + end +end +__fish_setup_cancel_text + # This is meant to be bound to something like \cC. function __fish_cancel_commandline - # Close the pager if it's open (#4298) - commandline -f cancel - set -l cmd (commandline) if test -n "$cmd" - commandline -C 1000000 - if set -q fish_color_cancel - echo -ns (set_color $fish_color_cancel) "^C" (set_color normal) - else - echo -ns "^C" - end - if command -sq tput - # Clear to EOL (to erase any autosuggestion). - echo -n (tput el; or tput ce) - end - for i in (seq (commandline -L)) - echo "" - end + echo -sn $__fish_cancel_text + # `commandline -L` prints the line the cursor is on (starting from the prompt), so move the cursor + # "to the end" then call `commandline -L` to get the total number of lines typed in at the prompt. + commandline -C 10000000 + printf (string repeat -n (commandline -L) "\n") commandline "" emit fish_cancel end - # Repaint even if we haven't cancelled anything, - # so the prompt refreshes and the terminal scrolls to it. - commandline -f repaint + + # cancel: Close the pager if it's open (#4298) + # repaint: Repaint even if we haven't cancelled anything so the prompt refreshes + # and the terminal scrolls to it. + commandline -f cancel -f repaint end