読者です 読者をやめる 読者になる 読者になる

screenとかzshとか

 久々にscreenとzshの設定をどっぷりやってました。現段階で.screenrcが118行、.zshrcが188行あるので全部はさらしませんが、screenまわりの設定をメモ代わりに上げてみようと思います。

.scrrenrc(一部のbindまわり+α)

hardstatus  alwayslastline " %-Lw%{=ub bw}%n %t%{-}%+Lw %=%{=b} %H %l %{-}"
caption     always         "%?%F%{= bW}%:%{= Kk}%?%2n%f%07=%t"

escape ^Gt

# window focus {{{2
bind                ^n eval next   'command -c term_region' 'echo "Change teminal"'
bind                ^p eval prev   'command -c term_region' 'echo "Change teminal"'
bind -c term_region ^n eval next   'command -c term_region' 'echo "Change teminal"'
bind -c term_region ^p eval prev   'command -c term_region' 'echo "Change teminal"'

bind -c term_region  q eval remove 'command -c term_region' 'echo "Change teminal"'
bind -c term_region ^i eval next   'command -c term_region' 'echo "Change teminal"'


bind                  h eval 'focus left'  'command -c focus_region' 'echo "Change window focus"'
bind                  j eval 'focus down'  'command -c focus_region' 'echo "Change window focus"'
bind                  k eval 'focus up'    'command -c focus_region' 'echo "Change window focus"'
bind                  l eval 'focus right' 'command -c focus_region' 'echo "Change window focus"'
bind -c focus_region  h eval 'focus left'  'command -c focus_region' 'echo "Change window focus"'
bind -c focus_region  j eval 'focus down'  'command -c focus_region' 'echo "Change window focus"'
bind -c focus_region  k eval 'focus up'    'command -c focus_region' 'echo "Change window focus"'
bind -c focus_region  l eval 'focus right' 'command -c focus_region' 'echo "Change window focus"'

bind -c focus_region  q eval remove        'command -c focus_region' 'echo "Change window focus"'
bind -c focus_region ^i eval focus         'command -c focus_region' 'echo "Change window focus"'

 この部分ではウィンドウ?の切り替えの設定ですが、^G ^n^n...と^nを連打するとウィンドウを順次切り替えられるようにしました。通常では^a^n ^a^nといちいちコマンドキーを押さないといけませんね。
 もう一つとしては、^G hjklでsplitしたウィンドウの切り替えが、これも連続的に移動できるように。通常では^a tabで順次切り替えってなってるやつです。


 余談ですが、ボクはgitからscreenのソースをコンパイルして使ってるので、バージョンが4.01.00になってます。このバージョンでは標準で縦に画面を分割したり、layout,groupという新しい概念が登場しています。
 縦に分割は結構使っている人が多いと思いますが、layout, groupはまだ機能が弱いような印象を受けました。できればcaptionにどのlayoutを使っているのか表示できるようになっていたら嬉しかったのですが。もうちょっと様子見ですね。

zshrc(screenに関する部分+α)

autoload -U add-zsh-hook
autoload -Uz vcs_info
autoload -Uz colors; colors

_update_vcs_info_msg() {
  psvar=()
  LANG=en_US.UTF-8 vcs_info
  [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"

  # for screen title
  local git_branch=`git branch 2>&1 | grep '^*' | sed -e 's/^* //'`
  if [[ -n "$git_branch" ]] then
    local dir_orig=`pwd`
    local dir=$dir_orig
    while [[ -n "$dir" ]] ; do
      if [[ -n "`ls -1aF $dir | grep .git/`" ]] then
        local relative_git_path="${${dir_orig#${dir}}#/}"
        screen -X title "${dir##*/}[$git_branch]:$relative_git_path"
        break
      fi
      local dir=${dir%/*}
    done
  fi
}
add-zsh-hook precmd _update_vcs_info_msg

_update_screen_name() {
  local ti=''
  : ${(A)cmd::=${=1}}
  case "$cmd[1]" in
    *) ti="$cmd[1]" ;;
  esac
  screen -X title "$ti"
}
add-zsh-hook preexec _update_screen_name

chpwd() {
  echo "$fg[red]`ls -A1 | wc -l | sed -e 's/ //g'` files$reset_color in $fg[green]`pwd`$reset_color"
}

_update_vcs_info_msg()という関数自体は以下のサイトを参考にさせてもらい、それにもうちょっと便利にする形で書き加えています。
zsh で Git の作業コピーに変更があるかどうかをプロンプトに表示する方法 - mollifier delta blog


git限定にはなってますが、作業ディレクトリに入るとこのようにtitleが変わります。

今いるディレクトリが~/zsh/Src/Mocdulesとなってまして、表示されているのが


"リボジトリルートのディレクトリ名[checkoutしているbranch]:リポジトリルートからの相対パス"


となるようにしてみました。タイトルが長くなってhardstatusが見づらくなってしまいましたが、代わりにcaptionが便利になったので良しとしましょう。

 _update_screen_name()はscreenのタイトルを直前にタイプしたコマンド名に変えるものです。よくpreexec()でechoからscreenのタイトルを動的に変えるって記事がありますが、echoからではうまくいかなかったのでやっつけで書き直しました。
 screenの-Xオプションを使うとscreenrc関係のコマンドが通るみたいで、こっちからタイトルを変えるようになってます。

chpwd()にはcd先のディレクトリにあるファイル数とパスを表示するようにしました。


 とまぁこんな具合で、より便利になったかなぁって感じになりました。これくらいで。