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

How to send escape sequences from within Vim?

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

ESC ] 6 ; Pt BEL

其中 Pt 是指向当前正在编辑的文件的 file:// url。所以我想我可以让 Vim 将此命令作为转义序列发送,但我遇到了一些麻烦。到目前为止我有这个:

au BufNewFile,BufReadPost,BufFilePost,BufWritePost * echo <escape sequence>

但我觉得它不会像那样工作。此外,我不知道如何将当前文件作为 file:// url,尽管我怀疑 netrw 可能会帮助我。有什么想法吗?

编辑

到目前为止,我有这个:

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

但它仍然不起作用 - $HOSTNAME 没有得到扩展。有人对如何展开这个有任何建议吗?

编辑 2

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

成功!

最终代码如下:

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

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

execute "silent !echo -ne " . EXPRESSION

但老实说,没有必要推出自己的命令。相反,您可以按照 here.

的说明操作这两个变量

The 't_ts' and 't_fs' options are used to set the window title if the terminal allows title setting via sending strings. They are sent before and after the title string, respectively. Similar 't_IS' and 't_IE' are used to set the icon text. These are Vim-internal extensions of the Unix termcap, so they cannot be obtained from an external termcap. However, the builtin termcap contains suitable entries for xterm and iris-ansi, so you don't need to set them here.