From 06281c268d74a85d5b28e953bea251a2115f5568 Mon Sep 17 00:00:00 2001 From: Rashil Gandhi <46838874+rashil2000@users.noreply.github.com> Date: Fri, 9 Sep 2022 18:26:33 +0530 Subject: feat(fish): Enable left and right transience (#4204) * feat(fish): Enable left and right transience * Update README.md * Mention limitation --- docs/advanced-config/README.md | 35 ++++++++++++++++++++++++++++++++ src/init/starship.fish | 46 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/docs/advanced-config/README.md b/docs/advanced-config/README.md index e030cadf3..9718e94d9 100644 --- a/docs/advanced-config/README.md +++ b/docs/advanced-config/README.md @@ -71,6 +71,41 @@ end load(io.popen('starship init cmd'):read("*a"))() ``` +## TransientPrompt and TransientRightPrompt in Fish + +It is possible to replace the previous-printed prompt with a custom string. This +is useful in cases where all the prompt information is not always needed. To enable +this, run `enable_transience` in the shell session. To make it permanent, put +this statement in your `~/.config/fish/config.fish`. Transience can be disabled on-the-fly with +`disable_transience`. + +Note that in case of Fish, the transient prompt is only printed if the commandline is non-empty, +and syntactically correct. + +- By default, the left side of input gets replaced with a bold-green `❯`. To customize this, + define a new function called `starship_transient_prompt_func`. For example, to + display Starship's `character` module here, you would do + +```fish +function starship_transient_prompt_func + starship module character +end +starship init fish | source +enable_transience +``` + +- By default, the right side of input is empty. To customize this, define a new + function called `starship_transient_rprompt_func`. For example, to display + the time at which the last command was started here, you would do + +```fish +function starship_transient_rprompt_func + starship module time +end +starship init fish | source +enable_transience +``` + ## Custom pre-prompt and pre-execution Commands in Cmd Clink provides extremely flexible APIs to run pre-prompt and pre-exec commands diff --git a/src/init/starship.fish b/src/init/starship.fish index 569968eba..b427ec243 100644 --- a/src/init/starship.fish +++ b/src/init/starship.fish @@ -10,7 +10,18 @@ function fish_prompt # 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)) - ::STARSHIP:: prompt --terminal-width="$COLUMNS" --status=$STARSHIP_CMD_STATUS --pipestatus="$STARSHIP_CMD_PIPESTATUS" --keymap=$STARSHIP_KEYMAP --cmd-duration=$STARSHIP_DURATION --jobs=$STARSHIP_JOBS + if test "$TRANSIENT" = "1" + # 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 + if type -q starship_transient_prompt_func + starship_transient_prompt_func + else + printf "\e[1;32m❯\e[0m " + end + else + ::STARSHIP:: prompt --terminal-width="$COLUMNS" --status=$STARSHIP_CMD_STATUS --pipestatus="$STARSHIP_CMD_PIPESTATUS" --keymap=$STARSHIP_KEYMAP --cmd-duration=$STARSHIP_DURATION --jobs=$STARSHIP_JOBS + end end function fish_right_prompt @@ -25,7 +36,15 @@ function fish_right_prompt # 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)) - ::STARSHIP:: prompt --right --terminal-width="$COLUMNS" --status=$STARSHIP_CMD_STATUS --pipestatus="$STARSHIP_CMD_PIPESTATUS" --keymap=$STARSHIP_KEYMAP --cmd-duration=$STARSHIP_DURATION --jobs=$STARSHIP_JOBS + 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 @@ -36,6 +55,29 @@ 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 enable_transience + bind \r transient_execute +end + +function disable_transience + bind \r execute +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) -- cgit v1.2.3