本記事
こんにちは、鈴木商店のDidyです。
今回が初投稿です。
記念すべき初投稿はcoc.nvimというvimプラグインを導入した話をします。
この話は元々6月の社内の報告会で発表したかったネタの一つでした。
定員オーバーでお断りされて発表できませんでした。
次の発表まで温める程の内容でもないし、お小遣いも貰えるらしいので記事にしました。
ちなみに導入した感想ですが、控えめに言って最高です。
coc.nvimとは
coc.nvimはvimをVSCodeのようなIDEライクな開発環境にしてくれるLSPフルサポートプラグインです。
LSPをサポートするプラグインはたくさんあります。数ある中からcoc.nvimに決めた理由を簡単に書きます。
・ 豊富な拡張機能。
・ 容易な設定。
・ githubのスター数とユーザー数。
・ 活発なコミュニティ。
拡張機能はgithubのwikiかnpm moduleを検索するサイトで必要な拡張機能を探して見つけます。
Vimのコマンドラインモードでコマンドを叩くか、vimrc(設定ファイル)に記述するだけで拡張を追加できます。
1 2 |
:CocInstall extension-name |
1 2 3 |
# coc.lua(vimrc) vim.g.coc_global_extensions = { 'coc-json', 'coc-yaml', 'coc-pyright' } |
インストール
Coc.nvimのReadme.mdを参考にしつつインストールしました。
・ Node.jsのインストール。
|—- homebrewを使いました。シェルで$ brew install node
コマンドを実行。
・ coc.nvimのインストール。
|—- vimrcにpaq {'neoclide/coc.nvim', branch='release'}
を追記し、:PaqInstall
を実行。
設定
・ vimrc(キーマッピング等の設定)
|—- 鈴木商店では希少なvimmer・やまけんさんのvimrcを参考にさせてもらいました。
|——– (公式にもサンプルあるよ)
・ 拡張機能。以下の2つの拡張を追加しました。
|—- coc-pyright: PythonのLanguage Server。現在のプロジェクトのメイン言語がPythonのため利用しています。
|——– pyright: MS制の静的解析ツール
|—- efm-langserver: LintツールをLSPに対応させるための汎用的なLanguage Server。textlintと連携させて日本語校正ツールとして利用しています。
|——– textlint: 自然言語のリンター
|—- coc-json: JsonのLanguage Server
|—- coc-yaml: YamlのLanguage Server
・ その他(覚えておくと便利なコマンド)
|—- :CocInstall
: 拡張機能を追加する 。
|—- :CocUninstall
: 拡張機能を削除する 。
|—- :CocList extensions
: 追加済みの拡張機能の一覧を表示する。
|—- :CocCommand workspace.showOutput
: 拡張機能の実行ログを表示する。
|—- :CocConfig
: LSPの設定ファイルを開く。
機能
・ 自動補完
・ エラーやワーニングなどのリントメッセージの表示。カーソルを載せるとエラーメッセージを確認できます。
・ ソースコードの整形機能。
・ 定義またはヒントの確認。
・ 定義ジャンプ機能。定義が別ファイルにある場合は、そのファイルの該当位置に移動してくれます。
・ 関数名または変数名などを一括で変更する。
vimrcの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# coc.lua(vimrc) -- helper local api, bo, cmd, fn, g, o = vim.api, vim.bo, vim.cmd, vim.fn, vim.g, vim.o local nvim_set_keymap = vim.api.nvim_set_keymap g.coc_global_extensions = { 'coc-json', 'coc-yaml', 'coc-pyright' } function _G.check_back_space() local col = fn.col(".") - 1 if col == 0 or fn.getline("."):sub(col, col):match("%s") then return true else return false end end -- Completion nvim_set_keymap("i", "", 'pumvisible() ? "" : v:lua.check_back_space() ? "" : coc#refresh()', {noremap = true, silent = true, expr = true}) nvim_set_keymap('i', '', 'pumvisible() ? "" : ""', {noremap = true, silent = true, expr = true}) nvim_set_keymap('i', '', 'coc#refresh()', {noremap = true, silent = true, expr = true}) nvim_set_keymap("i", "", 'pumvisible() ? coc#_select_confirm() : "u=coc#on_enter()"', {noremap = true, silent = true, expr = true}) -- navigate diagnostic nvim_set_keymap('n', '[g', '(coc-diagnostic-prev)', {noremap = false, silent = true}) nvim_set_keymap('n', ']g', '(coc-diagnostic-next)', {noremap = false, silent = true}) -- goto definition nvim_set_keymap('n', 'gd', '(coc-definition)', {noremap = false, silent = true}) nvim_set_keymap('n', 'gy', '(coc-type-definition)', {noremap = false, silent = true}) nvim_set_keymap('n', 'gi', '(coc-implementation)', {noremap = false, silent = true}) nvim_set_keymap('n', 'gr', '(coc-references)', {noremap = false, silent = true}) function _G.show_documentation() if fn.index({ 'vim', 'help' }, bo.filetype) >= 0 then cmd('h ' .. fn.expand('')) elseif api.nvim_eval('coc#rpc#ready()') then fn.CocActionAsync('doHover') else cmd('! ' .. o.keywordprg .. ' ' .. fn.expand('')) end end -- show reference nvim_set_keymap('n', 'lk', 'lua _G.show_documentation()', {noremap = false, silent = true}) -- scroll float popups nvim_set_keymap('n', '', 'coc#float#has_scroll() ? coc#float#scroll(1) : ""', {noremap = true, silent = true, expr = true}) nvim_set_keymap('n', '', 'coc#float#has_scroll() ? coc#float#scroll(0) : ""', {noremap = true, silent = true, expr = true}) nvim_set_keymap('i', '', 'coc#float#has_scroll() ? "=coc#float#scroll(1)" : ""', {noremap = true, silent = true, expr = true}) nvim_set_keymap('i', '', 'coc#float#has_scroll() ? "=coc#float#scroll(0)" : ""', {noremap = true, silent = true, expr = true}) nvim_set_keymap('n', '', '(coc-float-jump)', {noremap = false, silent = true}) nvim_set_keymap('i', '', '(coc-float-jump)', {noremap = false, silent = true}) -- format nvim_set_keymap('n', 'lr', '(coc-rename)', {noremap = false, silent = true}) nvim_set_keymap('n', 'lf', 'call CocAction("format")call CocAction("runCommand", "editor.action.organizeImport")', {noremap = true, silent = true}) -- mappings for coclist nvim_set_keymap('n', 'la', 'CocList diagnostics', {noremap = true, silent = true}) nvim_set_keymap('n', 'le', 'CocList extensions', {noremap = true, silent = true}) nvim_set_keymap('n', 'lc', 'CocList commands', {noremap = true, silent = true}) nvim_set_keymap('n', 'lo', 'CocList outline', {noremap = true, silent = true}) |
最後に
導入した感想ですが、控えめに言って最高です。
以上、coc.nvimを導入した話でした。
「vimを最高のIDEにする」への1件のフィードバック