不久前,我发现了以下珍贵的片段,它允许 Emacs 跟踪我在任何ansi-term缓冲区上的当前目录。
更具体地说,如果我cd <some/path>从终端在Emacs内,并且我然后按C-x C-f,Emacs会运行find-file从<some/path>直接,这是非常,非常方便。
if [ -n "$INSIDE_EMACS" ]; then
chpwd() { print -P "\033AnSiTc %d" }
print -P "\033AnSiTu %n"
print -P "\033AnSiTc %d"
fi
Run Code Online (Sandbox Code Playgroud)
但是,如果我ssh从 shell 访问远程机器,上述技巧将不起作用。理想情况下,在这种情况下,如果我按C-x C-fEmacs 应该认识到我已经 sshed 到某台机器,并使用trampfind-file在相应的机器和远程路径上运行。
这让我想到以下两个问题:
首先,正如罗伯特的评论中提到的,您的代码片段无效。之前至少需要一个分号或换行符}。打印语句可能也不正确。
然而这里已经足够猜测发生了什么,所以我会解释一下。
当您运行时ansi-term,它会调用设置了环境变量的 shell $INSIDE_EMACS。然后,shell 代码会执行其他操作,主要是重新定义函数,chpwd以便打印其他操作,其中无疑包括当前工作目录。您可以通过注意到在每个命令中,在最后一个命令正确完成后,您可能会在提示区域的某个位置看到当前目录来轻松验证这一点。
当 ansi-term 在行首看到类似目录的内容时,它会跟踪该内容。所以从这个意义上说,代码并不特殊;该目录可以通过多种方式显示,例如\w通过设置环境变量添加到提示符PS1。
至于 #2,请参阅“在 emacs ansi-term 缓冲区/窗口中打开远程文件:ansi-term + trapmp ”