2012年3月31日土曜日

zshとscreenを少し便利にした。主にgit向け。

メインの開発環境が git になり、かつ複数の作業を平行してやってるため、「あ、しまった。この変更はこのブランチじゃなかった」と今週だけで 3 回は叫び、git stash -> git checkout XXX -> git stash pop を繰り返してしまった。

会社の他の人のターミナルを盗み見ると、プロンプトの一部にブランチ名を表示している人が多かったので、やり方を調べてブログにまとめよう・・・と思ったが、すでに A Zsh prompt for Git users という素晴らしい記事があり、このとおりに設定できてしまったので、書くことがない。

現在のターミナルはこんな感じ。zsh であることを見せびらかすように、ブランチ名は右プロンプトに、目立つように赤で表示させた。ついでに時刻も表示させた。「この処理何分かかったっけ」と考えることがたまにあったので。普段は幅 180 カラムで使ってるので、これでも全然狭くない。
ついでに GNU screen のステータスバーの表示も少し見直した。直前のコマンドが "cd" なら異動先のディレクトリ名を表示、そうじゃなければコマンド名と第一引数を表示するようにした。ただし第一引数がハイフン '-' で始まる場合は引数は表示しない。(今考えるとこの特別扱い不要だな)

まず、GNU screen のステータスバーを表示するように .screenrc を設定する。
hardstatus alwayslastline "[%02c] %-w%{=b bw}%n %t%{-}%+w"

次に、preexec_update_screen_status というファイルを作り、
emulate -L zsh
local -a cmd; cmd=(${(z)2})
case $cmd[1] in
  cd)
      if [[ $#cmd -eq 2 ]]; then
        echo -n "^[k$cmd[2]^[\\"
      else
        echo -n "^[k$HOME^[\\"
      fi
      ;;
  *)
      if [[ $#cmd -eq 2 && ! ("$cmd[2]" =~ "-.*") ]]; then
        echo -n "^[k$cmd[1] $cmd[2]^[\\"
      else
        echo -n "^[k$cmd[1]^[\\"
      fi
      ;;
esac
と書いておく。"^[" はエスケープシークエンスなので注意。Emacs だと Ctrl+Q ESC で入力する。(このファイル自体もどこかからコピーした気がするが忘れてしまった)

ほとんど分かってないが、"^[k" と "^[\" で囲まれた文字列は、(普通に出力されるのではなく)ウィンドウのタイトルに設定されるようだ。で、hardstatus で設定した "%t" が、「ウィンドウのタイトルをステータスラインに表示する」という意味らしい。(余談だけど、エスケープシークエンス・コントロールシークエンスは複雑すぎて覚える気にならない)

最後に、この preexec_udpate_screen_status 関数を、コマンド実行直前に評価するように、以下の内容を .zshrc に追加する。
typeset -ga preexec_functions
case "$TERM" in
screen)
  preexec_functions+='preexec_update_screen_status'
  ;;
esac
$TERM で場合分けしないと、screen 使ってないときに表示が乱れる。

というようにツールを整備したので、来週は効率10倍で働いてコミット10倍します。あ、まだエイプリルフールじゃなかったか。来週は効率1.05倍で働いてコミット1.05倍します。[追記: 日本ではすでに 4/1 だった。]

zsh とか screen とかもっと便利に使える気がするが、あとどれだけ時間をかければ何が得られるのか分からないので時間のかけようがないのがつらいところだ。

0 件のコメント:

コメントを投稿