warpdotdev / warpdotdev/warp

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

Open
#4,951 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

area:window-tabs-panes bug needs-info ready-to-implement triaged
Dominant language
Rust
Stars
65.1k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the missing prompt when opening a new Warp tab on macOS Sonoma with fish 3.7.1, then compare it with sourcing config.fish or running exec fish. Trace Warp's fish startup handling, including the brief "Starting fish..." phase; done means the configured left and right prompts appear immediately in a new tab without requiring a command.

Written by the indexing model from the issue text.

Assessment

Tech stack
fish
Domain
cli
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.