2

我曾经term-mode在 Emacs 中运行 Bash shell。在远程主机上,term-mode的目录跟踪功能有助于将default-directory主机名设置在其中,以便通过 Tramp 远程完成选项卡完成和文件访问。然而,有时我使用与我的工作站共享相同文件系统的远程主机,因为它们从 NFS 加载相同的目录。在这些情况下,流浪汉让我放慢了太多的速度。我希望在使用这些系统时,让 Emacs 在default-directory本地设置。为此,我term-handle-ansi-terminal-messages已从系统复制term.el到我的.emacs. 我替换这部分:

((= command-code ?h)
 (setq term-ansi-at-host argument))

有了这个:

((= command-code ?h)
 (setq term-ansi-at-host-real argument)
 (setq term-ansi-at-host
       ;; if it has an equivalent filesystem group, set to system-name
       (if (term-equivalent-filesystem-host-group-p argument)
           (system-name)
         argument)))

这调用了一个term-equivalent-filesystem-host-group-p函数,该函数告诉主机是否应该被视为具有等效的文件系统。

此方法具有预期的效果,但复制和修改系统 Lisp 代码对代码中的任何未来更改都不可靠。我认为如果不复制其一半的功能(消息循环或default-directoryange-ftp-...变量的设置),就不可能为该函数提供建议。

有一个更好的方法吗?

4

1 回答 1

2

我认为您可以通过建议获得该死的接近。我将建议定义如下:

(defadvice term-handle-ansi-terminal-messages
   (before rewrite-remote-paths-to-local (message) activate)
   (when (and (string-match ".*\eAnSiTh.\\([^\r\n]+\\)\r?\n" message)
              (term-equivalent-filesystem-host-group-p (match-string 1 message)))
     (setq term-ansi-at-host-real (match-string 1 message))
     (setq message (replace-match (system-name) t t message 1))))

所有这一切都是寻找输入的子字符串,该子字符串term-handle-ansi-terminal-messages将落入相关案例中,并主动重写路径。现在没有必要摆弄 的内部term-handle-ansi-terminal-messages,因为它永远不会看到远程路径。

这与修改功能有什么不同吗?我会说是的,但这可以解释。特别是,我认为上述代码所依赖term-long-function-name-you-already-know的唯一知识是要查找的子消息的格式,这实际上是终端协议的属性,而不是term-now-i'm-just-being-silly. 有一些潜在的问题,例如新代码会根据匹配中的第 7 个字符改变行为。(这是上面唯一.string-match。)

不用说,我根本没有测试这段代码。

于 2012-07-11T06:09:56.487 回答