首页 > 解决方案 > 从插件或 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'。难道我做错了什么?

标签: vim

解决方案


在 VimScript 中,字符串和数字在运行时不同。expand()总是返回一个字符串,但getbufvar()需要缓冲区名称 ( v:t_string) 或缓冲区编号 ( v:t_number)。所以“1”被解释(按参数类型)作为缓冲区名称。您必须将其转换为 number 以避免此麻烦。

但请注意,在这种情况下BufEnter,总是在进入缓冲区bufnr()调用,因此您可以安全地使用(甚至&ft不使用getbufvar())。


推荐阅读