如何在Vim中发送转义序列?

fel*_*hew 5 vim ansi-escape viml

因此,最近苹果公司已经支持在终端的状态栏中显示工作目录和文件。必须发送(设置当前文件)的转义序列是这样的:

ESC ] 6 ; Pt BEL
Run Code Online (Sandbox Code Playgroud)

其中Ptfile://网址指向当前正在编辑的文件。所以我想我可以让Vim以转义序列的形式发送此命令,但是我有点麻烦。到目前为止,我有:

au BufNewFile,BufReadPost,BufFilePost,BufWritePost * echo <escape sequence>
Run Code Online (Sandbox Code Playgroud)

但我有种感觉,它不会像那样工作。另外,file://尽管我怀疑netrw可能会帮助我,但我也不知道如何获取当前文件作为url。有任何想法吗?

编辑

到目前为止,我有这个:

au BufNewFile,BufReadPost,BufFilePost * echo printf('\e]6;file://%s%s\a', $HOSTNAME, expand('%:p'))
Run Code Online (Sandbox Code Playgroud)

但它仍然无法正常工作- $HOSTNAME没有得到扩展。任何人都对如何使其扩展有任何建议?

编辑2

好的,所以我对引号进行了一些更改并导出了$HOSTNAME,现在可以正常打印了。但是,vim ^[并没有像字面上那样呼出转义序列,而是像那样打印它们,这使它们毫无用处!所以这是我真正的问题:如何使vim将字面量转义序列发送到shell?

成功!

最终代码如下:

set title
set t_ts=^[]6;
set t_fs=^G
auto BufEnter * let &titlestring = "file://" . hostname() . expand("%:p")
Run Code Online (Sandbox Code Playgroud)

Roy*_*Zuo 3

你可以!echo -ne <ESCAPE SEQUENCE>在vim中使用。为了将它与包含变量的标题字符串一起使用,execute可以添加前缀。

execute "silent !echo -ne " . EXPRESSION
Run Code Online (Sandbox Code Playgroud)

但老实说,没有必要推出自己的命令。相反,您可以按照此处的说明操作这两个变量。

如果终端允许通过发送字符串设置标题,则“t_ts”和“t_fs”选项用于设置窗口标题。它们分别在标题字符串之前和之后发送。类似't_IS'和't_IE'用于设置图标文本。这些是 Unix termcap 的 Vim 内部扩展,因此无法从外部 termcap 获取它们。但是,内置 termcap 包含适用于 xterm 和 iris-ansi 的条目,因此您无需在此处设置它们。