jorgebucaran/hydro

Pre/Post prompt customization

mattmc3 opened this issue · 13 comments

@jorgebucaran - Are you open to a PR that would introduce two new variables into the prompt: a pre-prompt and a post-prompt like so...

set --query hydro_pre_prompt || set --global hydro_pre_prompt ""
set --query hydro_post_prompt || set --global hydro_post_prompt " "

The intent of the hydro_pre/post_prompt variables would be to allow users some to way to customize their prompt without having Hydro have to directly support all the customizations a user might dream up. For example, I like a more spacious prompt similar to Zsh's Pure, so I could get that by setting the pre-prompt variable to a new line in my config like so: set --global hydro_pre_prompt "\n".

Theoretically, with these variables a user could do whatever they wanted like adding a low battery indicator 🔋, or a python symbol 🐍 when they're in a python venv, or whatever - all without having to modify hydro itself. I'm open to other ideas on an implementation - just thought this would be a real simple change that would give the user more power in customizing their Hydro prompt.

The only change to Hydro in the PR to implement this would be adding those variables and then changing the fish_prompt function:

function fish_prompt
    echo -e "$hydro_pre_prompt...all-the-other-vars...$hydro_post_prompt"
end

@mattmc3 What would you like to set these to in practice? I just want to see how the prompt would look.

One more example using a post-prompt for to indicate a Python venv:

function VIRTUAL_ENV --on-variable VIRTUAL_ENV
    if test -n "$VIRTUAL_ENV"
        set -g fish_prompt_pwd_dir_length 1
        set -g hydro_pre_prompt ""
        set -g hydro_post_prompt "🐍 "
        set -g hydro_multiline false
    else
        set -g fish_prompt_pwd_dir_length -1
        set -g hydro_pre_prompt "\n"
        set -g hydro_post_prompt " "
        set -g hydro_multiline true
    end
end && VIRTUAL_ENV

Screen Shot 2022-06-17 at 9 50 33 PM

Thanks, @mattmc3. Would this feature also supersede hydro_multiline?

It could. In that case we'd need to deprecate/repurpose the multiline variable, and then if you wanted a more spacious prompt you'd do set --query hydro_pre_prompt || set --global hydro_pre_prompt "\n\n". Since deprecating a variable would be a breaking change, I'll leave that call to you.

See PR #36 for an alternative implementation that handles mutiline support.

Thank you, @mattmc3. I'm still not sure if I want to add this feature, but I'm thinking about it.

Question. Would a new "sparse" (as opposed to "compact") configuration variable solve your use case here? I'm not suggesting we add that yet, just curious.

The genesis of this request is from someplace else entirely. What I'm actually looking at is other prompts like Starship, which let you customize a ton of components of your prompt: https://starship.rs/config/#prompt. Starship isn't fast (at least, compared to Hydro), and I definitely don't think Hydro should become like Starship, but having a simple way to extend Hydro answers a lot of the customization need without putting additional burden on Hydro to support all-the-things the way the Starship devs have to.

The other option I was considering is forking out the clever git status portion of the prompt (similar to what Zsh has here: https://github.com/romkatv/gitstatus). Having these features separate would let Fish users compose a prompt of their choosing tailored to their specific needs, and makes the Ruby/Python/Node/Go/Rust/etc customizations available with a simple user-managed Fish script. This method seems overkill when Hydro does 95% of what I need in a prompt, but could use just a small hook or two to add customizations to it. Whitespace management is only one small part of that customization.

If there's another idea I hadn't considered, I'm open to that.

Fair enough. Should we also consider adding a right prompt?

Another option is introducing a new variable: $hydro_prompt_items. We would iterate over the list of items and figure out how to print the prompt from there. This would allow you not only to add new items but to reorder the built-in items.

set --global hydro_prompt_items _hydro_git _hydro_pwd _hydro_prompt
function fish_prompt --description Hydro
    if set --query hydro_prompt_items
        set --local prompt 
        for item in $hydro_prompt_items
            switch $item
                case _hydro_pwd
                    set prompt "$prompt$_hydro_color_pwd$_hydro_pwd$hydro_color_normal"
                case _hydro_git
                    set prompt "$prompt $_hydro_color_git$$_hydro_git$hydro_color_normal"
                case _hydro_cmd_duration
                    set prompt "$prompt$_hydro_color_duration$_hydro_cmd_duration$hydro_color_normal"
                case _hydro_prompt
                    set prompt "$prompt$_hydro_prompt$hydro_color_normal"
                case \*
                    echo set prompt "$prompt$_hydro_color_$$item$$item$hydro_color_normal"
            end
        end
        echo -e "$prompt "
    else
        echo -e "$_hydro_color_pwd$_hydro_pwd$hydro_color_normal $_hydro_color_git$$_hydro_git$hydro_color_normal$_hydro_color_duration$_hydro_cmd_duration$hydro_color_normal$_hydro_prompt$hydro_color_normal "
    end
end
main ~/C/@/hydro 1.3s ❱

I like that a lot. That’s a way better solution. Then the user just adds items, or overrides the prompt and displays the items themselves.

I think that's how Tide does it. I don't want to allow too much customization, though. I think Tide already excels at that.

Having said that, I'm not sure about this particular implementation yet. It's not slow, but it hurts perf a tiny bit, which I'd like to avoid or diminish somehow (if possible).

While I'm open to exploring the idea of addons, components, or whatever we want to call them (#37), I won't be introducing specific pre/post customization variables, so closing as not planned.