はじめに
この文章は、普段から Vim を使い、仕事でも趣味でも Go 言語を書いている僕が、最近どの様な環境で書いているかを説明した文章です。ベストプラクティスではありません。
vim-go と僕
元々、Go 言語はリポジトリの misc/vim に Vim で Go 言語を書くための syntax やコマンドを持っていました。今でもそれらは Google のリポジトリに置かれています。ミュージアム的な物なので、実用的ではないと思います。
GitHub - google/vim-ft-go
A rudimentary Go filetype plugin. Provides syntax files and basic settings for go files. This is a f...
https://github.com/google/vim-ft-go
これを Fatih Arslan 氏が拡張した vim-go が、最近では Vim で Go 言語を書くためのデファクトスタンダードになっていました。vim-go は :GoImport
コマンドによる import 文の追加や、:w
での保存時にソースコードを整形する機能、:GoDef
による定義位置ジャンプなど、色々な機能を搭載していきました。
僕もずっと vim-go を愛用してきて、幾らかコントリビュートもさせて頂いたりしました。正直、vim-go が無いと Go 言語が書けない、そんな風にも思っていました。
vim-go 無いと Go 書けないくらい vim-go に依存してる。 #vimconf2017
— mattn (@mattn_jp) November 4, 2017
大きくなりすぎた vim-go
最近、vim-go が Language Server Client を実装しました。僕は vim-lsp という Language Server Client を使っていたのでそれらを無効にしていました。少し残念だったのが vim-go の Language Server Client の実装に伴い、幾らかバグが発生していました。またシンタックスハイライトにもバグがありました。そしてこれは最近思い始めた事ではないのですが、幾らかの機能を無効にしていても「若干重たいな」と感じていました。
普段から vim-go の幾らかの機能を無効にする為の設定を vimrc に書いていたのですが、ふと「もしかして僕には vim-go は大きすぎるのかもしれない」と思ったのです。
僕が欲しい機能は何だ
改めて、僕が Vim による Go 言語の編集環境で欲しい物を洗い出してみました。
- Go 言語のシンタックスハイライト
- 入力補完
:GoImport
コマンド:w
による自動ソースコード整形、およびそのエラー表示
これだけあれば、僕には十分なのです。
Go 言語のシンタックスハイライトに関しては、最近の Vim であればデフォルトランタイムに含まれています。Go 言語は新しい予約語を増やす事はないので、これで十分です。
入力補完に関しては vim-lsp を使っており、こちらの方が色々な言語をサポートしており拡張性もあり、そもそも僕は vim-lsp のコントリビュータでもあるのでこちらが使いたいです。ただし、実は僕は入力補完は使っていなかったりします。Vim による編集の体験を良くする為に Vim や vim-lsp へのコントリビュートは行っていますが、僕本人はほぼ手打ちしていたります。
残るは :GoImport
コマンドと :w
による自動ソースコード整形なのですが、これだけの為に vim-go に依存する必要はないと思い立ち、vim-go を卒業する事を決めました。
vim-goimports による引越し
GitHub - mattn/vim-goimports: Vim plugin for Minimalist Gopher
vim-goimports Vim plugin for Minimalist Gopher Features Auto-formatting with :w GoImport/GoImportAs ...
https://github.com/mattn/vim-goimports
vim-goimports は、上記の残る2つの問題を解決する為だけに作ったプラグインです。
:GoImport
コマンド:w
による自動ソースコード整形、およびそのエラー表示
メンテナンスやバグ修正は行いますが、これ以上、機能を足す予定はありません。もし「あー、vim-go のあの機能はさすがに欲しかった」と思い出す事があれば、僕はおそらく別のプラグインを作るでしょう。
これは vim-go がイケてないという話ではなく、僕と vim-go との距離感の話です。僕が vim-go に歩みよるよりも、僕のスタイルに何かを足して僕が欲しかった物を作った方が近かった、というだけの話です。
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'mattn/vim-goimports'
Language Server や入力補完が必要ない方であれば以下でも構いません。
Plug 'mattn/vim-goimports'
これにより、vim-go の幾らかの機能を無効にする為に書いていた設定類を消しました。:GoDef
による定義位置ジャンプは vim-lsp が有効になっていれば gd
で可能ですし、ソースコードの整形は vim-goimports がやってくれます。ソースコード整形は、本来 Language Server でやれる話ですが、これに関しては絶賛取り組み中で、もう少し時間が必要です。それまでの間は vim-goimports に頼る事にします。また下記のエントリでもご紹介した通り、Vim の歩むべき道は、個別の言語の個別のプラグインによって個々のツールの導入に時間を割いたり vimrc を太らせる事ではないはずなのです。
Big Sky :: Vim をモダンな IDE に変える LSP の設定
Go 言語の IDE 機能を得る為に何か知る必要はありません。Java の IDE 機能を得る為に何か知る必要はありません。HTML の IDE 機能をインストールする為に npm コマンドの使い方を...
https://mattn.kaoriya.net/software/vim/20191231213507.htm
おわりに
上記の引越し作業により、幾分 vimrc の Go に関する項目がスッキリしました。今後、本来は必要なはずだった vim-go の機能が見つかれば、自分で作っていくしかありません。ですが 2019 年末に「こっちの方が近い」と思った自分を信じて、しばらくはやってみます。