ほとんどの変数は、ローカルマシン上の状況を反映しています。リモートのデフォルトディレクトリを持つバッファで操作する場合、多くの場合、別の値を使用する必要があります。shell を呼び出した際の動作を考えてみてください。ローカルマシンでは /bin/bash を使用して termcap に依存するかもしれませんが、リモートマシンでは /bin/ksh と terminfo になる可能性があります。
これは接続ローカル変数を用いて実現できます。こうした変数は、現在のバッファのdefault-directoryの値に応じて宣言されます。バッファにリモートのdefault-directoryがあり、かつdefault-directoryに一致する接続ローカル変数が存在する場合、その変数の代替値が使用されます。ディレクトリおよびファイルローカル変数は、接続ローカル変数よりも優先されます。安全でない接続ローカル変数は、安全でないファイルローカル変数と同様に扱われます(ファイル変数の安全性を参照)。
接続ローカル変数は、connection-local-set-profile-variables
関数を用いて、プロファイル 内の変数と値のペアの集合として宣言されます。connection-local-set-profiles
関数は、指定された条件(第1引数)に基づいてプロファイルを宣言し、現在のバッファの default-directory を参照してリモートマシンを特定します:
(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は、ホスト名として文字列"remotemachine"に一致するリモートdefault-directoryを持つすべてのバッファに適用されます。
connection-local-set-profiles の第1引数である criteria
は、プロファイルが default-directory
とどのように一致するかを指定します。これは、接続と、その接続を使用するアプリケーションを特定する plist です。プロパティ名には :application、:protocol、:user、:machine などが用いられます。:application
のプロパティ値はシンボルであり、それ以外のプロパティ値はすべて文字列です。一般的に、シンボル tramp を :application
の値として使用すべきです。一部のパッケージでは異なる :application(例えば eshell や vc-git)を使用しており、その場合はドキュメントにその旨が記載されています。すべてのプロパティは省略可能です。
その他のプロパティは default-directory のチェックに使用されます。プロパティ
:protocol はリモート default-directory が使用するメソッドに、プロパティ :user はリモートユーザー名に、プロパティ :machine はリモートホスト名にそれぞれ使用されます。すべてのチェックは string-equal を介して行われます。nil
の条件は、リモートのデフォルトディレクトリを持つすべてのバッファに一致します。
コネクションローカル変数は、デフォルトでは有効になりません。コネクションローカル変数を使用するパッケージは、特定のバッファに対してそれらを有効にし、どの
:application で使用するかを指定する必要があります。詳細については、The Emacs Lisp Reference Manual の Applying
Connection Local Variables を参照してください。
上記のプロファイルの定義およびその有効化を踏まえ、Trampが‘remotemachine’システムに対して行うあらゆる接続では、
t を system-uses-terminfo
の接続固有の値として、
comint-terminfo-terminal の接続固有の値としての ‘dumb-emacs-ansi’、
shell-file-nameの接続固有の値として、
shell-command-switch の接続固有の値としての ‘-c’。
同一の変数で異なるプロファイルを宣言し、それらのプロファイルに並列してマッチし得る条件を設定する場合はご注意ください。その際、どの変数値が使用されるかは規定されていません。
また、バッファ内で connection-local
変数を設定する際にも注意が必要です。これを行うと、その後バッファのメジャーモードが変更されます。メジャーモードの変更時にはすべてのバッファローカル変数が破棄されるため、connection-local
変数の値は失われてしまいます。これを防ぐには、該当する変数の permanent-local
シンボルプロパティを nil 以外に設定してください。