👅

neovimでdein.vimや各種プラグイン、LanguageServerを自動インストールし環境構築を自動化する

2022/06/06に公開

はじめに

※ 読み飛ばして大丈夫です

禁煙に失敗しました。

というのも、以前にVim やめますという記事を書いたのですが、早々にVim(正確にはneovim)に戻ってきてしまいました。
そちらの記事からはそれなりに時間があいているので割と離れていたかのように思えますが、記事が思いのほかバズってしまい、すぐに戻ってきましたと言いづらかっただけで実際にはVimから完全に離れていたのは数週間程度だったと思います。
今ではVimとVS Codeを8:2くらいの割合で利用しています。(これでも以前と比べVS Codeの割合はかなり増えました)

ありがたいことにただのポエム記事を30000人近くの方に見て頂くことが出来[1]、twitter、はてブ、vim-jp等々でさまざまなコメントを頂きました。その中で「おう!また明日な!」「禁煙みたいな感じでしょ?」」「Vimの幻影を求める間はまたVimに戻ってくる」[2]といった言及が多く、
案外自分以上に自分のことを理解している人が多かったのだなといまさらながら痛感しています。とくに「禁煙」という表現がとてもしっくり来たので冒頭にて利用させて頂きました。

さて、これ以上続けるとまたもやポエム記事と化してしまいそうなのでそろそろ本題に入ろうと思います。
なお、今回の記事の内容はおそらくほとんどがvimでも可能だとは思いますが、未検証のためタイトルはneovimとしています。

自動で環境構築をする流れ

  1. neovimをインストールする(残念ながら手動で行う必要があります)
  2. dein.vimを自動でインストールする
  3. dein.vimで各種プラグインを自動でインストールする
  4. dein.vimを用いて自動インストールしたcoc.nvimを使って各種Language Serverを自動インストールする
  5. 快適なVimライフを送る

なお、neovimのインストールはMacであれば下記で行えます。

brew install neovim

Vim関連ファイルの構成

僕はホームディレクトリにVim関連のファイルを以下のように配置しています。これ以降の説明はこの配置を前提としたものが含まれるため、必要に応じて適宜読みかえてくだい。

.vim
├── coc-settings.json
├── dein.toml
├── dein_lazy.toml
└── settings
    ├── coc-setting.vim
    └── 各種プラグインの設定ファイル(省略)

coc-setting.jsoninit.vim$HOME/.config/nvim/以下にシンボリックリンクを設定して利用しています。

init.vimの全文

今回利用するinit.vimの全文は以下の通りです。

init.vim
" set up the dein.vim directory
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let g:rc_dir = expand('~/.vim')

" automatic installation of dein.vim
if !isdirectory(s:dein_repo_dir)
  execute '!git clone <https://github.com/Shougo/dein.vim>' s:dein_repo_dir
endif
execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')

if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " load the file which contain the plugin list
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

  call dein#load_toml(s:toml, {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  call dein#end()
  call dein#save_state()
endif

" automatically install any plug-ins that need to be installed.
if dein#check_install()
  call dein#install()
endif

init.vimの解説

vimのプラグイン管理にはdein.vimを利用しています。こちらに関してはドキュメントも充実しており、解説記事が多々存在しているので詳しい解説は省略いたします。

dein.vimの自動インストール

まずはdein.vimをインストールするディレクトリを指定しています。こちらは任意の場所に設定しなおして頂いて構いません。

init.vim
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let g:rc_dir = expand('~/.vim')

その後、指定したディレクトリにdein.vimが存在するかを確認しています。もし存在しない場合はGitHubからcloneしてきます。

init.vim
if !isdirectory(s:dein_repo_dir)
  execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
endif
execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')

その後、dein.vimの初期設定を行ないます。
dein.tomldein_lazy.tomlにインストールしたいvimのプラグインを列挙してあるため、こちらで読み込みます。

