使vim理解tcl脚本环境变量(“ gf”命令)

时间:2019-03-20 16:59:55

标签: 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,/,.,-,_,+,,,#,$,%,~,=,{,},40-41

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

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

3 个答案:

答案 0 :(得分:1)

有一些技巧:

设置const store = ModelStore.create(); const myComponent = withRouter( observer(({ history }) => { const [isDropdownOpen, setIsDropdownOpen] = React.useState(false); const toggle = () => { setIsDropdownOpen(prevDropdownOpen => !prevDropdownOpen); }; const handleOnClick = () => { history.push(routes.home.path); }; return ( <Dropdown isOpen={isDropdownOpen} toggle={toggle}> <DropdownToggle caret>Dropdown</DropdownToggle> <DropdownMenu right> <DropdownItem header> viewed items: {store.unviewedCount} </DropdownItem> <Button outline onClick={handleOnClick}> go home </Button> </DropdownMenu> </Dropdown> ); }) ); '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'

这使用sub-replace-expression(请参见let l:includeexpr = "substitute(v:fname, '$\\%(::\\)\\=env(\\([^)]*\\))', '\\=expand(\"$\".submatch(1))', 'g')" )来使用:h sub-replace-expression来获取环境变量。

这可能需要您更改expand(),以允许更多字符成为看起来像文件名的字符串的一部分。

只需地图'isfname'和朋友

gfgf等创建特定于您的语言的缓冲区本地映射,并检查某些路径。这完全避开了Vim的许多内置方法,因此应将其作为最后的手段。

答案 1 :(得分:0)

在〜/ .vimrc中添加以下两行将对我有用。

设置isfname + = {,},(,),:

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

答案 2 :(得分:0)

最后回到了这一点,并能够以非常好的方式解决它。将以下tcl.vim文件添加到您的〜/ .vim / ftplugin中,您的“ gf”应该可以正常工作!

https://github.com/stephenmm/dotfiles/blob/master/vim/ftplugin/tcl.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)