使vim理解tcl脚本环境变量(';gf';命令)
我经常在vim中使用gf打开光标下的文件。这些文件路径通常使用环境变量,但在.tcl脚本文件中,vim无法使用环境变量 这适用于gf:使vim理解tcl脚本环境变量(';gf';命令),vim,tcl,Vim,Tcl,我经常在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,/,.,-,_,+,,,
$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”命令) 有几种技巧: 设置
“路径”
和“includeexpr”
理论上,您可以将$tcl_lib
添加到路径。e、 g.set path=,$tcl\u 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子替换表达式
)来使用expand()
获取环境变量
这可能需要您更改“isfname”
,以允许更多字符成为文件名字符串的一部分
只需映射gf
和朋友
为特定于您的语言的
gf
、f
等创建缓冲区本地映射,并检查某些路径。这完全忽略了Vim的许多内置方法,因此应将其作为最后手段使用。在~/.中添加以下两行。vimrc将适用于我
set isfname+={,},(,),:
let &l:includeexpr = "substitute(v:fname,'$\\%(::\\)\\=env(\\([^)]*\\))','\\=expand(\"$\".submatch(1))', 'g')"
最后回到这个问题上,以一种非常好的方式解决了它。将以下tcl.vim文件添加到~/.vim/ftplugin中,您的“gf”应该可以工作
你能把
$tcl_lib
添加到你的路径中吗?e、 g.setlocal path=,$tcl_lib,
@PeterRincker我需要删除源代码中的“$env(tcl_lib)/”,然后源代码就会被破坏。理论上,你可以将'isfname'
单独保留,只需将$tcl_lib
添加到'path'
。如果您更改了'isfname'
,那么您是正确的,您需要删除或读取类似结构的$env(..)
。@PeterRincker我确实还原了isfname,但仍然看到了开头的“/”,并在根目录而不是“path”中查找。我认为第二个非常接近,但对我来说还不太有效。你能再解释一下它在做什么吗。特别是\%
和第一个\=
,这样我就可以进一步调试了?顺便说一句,这确实有效。:echo替换('$::env(tcl\u lib)/myfile.tcl','$\%(:\)\=env(\([^)]*\),'\=expand($”.submatch(1)),'g')
所以它是带有附加引号的东西,或者是let或…转义被关闭了<代码>\=
将运行一个Vim表达式作为替换(也称为子替换表达式)。您能否使用代码格式并在回答中给出更多解释?
" Add charecters to possible filename types so vim will recognize:
" $::env(THIS)/as/a/file.tcl
set isfname+={,},(,),:
" Turn the string into something vim knows as a filename:
" $::env(THIS)/as/a/file.tcl => ${THIS}/as/a/file.tcl
function! TclGfIncludeExpr(fname)
if a:fname =~? '\$\(::\)\?env([^)]\+)'
return substitute(a:fname, '\$\(::\)\?env(\([^)]\+\))', '${\2}', 'g')
endif
return a:fname
endfunction
" Tie the function to includeexpr
set includeexpr=TclGfIncludeExpr(v:fname)