warpdotdev / Warp

Warp is a modern, Rust-based terminal with AI built in so you and your team can build great software, faster.
https://warp.dev
Other
20.2k stars 333 forks source link

Fish prompt does not show when I create a new terminal tab #4951

Open mearleycf opened 1 month ago

mearleycf commented 1 month ago

Dupe Check

Describe the bug

Basically, whenever I create a new tab in Warp, the fish prompt does not appear. No part of it--the file path part, the > part, or the right prompt part--none of it is present. I see a brief flash of the text "Starting fish...", then it goes away. Now--I can type in commands, and everything works, and as soon as I type in basically any command (valid or invalid), the prompts all appear correctly, and stick around. The problem does not occur if I source my config.fish file, or run exec fish. It only happens when opening a new tab.

To reproduce

  1. Start Warp.
  2. Open a new tab.

Expected behavior

I expect to see the standard fish prompt that I've defined in fish_prompt.fish and fish_right_prompt.fish (or whatever those files are named).

Screenshots

CleanShot 2024-05-24 at 11 17 40

Operating system

MacOS

Operating system and version

macOS Sonoma 14.5

Shell Version

fish, version 3.7.1

Current Warp version

v0.2024.05.21.16.09.stable_02

Regression

No, this bug or issue has existed throughout my experience using Warp

Recent working Warp date

Don't know

Additional context

This is my config.fish, but it should be noted that this problem was occurring when my config.fish was empty, so I don't think that's it.

    # Commands to run in interactive sessions can go here
end

# source various functions
source ~/.config/fish/functions/greeting.fish
source ~/.config/fish/functions/path_cleanup.fish

# display the greeting
greeting

# clean up the path to remove duplicates
path_cleanup

# initialize pyenv
if type -q pyenv
    pyenv init --path | source
    pyenv init - | source
    pyenv virtualenv-init - | source
end

# abbreviations
abbr -a sf 'source ~/.config/fish/config.fish'
abbr -a backupnpm '~/scripts/backup_npm_globals.sh'
abbr -a cleaner '~/scripts/cleanup_yarn.sh'
abbr -a sortsettings '~/scripts/sort_settings_json.mjs'
abbr -a ycc 'yarn cache clean'
abbr -a yb 'yarn build'
abbr -a yd 'yarn dev'```

I'm using Tide as my fish prompt, here is what it generated:
```function fish_prompt
end # In case this file gets loaded non-interactively, e.g by conda
status is-interactive || exit

_tide_remove_unusable_items
_tide_cache_variables
_tide_parent_dirs
source (functions --details _tide_pwd)

set -l prompt_var _tide_prompt_$fish_pid
set -U $prompt_var # Set var here so if we erase $prompt_var, bg job won't set a uvar

set_color normal | read -l color_normal
status fish-path | read -l fish_path

# _tide_repaint prevents us from creating a second background job
function _tide_refresh_prompt --on-variable $prompt_var --on-variable COLUMNS
    set -g _tide_repaint
    commandline -f repaint
end

if contains newline $_tide_left_items # two line prompt initialization
    test "$tide_prompt_add_newline_before" = true && set -l add_newline '\n'

    set_color $tide_prompt_color_frame_and_connection -b normal | read -l prompt_and_frame_color

    set -l column_offset 5
    test "$tide_left_prompt_frame_enabled" = true &&
        set -l top_left_frame "$prompt_and_frame_color╭─" &&
        set -l bot_left_frame "$prompt_and_frame_color╰─" &&
        set column_offset (math $column_offset-2)
    test "$tide_right_prompt_frame_enabled" = true &&
        set -l top_right_frame "$prompt_and_frame_color─╮" &&
        set -l bot_right_frame "$prompt_and_frame_color─╯" &&
        set column_offset (math $column_offset-2)

    if test "$tide_prompt_transient_enabled" = true
        eval "
