category

vim8でコード補完(TypeScript)

vim-lspプラグインを利用することで、vim 8でもLanguage Server Protocol経由でコード補完機能を使えます。
例としてTypescriptのコード補完設定をとりあげます。

準備

まずvim8をインストールしておきます。macOSではbrew install vimでインストール可能です。
既存のvim7が存在している場合、PATHの優先順位の関係でvimコマンドがvim7を指しているケースがあるため、必要に応じてln -s /usr/local/bin/vim /usr/bin/viなどでvim8にシンボリックリンクを張っておくと良いでしょう。

ls -al /usr/bin/vi*でvi関係のコマンドが何を指しているかを確認できます。

また、vim-lspの標準手順ではvim-plugでプラグインをインストールしているため、以下のコマンドでvim起動時に読み込まれるようにしておきます。

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

TypeScriptのLanguage Serverインストール

補完リストなどを提供するTypeScriptのLanguage Serverはnpm install -g typescript typescript-language-serverでインストールできます。

vimからLanguage Serverへの接続設定については、https://github.com/prabirshrestha/vim-lsp/wiki/Servers-TypeScriptに解説があります。

.vimrc

vim-lsp用の.vimrc設定は以下の範囲で動作しています。

call plug#begin('~/.vim/plugged')
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
call plug#end()

if executable('typescript-language-server')
    au User lsp_setup call lsp#register_server({
            \ 'name': 'typescript-language-server',
            \ 'cmd': { server_info->[&shell, &shellcmdflag, 'typescript-language-server --stdio']},
            \ 'whitelist': ['typescript', 'javascript', 'javascript.jsx']
            \ })
endif

let g:lsp_async_completion = 1
"let g:lsp_log_verbose = 1
"let g:lsp_log_file = expand("~/vim-lsp.log")

autocmd FileType typescript setlocal omnifunc=lsp#complete

inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<cr>"
imap <c-space> <Plug>(asyncomplete_force_refresh)
autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif

設定後にviを起動して:PlugInstallを実行すると、冒頭に記載している4つのプラグインをインストールします。

4つのうち、async.vimとvim-lspが素朴なオムニ補完クライアント機能を提供します(Ctrl-X, Ctrl-Oで呼び出し)。
後半のasyncompleteはインクリメンタルな絞り込みなど高次の機能を提供しています。

ioremap以降の最終ブロックがasyncompleteの挙動定義で、Tabでリスト選択する動作などを設定しています。

動作確認

filetypeがtypescript、javascriptのファイルを編集すると、vimがtypescript-language-serverを起動して補完機能を利用できるようになります。

動作しない場合は、設定中コメントアウトしているログ出力を有効にすると原因を調査できます。