不久前,我发现了以下宝贵的代码片段,它允许 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
ssh
但是,如果我从 shell 访问远程计算机,则上述技巧不起作用。理想情况下,在这种情况下,如果我按Emacs 应该识别出我已经 sshed 到某台机器,并使用 trapmp在相应的机器和远程路径上C-x C-f
运行。find-file
这让我想到以下两个问题:
- 上面的代码片段如何以及为什么起作用?
- 如何扩展它,以便在我 ssh 到另一台计算机后它也可以跟踪我的远程路径?
答案1
首先,正如罗伯特的评论中提到的,您的代码片段无效。之前至少需要一个分号或换行符}
。打印语句可能也不正确。
然而这里已经足够猜测发生了什么,所以我会解释一下。
当您运行时ansi-term
,它会调用设置了环境变量的 shell $INSIDE_EMACS
。然后,shell 代码会执行其他操作,主要是重新定义函数chpwd
,以便打印其他操作,其中无疑包括当前工作目录。您可以通过注意到在每个命令中,在最后一个命令正确完成后,您可能会在提示区域的某个位置看到当前目录来轻松验证这一点。
当 ansi-term 在行首看到类似目录的内容时,它会跟踪该内容。所以从这个意义上说,代码并不特殊;该目录可以通过多种方式显示,例如\w
通过设置环境变量添加到提示符PS1
。