1

現在、特定の言語のカスタム omnifunc を定義できるようにする vim 用のプラグインを作成しようとしています。

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

カーソルが 2 行目にあるときに (オムニコンプリートをトリガーするために) cx co を押すと、次のように表示されます (プラグイン内でエコーアウトします)。

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

関連するコードは次のとおりです

編集:修正されたので、現在使用しているコードを次に示します。そのコードが存在する理由については、Ingorの回答を参照してください

4

1 に答える 1

1

Vim が 2 回目の補完関数(cp. :help complete-functions) を呼び出して候補のリストを取得する前に、Vim は補完ベース (最初の呼び出しで決定されたもの) を削除します。その利点は、バッファー検索 (ほとんどの補完が行うこと) に現在の位置が含まれていないことです (それ自体が補完されるだけです)。あなたの例では、カーソルの前に単語が 1 つしかないため、「行全体」が消えていることがわかります。

コンテキストのために「完全な」バッファの内容が本当に必要な場合は、現在の位置でベースを手動でスプライスする必要があります。ベースはあなたに返されました。ただし、ほとんどの現在のバッファーの補完では、バッファー全体を文字列に取得するのではなくsearch()、実際のバッファー内でカーソルを (一時的かつ非表示に) 移動して一致を取得します。このようなユーティリティ関数については、私のCompleteHelper プラグインを参照してください。

PS: の代わりにgetbufline(bufname('%'), 1, "$")、代わりに使用できますgetline(1, "$")

于 2015-11-10T08:06:33.923 に答える