EarOwlの日記: My .bashrc (の一部) 6
.bashrc に下記の function を書いて、 PS1 シェル変数に $(get_vcs_type) を入れている。
各種 VCS の作業ディレクトリに移動すると、プロンプトに VCS の種類が表示されて便利。
※#2558413・#2558528 の AC さんの指摘を受けて修正。
function get_vcs_type { if [[ `echo $PWD | grep "^$HOME/"` ]]; then
if [[ -z ${PWD/$HOME\/*/} ]]; then
local dir="$PWD"
local vcs
while [[ $dir != $HOME ]]; do
if [[ -d $dir/CVS ]]; then
echo "cvs"
return 0
fi
for vcs in bzr git hg svn; do
if [[ -d $dir/.$vcs ]]; then
echo "$vcs"
return 0
fi
done
dir="$(dirname "$dir")"
done
fi
}
補足...
上記の function の中身は、大元はどこかのサイトにあったものを、一部動作を自分なりに変更したものになります。
一番大きい変更は $HOME 以下のみを対象にしたこと。
$HOME 自身を対象外としているのは、ドットファイルをバージョン管理している場合、 $HOME に VCS のディレクトリがある状態になるだろう…と思ったからなのですが、調べてみたら通常はドットファイルをバージョン管理する場合でも $HOME 自身を作業ディレクトリにはしないのが一般的なんですね。
ちょっと重そう (スコア:0)
if [[ `echo $PWD | grep "^$HOME/"` ]]; then
は
if [ -z "${PWD/$HOME*/}" ]; then
と書いた方が軽いかも.
Re:ちょっと重そう (スコア:1)
${変数名#パターン} や ${変数名/置換前/置換後/} などで変数の展開時に部分削除や置換が出来るのは知りませんでした。ご教示いただきありがとうございます。
ただ、ご提示いただいた修正では誤りで、 if [[ -n ${PWD#$HOME} ]]; then が適切なようでしたので、こちらで修正しました。
Re:ちょっと重そう (スコア:1)
部分を削除/置換する機能はbashだけではなくてkshでもあったはず。bshはどうだったか忘れた。
そもそもそこまで細かいことはその都度調べれば足りるので暗記する気なし。
あと、echoその他もコマンド呼び出しとのトレードオフとか細かい話は昔からいろいろあるわけで。
Re:ちょっと重そう (スコア:1)
そういう機能があること自体を知らないばかりか、無いものと思い込んであまり調べもしていませんでした。あらためて勉強不足を痛感しました…
Re: (スコア:0)
if [[ -n ${PWD#$HOME} ]]; then
これだと /var とか /tmp 以下も処理対象になりませんか?
対象を $HOME 以下、かつ $HOME は除外したい、ということなら
if [ -z "${PWD/$HOME\/*/}" ]; then
ですかね
Re:ちょっと重そう (スコア:1)
その通りですね…というか自分が大きな勘違いをしていたことに今頃になって気付きました orz
ご提示いただいた方法はもちろん正解ですし、 #2558413 の方法も正解でした。
間違った答えを自信満々に言ってしまい、恥ずかしい…