
VimをIDEというかVS Codeみたいにしたかったんです(語彙力)
一つでそれを実現するプラグインとしてcoc.nvimというものがあるんですが、NeovimにLSP (Language Server Protocol)機能が搭載されてからは、各言語サーバや機能を個別に導入するスタイルが流行りのようです(?)
Vim(Neovimではなく)にLSPや機能ごとのプラグインを導入することに挑戦してみました。
vim-plug
プラグインマネージャとしてvim-plugを選びました。以下のコマンドでインストールできます。
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
プラグインの導入は、.vimrcに以下のように記載します。call plug#begin()とcall plug#end()の間でPlugコマンドを使います。
call plug#begin()
Plug 'cocopon/iceberg.vim'
call plug#end()
silent! colorscheme iceberg
こちらはカラースキームのicebergです。あとはVimで:PlugInstallを実行すればプラグインのインストールは完了です。
ちなみに、上記のようにcolorschemeはplug#end()の後で読み込むべきだそうです。また、plug#end()を呼ぶと自動的にfiletype plugin indent onとsyntax enableが実行されます。
prabirshrestha/vim-lsp
次は、まさにそのLSP機能をVimにもたらすvim-lspです。ただ、導入する言語ごとに煩雑な設定を書く必要があります。そこで、それを自動的にしてくれるvim-lsp-settingsも入れます。
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
vim-lsp-settingsの使い方
ファイルを開くとFileTypeに応じてインストールの案内を表示してくれます。たとえば、Python用の言語サーバはVim内で以下を実行します。
:LspInstallServer pylsp-all
一覧からインストール、アンインストールを行うこともできます。
:LspManageServers
好みで以下も設定しました(.vimrcに書きます)。上から、E>(エラー)やW>(ウォーニング)といったサインの無効、A>(コードアクション)サインの無効、テキスト領域へのメッセージ表示の無効、代わりにステータスラインへのメッセージ表示を有効にするものです。
let g:lsp_diagnostics_signs_enabled = 0
let g:lsp_document_code_action_signs_enabled = 0
let g:lsp_diagnostics_virtual_text_enabled = 0
let g:lsp_diagnostics_echo_cursor = 1
pylsp-allの設定
私の好みでRuffも入れます。vim-lsp-settingsから入れてもよいのですが、これまたpylsp-allと競合するlinter、formatterをすべて無効にしてくれるpython-lsp-ruffをpipでインストールします。
~/.local/share/vim-lsp-settings/servers/pylsp-all/venv/bin/pip install python-lsp-ruff
手動でたとえばpycodestyle、mccabe、pyflakesを無効にするには以下のように設定しなければなりませんが、python-lsp-ruffはこういう設定が必要ありません。
let g:lsp_settings = {
\ 'pylsp-all': {
\ 'workspace_config': {
\ 'pylsp': {
\ 'plugins': {
\ 'pycodestyle': {
\ 'enabled': v:false
\ },
\ 'mccabe': {
\ 'enabled': v:false
\ },
\ 'pyflakes': {
\ 'enabled': v:false
\ },
\ }
\ }
\ }
\ },
\}
余談
一度vim-lsp-settingsからruffサーバを入れたのですが、現状(?)g:lsp_settings_filetype_pythonに'ruff'を追加する必要もありました。
また、vim-language-server等ではNode.jsのインストールも必要です。
brew install node
prabirshrestha/asyncomplete.vim
オートコンプリート機能にはasyncomplete.vimを入れます。ここまでで十分IDEっぽくなります。
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
itchyny/lightline.vim
statuslineやtablineをきれいに表示してくれるlightline.vimを入れてみました。lightline-lspはstatuslineにウォーニングやエラーの数を表示してくれます。
Plug 'itchyny/lightline.vim'
Plug 'halkn/lightline-lsp'
設定はREADMEを参考にOKの表示だけ不要なので省きました。
set laststatus=2
set noshowmode
let g:lightline = {
\ 'colorscheme': 'iceberg',
\ 'active': {
\ 'right': [ [ 'lsp_errors', 'lsp_warnings', 'lineinfo' ],
\ [ 'percent' ],
\ [ 'fileformat', 'fileencoding', 'filetype' ] ]
\ },
\ 'component_expand': {
\ 'lsp_errors': 'lightline_lsp#errors',
\ 'lsp_warnings': 'lightline_lsp#warnings',
\ },
\ 'component_type': {
\ 'lsp_errors': 'error',
\ 'lsp_warnings': 'warning',
\ },
\ }
[ 'lsp_errors', 'lsp_warnings', 'lineinfo' ]が画面上、右から並ぶのに[ 'fileformat', 'fileencoding', 'filetype' ]は左から並ぶ理由については、作者のブログをご覧ください。
tpope/vim-commentary
Vimでは少し面倒なコメントアウトをトグルできるようにvim-commentaryを追加しました。VS Codeではcommand + /ですが、vim-commentaryではカーソル行でgcc、選択範囲でgcです。
Plug 'tpope/vim-commentary'
lambdalisue/fern.vim
ファイラーとしてfern.vimを入れました。
Plug 'lambdalisue/fern.vim'
以下でドロワー形式で起動できます。
:Fern . -drawer
おわりに
導入としてはこれくらいでしょうか。Gitとかのプラグインもあるので調べてみてください。細かいキーマップは追い追い設定していこうと思います。