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

时间:2015-09-06 23:59:33

标签: vim ansi-escape viml

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

ESC ] 6 ; Pt BEL

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

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

但我觉得它不会像那样工作。此外,我不知道如何将当前文件作为file://网址获取,尽管我怀疑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")

1 个答案:

答案 0 :(得分:2)

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

execute "silent !echo -ne " . EXPRESSION

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

  

't_ts'和't_fs'选项用于设置终端的窗口标题   允许通过发送字符串设置标题。它们在之前和之后发送   标题字符串。类似的't_IS'和't_IE'用于设置   图标文本。这些是Unix termcap的Vim内部扩展,所以它们   不能从外部的术语中获得。但是,内置的termcap   包含xterm和iris-ansi的合适条目,因此您无需设置   他们在这里。