zsh のプロンプト
ちょっとしたキッカケで、zsh のプロンプトをよしなにしたいと考えた。
結果こうしました、と言うお話。;
parse-git-branch() { local branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if [ -n "${branch}" ]; then [ "${branch}" = "HEAD" ] && local branch=$(git rev-parse --short HEAD 2>/dev/null) local statusis="$(git status --porcelain 2>/dev/null)" echo -n " on %F{6}${branch}%f" [ -n "${statusis}" ] && echo -n "%F{3}*%f" fi } PROMPT="%F{6}%n%f at %F{6}%m%f in %F{6}%c%f$(parse-git-branch) %# "
おそらく、こんな感じになるのんではなかろーか、思います。;
出典は、こちら。 ;
» mathiasbynens/dotfiles/.bash_prompt
えぇ、またもや、でございます。氏の dotfiles を参考にごちゃごちゃやっていたら、偶然、こちらの bash の設定を吸ったターミナルを見、「あ、こんなんしたい」と思いまして。
ここで、参考どころか、ほぼパクっております。恥知らず。
色々とキッカケと勉強させていただき、本当に感謝しきりです。
その他、助けて頂いたページもここに挙げておきたいと思います。;
- zsh のプロンプト、そのものについて。 ;
- てげてげきばる日記 zsh 設定 - プロンプト -
→ プロンプトで使えるエスケープ文字というのも分かり易くまとめられてて参考になりました。 - 漢のzsh (2) 取りあえず、プロンプトを整えておく。カッコつけたいからね | マイナビニュース
- てげてげきばる日記 zsh 設定 - プロンプト -
- zsh プロンプトの文字の色制御の方法について。 ;
- Zsh (日本語) > 3.10 プロンプトのカスタマイズ - ArchWiki
→$fg~
スタイル。 - 紹介マニアどらふと版 Zsh プロンプトの色設定
→ 《Zsh 4.1.12 に合せた設定方法》と言う事で、%~
なスタイル。
- Zsh (日本語) > 3.10 プロンプトのカスタマイズ - ArchWiki
- zsh プロンプトに git のブランチ名を出したいと考えて。 ;
- zshのプロンプトにgitのブランチ名とステータスを色で表示したい【zsh】【git】【PROMPT】 - DRYな備忘録
- git のブランチ名 と作業状態 を zsh の右プロンプトに表示+ status に応じて色もつけてみた - ヤルキデナイズドだった
- git current-branchで現在のブランチ名を返す - There's an echo in my head
→git rev-parse --abbrev-ref HEAD
って? で。 - Eagleの回路図にgitのコミットハッシュを埋め込む - maaash.jp
→git rev-parse --short HEAD
って? で。
- zsh プロンプト、色々その他。 ;
- zshの設定メモ - Webtech Walker
→ プロンプトを複数行にする方法、で。普通に改行すればよい。\n
などではない。
→ エスケープ文字は使わない。《エスケープ使うとコピペできないので》という記述に膝を打つ。
→colors
の意味を知る。これをロードすることで$fg[<colorname>]
がイケル。 - ShellScript - シェルスクリプト(sh bash zsh)で変数から変数へ代入する方法について - Qiita
→ zsh では、local <変数>="$(<式>)"
とすること。コマンド置換$()
を "" でクォート。
→ コマンド置換の結果にスペースがあった場合、スペース区切りが働き、困る。
- zshの設定メモ - Webtech Walker
- shellscript について新たに知った事。 ;
- bash のビルトインコマンド "local" について - いままでのこと
→local
。《明示的に local の変数だよーって宣言してあげる》こと。 - UNIXの部屋 コマンド検索 echo ( BSD Linux)
→-n
オプションは改行の抑止。 - bash zshにおける「[」(test)コマンドと複合コマンド「[[」との違いについて - 試験運用中なLinux備忘録
→ 《testコマンドで「=」を用いるのがよいようだ》、これ知った時泣きそうになった。
- bash のビルトインコマンド "local" について - いままでのこと
ハマったとこ、2 点ほど、ここにメモさせてください。
エラー = not found
→ test
、文字列の比較演算子の等価は =
この原因知った時、自分で自分に驚いた。
もうこんなこと二度と嫌なので、あえて自虐的に、ここに恥を晒します。
test
コマンドの文字列比較演算子の "等価" は ==
ではなく =
。
いつから、==
だと覚えた、と言うか、思い込んだのだろう...*1
エラーは、今回のケースですとこんな感じ。;
% parse-git-branch parse-git-branch:4: = not found
発生個所は、test コマンドの部分。;
[ "${branch}" == "HEAD" ] && local branch=$(git rev-parse --short HEAD 2>/dev/null)
これ間違い。
なお、文字列比較においてパターンへの一致を示す「=」はシェルによっては「==」と記述することもできる場合があるが、基本的に[(test)コマンドでは「==」と記述することはできない。
エラー not valid in this context:
→ クオートしてやる
もう一つ、ハマったエラーがこちら。 ;
% parse-git-branch parse-git-branch:local:5: not valid in this context: .vimrc
エラー発生個所は、この部分。 ;
local statusis=$(git status --porcelain 2>/dev/null)
答えは、
コマンド置換の記述部分を "" で囲んでやるといけた。
一応、困っていた時、やったこと。;
% cd dots % git status --porcelain M .vimrc M .zshrc
この結果見て、「あぁ、スペース区切りってやつね」と思う。
エラーの文字列で検索してみると、こんなのを見つける。
zshのオプションを調べたら、以下の設定をコメントアウトしたら、普通に動いた。
setopt sh_word_split
sh_word_split
と言うものの存在を知る。
しかし、そんな設定しているところ見当たらない。
で、今度は sh_word_split
で調べみる。
と、こちらに辿り着く。
そしてこの中で気になった、こんな記述。 ;
・zsh で変数宣言と同時に代入する場合はクォートが必要 (SH_WORD_SPLIT あり)
・zsh で変数宣言と同時にコマンド置換する場合はクォートが必要 (SH_WORD_SPLIT 関係なし)
こう言うことなのかしら、と、コマンド置換部分をクォーティング。
一応、思い通りの動作をしてくれた。
ちなみに今回のケースだと、さっきの sh_word_split
もへったくれもない、と言う事みたい。
ちなみにちなみに、zsh における sh_word_split
って何、って話は、コチラが分かり易かった。
と言うことで、怖い話これまで。
おしまい。