Neovimの設定をVimScriptからLuaに置き換える

本投稿は TECOTEC Advent Calendar 2023 の10日目の記事です。

こんにちは、証券フロンティア事業部の内田です。

エディタは何を使っていますか?
Visual Studio CodeやIDEなどたくさんありますが、私はNeovimを使っています。

neovim.io

VimにはVimScriptという組み込みのスクリプト言語があり、設定やプラグインの作成ができます。
NeovimでもVimScriptで設定を書くことができますが、2021年にリリースされたv0.5.0からLuaでも設定を書くことができるようになりました。
Luaに対応してから2年以上が経過しましたが、これまで敬遠していました。
しかし、今回はちょうど良い機会だと思うので、Luaを使いながら設定作業を行いたいと思います。
実施バージョンはv0.9.4です。

初期化

まずは設定をファイルをVimScriptからLuaに切り替えるため、いったん今までの設定を退避してinit.luaファイルを作成します。 ※下記ディレクトリ以外から読み込まれるruntimepathの設定はそのままなのでカラースキームなどがデフォルトに戻っていませんが今回は無視します。

mv ~/.config/nvim{,_bk}
mkdir ~/.config/nvim
touch ~/.config/nvim/init.lua

まっさらな状態になりました。

初めてなのでとりあえずHello, Worldしてみます。 下記をinit.luaに記載すればコマンドライン部分に表示されます。

~/.config/nvim/init.lua

print("Hello, World")

モジュール化

Luaで作成した設定ファイルは~/.config/nvim/luaに配置して、init.luaからrequireすることでモジュールとして呼び出すことができます。

~/.config/nvim/lua/helloworld.lua

print("Hello, World")

~/.config/nvim/init.lua

require('helloworld')

コマンド化

プラグインの開発などを行わなければあまり使わないと思いますがせっかくなのでコマンドを作ってみます。
vim.api.nvim_create_user_command()関数を使うことでユーザーコマンドを作成することができます。
第1引数がコマンド名、第2引数が実行する処理、第3引数がコマンドの属性を設定します。
Helloというコマンドを作成して、"Hello, {受け取った引数}"を表示するコマンドを作成します。

~/.config/nvim/lua/helloworld.lua

vim.api.nvim_create_user_command(
        'Hello',
        function(opts)
                print("Hello, " .. opts.args)
        end,
        {nargs=1}
)

表示されました。

設定

簡単にLuaを動かしてきましたが、基本的な設定などは用意されているのでそれらを使います。

VimScriptで設定していた時はsetコマンドで行っていましたが、Luaではvim.opts.*=hogeのように設定を行います。 最低限ですがLuaに置き換えてみました。

~/.config/nvim/init.lua

vim.opt.ff=unix -- 改行コードをLFで開く
vim.opt.relativenumber=true -- 行番号の表示(相対表示)

-- タブのサイズを4文字に変更
vim.opt.expandtab=true
vim.opt.tabstop=4
vim.opt.shiftwidth=4

-- キーバインド設定
vim.g.mapleader = " "
vim.api.nvim_set_keymap('n', '<leader>w', ':<C-u>w<CR>', {noremap = true})
vim.api.nvim_set_keymap('n', '<leader>q', ':<C-u>q<CR>', {noremap = true})
vim.api.nvim_set_keymap('n', '<leader>n', ':<C-u>bn<CR>', {noremap = true})
vim.api.nvim_set_keymap('n', '<leader>p', ':<C-u>bp<CR>', {noremap = true})
vim.api.nvim_set_keymap('i', 'jj', '<ESC>', { noremap = true, silent = true })

終わりに

実際触ってみて文法などはJavaScriptに少し近かったたりするので、簡単に覚えることができそうです。
Lua対応前の設定ではたくさんモジュールを入れていましたが、ほぼコピペで作成していたので中身をあまり意識することがありませんでした。
同じ設定のまま数年使ってきて使っていない設定が多々あるので、これを機に少しずつ設定を見直していきたいと思います。

参考

github.com

テコテックの採用活動について

テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。 tecotec.co.jp