ミシシッピ川以東のルイジアナ

わたしのブログへようこそ!出てけ

Neovimを導入する

はじめに

Neovim を入れます。

環境

こんな感じ。

$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=20
DISTRIB_CODENAME=ulyana
DISTRIB_DESCRIPTION="Linux Mint 20 Ulyana"

きっかけ

僕も一応 Vimmer の端くれではあるものの、元々そこまでプログラミングするタイプではなくて(レポートで LaTeX 書いてる時間が圧倒的に長い)、程々にプラグインを入れたり.vimrcに自作コマンドベタ書きしたりしながら暮らしていた。

ただ最近某IT企業でバイトを始めたことででコーディングの機会が爆増した。しかもかなり大きなプロジェクトで、タグジャンプもカスだし補間も効かないほぼ生の Vim では全く仕事にならない。

ということで(不本意ながら)ゴリゴリにカスタマイズする決意をしたのだが、どうせならメンテナンス性も良さそうだし Neovim にしようかなと思った次第である。

Neovim

とりあえず Neovim を入れていく。

Bob を使いたかった

Bob というバージョンマネージャがあるらしい。せっかくなら導入しよう。

github.com

rustup が要求されるので用意する(元々 Rust の環境があったので今回は割愛)。

普通に入れる分には zip があるので解凍して中の実行ファイルを動かせばいいらしいのだが、肝心のファイルが Releases にあるのが見つけられずにしばらく迷っていた。

$ unzip bob-linux-x86_64.zip
$ cd bob-linux-x86_64/
$ chmod u+x bob
$ ./bob 
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./bob)
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./bob)
./bob: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./bob)

glibc のバージョンがないと怒られた。そんなに古いか?

$ dpkg -l | grep libc6
ii  libc6:amd64                                   2.31-0ubuntu9.14                            amd64        GNU C Library: Shared libraries
ii  libc6:i386                                    2.31-0ubuntu9.14                            i386         GNU C Library: Shared libraries
ii  libc6-dbg:amd64                               2.31-0ubuntu9.14                            amd64        GNU C Library: detached debugging symbols
ii  libc6-dev:amd64                               2.31-0ubuntu9.14                            amd64        GNU C Library: Development Libraries and Header Files
ii  libc6-i386                                    2.31-0ubuntu9.14                            amd64        GNU C Library: 32-bit shared libraries for AMD64

ちょっと古かった。いやしかし、流石に glibc を適当にアップデートして依存関係ブチ壊しとかになったら目も当てられないし、全部調べて丁寧に更新するほどの気力はない。 Bob はまた機会があればということで一旦諦めることにする。

仕方ないので

apt installneovimを入れるとv0.4.3が入る。4年以上前のビルドバージョンなのでかなり古い。 そもそも apt が Ubuntu の公式レポジトリから持ってくるアプリケーションは全体的に古く、以前も TeX Live のバージョンが古くてキレたりしていた。 執筆現在で Latest はv0.9.5だから、流石にこちらを使いたい。

Neovim の GitHub レポジトリはこちら。Releases から一番新しい安定版をダウンロードしよう。

github.com

$ mkdir nvim_install && cd nvim_install
$ wget https://github.com/neovim/neovim/releases/download/v0.9.5/nvim.appimage
... # なんかいっぱい表示される
$ chmod u+x nvim.appimage
$ ./nvim.appimage

Neovim が立ち上がる。この時点でalias nvim="<dir>/nvim.appimage"とかしてもいいのだが、この後紹介する nvim-kickstartでその辺の設定までしてくれるので、とりあえず放置でも問題ない。

nvim-kickstart

nvim-kickstart は Neovim 環境構築のために色々盛り込んだスターターキットである。

github.com

Vim でいう ~/.vim/ にあたるのが Neovim では ~/.config/nvim/ なので、ここにレポジトリごとcloneしてぶち込めばよい。

$ cd ~/.config
$ git clone git@github.com:nvim-lua/kickstart.nvim.git nvim

この後 ./nvim.appimage で起動すると、色々表示されて気がつくと色々なプラグインがインストールされている。正直サラの状態で全然触っていないのでどこがどう変わったのか全然わからないのだが、なんかカッコいい感じになった。

また、 nvim で起動するようになっている。ありがたい。

自分で設定

先述の.config/nvim/(以下単にnvim/と書く)の中にはinit.luaというファイルが入っている。これがメインの設定ファイル(Vim でいう.vimrc)である。

Lua

Neovim の設定には VimScript も使えるものの、基本は Lua で書かれている。

-- コメントアウトは "--" で行う

-- ローカル変数は `local` で宣言
-- ちなみに動的型付け
local hoge = 1
local fuga = "Fuga"

-- 配列
local arr = { 1, 2, 3 }
-- ハッシュマップもできる
local tab = { num1 = 1, num2 = 2 }

-- 要素アクセスは 1-indexed なので注意
if  arr[1] == tab.num1 then
  print(":D")
else
  print(":(")
end

だいたい雰囲気で読めるので、書くときに困ったら調べるとよい。

www.lua.org

qiita.com

ファイル分割

