2016-09-03 5 views
2

これは私のためのbash-prompt-fiddling-timeです。背景色がBashプロンプトで行末まで伸びています

私は2ラインプロンプトを取得しようとしている:

    行の最後に位置情報、および背景色で
  • 第一ライン
  • 時間と前のコマンドの終了コードで
  • 2行目

私はほとんどそこにいますが、私は "行の終わりまでの背景色"の部分を解読することはできません。まあまあ。

いくつかの情報源からの情報をまとめて、最も重要なのはherehereですから、私はthis result (terminal screenshot)になります。それが第一ライン

  • 上のテキストの長さに依存
  • が、それは時に悪化する行の末尾に到達していない

    • :あなたが見ることができるように

      は、何かがCOLUMNSの計算で間違っていますターミナルの底に達する。それはラインの終わりに達します。間違った行...

    • 別の奇妙なもの:2番目のプロンプト行をブラケットしている小さな[]。そしてそれらはONLY A COMMANDが

    を入力した後これは私のbashrcにコードで表示されます。

    PROMPT_COMMAND=__prompt_command 
    __prompt_command() 
    { 
        local EXIT="$?" 
    
        local Red='\[\033[1;38;5;9m\]' 
        local Green='\[\033[1;38;5;10m\]' 
        local Gray='\[\033[0;38;5;248m\]' 
        local BgBlue='\[\033[48;5;253;1;38;5;12m\]' 
        local BgPurple='\[\033[48;5;253;1;38;5;93m\]' 
        local None='\[\e[0m\]' 
    
        PS1="${BgPurple}\[email protected]\h:${BgBlue}\$PWD" 
    
        printf -v TC_SPC "%${COLUMNS}s" '' 
    
        COLUMNS=$(tput cols) 
        PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"` 
    
        PS1+="\n${Gray}\D{%F %T}" 
    
        if [ $EXIT != 0 ]; then 
         PS1+=" ${Red} O_o ${None}"  # Add red if exit code non 0 
        else 
         PS1+="${Green} ^_^ ${None}" 
        fi 
    } 
    

    私はより多くのハッキングを試みたが、何もない成功。

    ああ、そこに私も試したのsedビット、他のより洗練されたバージョン:

    PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\([^\o033]\\{${COLUMNS}\\}\\) */\\1\\3/"` 
    

    Different result (terminal screenshot)まだありませんOK。

    この時点で私は助けを借りています!

    答えて

    0

    の代わりに:

    printf -v TC_SPC "%${COLUMNS}s" '' 
    
    COLUMNS=$(tput cols) 
    PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"` 
    

    使用:ここで

    PS1+=$'\033[K' #erase to end of line 
    
    +0

    ありがとうエリックは、完璧でとてもシンプルな...私は両方の行の後にこれを追加しなければならなかった、2番目は、端末の底に達するときに問題を解決するために必要でした。好奇心の外にあなたの提案に意図された「$」は何ですか?私はそれを試してみましたが、それを達成したようです。 – Peyo61

    +0

    bashでは、 '$ 'STRING''は一重引用符で囲まれた文字列に似ていますが、バックスラッシュでエスケープされたシーケンスに特別な意味を与えます。この場合、 '\ nnn'は"値が8進数のnnn(1〜3桁)の8ビット文字 "に置き換えられます。オクタル033はエスケープ文字です。'man bash'を見て、完全なリストについて' $ 'を探してください。 – Eric

    0

    は、実用的なソリューションは、エリックのヒント "行の最後に消去" のおかげです。

    PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs 
    __prompt_command() 
    { 
        local EXIT="$?"    # This needs to be first (retrieves last commmand exit code) 
    
        local Red='\[\033[1;38;5;9m\]' 
        local Green='\[\033[1;38;5;10m\]' 
        local Gray='\[\033[0;38;5;248m\]' 
        local BgBlue='\[\033[48;5;253;1;38;5;12m\]' 
        local BgPurple='\[\033[48;5;253;1;38;5;93m\]' 
        local None='\[\e[0m\]' 
    
        PS1="${BgPurple}\[email protected]\h:${BgBlue}\$PWD" 
        PS1+="\033[K"    # erase to end of 1st line (background color stays) 
    
        PS1+="\n${Gray}\D{%F %T}\a" 
    
        if [ $EXIT != 0 ]; then 
        PS1+="${Red} O_o ${None}" # Add red if exit code non 0 
        else 
        PS1+="${Green} ^_^ ${None}" 
        fi 
        PS1+="\033[K"    # erase to end of 2nd line (no more background color) 
    } 
    

    およびhere is the result (terminal screenshot)。もう1つ幸せなプロンプトの所有者...

    関連する問題