Emacs term-mode:停止在某些主机上设置远程default-directory

时间:2012-07-05 19:59:18

标签: emacs term tramp advising-functions

我使用term-mode在Emacs中运行Bash shell。在远程主机上,term-mode的目录跟踪功能有助于将default-directory设置为包含主机名,以便通过Tramp远程完成选项卡完成和文件访问。但是,有时候,我使用的远程主机大多与我的工作站共享相同的文件系统,因为它们从NFS加载相同的目录。在这些情况下,Tramp减慢了我的速度。我想,在使用这些系统时,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- ...变量的设置)的情况下建议该功能。

有更好的方法吗?

1 个答案:

答案 0 :(得分: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要寻找的格式,这实际上是终端<的一个属性/ strong>协议,而不是term-now-i'm-just-being-silly的内部。存在一些潜在的问题,例如根据匹配中的第7个字符更改行为的新代码。 (这是上面.中唯一的string-match。)

毋庸置疑,我根本没有测试过这段代码。