screen 提供多个 shell 来回切换是很方便,不过有时会忘记应该切换到哪个 window。如果可以根据执行的命令和当前目录来动态设置 window title 的话来回切换时就会可以方便的找到目标 window。其实 zsh-lovers 里就有说明。
screen 可以通过 echo 特殊的字符来设置 window 的 title,而 zsh 有两个特殊的函数 preexec 和 precmd,前者在用户输入命令按下回车但 zsh 还未执行命令前被调用,后者在 zsh 更新 prompt 前被调用(具体说明见 man zshmisc)。把 zsh 和 screen 的功能结合起来就可以在执行命令时把 screen window 的标题设置成当前执行的命令,而在 zsh 等待用户命令时,将 title 设置成当前目录。
先贴 zsh 的相关配置,PS1 的配置不喜欢可以去掉。
autoload colors colors case $TERM in screen*) function sctitle() { print -Pn "\ek$1\e\\"} function precmd() { sctitle "%20..>$1% 有时命令或者当前目录很长,screen 的 status bar 宽度会不够,zsh 有内置的截短字符串的功能,用 %20..>$1% startup_message off # use visual bell vbell off # replace Ctrl-A by ` escape `` # set a big scrolling buffer defscrollback 5000 # Set the caption on the bottom line caption always '%{= kg}[%{G}%H%{g}][%= %{= kw}%?%-Lw%?%{+b r}(%{y}%n %t%?(%u)%?%{r})%{= w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]' # %{= kG} first set default color (=), back ground black (k), foreground green (G) # [%{G}%H%{g}] color bright green, host name (%H), color green # [%= ...] padding (%=), window left to the current focus window if exists, # (current focus window with color yellow), window to the right of the # focus window # [%{B} %m/%d %{W}%c %{g}] color bright blue, month/date (%m%d), color bright white, # current time(%c), color green # open several terminals at startup screen 5 screen 4 screen 3 screen 2 screen 1
因为我用 vim,而且我觉得切换 window 时要按数字键,所以我把 escape 设置成 back tick。这个配置最关键的就是 caption 了,忘记从哪里 copy 过来的了(用 hardstatus 的话 screen 的消息也是在 hardstatus 上显示,所以我喜欢用 caption)。我直接在配置文件里加了点注释,语法很恶心,我都看晕了。关于 caption/hardstatus 里的转义字符说明见 man screen 的 string escape 一节。
试试看吧,这个配置还是很炫而且也蛮实用的。