<C-x><C-o>
で Vim 標準の方法でオムニ補完をした場合、!a:findstart
時の col('.')
は補完の開始位置、つまり a:findstart
時に返した場所になる。
しかし、neocomplete.vimや YouCompleteMeの場合、各自のエンジンが補完関数を呼んでいるため、col('.')
の値は普通に補完時のカーソル位置になる。なので col('.')
の値に依存した omnifunc を書くと neocomplete.vim や YouCompleteMe では動かなくなる。
neocomplete.vim の場合、gather_candidate の中で a:context.complete_pos
が補完開始位置になっているので、この値を使うようにする。
YouCompleteMe の場合、そもそも a:findstart
時に返した補完開始位置を無視するので (つらい……)、本当の補完開始位置を知るためには再度 a:findstart
時の処理を行う必要がある、と思う。
neco-ghcでは汎用的に書く方法を思い付けず、col('.')
のこの挙動等によって Vim の補完なのか neocomplete.vim の補完なのか YouCompleteMe の補完なのかを判定して分岐させている……