ウォンツテック

そでやまのーと

screen, zshメモ

GNU screenのコンフィグに「hardstatus alwayslastline ...」を書いていると一番下のラインにそのterminalのシェル(zshbash)の文字列が表示されるが、どこのterminalで何の作業をしているか忘れてしまった場合全て「zsh」などと表示されていて見分けがつかないので以下のように設定して「直前に打ち込んだコマンド」を表示させるようにする。
zshのみ設定可能です。

.zshrcに以下の設定を追加する。

if [ "$TERM" = "screen" ]; then
chpwd () { echo -n "^[_`dirs`^[\\" }
preexec() {
emulate -L zsh
local -a cmd; cmd=(${(z)2})
case $cmd[1] in
fg)
if (( $#cmd == 1 )); then
cmd=(builtin jobs -l %+)
else
cmd=(builtin jobs -l $cmd[2])
fi
;;
%*)
cmd=(builtin jobs -l $cmd[1])
;;
cd)
if (( $#cmd == 2)); then
cmd[1]=$cmd[2]
fi
;&
*)
echo -n "^[k$cmd[1]:t^[\\"
return
;;
esac

local -A jt; jt=(${(kv)jobtexts})

$cmd >>(read num rest
cmd=(${(z)${(e):-\$jt$num}})
echo -n "^[k$cmd[1]:t^[\\") 2>/dev/null
}
chpwd
fi

ここで設定上の注意が以下2点あります。
1. ^[ 記号は制御文字なのでそのままコピペしては正常に作動しないので以下のように入力する。
viでファイルを開きinsertモードにする。次にCtrl-vを押しESCを押す。すると制御文字「^[」が入力されます。
2. 「$TERM = ...」の所で.screenrcでカラー化のために「term xterm-256color」などとしている場合はこの設定箇所もそのように書き直す必要があります。