如何在vimscript函数中执行全局命令?

如何在vimscript函数中执行全局命令?,vim,nerdtree,neovim,Vim,Nerdtree,Neovim,如何编写执行:NERDTree命令的函数?注意:我使用的是neovim,但我假设vimscript语法是相同的 这是我的密码 nmap <expr> <C-n> Toggle() func Toggle() if g:open == 0 let g:open += 1 execute g:NERDTreeCWD else let g:open -= 1 execute g:NERDTreeClose endfunc nmap T

如何编写执行:NERDTree命令的函数?注意:我使用的是neovim,但我假设vimscript语法是相同的

这是我的密码

nmap <expr> <C-n> Toggle()

func Toggle()
  if g:open == 0
    let g:open += 1
    execute g:NERDTreeCWD
  else
    let g:open -= 1
    execute g:NERDTreeClose
endfunc
nmap Toggle()
func Toggle()
如果g:open==0
设g:open+=1
执行g:NERDTreeCWD
其他的
设g:open-=1
执行g:NERDTreeClose
endfunc
NERDTree命令是自定义的Ex命令,因此您可以通过
:NERDTreeCWD
然后按Enter键(以交互方式)调用它们。在Vimscript中,可以删除
前缀

可能部分混淆(也可以在注释中看到)源于NERDTree命令由同名全局函数实现的事实:

:verbose command NERDTreeCWD
    Name              Args Address Complete    Definition
|   NERDTreeCWD       0                        call NERDTreeCWD()
因此,您也可以绕过自定义函数,直接调用NERDTreeCWD(),但这会使您依赖于插件的实现细节,因此不鼓励这样做

实现NERDTree切换 你知道插件已经有一个命令了吗


此外,您不需要定义自己的标志变量(
g:open
),只需重用插件中的一个(通过
g:NERDTree.IsOpen()函数公开)。是的,这使您依赖于插件细节(但这看起来像是一个公共API,而不是内部实现,所以它应该更稳定)-这仍然比试图重新发明轮子要好。(您的全局标志在多个选项卡页上会出现问题-每个选项卡页都可能有一个NERDTree处于活动状态或未处于活动状态。)

您不需要,因为您不进行评估。你需要
()
。因此:
g:NERDTreeCWD()
g:NERDTreeClose()
。函数不需要
g:
,变量只需要
help:g
)。所以:
NERDTreeCWD()
非常感谢您提供的有用信息。我应该在前面解释的是,我正在尝试解决一个问题:nerdtreetobggle,其中命令打开父目录的第二个不需要的树,该树在切换后仍然存在。其想法是使用NERDTreeCWD,因为它不会生成不需要的父树。我尝试使用
call NERDTreeCWD()
但是我得到了这个错误
E523:这里不允许