背景
プログラムを読みやすくするために必須なインデントですが、「字下げを何文字分すべきか」はプログラミング言語によって異なります。
今回はNeovimをLua言語を用いてinit.lua
で設定する場合に、特定のプログラミング言語の場合だけインデント幅を変える方法を紹介します。
基礎知識:LuaでNeovimのインデント幅を設定する方法
NeovimをLua言語で設定する場合、インデント幅を調整する設定は主に次の3つです。
vim.o.expandtab = true
vim.o.tabstop = 4
vim.o.shiftwidth = 4
それぞれの設定項目は
-
vim.o.expandtab
-true
ならtabキー入力時にtab文字の代わりに同じ幅の半角スペースを入力する。 -
vim.o.tabstop
- tab文字の幅を指定 -
vim.o.shiftwidth
- Neovimがインデントを入力する際(例えばnormalモードでの>>
)の幅を指定
です。
ここでvim.o
の「o」は「option」のことです。
init.lua
にてvim.o
で指定した設定はすべてのバッファで有効になります。
本題:特定の言語だけインデント幅を変える
ソースコード
以下のコードをinit.lua
に記載することで、プログラミング言語ごとにインデント幅を変更できます。
1行目のfiletype_tabstop
テーブルの定義だけ調整してください。
local filetype_tabstop = {lua=2, markdown=2} -- filetype毎のインデント幅
local usrftcfg = vim.api.nvim_create_augroup("UserFileTypeConfig", { clear = true})
vim.api.nvim_create_autocmd("FileType", {
group = usrftcfg,
callback = function (args)
local ftts = filetype_tabstop[args.match]
if ftts then
vim.bo.tabstop = ftts
vim.bo.shiftwidth = ftts
end
end
})
解説
1行目のfiletype_tabstop
にてプログラミング言語ごとにインデント幅をfiletype名=インデント幅
で列挙します(vim.o.tabstop
等で定義した幅をそのまま用いる言語については、わざわざ記述する必要はありません)。
この部分については利用する言語にあわせて変更してください。
プログラミング言語に応じて設定を変更するためにautocmd
を利用します(一応セットでaugroup
も設定しておきます)。
vim.api.nvim_create_autocmd
の第1引数にFileType
すなわち「バッファのfiletype
が設定されたとき」を指定することで、既存ファイルを開いた場合およびfiletype
を手動で設定した場合に処理を実行させます。
条件を満たした場合に実行する処理をcallback =
で定義します。
つまり
function (args)
local ftts = filetype_tabstop[args.match]
if ftts then
vim.bo.tabstop = ftts
vim.bo.shiftwidth = ftts
end
end
が実際の処理内容です。
まずargs.match
はVim Scriptの<amatch>
に該当する変数で、FileType
の場合にはバッファに設定されたfiletype
が格納されます。
よってfiletype_tabstop[args.mathc]
とすることで、1行目にて定義したインデント幅を得ることができます。
その値を一旦ftts
変数に格納した後、vim.bo.tabstop
およびvim.bo.shiftwidth
に設定します。
ここでvim.bo
の「bo」は「buffer option」のことであり、指定したバッファでのみ有効になる設定です。
当該バッファにおけるtabstop
とshiftwidth
を上書きすることで、そのプログラミング言語に合わせたインデント幅を利用できます。
以上の説明はfiletype_tabstop
にて当該filetype
のインデント幅が指定されている場合の動作です。
もしfiletype_tabstop
に指定のないプログラミング言語を用いた場合はどうなるでしょうか?
Lua言語では、テーブルに含まれないインデックスが指定された場合はnil
を返します。
したがって、バッファのfiletype
がfiletype_tabstop
に含まれていない場合はftts = nil
となります。
そしてif
文は条件がnil
であればthen
以降の処理を実行しないため、if ftts then ~ end
の内側はスキップされます。
この場合は、vim.o.tabstop
およびvim.o.shiftwidth
の値がそのまま利用されます。
このようにして、プログラミング言語ごとにインデント幅を変更できます。
補足
今回説明した設定はinit.lua
に書き込むことを想定し、比較的コンパクトな記述で済むよう心がけたものです。
filetype
毎により込み入った設定をしたい場合は、以下の記事が参考になります。
[Neovim]filetype毎の設定をluaの関数単位で分ける