Kotlinアドベントカレンダー2020(https://qiita.com/advent-calendar/2020/kotlin)の10日目の記事です。
前提(というか僕の環境というか)
- MacOS
- Vim 8
プラグインを入れる
このあたりを入れれば良いと思います。
- prabirshrestha/vim-lsp
- prabirshrestha/async.vim
- prabirshrestha/asyncomplete.vim
- prabirshrestha/asyncomplete-lsp.vim
- mattn/vim-lsp-settings
- udalov/kotlin-vim
deinの場合の設定
vim-plugでもなんでもいいんですが、自分はdeinを使っているので、こんな感じに設定します。
[[plugins]]
repo = 'udalov/kotlin-vim'
hook_add = '''
autocmd FileType kotlin nmap gd <esc>:LspDefinition<CR>
'''
on_ft = 'kotlin'
[[plugins]]
repo = 'prabirshrestha/async.vim'
[[plugins]]
repo = 'prabirshrestha/vim-lsp'
hook_add = '''
nnoremap <leader>ph :LspHover<CR>
nnoremap <leader>pn :LspNextDiagnostic<CR>
nnoremap <leader>pc :pclose<CR>
autocmd FileType go nnoremap gd :<C-u> TagImposterAnticipateJump <Bar> LspDefinition<CR>
autocmd FileType typescript nnoremap gd :<C-u> TagImposterAnticipateJump <Bar> LspDefinition<CR>
autocmd FileType typescriptreact nnoremap gd :<C-u> TagImposterAnticipateJump <Bar> LspDefinition<CR>
let g:lsp_signs_error = {'text': ' '}
let g:lsp_signs_warning = {'text': ' '}
let g:lsp_signs_hint = {'text': ' '}
let g:lsp_log_verbose = 0
" let g:lsp_log_file = expand('~/vim-lsp.log')
" for asyncomplete.vim log
" let g:asyncomplete_log_file = expand('~/asyncomplete.log')
'''
[[plugins]]
repo = 'prabirshrestha/asyncomplete.vim'
hook_add = '''
imap <c-n> <Plug>(asyncomplete_force_refresh)
imap <c-x> <Plug>(asyncomplete_force_refresh)
imap <c-p> <Plug>(asyncomplete_force_refresh)
let g:lsp_signs_enabled = 1
let g:lsp_highlight_references_enabled = 1
let g:lsp_highlights_enabled = 1
let g:lsp_diagnostics_enabled = 1
let g:lsp_async_completion = 1
let g:lsp_auto_enable = 1
let g:lsp_preview_autoclose = 0
let g:lsp_preview_keep_focus = 0
let g:lsp_preview_doubletap = 0
let g:lsp_insert_text_enabled = 0
let g:lsp_text_edit_enabled = 0
let g:lsp_diagnostics_echo_cursor = 1
let g:lsp_virtual_text_enabled = 0
let g:lsp_textprop_enabled = 0
let g:lsp_signature_help_enabled = 0
let g:lsp_fold_enabled = 0
let g:asyncomplete_auto_popup = 1
let g:asyncomplete_auto_completeopt = 1
let g:asyncomplete_remove_duplicates = 1
let g:asyncomplete_smart_completion = 1
set completeopt-=preview
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<cr>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ asyncomplete#force_refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
'''
[[plugins]]
repo = 'mattn/vim-lsp-settings'
hook_add = '''
let g:lsp_settings_servers_dir = '/Users/yy_yank/.vim/lsp/server'
'''
[[plugins]]
repo = 'prabirshrestha/asyncomplete-lsp.vim'
[[plugins]]
repo = 'natebosch/vim-lsc'
hook_add = '''
'''
全体的な構成が気になる方はGitHubにベースとなる自分のやつが乗っているので見てみてもらえればいいかもしれないです。
https://github.com/yyYank/dotfiles/tree/master/macOS/.vim
https://github.com/yyYank/dotfiles/blob/master/macOS/.vimrc
このプラグインたちは何をしてるの?
- prabirshrestha/vim-lsp はVimでLSPを使えるようにしている
- prabirshrestha/async.vimとprabirshrestha/asyncomplete-lsp.vim はVimで非同期にLSPを使うために入れてる(たしか)
- prabirshrestha/asyncomplete.vim はVimでLSPを使ったコード補完(completion)をするために使っている
- mattn/vim-lsp-settings は LSPでいろんな言語に対応させるのをラクラクにするために使っている
- udalov/kotlin-vim はシンタックスハイライトを入れるためとktの拡張子でfiletype=kotlinをdetectするために使っている
LSPについてとLSPをVimで使うための細かな説明はmattnさんのブログ記事をご参照ください。
https://mattn.kaoriya.net/software/vim/20191231213507.htm
その他の手順
これらの設定をして、VimでKotlinのファイルを開いた状態で :LspInstallServerとするとKotlinのLSPサーバーがインストールされるはずです。
そのあと :LspStatus
で kotlin-language-server: running
って表示されればおk
実演
こんな感じでコード補完とかできますし、定義ジャンプもできます。
mattnさんのを見てもらった方がわかりやすいかもな…
便利。 pic.twitter.com/AUlzKd72pK
— mattn (@mattn_jp) September 23, 2019
まとめ
とはいってもKotlinを書くためってことであればIntelliJ IDEAとかAndroid StudioとかみたいなIDEの方が便利だよ!(おい)
Vimが好きで仕方ない人、ちょろっとコード見るときにわざわざIDE使いたくない人などにおすすめです。
0 件のコメント:
コメントを投稿