コネクションを意識したコードを記述する際は、コネクションローカルな変数を収集し、必要に応じて適用する必要があります。これを実現する方法はいくつかあり、以下に説明します。
この関数は、criteria に関連付けられた適用可能な接続ローカル変数を、適用することなく connection-local-variables-alist に収集します。例:
(hack-connection-local-variables '(:application tramp :protocol "ssh" :machine "localhost"))
connection-local-variables-alist
⇒ ((null-device . "/dev/null")
(shell-login-switch . "-l")
(shell-interactive-switch . "-i")
(shell-command-switch . "-c")
(shell-file-name . "/bin/bash"))
この関数は criteria に従って接続ローカル変数を検索し、現在のバッファに即座に適用します。
default-directory で指定された application に対するすべての接続ローカル変数を適用します。
その後、body が実行され、接続ローカル変数がアンワインドされます。 例:
(connection-local-set-profile-variables
'my-remote-perl
'((perl-command-name . "/usr/local/bin/perl5")
(perl-command-switch . "-e %s")))
(connection-local-set-profiles '(:application my-app :protocol "ssh" :machine "remotehost") 'my-remote-perl)
(let ((default-directory "/ssh:remotehost:/working/dir/"))
(with-connection-local-application-variables 'my-app
do something useful))
with-connection-local-variables、connection-local-p、connection-local-value で適用されるデフォルトのアプリケーション(シンボル)。デフォルトは
tramp ですが、let-bind することで一時的にアプリケーションを変更できます(ローカル変数 を参照)。
この変数をグローバルに変更してはなりません。
これは with-connection-local-application-variables
と同等ですが、適用には connection-local-default-application
を使用します。
このマクロは、connection-local-profile-name-for-setqで指定されたコネクションローカルプロファイルを用いて、各symbolコネクションローカルを対応するformの評価結果に設定します。プロファイル名がnilの場合、このマクロはsetqと同様に、通常通り変数を設定します(変数値の設定を参照)。
例えば、このマクロを with-connection-local-variables や with-connection-local-application-variables
と組み合わせて使用することで、接続ローカル設定を遅延初期化できます:
(defvar my-app-variable nil) (connection-local-set-profile-variables 'my-app-connection-default-profile '((my-app-variable . nil))) (connection-local-set-profiles '(:application my-app) 'my-app-connection-default-profile)
(defun my-app-get-variable ()
(with-connection-local-application-variables 'my-app
(or my-app-variable
(setq-connection-local my-app-variable
do something useful))))
setq-connection-local
経由で変数を設定する際に使用する、シンボル形式の接続ローカルプロファイル名。これは with-connection-local-variables の本体内で let
束縛されていますが、別のプロファイルで変数を設定したい場合は、自身で let 束縛することも可能です。
この変数をグローバルに変更してはなりません。
このマクロは、symbol が application
に対して接続ローカルバインディングを持つ場合、nil 以外の値を返します。application が nil である場合は、connection-local-default-application の値が使用されます。
このマクロは、application に対する symbol
の接続ローカル値を返します。application が nil の場合は、connection-local-default-application の値が使用されます。
symbol に接続ローカルバインディングがない場合、値は変数のデフォルトバインディングとなります。
with-connection-local{-application}-variablesとの違いは、symbolがバッファローカルに設定されない点です。典型的な使用パターンとしては、変数の接続値が存在する場合にのみそれを使用し、そうでない場合はデフォルト値を使用するというものです(上記で初期化したmy-app-variableを使用):
(if (connection-local-p my-app-variable 'my-app)
(connection-local-value my-app-variable 'my-app)
;; Something else.
)
nil の場合、connection-local
変数は無視されます。この変数は、特殊なモードにおいてのみ一時的に変更されるものとします。