Emacs 术语模式 : stop setting remote default-directory on some hosts

标签 emacs tramp advising-functions

我使用 term-mode 在 Emacs 中运行 Bash shell。在远程主机上,term-mode 的目录跟踪功能有助于将 default-directory 设置为在其中包含主机名,以便通过以下方式远程完成选项卡补全和文件访问流浪汉。然而,有时我使用的远程主机大多与我的工作站共享相同的文件系统,因为它们从 NFS 加载相同的目录。在这些情况下,流浪汉让我放慢了太多的速度。我希望在使用这些系统时,Emacs 在本地设置默认目录。为此,我已将 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 代码对于代码中的任何 future 更改来说并不稳健。我认为在不复制其一半功能的情况下建议该函数是不可能的(消息循环或 default-directoryange-ftp-... 变量的设置) .

有更好的方法吗?

最佳答案

我认为你可以得到非常接近的建议。我将建议定义如下:

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

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

关于Emacs 术语模式 : stop setting remote default-directory on some hosts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351681/

相关文章:

emacs 流浪模式不尊重远程目录中的 .clang 格式

Emacs 光标移动建议

emacs - 防止 Emacs 在按回车键时删除尾随空格

html - 无法让 emacs 组织模式使用我的 CSS 文件

shell - Emacs 在当前窗口打开另一个 shell

Emacs -- dired-mode 测试以确定远程服务器名称/地址

emacs - 使用 Emacs 使用公钥身份验证编辑远程文件

c - 在 Emacs 中缩进 C block 注释

emacs - 如何在 Emacs 中建议原语