現状だと万物が init.luaに入っているのでファイルを分割したい。nvim/lua/ の中に置かれた Lua ファイル <file>.luarequire("<file>") で呼び出せる。また require("<dir>") とすると nvim/lua/<dir>/init.lua が呼び出される。

init.lua の270行目あたりから[[ Setting options ]][[ Basic Keymaps ]]とコメントされている並びがあるのでそれぞれoptions.lua, keymaps.luaというファイルに分けておき、また各プラグインの設定は適宜ディレクトリに分けて次のようなファイル構成にする。

nvim/
 |- init.lua
 |- lua/
     |- options.lua
     |- keymaps.lua
     |- plugin1-config
     |   |- init.lua
     |   |- setting.lua
     |- plugin2-config
     |   |- init.lua
     .........
     ......
     ...
     ..

init.luaには代わりに次のように書く。

-- Read setting options
require("options")

-- Read basic keymaps
require("keymaps")

-- Setup <plugin1>
require("<plugin1>")

...
...

option.luaは好みで以下のような具合に付け足す。

-- language
vim.cmd('language en_US.utf8')

-- file
vim.o.fileencoding = "utf8"

-- cursor
vim.o.cursorline   = true
vim.o.cursorcolumn = true

-- tab
vim.o.expandtab   = true
vim.o.tabstop     = 4
vim.o.shiftwidth  = 4

-- blank
vim.o.list        = true
-- vim.o.listchars   = { tab = '»', trail = '-', nbsp = '+' }

-- display
vim.o.showmatch = true
-- vim.o.relativenumber = true

-- window transparency
vim.o.winblend = 30
vim.o.pumblend = 20

ちなみに完成形はこんな感じ。

github.com

プラグイン追加

先述の通り kickstart.nvim にはデフォルトでおすすめのプラグインがたくさん入っている(厳密にはインストールするよう init.lua に既に書いてある)が、もちろん他にも入れたいものがあれば適宜追加できる。

nvim-web-devicons

github.com

ステータスラインなどで特殊フォントのアイコンを表示する。色々なプラグインが依存しているのでとりあえず入れておくと吉。

lualine.nvim

github.com

ステータスラインをカスタムする。あるのとないのではシャレオツ度がかなり違う。

nvim-autopairs

github.com

カッコ類の補完をしてくれる。正直これがないとやってられない。

Vim 時代は職人手作りの inoremap {<CR> {}<LEFT><CR><ESC><S-o> みたいな設定を .vimrc に書いていたが、このプラグインのおかげで万物が解決した。

nvim-lsp-smag

github.com

tagfunc と LSP の連携をしてくれる。ほとんど使うことはないが、tags で頑張っていた高校時代のプロジェクトも残っているのでお守り代わりに入れてある。

dial.nvim

github.com

カーソル位置の数値をインクリメント・デクリメントする。日付なんかにも対応している。

lpsaga.nvim

github.com

LSP 関連のUIをオシャレにする。まあなくても困りはしない。

lsp-colors.nvim

github.com

Neovim のビルドイン LSP がサポートしていないハイライト等の色定義を追加する。

noice.nvim

github.com

メッセージやコマンドラインモードのときのプロンプトをポップアップウィンドウにしてくれる。

nvim-treesitter-context

github.com

長い関数などで冒頭行が見切れたとき、上部に名前や引数を表示してくれる。

treesitter-unit

github.com

カーソル位置のコードブロックを textobeject u にする。例えば、関数内で yiu とすると関数内部全体をヤンクできる。

hlargs.nvim

github.com

デフォルトだと見分けがつかない関数等の引数に色をつけてくれる。かなり助かる。

sidebar.nvim

github.com

Diagnostics やブランチの状況を表示するサイドバーが追加できる。鬱陶しいので普段は非表示にしている。

neo-tree.nvim

github.com

ファイラ。これがないとやってられないシリーズ。

git.nvim

github.com

Neovim 内部でも Git コマンドが :Git <subcmd> の形式で使える。他にもキーバインドを色々設定できるが、ミスタイプで変なことをすると怖いので使っていない。

vim-illuminate

github.com

カーソル位置の単語をうっすらハイライトする。コードを読むとき、検索するほどでもない場面で目 grep する必要がなくて非常によい。地味にこれがないとやってられないシリーズ。

todo-comments.nvim

github.com

TODO:, WARNING:, FIX: などのテキストを目立たせる。かなり派手。 自分の環境だと何故か NOTE: で出てくるアイコンだけ上手く表示されず、ミトコンドリアみたいになっていてかわいい。

cmp-cmdline

github.com

コマンドラインモードで補完が使えるようになる。これがないとやってられないシリーズ。

cmp-buffer

github.com

バッファの操作に補完が使える。あまり使っていない。

vimtex

github.com

LaTeX のファイル編集や LaTeX コマンドの実行に便利なプラグイン。本当に一年中 LaTeX を書いているのでこれがないとやってられないシリーズ......と言いたいのだが、微妙に痒いところに手が届かず、結局自分でスクリプトを書いて補助している。

おわりに

この期にエディタ以外にもシェルとかターミナルとか色々いじる予定なので、シリーズ物になると思います。