首页 > 解决方案 > 让 vim 理解 tcl 脚本环境变量('gf' 命令)

问题描述

我经常在 vim 中使用 gf 打开光标下的文件。这些文件路径通常使用环境变量,但在 .tcl 脚本文件中,vim 无法使用环境变量。

这适用于 gf:

$tcl_lib/myfile.tcl

这些不适用于 gf:

$env(tcl_lib)/myfile.tcl
$::env(tcl_lib)/myfile.tcl

这些是我尝试过的一些事情:

:set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,{,},(,)
:set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,{,},40-41

:set includeexpr=substitute(v:fname,'\$env(\([^)]\+\))','\$\1','')

有没有办法让 vim 理解 tcl 脚本中环境变量的语法(特别是 'gf' 命令)?

标签: vimtcl

解决方案


有几个技巧:

设置'path'&'includeexpr'

理论上你可以添加$tcl_lib到路径中。例如set path=.,$tcl_lib,,。但是,任何以开头的文件名/都会失败。这可以通过删除启动来解决/

添加到~/.vim/after/ftplugin/tcl.vim

set path=.,$tcl_lib,,
let &l:includeexpr="substitute(v:fname, '^/', '', 'g')"

通过读取环境变量'includeexpr'

可以使用替换来扩展环境变量

let l:includeexpr = "substitute(v:fname, '$\\%(::\\)\\=env(\\([^)]*\\))', '\\=expand(\"$\".submatch(1))', 'g')"

这使用子替换表达式(参见:h sub-replace-expressionexpand()来获取环境变量。

这可能需要您进行更改'isfname'以允许更多字符成为文件名查找字符串的一部分。

只是地图gf和朋友

gf为特定于您的语言的、<c-w>f等进行缓冲区本地映射并检查某些路径。这完全避开了 Vim 的许多内置方法,所以它应该作为最后的手段。


推荐阅读