首页 > 解决方案 > 如何在 vimscript 函数中执行全局命令?

问题描述

如何编写执行 :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

标签: vimnerdtreeneovim

解决方案


NERDTree 命令是自定义的 Ex 命令,因此您可以(以交互方式)调用它们,:NERDTreeCWD后跟Enter. 在 Vimscript 中,您可以删除:前缀。

也许部分混淆(也可以在评论中看到)源于 NERDTree 命令由具有相同名称的全局函数实现的事实:

:verbose command NERDTreeCWD
    Name              Args Address Complete    Definition
|   NERDTreeCWD       0                        call NERDTreeCWD()

所以你也可以call NERDTreeCWD()直接绕过自定义函数,但这会让你依赖插件的实现细节,因此不鼓励。

实现 NERDTree 切换

你知道插件已经有一个:NERDTreeToggle命令吗?

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


推荐阅读