ronakg
ronakg

Reputation: 4212

Sometimes cursor jumps to start of line in bash prompt

I have my bash prompt as defined in following script -

#!/bin/bash

if tput setaf 1 &> /dev/null; then
    tput sgr0; # reset colors
    bold=$(tput bold);
    reset=$(tput sgr0);
    black=$(tput setaf 235)
    red=$(tput setaf 1)
    green=$(tput setaf 142)
    yellow=$(tput setaf 214)
    blue=$(tput setaf 66)
    purple=$(tput setaf 175)
    cyan=$(tput setaf 37)
    gray=$(tput setaf 246)
    white=$(tput setaf 223)
    orange=$(tput setaf 208)
else
    bold='';
    reset="\e[0m";
    black="\e[1;30m";
    blue="\e[1;34m";
    cyan="\e[1;36m";
    green="\e[1;32m";
    orange="\e[1;33m";
    purple="\e[1;35m";
    red="\e[1;31m";
    violet="\e[1;35m";
    white="\e[1;37m";
    yellow="\e[1;33m";
fi;

# Highlight the user name when logged in as root.
if [[ "$USER" == "root" ]]; then
    userStyle="$red";
else
    userStyle="$orange";
fi;

# Highlight the hostname when connected via SSH.
if [[ "$SSH_TTY" ]]; then
    hostStyle="$green";
else
    hostStyle="$gray";
fi;

dirStyle="$cyan"

function prompt_command {
    ret_code=$?
    # Are we running in a shell invoked from Vim?
    if [[ "$VIM" ]]; then
        vim="(Vim) "
    else
        vim=""
    fi

    # Did last command return non-zero value?
    if [ "$ret_code" != 0 ]; then
        ret_str="\[$red\]$ret_code>"
    else
        ret_str="\[$green\]$"
    fi

    PS1="\[$userStyle\]\u \[$reset\]at \[$hostStyle\]\H \[$reset\]in \[$dirStyle\]\w\n\[$yellow\]$vim$ret_str\[$reset\] "
}
export PROMPT_COMMAND=prompt_command
export PS2="\[$blue\]continue -> \[$reset\]"

It's really simple, just username, hostname, current directory and couple of variables - one to check if shell was invoked from vim and other is return code of last command.

Sometimes the cursor jumps to start of line when I'm trying tab completion. I've not been able to find a pattern when exactly this happens.

This is how the prompt looks like -

rogandhi at sjc-ads-253 in ~/tools
$
rogandhi at sjc-ads-253 in ~/tools
$ adsf
-bash: adsf: command not found
rogandhi at sjc-ads-253 in ~/tools
127>

Looks like this when shell is invoked from vim -

rogandhi at sjc-ads-253 in ~/tools
(Vim) $
rogandhi at sjc-ads-253 in ~/tools
(Vim) $ asdf
bash: asdf: command not found
rogandhi at sjc-ads-253 in ~/tools
(Vim) 127>

Following is the output of declare -p PS1

rogandhi at sjc-ads-253 in ~/tools
$ declare -p PS1
declare -- PS1="\\[\\]\\u \\[\\]at \\[\\]\\H \\[\\]in \\[\\]\\w\\n\\[\\]\\[\\]\$\\[\\] "

Any ideas? How do I go about debugging this behavior?

Upvotes: 3

Views: 1771

Answers (1)

ronakg
ronakg

Reputation: 4212

The issue is that the $ in line ret_str="\[$green\]$" is not escaped.

Escaping the $ with a \ fixed the problem.

Fix:

ret_str="\[$green\]\$"

Upvotes: 3

Related Questions