vim - 如何在 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
解决方案
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 处于活动状态或不处于活动状态。)
推荐阅读
- c# - 构建时游戏 UI 位置更改,而在具有相同分辨率的统一编辑器中工作正常
- debian - Gitlab-ci,图像 debian:jessie。无法使用 su 命令更改用户
- c# - 用于 C# 桌面应用程序的数据库
- c# - 从 int[] 中选择每 2 个整数,并使用 Lamda 表达式将它们组合成一个 uint64[] 数组
- swift - 无法安装应用程序
- javascript - 将 React 应用程序嵌套在带有路由的 iframe 中
- html - 如何设置 CSS 按钮的样式以在不同版本的 IE11 中正确显示?
- css - 如何使用 Live Sass Compiler 编译相关的 scss 文件?
- javascript - 制表器:如何获取最近添加的行的索引
- php - Laravel Event Sourcing (Spatie) - 如何处理更复杂的业务规则