deoplete.nvimのソースをつくってみた


Summary

下記のような感じでオートコンプリートしたい

apと入力したらapple
baと入力したらbanana
chと入力したらcherry

必要なもの

deoplete.nvim

# dein.toml の記入例
[[plugins]]
repo = 'Shougo/deoplete.nvim'
hook_add = 'let g:deoplete#enable_at_startup = 1'

ソースをつくる

ソースの置き場所

$XDG_CONFIG_HOME/nvim/rplugin/python3/deoplete/sources

まずフォルダをつくる

cd $XDG_CONFIG_HOME/nvim
mkdir -p rplugin/python3/deoplete/sources

ソース(パイソンファイル)を作成

cd rplugin/python3/deoplete/sources
vim callmekohei.py

callmekohei.pyの中身(さわるところは3ヶ所のみ!)

from .base import Base

class Source(Base):
    def __init__(self, vim):
        super().__init__(vim)
        self.name = 'callmekohei'           # なまえ
        self.mark = '[kohei]'               # mark のなまえ

    def gather_candidates(self, context):
        return ["apple","banana","cherry"]  # ポップアップのリスト

init.vimに記入
filetype plugin indent onの前に書く

set runtimepath+=$XDG_CONFIG_HOME/nvim/rplugin

filetype plugin indent on
syntax   enable

やりたいこと2

fruits.と入力したらapple, banana, cherry

ソース

import re
from .base import Base

class Source(Base):
    def __init__(self, vim):
        super().__init__(vim)
        self.name = 'callmekohei'
        self.mark = '[kohei]'
        self.input_pattern = (r'^fruits\.')        # input_pattern で fruits. を指定する

    def get_complete_position(self, context):      # input_pattern を使うときは必須
        m = re.search(r'\w*$', context['input'])
        return m.start() if m else -1

    def gather_candidates(self, context):
        return ["apple","banana","cherry"]

最小のセッティング

set runtimepath+=~/.config/nvim/rplugin
set runtimepath+=~/.config/nvim/plugins/deoplete.nvim
let g:deoplete#enable_at_startup = 1
filetype plugin indent on
syntax enable

やりたいこと3

appleを選択したらappleの説明を表示したい

ソース

from .base import Base

class Source(Base):
    def __init__(self, vim):
        super().__init__(vim)
        self.name          = 'callmekohei'
        self.mark          = '[kohei]'

    def gather_candidates(self, context):
        return [
            {
                  'word' : "apple"
                , 'abbr' : "apple  : red, round and delicious!"
                , 'info' : "Apple is delicious"
                , 'kind' : "Food"
                , 'dup'  : 1
            }
        ]

参照

ヘルプ :help deoplete

CREATE SOURCE                   *deoplete-create-source*

To create source, you should read default sources implementation in
rplugin/python3/deoplete/source/*.py.

The files are automatically loaded and deoplete creates new Source class
object.
Source class must extend Base class in ".base".

Note: The sources must be created by Python3 language.

Note: If you call Vim functions in your source, it is not asynchronous.

次世代補完フレームワークdeoplete.nvimと、そのソースの内部を詳しく