В настоящее время я пытаюсь написать плагин для vim, который позволит мне определить пользовательский omnifunc для данного языка.getbufline отсутствует текущая строка при вызове из omnifunc
Я могу заставить эту работу работать, кроме того, что при вызове getbufline
(для получения содержимого текущего буфера) результаты содержат пустую строку вместо содержимого текущей строки.
Вот функция, я в настоящее время с помощью:
function! statemachine#GetCurrBuffContents()
return join(getbufline(bufname('%'), 1, "$"), "\n")
endfunction
Странная часть об этом, является то, что если я называю функцию из Vim с помощью echom statemachine#GetCurrBuffContents()
я вижу выход, как ожидалось, то есть, каждая строка разделенных символом \n
.
Пример: Буфер содержит следующие
input signal x
out
state State2
if x == false goto State2
end
Если я ударил Cx Co (для запуска omnicompletion), когда курсор находится в строке 2, я вижу следующее (я повторяю это в мой плагин):
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/scottopell/vim-statemachine/blob/3c3c3803f24031cce676e3988daaff12c269142a/autoload/statemachine.vim#L33
EDIT: теперь, когда он фиксируется, вот код, который я сейчас использую. См ответа Ingor относительно того, почему этот код существует
Спасибо за помощь! Сейчас я буду сражаться в базе. Если большинство функций завершения не учитывают полный буфер, как они определяют, какие определенные переменные/функции и т. Д. Могут возникать в текущей точке? – ScottO
Конечно, они рассматривают базу завершения перед курсором, это просто, что эта конкретная база не предлагается как возможный кандидат (потому что она завершится сама по себе). –