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にアップしました。 仕事でもプライベートでも同じ環境に統一します。