init.vim
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " load the file which contain the plugin list
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

  call dein#load_toml(s:toml, {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  call dein#end()
  call dein#save_state()
endif

ここまででdein.vimを自動的にインストールするための設定は完了です。
上記スクリプトをinit.vimに記載しておけば、dein.vimがインストール(GitHubからのclone)されていない状態でvimを起動した際、自動的にdein.vimのインストールが始まります。

dein.vim によるプラグインの自動インストール

vimプラグインの自動インストールにはdein.vimの機能を利用しています。
指定したプラグインがインストール済みかチェックするための関数が用意されているためそちらを呼びだします。
インストール済みでない場合は自動的にプラグインのインストールが始まります。

init.vim
" automatically install any plug-ins that need to be installed.
if dein#check_install()
  call dein#install()
endif

なお、インストールしたいプラグインはdein.tomlまたはdein_lazy.tomlに下記のように記載しておくだけで大丈夫です。

dein.toml
[[plugins]]
repo = 'neoclide/coc.nvim'
hook_add = '''exec 'source ' . g:rc_dir . '/settings/coc-vim.vim' '''

hook_addの部分は設定を外部ファイルに記載して管理しているため、そのファイルを読み混む処理になります。

このように利用したいvimプラグインをtomlファイル内に列挙しておくだけでvim起動時に自動的にインストールしてくれます。

coc.nvim によるLanguage Serverの自動インストール

Language Serverの管理にはcoc.nvimを利用しています。
こちらも解説記事等、多々ありますので今回は詳細についての解説は避けさせていただこうと思います。

coc.nvimにはLanguage Serverの自動インストール機能があります。
下記のように設定ファイルに利用したいLanguage Serverを列挙しておくだけで初回起動時に自動的にインストールしてくれます。(coc-setting.jsonではなくvim script側の設定です)

settings/coc-setting.vim
let g:coc_global_extensions = [
    \ 'coc-flutter',
    \ 'coc-sql',
    \ 'coc-go',
    \ 'coc-rls',
    \ 'coc-omnisharp',
    \ 'coc-svelte',
    \ 'coc-tsserver',
    \ 'coc-vetur',
    \ 'coc-vimlsp',
    \ 'coc-docker',
    \ 'coc-markdownlint',
    \ 'coc-json',
    \ 'coc-xml',
    \ 'coc-yaml',
    \ 'coc-css',
    \ 'coc-cssmodules',
    \ 'coc-spell-checker',
    \ 'coc-snippets',
\ ]

自動フォーマット

余談ですがcoc-settings.jsonに下記のように記載しておけばファイル保存時に自動でフォーマットしてくれるので便利です。

coc-settings.json
{
    "coc.preferences.formatOnSaveFiletypes": ["*"]
}

フォーマットしたいファイルタイプだけを列挙することも可能です。

coc-settings.json
{
    "coc.preferences.formatOnSaveFiletypes": [
        "python",
        "go",
        "dart",
        "cs",
        "java",
        "html",
        "javascript",
        "css",
        "vue",
        "svelte",
        "javascriptreact",
        "typescriptreact",
        "json"
    ],
}

おわりに

今回の記事の設定をしておけば、Vimを起動した時点で自動的に必要なプラグインやLanguage Serverがインストールされます。
その他に特殊な作業をしなくてもVimを起動するだけでさまざまなプラグインが自動でインストールされ、補完が利き、定義ジャンプやシンボルの利用箇所の取得、自動整形、識別子の変更等さまざまな恩恵が受けられると思います。
Vimの底力を舐めていたかもしれません。ぜひ快適なVimライフを。

脚注
  1. QiitaのView数を参考にしています。実際にはユニークアクセス数ではないと思うのでもっと少ないと思います。 ↩︎

  2. 前回の記事中でVSCodeはVimモードで利用していると言及したためだと思われます。現在はVSCode利用時はVimモードは利用していません。 ↩︎

GitHubで編集を提案

Discussion