1

我目前正在尝试为 vim 编写一个插件,它允许我为给定的语言定义一个自定义的omnifunc。

除了当我调用getbufline(为了获取当前缓冲区的内容)时,我几乎可以让它工作,结果包含一个空行而不是当前行的内容。

这是我目前正在使用的功能:

function! statemachine#GetCurrBuffContents()
  return join(getbufline(bufname('%'), 1, "$"), "\n")
endfunction

奇怪的是,如果我从 vim via echom statemachine#GetCurrBuffContents()then 调用我的函数,我会看到预期的输出,即每一行由一个\n字符分隔。

示例:缓冲区包含以下内容

input signal x
out

state State2
if x == false goto State2
end

如果我在光标位于第 2 行时点击 cx co (触发omnicompletion),我会看到以下内容(我在我的插件中回显它):

input signal x^@^@^@state State2^@if x == false goto State2^@end

如果我运行echom statemachine#GetCurrBuffContents(),我会看到以下内容:

input signal x^@input^@^@state State2^@if x == false goto State2^@end

以下是相关代码: https ://github.com/scotopell/vim-statemachine/blob/3c3c3803f24031cce676e3988daaff12c269142a/autoload/statemachine.vim#L33

编辑:现在它已经修复了,这是我目前正在使用的代码。请参阅 Ingor 关于为什么存在该代码的答案

4

1 回答 1

1

在 Vim 第二次调用完成函数(cp. :help complete-functions) 以获取候选列表之前,Vim 删除完成基(由第一次调用确定)。这样做的好处是缓冲区搜索(大多数完成所做的)不包括当前位置(它只会自动完成)。您的示例光标前只有一个单词,因此您会看到“整行”消失了。

如果你真的需要有上下文的“完整”缓冲区内容,你需要在当前位置手动拼接base;基地被传回给你。但是大多数当前缓冲区完成不会将整个缓冲区抓取到一个字符串中,而是search()用于(临时且不可见地)在实际缓冲区中移动光标以获取匹配项。您可以查看我的CompleteHelper 插件以了解此类实用程序功能。

PS:代替getbufline(bufname('%'), 1, "$"),你可以使用getline(1, "$")代替。

于 2015-11-10T08:06:33.923 回答