【Neovim】設定ファイルをluaに移行する

neovimのロゴ Vim/Neovim

最初VimからNeovimに移行した際に、.vimrcinit.vimにコピーして利用していたが
init.luaのほうが柔軟な書き方ができるということなので、
設定ファイルの刷新も兼ねてinit.luaで設定ファイルを記載する。

新規作成に近い形で実施していく。

ヘルプ

まずはヘルプの引き方。

Luaで設定ファイルを書くことに関するヘルプは以下の通り。

:help lua-guide

設定ファイル

Nvim supports using init.vim or init.lua as the configuration file, but
not both at the same time

:help lua-guide

設定ファイルだが、init.viminit.luaは共存できないため、
init.vimを一旦退避させてinit.luaを新規作成する。

$ mv ~/.config/nvim/init.vim ~/.config/nvim/_init.vim
$ touch ~/.config/nvim/init.lua

luaの実行方法

:luaコマンドを利用することで、任意のluaコードを実行することができる。

init.luaに書く際には、:luaを外した状態で書けば良い。

:lua print("Hello.")

これで簡単にluaの実行を検証することができる。

luaでvimのコマンドを実行する方法

書かれているヘルプは以下の通り。

:help lua-guide-vim-commands

ヘルプを読むと、大きく分けて3通りの実行方法があることがわかる。

① vim.cmd()をそのまま利用する

このコマンドは、luaコードの中で任意のvimコマンドを実行できる書き方。

colorscheme habamax

.vimrcなどに↑のように書かれていた場合
以下のコマンドを実行すると、カラースキームが変更されることが分かる。

:lua vim.cmd("colorscheme habamax")

ただし、この実行方法は特別な文字についてはバックスラッシュによるエスケープが必要な点に注意。

② リテラル文字列を使う

エスケープが必要なコマンドで、エスケープなしで書きたい場合や
複数行にまたいで書きたい場合は、[[]]を使ったリテラル文字列の書き方が良い。

vim.cmd([[%s/\Vfoo/bar/g]])

vim.cmd([[
  highlight Error guibg=red
  highlight link Warning Error
]])

③ vimコマンドが用意されている場合は、関数のように使える

先程のカラースキームを変更した書き方は、以下のように書くこともできる。

vim.cmd.colorscheme("habamax")

設定値の変え方

ウィンドウの左側に行数を表示する以下のvimコマンド

set number

これは、luaで書く場合はoptを利用することで以下のように記述できる。

vim.otp.number = true

カンマ区切りで設定する系

コード中にある、タブやスペースを可視化する設定をVimで行う場合、以下のように設定する。

" スペースは「_」で表示、タブは「>~」で表示
set listchars=space:_,tab:>~

これをluaで書く場合は以下のようになる。

vim.opt.listchars = { space = '_', tab = '>~' }

変数の設定

グローバル変数などを設定している場合は、以下のように変換する

vimscriptの書き方

" プレビューウィンドウを垂直分割で表示する
let g:netrw_preview=1

luaの書き方

vim.g.netrw_preview = 1

まとめ

これらのvimscript→luaの置換方法がわかっていれば、シンプルな.vimrcであれば簡単に移行することができる。

  • コマンド実行は「vim.cmd("vimコマンド")」 or 「vim.cmd([[vimコマンド]])
  • オプション系の設定は「vim.opt.オプション名 = 値

プラグインなしで、最小限で移行した結果、init.luaはこの様になった。

vim.opt.number = true                             -- 行番号を表示
vim.opt.title = true                              -- ファイル名を表示
vim.opt.smartcase = true                          -- 小文字で検索時、大文字小文字を無視する
vim.opt.wrap = false                              -- 行の折返しを無効にする

-- 括弧
vim.opt.showmatch = true                          -- 括弧入力時の対応する括弧を表示
vim.opt.matchtime = 1                             -- 対応括弧に飛ぶ時間を0.1×1秒に設定

-- タブ、インデント
vim.opt.tabstop = 2                               -- タブの文字幅
vim.opt.shiftwidth = 2                            -- 自動インデントの幅
vim.opt.smartindent = true                        -- 一つ前の行に基づくインデントを有効
vim.opt.expandtab = true                          -- タブ入力を空白にする
vim.opt.list = true                               -- listオプションを有効にする
vim.opt.listchars = { tab = '»-' , trail = '-' }  -- タブと行末空白を可視化する

-- ハイライト
vim.opt.hlsearch = true                           -- 検索ワードのハイライトを行う

-- netrw
vim.g.netrw_preview = 1                           -- プレビューウィンドウを垂直分割で表示する
タイトルとURLをコピーしました