2016-05-24 40 views
1

我有我的bash提示符,如下面的腳本定義 -有時光標跳到行首在bash提示符

#!/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\]" 

它很簡單,只需用戶名,主機名,當前目錄和幾個變量 - 一個檢查如果從vim調用shell,而其他則是最後一個命令的返回碼。

有時光標會跳到行首,當我嘗試完成標籤頁時。在發生這種情況時,我一直無法找到模式。

這是提示的樣子 -

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> 

貌似這個當外殼由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> 

以下是declare -p PS1

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

任何輸出想法?我如何去調試這種行爲?

+0

爲什麼周圍的換行有括號? –

+0

當您設置'PS1 =「>>>」'時,是否會發生這種情況? – hek2mgl

+0

@ IgnacioVazquez-Abrams當我在'\ n'周圍添加括號時,光標跳轉發生得不那麼頻繁。 – ronakg

回答

1

問題是行ret_str="\[$green\]$"未被轉義。

\轉義$解決了這個問題。

修復:

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