我经常在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'命令)?
答案 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'
和朋友为gf
,gf
等创建特定于您的语言的缓冲区本地映射,并检查某些路径。这完全避开了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)