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を起動して補完機能を利用できるようになります。
動作しない場合は、設定中コメントアウトしているログ出力を有効にすると原因を調査できます。
Chuma Takahiro