« Linuxのファイルをデフラグするshakeを使ってみる | メイン | MacPortsのmacfuse関連がfuse4xに置き換わった模様 »

MacOSX LionでTerminalが復帰した時zshとsshでディレクトリを復帰させるメモ

MacOSX Lionではアプリの再起動を行う際以前の状態を戻してくれる機能が備わるようになりましたが、Terminal.appでもタブが復帰しbashは閉じる前のディレクトリに復帰してくれます。

ところがzsh, sshでは残念ながら同じことは出来ないので、どうにかできないか調べてみたメモ。

zshをresumeさせるには

まずzshではできないものか探してみるとbashでは/etc/bashrcにマジックがあったようで、同じ事を.zshrcに追加することで同じように閉じる以前のディレクトリに戻るようになるとのこと。

ほとんど書くことない感じでそのまま動きます。

sshでもディレクトリを復帰させるには

sshでも元いたディレクトリに復帰して欲しいと思ったのでやり方を思案してみました。少し不恰好ですがTERM_SESSION_IDを使ってディレクトリをファイルに記録しておくことに。

  1. Terminal.appでsshを開く際にshellは復帰されるが実行していたコマンドまではresumeしないので"新規コマンド"を使って開く か、[環境設定]->[設定]で起動時にsshを起動するエントリを追加作成(Basicをコピーすると楽)し開くようにする

  2. サーバ側には公開キーを渡す等してパスワード無しでログイン出来るようにしておく

  3. サーバ側の.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

  4. サーバに環境変数のTERM_PROGRAMとTERM_SESSION_IDを渡すようにする
    1. サーバ側の/etc/sshd_config
      113: AcceptEnv LANG LC_* TERM_PROGRAM TERM_SESSION_ID
    2. クライアント側の/etc/ssh_config
      21:  SendEnv LANG LC_* TERM_PROGRAM TERM_SESSION_ID

以上でTerminalコマンドが再起動してもssh先で元いたディレクトリに復帰するようになります。普通にログアウトして同じ端末から再ログインしても元いたディレクトリにcdしてしまうのでご注意。

bashでも/etc/bashrcを参考に.bash_profile等に記述すれば同じことが出来ると思います。

ホームディレクトリに.ZPWD_XXXというファイルがどんどん増えるのが問題なので一週間たつと消すようにしています。適当にいじってください。

追記:.zprofile追加スクリプトにミスがあったので修正

トラックバック

このエントリーのトラックバックURL:
http://blog.browncat.org/cgi-bin/mt/mt-tb-abc.cgi/936


コメントを投稿

(お書きになったコメントはすぐには表示されません。ご了承ください。)


About

2011年08月18日 23:36に投稿されたエントリーのページです。

ひとつ前の投稿は「Linuxのファイルをデフラグするshakeを使ってみる」です。

次の投稿は「MacPortsのmacfuse関連がfuse4xに置き換わった模様」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

           

カテゴリー

Powered by
Movable Type 3.36

Twitter


最近のエントリー

デル株式会社ads

注目エントリー