basyura's blog

あしたになったらほんきだす。

languishing

年明けから(年末からだと思うけど)全方位的にやる気がアレでウォーキングもだるくなってゴロゴロしていて何かを始めても集中力が無くすぐ飽きるの繰り返しになっているのだけど vimrc いじりは割と長時間やっていられる不思議。気になるところが割と明確でそれを改善しようとするアプローチに対してフィードバックが早いからだろう。 asyncomplete.vim に乗り換えた後、ある程度補完処理を自分でコントロールしたくなったので processor を書いてちまちま更新している。ある時から補完の挙動が怪しく、補完したい単語の手前を書き換えてしまうことがままある。

    e.Static("/", filepath.j

たとえば go で ↑ を入力していて、j の位置に Join が候補として補完メニューに出るので確定すると、

    e.Static(filepath.Join

になるとか。デフォルトの processor を使えば起こらないので自分の書き方がおかしいんだろうなと思うものの比較しても良く分からない。引数で optionsmatches が渡ってくるので、これをもとにフィルタリングする。

options : { 
  "lnum":26,
  "bufnr":1,
  "col":29,
  "changedtick":82,
  "typed":"    e.Static(\"/\", filepath.j",
  "base":"j",
  "startcol":28,
  "filetype":"go",
  "curpos":[0,26,29,0,29],
  "filepath":"(略)/stats/stats.go"
}

match : {
 "status":"success",
  "ctx":{
    "lnum":26,
    "bufnr":1,
    "col":28,
    "changedtick":81,
    "typed":"    e.Static(\"/\", filepath.",
    "filetype":"go",
    "curpos":[0,26,28,0,28],
    "filepath":"(略)/stats/stats.go"
  },
  "startcol":28,
  "items":[
    {"word":"Join","abbr":"Join","user_data":"{\"vim-lsp/key\":\"26\"}","kind":"function","empty":1,"dup":1,"icase":1}],
  "refresh":true
}

通常は option.base に単語が入ってくるので、 matches で各 completor が抽出した items を filter すればいい。これが、入力している文脈によって

basee : [/", filepath.j]

のように変化することがある。option の startcol と matches の startcolctx.col を使って単語を抽出するように書き換えてみたけど、回避できないケースが出てきた。 結局の所、prabirshrestha/asyncomplete-file.vim の有りなしで挙動が変わり、さらに見ると asyncomplete#complete を呼ぶ呼ばないで挙動が変わることが分かった。fork してマッチするものがない場合は asyncomplete#complete を呼ばないようにした。何も考えずデフォルトの processor を使えばいいんだけど・・・並び順とか優先順位とかちらつきとかファイルタイプによって設定変えたいとかが気になってしまってアレ。