starship / starship

☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!
https://starship.rs
ISC License
44.18k stars 1.92k forks source link

No starship prompt in tcsh if 'direnv' gets initialized after starship #6093

Open chschmir opened 1 month ago

chschmir commented 1 month ago

Current Behavior

I am using tcsh with direnv and starship. When I initialize them in the following order

# file: .cshrc
eval `starship init tcsh`
eval `direnv hook tcsh`

direnv works, but I do not get a starship prompt.

If I initialize direnv first and then starship everything works as expected.

Expected Behavior

Both direnv and starship should work.

Environment

ekorchmar commented 1 month ago

This is direnv bug, not starship bug.

Both direnv and starship hook to tcsh by aliasing to precmd. However, direnv simply overwrites existing precmd:

    return "alias precmd 'eval `{{.SelfPath}} export tcsh`'", nil

And Starship respects existing hooks by wrapping them in USER_PRECMD and USER_POSTCMD:

$ /usr/bin/starship init tcsh --print-full-init
setenv STARSHIP_SHELL tcsh;
setenv STARSHIP_SESSION_KEY `/usr/bin/starship session`;
set USER_PRECMD = "`alias precmd`";
set USER_POSTCMD = "`alias postcmd`";
set STARSHIP_PRECMD = 'set STARSHIP_CMD_STATUS = $status;set STARSHIP_PATH = /usr/bin/starship;set STARSHIP_END_TIME = `$STARSHIP_PATH time`;set STARSHIP_DURATION = 0;if ( $STARSHIP_START_TIME != -1 ) @ STARSHIP_DURATION = $STARSHIP_END_TIME - $STARSHIP_START_TIME;set prompt = "`$STARSHIP_PATH prompt --status $STARSHIP_CMD_STATUS --cmd-duration $STARSHIP_DURATION`";set STARSHIP_START_TIME = -1';
set STARSHIP_POSTCMD = 'set STARSHIP_START_TIME = `/usr/bin/starship time`';
alias precmd "$STARSHIP_PRECMD;$USER_PRECMD";
alias postcmd "$STARSHIP_POSTCMD;$USER_POSTCMD";
set STARSHIP_START_TIME = `/usr/bin/starship time`;

If you init starship after direnv, both should work.