【问题标题】:Emacs term-mode: stop setting remote default-directory on some hostsEmacs term-mode:停止在某些主机上设置远程默认目录
【发布时间】:2012-07-05 19:59:18
【问题描述】:

我使用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-... 变量的设置),我认为建议该函数是不可能的。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: emacs tramp advising-functions


    【解决方案1】:

    我认为你可以得到建议。我将建议定义如下:

    (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 中唯一的.。)

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

    【讨论】:

    • 这很有说服力——我认为这比重写函数更健壮。我稍微更改了正则表达式以使其正常工作。
    • 太棒了——我并不惊讶需要一些小的调整。 (出于好奇,它是什么?)我还忘了提到使用建议的另一个好处——如果有什么时髦的事情发生,你可以简单地(ad-deactivate 'term-handle-ansi-terminal-messages) 并且你会恢复原来的行为。
    • 我编辑了您的答案以表明我使用的正则表达式。旧的有两个问题:括号没有双反斜杠转义,message 可以包含很多行,所以匹配.*\r?\n 实际上会吞掉整个多行输入。此外,我在开头添加了.*,这样只有模式其余部分的最后一个示例才会匹配,以防在message 中指定了两次AnSiTh。
    猜你喜欢
    • 2012-12-07
    • 2010-10-06
    • 2013-07-12
    • 2012-05-10
    • 2011-01-24
    • 2013-11-06
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多