function fish_prompt
    _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
        jobs -q && jobs -p | count | read -lx _tide_jobs
        $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_2_line_prompt)\" &
        builtin disown

        command kill \$_tide_last_pid 2>/dev/null
        set -g _tide_last_pid \$last_pid
    end

    if not set -q _tide_transient
        math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides

        echo -n $add_newline'$top_left_frame'(string replace @PWD@ (_tide_pwd) \"\$$prompt_var[1][1]\")'$prompt_and_frame_color'
        string repeat -Nm(math max 0, \$dist_btwn_sides-\$_tide_pwd_len) '$tide_prompt_icon_connection'

        echo \"\$$prompt_var[1][3]$top_right_frame\"
    end
    echo -n \e\[0J\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
end

function fish_right_prompt
    set -e _tide_transient || string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
end"
    else
        eval "
function fish_prompt
    _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
        jobs -q && jobs -p | count | read -lx _tide_jobs
        $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_2_line_prompt)\" &
        builtin disown

        command kill \$_tide_last_pid 2>/dev/null
        set -g _tide_last_pid \$last_pid
    end

    math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides

    echo -ns $add_newline'$top_left_frame'(string replace @PWD@ (_tide_pwd) \"\$$prompt_var[1][1]\")'$prompt_and_frame_color'
    string repeat -Nm(math max 0, \$dist_btwn_sides-\$_tide_pwd_len) '$tide_prompt_icon_connection'
    echo -ns \"\$$prompt_var[1][3]$top_right_frame\"\n\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
end

function fish_right_prompt
    string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
end"
    end
else # one line prompt initialization
    test "$tide_prompt_add_newline_before" = true && set -l add_newline '\0'

    math 5 -$tide_prompt_min_cols | read -l column_offset
    test $column_offset -ge 0 && set column_offset "+$column_offset"

    if test "$tide_prompt_transient_enabled" = true
        eval "
function fish_prompt
    set -lx _tide_status \$status
    _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
        jobs -q && jobs -p | count | read -lx _tide_jobs
        $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_1_line_prompt)\" &
        builtin disown

        command kill \$_tide_last_pid 2>/dev/null
        set -g _tide_last_pid \$last_pid
    end

    if set -q _tide_transient
        echo -n \e\[0J
        add_prefix= _tide_item_character
        echo -n '$color_normal '
    else
        math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][2]\")$column_offset | read -lx dist_btwn_sides
        string replace @PWD@ (_tide_pwd) $add_newline \$$prompt_var[1][1]'$color_normal '
    end
end

function fish_right_prompt
    set -e _tide_transient || string unescape \"\$$prompt_var[1][2]$color_normal\"
end"
    else
        eval "
function fish_prompt
    _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
        jobs -q && jobs -p | count | read -lx _tide_jobs
        $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_1_line_prompt)\" &
        builtin disown

        command kill \$_tide_last_pid 2>/dev/null
        set -g _tide_last_pid \$last_pid
    end

    math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][2]\")$column_offset | read -lx dist_btwn_sides
    string replace @PWD@ (_tide_pwd) $add_newline \$$prompt_var[1][1]'$color_normal '
end

function fish_right_prompt
    string unescape \"\$$prompt_var[1][2]$color_normal\"
end"
    end
end

eval "function _tide_on_fish_exit --on-event fish_exit
    set -e $prompt_var
end"

if test "$tide_prompt_transient_enabled" = true
    function _tide_enter_transient
        # If the commandline will be executed, or is empty
        if commandline --is-valid || test -z "$(commandline)"
            # Pager open usually means selecting, not running
            # Can be untrue, but it's better than the alternative
            if not commandline --paging-mode
                set -g _tide_transient
                set -g _tide_repaint
                commandline -f repaint
            end
        end
        commandline -f execute
    end

    bind \r _tide_enter_transient
    bind \n _tide_enter_transient
    bind -M insert \r _tide_enter_transient
    bind -M insert \n _tide_enter_transient
end

Does this block you from using Warp daily?

No

Is this a Warp specific issue? (i.e. does it happen in Terminal, iTerm, Kitty, etc.)

Yes, this I confirmed this only happens in Warp, not other terminals.

Warp Internal (ignore): linear-label:b9d78064-c89e-4973-b153-5178a31ee54e

None

dannyneira commented 1 month ago

Hey @mearleycf sorry about this issue. It appears to be related to the tide prompt not being supported at this time. Please see the complete list of supported prompts here. https://docs.warp.dev/appearance/prompt#custom-prompt-compatibility-table

You can put the tide code into the following conditional in the config.fish to disable it just for Warp.

# fish
if test "$TERM_PROGRAM" != "WarpTerminal"
    # Unsupported plugin/prompt code here (i.e. TIDE)
end