vim - 从插件或 vimrc 调用时的 getbufvar 函数返回空字符串
问题描述
我有一个插件,我在其中一个插件函数中调用 getbufvar 来检查缓冲区是否是 quckfixlist。getbufvar 总是返回空字符串。但是,如果我将像 1 这样的硬编码值作为缓冲区编号而不是变量传递,它会返回正确的字符串。它是getbufvar中的错误吗?
下面是重现的测试代码。
function! Test(bufNum)
return getbufvar(a:bufNum, '&ft')
endfunction
au BufEnter * echoerr expand('<abuf>'). ", ". Test(expand('<abuf>'))
当我打开一个 python 文件时,上面的代码片段会回显“1”。但是,如果我调用 getbufvar(1, '&ft') 它会打印 '1, python'。难道我做错了什么?
解决方案
在 VimScript 中,字符串和数字在运行时不同。expand()
总是返回一个字符串,但getbufvar()
需要缓冲区名称 ( v:t_string
) 或缓冲区编号 ( v:t_number
)。所以“1”被解释(按参数类型)作为缓冲区名称。您必须将其转换为 number 以避免此麻烦。
但请注意,在这种情况下BufEnter
,总是在进入缓冲区后bufnr()
调用,因此您可以安全地使用(甚至&ft
不使用getbufvar()
)。
推荐阅读
- c# - 我在 websocket 上获得响应时遇到问题
- php - 向用户发送多封订单确认电子邮件
- swift - 如何快速修复“无法转换类型值”错误?
- java - 如何使用 FEIGN 客户端发送 SOAP 对象?
- in-app-purchase - Amazon In App Purchase in Live App 测试不起作用
- google-apps-script - 如何根据单元格填充颜色使单元格中的文本变为粗体?
- windows - 在 Windows 10 中找不到 istioctl 命令
- html - 为什么我的子菜单的宽度不会保持不变?
- ibm-cloud - 如何自动授予/撤销对 Cloud Object Storage 资源的访问权限?
- c++ - 在构造函数中初始化值