【问题标题】:How to send escape sequences from within Vim?如何从 Vim 中发送转义序列?
【发布时间】:2015-12-02 11:11:50
【问题描述】:

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

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")

【问题讨论】:

  • 文件名见:help fnamemodify()
  • 底层shell环境是否设置了$HOSTNAME
  • @DanLowe 是的,但它没有导出(这就是我的问题!)
  • 您不需要为此使用自动命令。将表达式包装在 %{…} 中也可以,即:set titlestring=%{\"file://\".hostname().expand(\"%:p\")}

标签: vim ansi-escape viml


【解决方案1】:

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

execute "silent !echo -ne " . EXPRESSION

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

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

【讨论】:

  • 非常感谢您!如果您好奇,我已将最终代码放入我的答案中。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2018-12-20
  • 2015-05-09
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多