2015-11-10 2 views
1

В настоящее время я пытаюсь написать плагин для 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 относительно того, почему этот код существует

ответ

1

Перед Vim вызывает функцию завершения во второй раз (ср. :help complete-functions), чтобы получить список кандидатов, Vim удаляет базу завершения (который был определен первым вызовом). Преимуществом этого является поиск буфера (что делает большинство завершений) не включает текущую позицию (которая просто завершится сама по себе). В вашем примере есть только одно слово перед курсором, поэтому вы видите, что «целая линия» исчезает.

Если вам действительно нужно иметь «полное» содержимое буфера для контекста, вам необходимо вручную сплайсировать базу в текущей позиции; база была передана вам. Но большинство завершений текущего буфера не захватывают весь буфер в строку, а используют search() (временно и невидимо), перемещая курсор в фактическом буфере для получения совпадений. Вы можете посмотреть мои CompleteHelper plugin для таких функций полезности.

PS: Вместо getbufline(bufname('%'), 1, "$") вместо этого вы можете использовать getline(1, "$").

+0

Спасибо за помощь! Сейчас я буду сражаться в базе. Если большинство функций завершения не учитывают полный буфер, как они определяют, какие определенные переменные/функции и т. Д. Могут возникать в текущей точке? – ScottO

+0

Конечно, они рассматривают базу завершения перед курсором, это просто, что эта конкретная база не предлагается как возможный кандидат (потому что она завершится сама по себе). –