Vimはもともと、さまざまなファイル形式に対応している。シンタックスを有効化(「syntax enable」または「syntax on」)しておけば、ファイルの拡張子に応じて対応するハイライトが行われる。今回はこの機能をさらに強化するプラグイン「sheerun/vim-polyglot」を紹介する。
vim-polyglotはいわゆるメタパッケージだ。各種プログラミング言語やファイル形式に対応するプラグインを取りまとめたもので、vim-polyglotをインストールすると、vim-polyglotが取りまとめているほかのプラグインがずらずらとインストールされていく。執筆時点では次の言語/ファイル形式に対応するとされている。
| 言語 | 対応内容 |
|---|---|
| acpiasl | シンタックス |
| ansible | シンタックス、インデント、ftplugins対応 |
| apiblueprint | シンタックス、ctags対応 |
| applescript | シンタックス、インデント |
| arduino | シンタックス、インデント |
| asciidoc | シンタックス |
| autohotkey | インデント |
| blade | シンタックス、インデント、ftplugins対応 |
| brewfile | シンタックス |
| c++11 | シンタックス |
| c/c++ | シンタックス |
| caddyfile | シンタックス、インデント、ftplugins対応 |
| carp | シンタックス |
| cjsx | シンタックス、ftplugins対応 |
| clojure | シンタックス、インデント、オートロード、ftplugins対応 |
| cmake | シンタックス、インデント |
| coffee-script | シンタックス、コンパイラ、インデント、オートロード、ftplugins対応 |
| cql | シンタックス |
| cryptol | シンタックス、コンパイラ、ftplugins対応 |
| crystal | シンタックス、インデント、オートロード、ftplugins対応 |
| csv | シンタックス、オートロード、ftplugins対応 |
| cucumber | シンタックス、インデント、コンパイラ、ftplugins対応 |
| cue | シンタックス |
| dart | シンタックス、インデント、オートロード、ftplugins対応 |
| dhall | シンタックス、ftplugins対応 |
| dlang | シンタックス、インデント |
| dockerfile | シンタックス、インデント、ftplugins対応 |
| elixir | シンタックス、インデント、コンパイラ、オートロード、ftplugins対応 |
| elm | シンタックス、インデント |
| emberscript | シンタックス、インデント、ftplugins対応 |
| emblem | シンタックス、インデント、ftplugins対応 |
| erlang | シンタックス、インデント |
| ferm | シンタックス |
| fish | シンタックス、インデント、コンパイラ、オートロード、ftplugins対応 |
| flatbuffers | シンタックス |
| fsharp | シンタックス、インデント |
| gdscript | シンタックス、インデント |
| git | シンタックス、インデント、ftplugins対応 |
| glsl | シンタックス、インデント |
| gmpl | シンタックス |
| gnuplot | シンタックス |
| go | シンタックス、コンパイラ、インデント |
| gradle | コンパイラ |
| graphql | シンタックス、インデント、オートロード、ftplugins対応 |
| haml | シンタックス、インデント、コンパイラ、ftplugins対応 |
| handlebars | シンタックス、インデント、ftplugins対応 |
| haproxy | シンタックス |
| haskell | シンタックス、インデント、ftplugins対応 |
| haxe | シンタックス |
| hcl | シンタックス、インデント、ftplugins対応 |
| helm | シンタックス |
| hive | シンタックス、ftplugins対応 |
| html5 | シンタックス、インデント、オートロード、ftplugins対応 |
| i3 | シンタックス、ftplugins対応 |
| icalenadr | シンタックス |
| idris | シンタックス、インデント、ftplugins対応 |
| ion | シンタックス、ftplugins対応 |
| javascript | シンタックス、インデント、コンパイラ、ftplugins対応 |
| jenkins | シンタックス、インデント |
| jinja | シンタックス、インデント |
| json5 | シンタックス |
| json | シンタックス、インデント、ftplugins対応 |
| jst | シンタックス、インデント |
| jsx | オートロード |
| julia | シンタックス、インデント、オートロード、ftplugins対応 |
| kotlin | シンタックス、インデント、ftplugins対応 |
| ledger | シンタックス、コンパイラ、インデント |
| less | シンタックス、インデント、ftplugins対応 |
| lilypond | シンタックス、インデント、コンパイラ、ftplugins対応 |
| livescript | シンタックス、インデント、コンパイラ、ftplugins対応 |
| llvm | シンタックス、インデント、ftplugins対応 |
| log | シンタックス |
| lua | シンタックス、インデント |
| mako | シンタックス、インデント、ftplugins対応 |
| markdown | シンタックス、インデント、ftplugins対応 |
| mathematica | シンタックス、ftplugins対応 |
| mdx | シンタックス |
| meson | シンタックス、インデント、ftplugins対応 |
| moonscript | シンタックス、インデント、ftplugins対応 |
| nginx | シンタックス、インデント、ftplugins対応 |
| nim | シンタックス、コンパイラ、インデント |
| nix | シンタックス、インデント、コンパイラ、ftplugins対応 |
| objc | ftplugins対応、シンタックス、インデント |
| ocaml | シンタックス、インデント、コンパイラ、ftplugins対応 |
| octave | シンタックス、インデント |
| opencl | シンタックス、インデント、ftplugins対応 |
| perl | シンタックス、インデント、ftplugins対応 |
| pgsql | シンタックス、インデント |
| php | シンタックス |
| plantuml | シンタックス、インデント、ftplugins対応 |
| pony | シンタックス、インデント、オートロード、ftplugins対応 |
| powershell | シンタックス、インデント、コンパイラ、ftplugins対応 |
| protobuf | シンタックス、インデント |
| pug | シンタックス、インデント、ftplugins対応 |
| puppet | シンタックス、インデント、オートロード、ftplugins対応、ctags対応 |
| purescript | シンタックス、インデント、ftplugins対応 |
| python-compiter | コンパイラ、オートロード |
| python-indent | インデント |
| python | シンタックス |
| qmake | シンタックス |
| qml | シンタックス、インデント、ftplugins対応 |
| r-lang | シンタックス |
| racket | シンタックス、インデント、ftplugins対応 |
| ragel | シンタックス |
| raku | シンタックス、インデント、ftplugins対応 |
| raml | シンタックス、ftplugins対応 |
| razor | シンタックス、インデント、ftplugins対応 |
| reason | シンタックス、インデント |
| rspec | シンタックス |
| rst | シンタックス、インデント、オートロード、ftplugins対応 |
| ruby | シンタックス、インデント、コンパイラ、オートロード、ftplugins対応 |
| rust | シンタックス、インデント、コンパイラ、オートロード、ftplugins対応、ctags対応 |
| sbt | シンタックス |
| scala | シンタックス、インデント、コンパイラ、ftplugins対応、ctags対応 |
| scss | シンタックス、インデント、ftplugins対応 |
| sh | シンタックス |
| slim | シンタックス、インデント、ftplugins対応 |
| slime | シンタックス、インデント |
| smt2 | シンタックス、オートロード、ftplugins対応 |
| solidity | シンタックス、インデント、ftplugins対応 |
| stylus | シンタックス、インデント、ftplugins対応 |
| svelte | シンタックス、インデント、ftplugins対応 |
| svg-indent | インデント |
| svg | シンタックス |
| swift | シンタックス、インデント、コンパイラ、ftplugins対応、ctags対応 |
| sxhkd | シンタックス |
| systemd | シンタックス、ftplugins対応 |
| terraform | シンタックス、インデント、オートロード、ftplugins対応 |
| textile | シンタックス、ftplugins対応 |
| thrift | シンタックス |
| tmux | シンタックス、ftplugins対応 |
| tomdoc | シンタックス |
| toml | シンタックス、ftplugins対応 |
| tptp | シンタックス |
| twig | シンタックス、インデント、ftplugins対応 |
| typescript | シンタックス、インデント、コンパイラ、ftplugins対応、ctags対応 |
| unison | シンタックス |
| v | シンタックス、インデント、ftplugins対応 |
| vala | シンタックス、インデント、ftplugins対応 |
| vbnet | シンタックス |
| vcl | シンタックス |
| vifm | シンタックス、オートロード、ftplugins対応 |
| vm | シンタックス、インデント |
| vue | シンタックス、インデント、ftplugins対応 |
| xdc | シンタックス |
| xls | シンタックス |
| xml | シンタックス |
| yaml | シンタックス、ftplugins対応 |
| yard | シンタックス |
| zephir | シンタックス |
| zig | シンタックス、インデント、オートロード、ftplugins対応 |
| zinit | シンタックス |
そもそもVimがさまざまな形式に対応しているので、vim-polyglotの効果がわかりにくいかもしれないが、vim-polyglotには次のような利点がある。
- Vimが対応していない言語やファイル形式にも対応している
- Vimよりもアップデートが頻繁
- Vimよりも新しいプログラミング言語などへの対応が早い
基本的には、Vimの基本的な機能を強化するものだと考えておけばよい。芋づる式に多くのプラグインがインストールされることにはなるが、それほど害があるものでもないので、使ってみてはいかがだろうか。
vim-polyglotのセットアップ方法
本連載でこれまでに作成してきた設定ファイル~/.vimrcは次のようになっているはずだ。
"dein Scripts=============================
if &compatible
set nocompatible " Be iMproved
endif
" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim
" Required:
if dein#load_state('~/.cache/dein/.')
call dein#begin('~/.cache/dein/.')
" Let dein manage dein
" Required:
call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')
" Add or remove your plugins here
call dein#add('junegunn/seoul256.vim')
call dein#add('vim-airline/vim-airline')
call dein#add('vim-airline/vim-airline-themes')
call dein#add('preservim/nerdtree')
call dein#add('tpope/vim-commentary')
call dein#add('tpope/vim-fugitive')
call dein#add('fholgado/minibufexpl.vim')
call dein#add('dense-analysis/ale')
call dein#add('junegunn/fzf', {'build': './install --all'})
call dein#add('junegunn/fzf.vim')
" Required:
call dein#end()
call dein#save_state()
endif
" Required:
filetype plugin indent on
syntax enable
" If you want to install not installed plugins on startup.
if dein#check_install()
call dein#install()
endif
" seoul256
let g:seoul256_background = 233
colo seoul256
" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'
" NERDTree
" <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>
" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>
" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>
"End dein Scripts=========================
set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase
ここにvim-polyglotの設定を追加する。vim-polyglotの設定は簡単だ。上記のファイルから以下の記述を探してほしい。
call dein#add('junegunn/fzf', {'build': './install --all'})
call dein#add('junegunn/fzf.vim')
これを、次のように書き換える。
call dein#add('junegunn/fzf', {'build': './install --all'})
call dein#add('junegunn/fzf.vim')
call dein#add('sheerun/vim-polyglot')
編集後、Vimを起動すると、vim-polyglotが紐付けているプラグインが次々にインストールされていく。少し時間がかかるかもしれない。
vim-polyglotの活用サンプル
vim-polyglotの効果は、例えばCSVファイルを編集したりするとわかりやすい。次のスクリーンショットはvim-polyglotをインストールする前の段階でVimで編集しているところだ。
これが、vim-polyglotインストール後にVimで編集すると次のようになる。
ハイライトが行われているほか、区切り部分が明示的に表示されるように変わっていることがわかる。こんな感じで、vim-polyglotをインストールすればVimがデフォルトでは対応していないフォーマットにも対応してくれるようになる。
もし、vim-polyglotを入れたことで表示されるようになったハイライトやインデントが気に入らない場合には、対象の形式に対してvim-polyglotが機能しないように無効化することができる。
プラグインの在り方として、vim-polyglotのアプローチは典型的なものではないかと思う。シンタックスハイライトのように、より頻繁に更新されたほうが便利な部分は、Vim本体に取り込むよりもプラグイン経由で頻繁にアップデートがかかったほうが便利だ。Visual Studio Codeなどの統合開発環境でも、プログラミング言語やファイル形式に対応するプラグインはそれ単体でアップデートがかかる仕組みになっている。このほうが、Visual Studio Codeに機能そのものを統合してリリースするよりも現実的だ。
vim-polyglotは導入の手間と比べてさりげない効果が素敵なプラグインなので、ぜひ使ってみていただきたい。
今回の成果物
今回のプラグイン設定を追加した設定ファイルは以下の通りだ。
"dein Scripts=============================
if &compatible
set nocompatible " Be iMproved
endif
" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim
" Required:
if dein#load_state('~/.cache/dein/.')
call dein#begin('~/.cache/dein/.')
" Let dein manage dein
" Required:
call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')
" Add or remove your plugins here
call dein#add('junegunn/seoul256.vim')
call dein#add('vim-airline/vim-airline')
call dein#add('vim-airline/vim-airline-themes')
call dein#add('preservim/nerdtree')
call dein#add('tpope/vim-commentary')
call dein#add('tpope/vim-fugitive')
call dein#add('fholgado/minibufexpl.vim')
call dein#add('dense-analysis/ale')
call dein#add('junegunn/fzf', {'build': './install --all'})
call dein#add('junegunn/fzf.vim')
call dein#add('sheerun/vim-polyglot')
" Required:
call dein#end()
call dein#save_state()
endif
" Required:
filetype plugin indent on
syntax enable
" If you want to install not installed plugins on startup.
if dein#check_install()
call dein#install()
endif
" seoul256
let g:seoul256_background = 233
colo seoul256
" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'
" NERDTree
" <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>
" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>
" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>
"End dein Scripts=========================
set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

