fix(fish): async starship
This commit is contained in:
143
modules/cli/shell/starship.fish
Normal file
143
modules/cli/shell/starship.fish
Normal file
@@ -0,0 +1,143 @@
|
||||
# This file is modified from:
|
||||
# https://github.com/tyler-stefani/starship/blob/main/conf.d/starship.fish
|
||||
# The MIT License can be found here:
|
||||
# https://github.com/tyler-stefani/starship/blob/main/LICENSE
|
||||
|
||||
status is-interactive
|
||||
or exit 0
|
||||
|
||||
# set temp file and signal for async prompts
|
||||
if test -n "$XDG_RUNTIME_DIR"
|
||||
set -g starship_temp_dir "$XDG_RUNTIME_DIR"/fish-async-prompt
|
||||
else
|
||||
set -g starship_temp_dir /tmp/fish-async-prompt
|
||||
end
|
||||
mkdir -p "$starship_temp_dir"
|
||||
set -g starship_temp_file "$starship_temp_dir"/"$fish_pid"_last_prompt
|
||||
set -g starship_async_signal SIGUSR1
|
||||
|
||||
function fish_prompt
|
||||
if test "$TRANSIENT" = "1"
|
||||
starship_transient_prompt_func
|
||||
else if test -e $starship_temp_file
|
||||
cat $starship_temp_file
|
||||
else
|
||||
starship_transient_prompt_func
|
||||
end
|
||||
end
|
||||
|
||||
function starship_transient_prompt_func
|
||||
# Clear from cursor to end of screen as `commandline -f repaint` does not do this
|
||||
# See https://github.com/fish-shell/fish-shell/issues/8418
|
||||
printf \e\[0J
|
||||
starship module character
|
||||
end
|
||||
|
||||
|
||||
function fish_right_prompt
|
||||
switch "$fish_key_bindings"
|
||||
case fish_hybrid_key_bindings fish_vi_key_bindings
|
||||
set STARSHIP_KEYMAP "$fish_bind_mode"
|
||||
case '*'
|
||||
set STARSHIP_KEYMAP insert
|
||||
end
|
||||
set STARSHIP_CMD_PIPESTATUS $pipestatus
|
||||
set STARSHIP_CMD_STATUS $status
|
||||
# Account for changes in variable name between v2.7 and v3.0
|
||||
set STARSHIP_DURATION "$CMD_DURATION$cmd_duration"
|
||||
set STARSHIP_JOBS (count (jobs -p))
|
||||
if test "$TRANSIENT" = "1"
|
||||
if type -q starship_transient_rprompt_func
|
||||
starship_transient_rprompt_func
|
||||
else
|
||||
printf ""
|
||||
end
|
||||
else
|
||||
starship prompt --right --terminal-width="$COLUMNS" --status=$STARSHIP_CMD_STATUS --pipestatus="$STARSHIP_CMD_PIPESTATUS" --keymap=$STARSHIP_KEYMAP --cmd-duration=$STARSHIP_DURATION --jobs=$STARSHIP_JOBS
|
||||
end
|
||||
end
|
||||
|
||||
# Disable virtualenv prompt, it breaks starship
|
||||
set -g VIRTUAL_ENV_DISABLE_PROMPT 1
|
||||
|
||||
# Remove default mode prompt
|
||||
builtin functions -e fish_mode_prompt
|
||||
|
||||
set -gx STARSHIP_SHELL fish
|
||||
|
||||
# Transience related functions
|
||||
function reset-transient --on-event fish_postexec
|
||||
set -g TRANSIENT 0
|
||||
end
|
||||
|
||||
function transient_execute
|
||||
if commandline --is-valid
|
||||
set -g TRANSIENT 1
|
||||
commandline -f repaint
|
||||
else
|
||||
set -g TRANSIENT 0
|
||||
end
|
||||
commandline -f execute
|
||||
end
|
||||
|
||||
function transient_cancel
|
||||
if string length -q -- (commandline)
|
||||
set -g TRANSIENT 1
|
||||
commandline -f repaint
|
||||
end
|
||||
commandline -f cancel-commandline
|
||||
end
|
||||
|
||||
# --user is the default, but listed anyway to make it explicit.
|
||||
function enable_transience --description 'enable transient prompt keybindings'
|
||||
bind --user \r transient_execute
|
||||
bind --user -M insert \r transient_execute
|
||||
bind --user \cc transient_cancel
|
||||
end
|
||||
|
||||
# Erase the transient prompt related key bindings.
|
||||
# --user is the default, but listed anyway to make it explicit.
|
||||
# Erasing a user binding will revert to the preset.
|
||||
function disable_transience --description 'remove transient prompt keybindings'
|
||||
bind --user -e \r
|
||||
bind --user -M insert -e \r
|
||||
bind --user -e \cc
|
||||
end
|
||||
|
||||
# Set up the session key that will be used to store logs
|
||||
# We don't use `random [min] [max]` because it is unavailable in older versions of fish shell
|
||||
set -gx STARSHIP_SESSION_KEY (string sub -s1 -l16 (random)(random)(random)(random)(random)0000000000000000)
|
||||
|
||||
# async related functions
|
||||
function write_prompt_to_temp --on-event fish_prompt
|
||||
switch "$fish_key_bindings"
|
||||
case fish_hybrid_key_bindings fish_vi_key_bindings
|
||||
set STARSHIP_KEYMAP "$fish_bind_mode"
|
||||
case '*'
|
||||
set STARSHIP_KEYMAP insert
|
||||
end
|
||||
set STARSHIP_CMD_PIPESTATUS $pipestatus
|
||||
set STARSHIP_CMD_STATUS $status
|
||||
# Account for changes in variable name between v2.7 and v3.0
|
||||
set STARSHIP_DURATION "$CMD_DURATION$cmd_duration"
|
||||
set STARSHIP_JOBS (count (jobs -p))
|
||||
|
||||
# MODIFIED: '"$STARSHIP_CMD_PIPESTATUS"' -> '$STARSHIP_CMD_PIPESTATUS'
|
||||
fish -c 'starship prompt \
|
||||
--terminal-width='"$COLUMNS"' \
|
||||
--status='$STARSHIP_CMD_STATUS' \
|
||||
--pipestatus='$STARSHIP_CMD_PIPESTATUS' \
|
||||
--keymap='$STARSHIP_KEYMAP' \
|
||||
--cmd-duration='$STARSHIP_DURATION' \
|
||||
--jobs='$STARSHIP_JOBS' > '$starship_temp_file' \
|
||||
&& kill -s '"$starship_async_signal"' '"$fish_pid"'' &
|
||||
disown
|
||||
end
|
||||
|
||||
function repaint_prompt_on_signal --on-signal "$starship_async_signal"
|
||||
commandline -f repaint
|
||||
end
|
||||
|
||||
function remove_temp_prompt_on_exit --on-event fish_exit
|
||||
rm -f $starship_temp_file
|
||||
end
|
||||
Reference in New Issue
Block a user