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-polyglotインストール後にVimで編集すると次のようになる。

vim-polyglotインストール後

ハイライトが行われているほか、区切り部分が明示的に表示されるように変わっていることがわかる。こんな感じで、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