Open4

Neovimの設定ファイルをちゃんとlua化していく

MizoreAmeMizoreAme

vim時代から騙し騙しコピペで育ててきたスパゲッティなvimrcを、ゼロからluaで書き直していくことにした。

そもそもスパゲッティ化してしまった最大の理由は、vimscriptを真面目に覚える気が起きなかったせいである。それに対してluaは、なんというか普通に学ぶに値するプログラミング言語だと思われたので、これを機にluaとvim設定そのものをちゃんと学ぶことにした。

情報源

当然、公式のドキュメント(help) が最大の情報源となる。

  • Luaref …… まずはluaそのものを自由に読み書きできなきゃ話にならねえ、ということでluaref。ざーっと目を通した。ちょっと癖のある言語だが、OOP機能はJavaScriptに似ているし、配列とマップが一つのデータ構造(table)という点にはPHPみも感じる。なおneovimが採用するLuaのバージョンは5.1で、それが"permanent interface"と謳われているので、それ以降のバージョンの機能は基本考えなくて良いはずである。
  • Lua-guide …… luaでvim設定を行うための最低限の知識やイディオムを集めたガイド。ネット上に転がっている設定をコピペしていくだけならここの知識があればだいたい何とかなる、という感じ。
  • Lua …… Neovimが提供するLua APIの全体像。vimから引き継がれてきた各種エディタ機能に対応するAPIが山盛りなので、そうそう読み解ける分量ではない。必要に応じて参照していくことになる。
MizoreAmeMizoreAme

最新のNeovimのインストール

環境: Ubuntu 22.04(WSLおよびbare metal)

Neovimはバージョンが新しいほど多機能でAPIも洗練されており、lua pluginの中には新しめのバージョンのneovimを要求するものも多い。OSの標準パッケージでは物足りない。

Ubuntuに最新のneovimを入れる方法は、ググるとsnapだのAppImageだの出てくるが、結局はビルド済みバイナリを /opt に配置する公式のやり方が最も簡単だと思う。

https://github.com/neovim/neovim/blob/master/INSTALL.md#linux

tarball落としてきて /opt に展開、PATHを通す。漢仕様。

MizoreAmeMizoreAme

設定ファイルの構成

Luaによる設定は ~/.config/nvim/init.lua に書いていく。設定を全て単一ファイルにまとめるか、それとも分割するかは人によって様々だろうが、私はこちらのサイトを参考にしつつ分割した。

現状、こんな感じ(後でアップデートしていくかも)

require("base")
require("my")
require("options")
require("autocmds")
require("keymaps")
require("config.lazy")

人の設定のコピペではなく、ちゃんとLuaコードを書きたかったので、ある程度意味のあるまとまりでファイル分割して、一つ一つ再読み込みを繰り返しながら設定していった。

MizoreAmeMizoreAme

base.lua - 設定を書くための設定

設定のためのLuaコード自体も設定中のNeovimで書いていくことになるので、まずは本当に最小限の設定をbase.luaにまとめた。

vim.scriptencoding = "utf-8"
vim.opt.fileencoding = "utf-8"
vim.opt.encoding = "utf-8"

-- Lua設定ファイル自体を書くうえで最低限あってほしい設定

-- Windows Termianlから使う前提なのでinsertモードでのマウスはoff
vim.opt.mouse = 'n'

-- Leaderをspaceに
vim.g.mapleader = ' '

-- 現在開いているファイルをsourceする
-- 実験としてユーザコマンドを作ってみる
vim.api.nvim_create_user_command('EvalCurrentBuffer', 'source %', {})
vim.keymap.set('n', '<Leader>u', '<cmd>EvalCurrentBuffer<cr>')

-- built-inのcolorscheme適用
vim.cmd('colorscheme slate')

いつ頃からか知らないがNeovimはマウス操作に対応しており、デフォルトではターミナルの標準動作が奪われる。これではWindowsからコピペするとき非常に不便なので、少なくともinsertモードではoffにしないとまともに操作できない。