Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使vim理解tcl脚本环境变量(';gf';命令)_Vim_Tcl - Fatal编程技术网

使vim理解tcl脚本环境变量(';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,/,.,-,_,+,,,

我经常在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”命令)

有几种技巧:

设置
“路径”
“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)