rwxr--r--
/dev/blog

Bez Hermoso, Software Engineer @ Square

I find it hard to remember if I stepped in to the shell from vim or not. I find myself attempting to open a file only to be told by vim that I already have the file open – indeed, I already was editing the file. I just forgot that I stepped into shell via :sh a few minutes before. Worst yet are the times when I typed exit on my shell thinking that I was coming vim, only to find I was wrong because terminal window closes.

I can’t be the only one.

I spent some time tweaking my Powerline config to get what I need: an indicator that tells me whether or not I am currently in vim shell or not. As you can see on the screenshot, this is indicated by a green segment with :sh in it.

I am using powerline-status to add use Powerline glyphs throughout my development tools like zsh, vim, and tmux.

Although powerline-status doesn’t come with a segment that is specifically addressed for this, you can repurpose the powerline.segments.common.env.environment segment to show an indicator based on whether or not the VIMRUNTIME environment variable is set.

Inside your ~/.zshrc (or .bashrc, .bash_profile or equivalent):

 
if [[ -n "$VIMRUNTIME" ]]; then
    export POWERLINE_VIM_SHELL_INDICATOR=':sh'
fi

Then register an environment segment inside your Powerline theme JSON file and tell it to display $POWERLINE_VIM_SHELL_INDICATOR.

For example, this is what your ~/.config/powerline/themes/shell/default.json could look like:

{
    "segments": {
        "left": [
            {
                "function": "powerline.segments.common.env.environment",
                "args": {
                    "variable": "POWERLINE_VIM_SHELL_INDICATOR"
                },
                "priority": 30
            },
    ...

Restart Powerline with powerline-daemon -rq to make sure the changes take effect. Open a file in vim, step into the shell via :sh, and you should see a green indicator as the left-most segment on your shell.

The only problem I had with this method though is that there isn’t a way to change the colors in with which the new segment is rendered with. Theoretically you can re-define the environment highlight group in your color-schemes JSON file, but this isn’t a viable solution if you use the environment segment multiple times and you want each of them styled differently.

vim-power

Just for kicks I wrote a tiny Python package which allows for easier configuration of vim shell indicators in Powerline by eliminating the need for adding variables into your environment and has the added benefit of being customizable via its own highlight group.

To get it just do:

 
$ pip install --user vim-power --pre

…and a new segment function vim_power.segments.in_vim_shell will be available for you to use. It can take an option argument text which you can use to override what to show in the segment when in vim shell i.e. :sh.

Now its just a matter of adding a definition for in_vim_shell in color scheme JSON file.

Here is what my ~/.config/powerline/colorschemes/default.json looks like:

{
    "name": "Default",
    "groups": {

        ...

        "in_vim_shell": { "fg": "gray0", "bg": "brightgreen", "attrs": ["bold"] }
    }
}

vim-power also comes with vim_power.segments.prompt_text, which I use to display the λ on my shell’s prompt with the ability to target it with styling using the prompt_text highlight group.

See my powerline-status config on GitHub if you want to dig around more:

https://github.com/bezhermoso/dotfiles/tree/master/.config/powerline

Peace!

comments powered by Disqus