QA@IT

git checkout したら、screen の全プロンプトで最新の現在のブランチを表示するには

3472 PV

bash, screen の設定の質問です。
.bashrc で以下のように設定し、__git_ps1 を使ってプロンプトに現在いるブランチを表示しています。

  export PS1="\[\033[1;36m\]\u@\h: \w\$(__git_ps1)$ \[\033[00m\]"

screen を使っていて、ブランチ bar にいて、git checkout foo した場合、そのコマンドを実行したターミナル表示 (foo) に変更されるのですが、別のターミナルに移動すると、リターン押下か何かコマンドを一つ実行しないと、checkout 先のブランチ名 foo にならず、bar のままです。この表示が誤操作の原因になることがありました。git checkout したら、screen の全プロンプトで最新の現在のブランチを表示する方法はないでしょうか。

たとえば以下のような、source ~/.bashrc を全プロンプトに反映する設定が参考になると思ったのですが、わかりませんでした。

# http://www.reddit.com/r/commandline/comments/12g76v/how_to_automatically_source_zshrc_in_all_open/
trap "source ~/.bashrc" USR1
alias source-bashrc-all="pkill -usr1 bash"

回答

追記しました。

正直あまり綺麗にいかなかったんですが、解決策の一つとして・・・。


if [ $TERM == "screen" ]; then
    trap "echo \$(__git_ps1);" USR1
else
    trap ":" USR1
fi

git-checkout(){ git checkout $@; pkill -usr1 bash; }

と .bashrc に記述しておき、git-checkout fooなどとチェックアウトすれば
各画面に __git_ps1()の値が表示されます。
プロンプトの再表示はできませんでしたがブランチが変わっているのに気づけないという問題には対処できるでしょう。

問題は関係ない画面も容赦なく表示されるところでしょうか・・・。

対象はTERMで screenだけにしぼってます。
\$(__git_ps1)$(__git_ps1)と書くとおそらく親のbashの __git_ps1()が取れますので注意してください。

ホントを言えば .screenrcにbacktickしこんでcaptionを更新してあげるというのが綺麗なんでしょうが、
(ウィンドウ名の更新と同じようにやれば可能じゃないかとは思います)
イヤでも気づくこちらを提示してみます。

エイリアスもハイフン込みでイケてないですが、気になるなら最初の引数で分岐してあげるようにしてgitのエイリアスにしてしまえば良いんじゃないかと思います。

(私 Mercurial使いで git使わないから気にならないのです、すいません)。

以下の環境で簡単に確認しました

# cat /etc/redhat-release
CentOS release 6.4 (Final)
# arch
x86_64
# screen -v
Screen version 4.00.03 (FAU) 23-Oct-06
# git --version
git version 1.7.1

以下は過去の回答

source ~/.bashrc で更新されてくれるかは確認してないですけど、

bashrcに

trap "source ~/.bashrc" USR1
git-checkout(){ git checkout $@; pkill -usr1 bash; }

としておいて
git checkout fooの代わりに
git-checkout foo
としたらどうなりますか?


これ以下はあまり価値がないので削除しました

編集 履歴 (3)
  • うまくゆきませんでした。別のターミナルでリターンを押下することでプロンプトが新しくなります。 -
  • 追記してみました。上手くいくかはわかりません。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。