MacOSX Lionではアプリの再起動を行う際以前の状態を戻してくれる機能が備わるようになりましたが、Terminal.appでもタブが復帰しbashは閉じる前のディレクトリに復帰してくれます。
ところがzsh, sshでは残念ながら同じことは出来ないので、どうにかできないか調べてみたメモ。
zshをresumeさせるには
まずzshではできないものか探してみるとbashでは/etc/bashrcにマジックがあったようで、同じ事を.zshrcに追加することで同じように閉じる以前のディレクトリに戻るようになるとのこと。
ほとんど書くことない感じでそのまま動きます。
sshでもディレクトリを復帰させるには
sshでも元いたディレクトリに復帰して欲しいと思ったのでやり方を思案してみました。少し不恰好ですがTERM_SESSION_IDを使ってディレクトリをファイルに記録しておくことに。
- Terminal.appでsshを開く際にshellは復帰されるが実行していたコマンドまではresumeしないので"新規コマンド"を使って開く
か、[環境設定]->[設定]で起動時にsshを起動するエントリを追加作成(Basicをコピーすると楽)し開くようにする
- サーバ側には公開キーを渡す等してパスワード無しでログイン出来るようにしておく
- サーバ側の.zshrcには上のリンクの設定は入れないで.zprofileに以下の設定を入れる
ついでにタイトルのホスト名も表示しとく
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] { [[ -e .ZPWD_$TERM_SESSION_ID ]] && cd `cat .ZPWD_$TERM_SESSION_ID`
function chpwd {
local SEARCH=' '
local REPLACE='%20'
local PWD_URL="file://$HOST${PWD//$SEARCH/$REPLACE}"
printf '\e]7;%s\a' $PWD_URL
[[ -n "$SSH_CLIENT" ]] && echo $PWD > ~/.ZPWD_$TERM_SESSION_ID
}
find ~ -maxdepth 1 -mtime +7 -name .ZPWD\* -exec rm {} \;
chpwd
}
if [[ -n $PS1 ]]; then
h=$HOST
echo -n -e "\033]0;$h\007"
alias chtitle='echo -n -e "\033]0;$@\007"'
fi
- サーバに環境変数のTERM_PROGRAMとTERM_SESSION_IDを渡すようにする
- サーバ側の/etc/sshd_config
113: AcceptEnv LANG LC_* TERM_PROGRAM TERM_SESSION_ID
- クライアント側の/etc/ssh_config
21: SendEnv LANG LC_* TERM_PROGRAM TERM_SESSION_ID
- サーバ側の/etc/sshd_config
以上でTerminalコマンドが再起動してもssh先で元いたディレクトリに復帰するようになります。普通にログアウトして同じ端末から再ログインしても元いたディレクトリにcdしてしまうのでご注意。
bashでも/etc/bashrcを参考に.bash_profile等に記述すれば同じことが出来ると思います。
ホームディレクトリに.ZPWD_XXXというファイルがどんどん増えるのが問題なので一週間たつと消すようにしています。適当にいじってください。
追記:.zprofile追加スクリプトにミスがあったので修正