Neovimの設定をLuaに移行した

2023年04月22日

Neovimの設定ファイルをinit.luaに書き換えた話。ついでにNeovimのプラグイン管理もdein.vimからLua製のPacker.nvimに移行。

ディレクトリ戦略

init.vim時代は1つのファイルに全ての設定を書いてたけど、せっかくLuaに移行するのでモジュール分割しました。

$HOME/.config/nvim/
    init.lua                    ... init.vimを置き換え
    lua/                        ... 設定をモジュール分割して管理
        commons.lua             ... 共通設定
        plugins.lua             ... プラグイン管理
        plugin_telescopete.lua  ... プラグイン個別設定
        ...

Packer.nvim

Packer.nvimはgit cloneするだけで導入できるのでdein.vimと比べて比較的楽。

$ git clone --depth 1 https://github.com/wbthomason/packer.nvim\
 ~/.local/share/nvim/site/pack/packer/start/packer.nvim

プラグイン管理はこんな感じ。導入したいプラグインを定義して :PackerInstall するだけで外部プラグインをcloneしてくれます。

vim.cmd [[packadd packer.nvim]]

return require('packer').startup(function(use)
    -- Packer can manage itself
    use 'wbthomason/packer.nvim'
    use 'nvim-lua/plenary.nvim'
    use 'nvim-telescope/telescope.nvim'
    use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make' }
end)

init.lua

init.luaは基本的に分割したLuaモジュールのインポートをするだけに。 共通設定はcommons.luaに記述してプラグイン固有の設定はモジュール分割しました。

require('commons')
require('plugins')
require('plugin_telescope')
require('plugin_vim_table_mode')
require('plugin_mason')
-- require('plugin_nvimtreesitter')
require('plugin_symbols_outline')
require('plugin_nvim_tree')
require('plugin_aerial')
require('plugin_venn')

Vim script API

Luaに移行してVim scriptの記述をLuaにどう変換するか少し調べる必要があったので忘備録的に。

キーマップ

ノーマルモードのキーマップ作成。タブ移動をQとSHIFT+Tabに設定する例。

vim.keymap.set('n', 'Q', '<cmd>tabp<CR>', {noremap = true})
vim.keymap.set('n', '<S-Tab>', '<cmd>tabn<CR>', {noremap = true})

グローバル変数

Vim scriptでlet g:python3_host_prog = ...と宣言していたものはLua流だと以下。 vim.g 経由でvimのグローバル変数を操作する。

vim.g.python3_host_prog = vim.env.PYENV_ROOT .. '/versions/neovim/bin/python'

環境変数

環境変数はvim.envにエクスポートされている。

vim.g.python3_host_prog = vim.env.PYENV_ROOT .. '/versions/neovim/bin/python'

任意のVim script実行

Vim scriptをそのまま解釈させる方法。vim.cmd() を使う。 Vim scriptで独自の設定を書いている場合は重宝しそうです。

vim.cmd([[
  if &compatible
    set nocompatible
  endif
]])

最終成果物

Githubにアップしました。 仕事でもプライベートでも同じ環境に統一します。


Profile picture

Written by なまちゃ Web系エンジニアPython好き。バックエンド/フロントエンド問わずマルチな方面でエンジニアリングしています。