12.14.2 应用连接局部变量

在编写感知连接状态的代码时,你需要收集(并可能需要应用)所有相关的连接局部变量。 具体有多种实现方式,下文将逐一说明。

Function: hack-connection-local-variables criteria

该函数会收集与 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"))
Function: hack-connection-local-variables-apply criteria

该函数会根据 criteria(判定条件)查找对应的连接局部变量,并立即将其应用到当前缓冲区中。

Macro: with-connection-local-application-variables application &rest body

application(应用程序)应用所有关联的连接局部变量,这些变量由 default-directory(默认目录)指定。

完成变量应用后,执行 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))
Variable: connection-local-default-application

该变量定义了默认应用程序(一个符号),会在 with-connection-local-variablesconnection-local-p 以及 connection-local-value 这些宏/函数中生效。其默认值为 tramp, 你可通过 let 绑定的方式临时修改该应用程序(详见see 局部变量)。

该变量禁止全局修改。

Macro: with-connection-local-variables &rest body

该宏的功能与 with-connection-local-application-variables 完全等价, 区别在于它会将 connection-local-default-application 作为默认应用程序使用。

Macro: setq-connection-local [symbol form]…

该宏会将每个 symbol(符号)以 连接局部 的方式设置为对应 form(表达式) 求值后的结果,具体使用的连接局部配置文件由 connection-local-profile-name-for-setq 指定; 若该配置文件名的值为 nil,则此宏会像 setq 一样正常设置变量(详见see 修改变量值)。

例如,你可将该宏与 with-connection-local-variableswith-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))))
Variable: connection-local-profile-name-for-setq

该变量指定了通过 setq-connection-local 设置变量时要使用的连接局部配置文件名(一个符号)。 在 with-connection-local-variables 的代码体中会对该变量进行 let 绑定, 但如果你希望为其他配置文件设置变量,也可自行对该变量进行 let 绑定。

该变量禁止全局修改。

Macro: connection-local-p symbol &optional application

symbol(符号)针对 application(应用程序)存在连接局部绑定, 该宏会返回非 nil 的值。若 applicationnil, 则使用 connection-local-default-application 的值。

Macro: connection-local-value symbol &optional application

该宏返回 symbol(符号)针对 application(应用程序)的连接局部值。 若 applicationnil,则使用 connection-local-default-application 的值。

symbol 不存在对应的连接局部绑定,该宏会返回该变量的默认绑定值。

Variable: enable-connection-local-variables

若该变量值为 nil,则连接局部变量会被忽略。此变量仅允许在特殊模式下临时修改。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike