先日、 ssh接続先でローカルのbashrcを使うシェル芸 というのを書いたのだが、同じような方法を使えばvimrcやtmuxの設定ファイルも持っていけることに気づいた。 bashの--rcfileオプションのように、vimでも-uオプションで使用するvimrcファイルを指定できるので、bashと同じようにプロセス置換を利用してやればいい。

ただ、vimrcやtmux.confの場合、bashrcのように1回だけ読み込ませればそれでおしまいにはならない。 コマンドを実行するたびに設定ファイルを読み込むことになるので、起動してつなげっぱなしのbashとはすこしやり方が異なる。 vimやtmuxでやる場合、ローカルのvimrcやtmux.confの内容をbase64化して、それをプロセス置換で復号化したものを読み込むようなfunctionをbashrcとして登録して、それをaliasで指定してやればいい。ここで利用するvimやtmuxのfunctionも事前に作っておく必要はなく、sshコマンド実行時にそのまま生成させることができる。

ssh -t user@host '
    bash --rcfile <(
        echo -e ' $(cat <(echo "function lvim() { vim -u <(echo "$(cat ~/.vimrc|base64)"|base64 -d) \$@ ; }") \
                        ~/dotfiles/{.bashrc,sh_function,sh_alias,bash_prompt} \
                        <(echo -e alias vim=lvim) | \
                        base64
                   ) ' \
        |base64 -d)'

ここでは、3行目の処理でvimrcのfunctionを作成し、4行目でローカルにあるbashrcやプロンプトの設定ファイル等を読み込ませている。 そして、5行目でvimのエイリアスだけを単独で読み込ませている。

あまりにも設定ファイルのサイズが大きいと接続する際に遅くなりそうだけど、読み込ませるのはbashrcやvimrcのファイルなので、よほどのことがなければそこまで大きいサイズになることもないだろう。 プロセス置換でbashに読み込ませているので、影響範囲は接続中のセッションのみになることから、共有アカウントで利用しても他の利用者には影響が無い(ファイルも吐かないので)。

ちなみに、注意事項としては上記のコマンドはMacで作ってるので、Linuxクライアントの場合は以下のようにbase64にオプションが必要になる。

ssh -t user@host '
    bash --rcfile <(
        echo -e ' $(cat <(echo "function lvim() { vim -u <(echo "$(cat ~/.vimrc|base64)"|base64 -d) \$@ ; }") \
                        ~/dotfiles/{.bashrc,sh_function,sh_alias,bash_prompt} \
                        <(echo -e alias vim=lvim) | \
                        base64 -w0
                   ) ' \
        |base64 -d)'