【问题标题】:How do you execute a global command in a vimscript function?如何在 vimscript 函数中执行全局命令?
【发布时间】:2019-11-15 01:23:15
【问题描述】:

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

【问题讨论】:

  • 您不需要execute,因为您不进行评估。你需要()。所以:g:NERDTreeCWD()g:NERDTreeClose()
  • 而且你不需要g: 来处理函数,只需要变量(见help :g)。所以:NERDTreeCWD()

标签: vim nerdtree neovim


【解决方案1】:

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

也许部分混淆(也见于 cmets)源于 NERDTree 命令是由同名的全局函数实现的:

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

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

实现 NERDTree 切换

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

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

【讨论】:

  • 非常感谢您提供的有用信息。我之前应该解释的是,我正在尝试解决 :NERDTreeToggle 的问题,其中该命令打开了父目录的第二个不需要的树,该树在切换后徘徊。这个想法是使用 NERDTreeCWD,因为它不会产生不需要的父树。我尝试使用call NERDTreeCWD(),但是我收到此错误E523: Not allowed here
猜你喜欢
  • 2012-06-01
  • 2021-05-21
  • 2023-03-26
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
相关资源
最近更新 更多