ほとんどの変数はローカルマシンの状況を反映します。リモートのデフォルトディレクトリーをもつバッファー操作時には、それらの変数が異なる値を使用しなければならないときが時折あります。shell
を呼び出す際の挙動について考えてみましょう。ローカルのマシンでは/bin/bashを使用してtermcapを用いるかもしれませんが、リモートのマシンでは/bin/kshとterminfoかもしれないのです。
これは接続ローカル変数(connection-local variables)で実現することができます。ディレクトリーローカル変数とファイルローカル変数は接続ローカル変数をオーバーライドします。安全ではない接続ローカル値は、安全でないファイルローカル値と同じ方法で扱われます(安全なファイル変数を参照してください)。
接続ローカル変数はconnection-local-set-profile-variables
関数を使用して変数/値ペアのグループとしてプロファイル(profile)内に宣言されます。関数connection-local-set-profiles
はリモートマシンを識別する与えられた条件にたいしてプロファイルをアクティブにします。
(connection-local-set-profile-variables 'remote-terminfo '((system-uses-terminfo . t) (comint-terminfo-terminal . "dumb-emacs-ansi"))) (connection-local-set-profile-variables 'remote-ksh '((shell-file-name . "/bin/ksh") (shell-command-switch . "-c"))) (connection-local-set-profile-variables 'remote-bash '((shell-file-name . "/bin/bash") (shell-command-switch . "-c"))) (connection-local-set-profiles '(:application tramp :machine "remotemachine") 'remote-terminfo 'remote-ksh)
このコードではremote-terminfo
、remote-ksh
そしてremote-bash
という3つの異なるプロファイルを宣言しています。プロファイルremote-terminfo
とremote-ksh
は、ホスト名がregexpの"remotemachine"
にマッチするリモートのデフォルトディレクトリーをもつすべてのバッファーに適用されます。このような条件はプロパティ:protocol
(Trampの手法)や:user
(リモートユーザー名)も区別できます。nil
という条件はリモートデフォルトディレクトリーをもつすべてのバッファーにマッチします。
同じ変数にたいして異なるプロファイルを宣言する際には、同時にマッチするかもしれない条件をプロファイルにセットしないように注意してください。その場合にはどちらの変数値が用いられるかは未定義です。
バッファーで接続ローカル変数をセットする際にも、その後にメジャーモードが変更されるので注意が必要です。メジャーモードを変更するとバッファーローカル変数はすべてkill
されるので、接続ローカル変数の値も失われます。対応する変数のシンボルプロパティpermanent-local
に非nil
をセットして、これを防ぐことができます。