はじめに
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
というバージョンマネージャがあるらしい。せっかくなら導入しよう。
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 install
でneovim
を入れるとv0.4.3が入る。4年以上前のビルドバージョンなのでかなり古い。
そもそも apt が Ubuntu の公式レポジトリから持ってくるアプリケーションは全体的に古く、以前も TeX Live のバージョンが古くてキレたりしていた。 執筆現在で Latest はv0.9.5だから、流石にこちらを使いたい。
Neovim の GitHub レポジトリはこちら。Releases から一番新しい安定版をダウンロードしよう。
$ 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 環境構築のために色々盛り込んだスターターキットである。
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
だいたい雰囲気で読めるので、書くときに困ったら調べるとよい。
ファイル分割
現状だと万物が init.lua
に入っているのでファイルを分割したい。nvim/lua/
の中に置かれた Lua ファイル <file>.lua
は require("<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
ちなみに完成形はこんな感じ。
プラグイン追加
先述の通り kickstart.nvim
にはデフォルトでおすすめのプラグインがたくさん入っている(厳密にはインストールするよう init.lua
に既に書いてある)が、もちろん他にも入れたいものがあれば適宜追加できる。
nvim-web-devicons
ステータスラインなどで特殊フォントのアイコンを表示する。色々なプラグインが依存しているのでとりあえず入れておくと吉。
lualine.nvim
ステータスラインをカスタムする。あるのとないのではシャレオツ度がかなり違う。
nvim-autopairs
カッコ類の補完をしてくれる。正直これがないとやってられない。
Vim 時代は職人手作りの inoremap {<CR> {}<LEFT><CR><ESC><S-o>
みたいな設定を .vimrc
に書いていたが、このプラグインのおかげで万物が解決した。
nvim-lsp-smag
tagfunc
と LSP の連携をしてくれる。ほとんど使うことはないが、tags で頑張っていた高校時代のプロジェクトも残っているのでお守り代わりに入れてある。
dial.nvim
カーソル位置の数値をインクリメント・デクリメントする。日付なんかにも対応している。
lpsaga.nvim
LSP 関連のUIをオシャレにする。まあなくても困りはしない。
lsp-colors.nvim
Neovim のビルドイン LSP がサポートしていないハイライト等の色定義を追加する。
noice.nvim
メッセージやコマンドラインモードのときのプロンプトをポップアップウィンドウにしてくれる。
nvim-treesitter-context
長い関数などで冒頭行が見切れたとき、上部に名前や引数を表示してくれる。
treesitter-unit
カーソル位置のコードブロックを textobeject u
にする。例えば、関数内で yiu
とすると関数内部全体をヤンクできる。
hlargs.nvim
デフォルトだと見分けがつかない関数等の引数に色をつけてくれる。かなり助かる。
sidebar.nvim
Diagnostics やブランチの状況を表示するサイドバーが追加できる。鬱陶しいので普段は非表示にしている。
neo-tree.nvim
ファイラ。これがないとやってられないシリーズ。
git.nvim
Neovim 内部でも Git コマンドが :Git <subcmd>
の形式で使える。他にもキーバインドを色々設定できるが、ミスタイプで変なことをすると怖いので使っていない。
vim-illuminate
カーソル位置の単語をうっすらハイライトする。コードを読むとき、検索するほどでもない場面で目 grep する必要がなくて非常によい。地味にこれがないとやってられないシリーズ。
todo-comments.nvim
TODO:
, WARNING:
, FIX:
などのテキストを目立たせる。かなり派手。 自分の環境だと何故か NOTE:
で出てくるアイコンだけ上手く表示されず、ミトコンドリアみたいになっていてかわいい。
cmp-cmdline
コマンドラインモードで補完が使えるようになる。これがないとやってられないシリーズ。
cmp-buffer
バッファの操作に補完が使える。あまり使っていない。
vimtex
LaTeX のファイル編集や LaTeX コマンドの実行に便利なプラグイン。本当に一年中 LaTeX を書いているのでこれがないとやってられないシリーズ......と言いたいのだが、微妙に痒いところに手が届かず、結局自分でスクリプトを書いて補助している。
おわりに
この期にエディタ以外にもシェルとかターミナルとか色々いじる予定なので、シリーズ物になると思います。