Neovimのオプション設定(init.lua)
Neovimのオプション設定をしてみたのですが、Lua形式の設定を知らなかったので時間がかかりました。
目次
- Lua-guide
- 設定を記述するファイル
- オプション設定の基本形
- vim.optとvim.o等
- オプション設定例
- ヘルプでオプションを調べる
- オプションの一覧を見る
- 失敗談
- 記法をいくつか試した時のメモ
Lua-guide
NeovimでLuaを使う場合の基礎が上記のページに記述されています。このページを拾い読みしながらinit.lua(Neovimの設定ファイル)を作成しました。
設定を記述するファイル
Neovimの各種設定を記述するファイルはinit.luaです。オプションの設定もこのファイルに記述します。
~/.config/nvim/init.lua
オプション設定の基本形
オプションを設定する時の基本形は
vim.opt.[オプション名] = [引数]
です。
Vimで次のようなオプション設定をしていたとして、
" 現在行から見た行番号を表示する set relativenumber
これをNeovimのinit.luaファイルに記述する場合、次のようになります。
-- 現在行から見た行番号を表示する vim.opt.relativenumber = true
(備考)-- から右側はコメントとなります。
ちなみに、オプションには種類があり、「グローバルオプション、バッファローカルオプション、ウィンドウローカルオプション」の3つです。この3つを区別して次のように記述することもできます。
vim.o.[オプション名] = [value] グローバルオプション vim.bo.[オプション名] = [value] バッファローカルオプション vim.wo.[オプション名] = [value] ウィンドウローカルオプション
vim.optとvim.o等
vim.o、vim.bo、vim.woではグローバル、バッファローカル、ウィンドウローカルを区別して記述しますが、vim.optはそれらを区別することなく使用できるので便利です。
NeovimのLua-guideによると、vim.optの不便な所はオプションの値を調べる時に:get()を使う必要があることだそうです(以下はLua-guideからの引用です)。
print(vim.opt.smarttab) --> {...} (big table) print(vim.opt.smarttab:get()) --> false
vim.optを使用した1行目のprint文ではsmarttabオプションに設定されている値を取得できていません。3行目のprint文では :get()を使うことで値を取得できています。
一方、vim.o vim.bo vim.wo を使用した場合、オプションの値を直接調べられます(以下はLua-guideからの引用です)。
vim.o.smarttab = false -- :set nosmarttab print(vim.o.smarttab) --> false
1行目の「-- :set nosmarttab」はコメントなので無視してください。
1行目でsmarttabにfalseという値をセットし、2行目のprint文では(:get()を使うことなく)セットした値を取得できています。
ついでに引用しておくと、Lua-guideには以下の記述もありました。
vim.o : behaves like :set vim.go: behaves like :setglobal vim.bo: for buffer-scoped options vim.wo: for window-scoped options
オプション設定例
オプションの設定例をいくつか記載します。
数値を指定する場合
vim.opt.tabstop = 4
bool値を指定する場合
vim.opt.relativenumber = true
(備考)trueかfalseを指定します。
文字列を指定する場合
vim.opt.clipboard = 'unnamedplus'
Vimの +=、^=、-=に相当するもの(以下はLua-guideからの引用です)。
vim.opt.shortmess:append({ I = true }) vim.opt.wildignore:prepend('*.o') vim.opt.whichwrap:remove({ 'b', 's' })
たとえば、Vimの.vimrcにおいて
set formatoptions+=mM
と記述していたものは、次のように記述します。
vim.opt.formatoptions:append({m = true, M = true})
以下はNeovimのオプションではなく、Vaffleというプラグインのオプションですが、これを例にして変数を使う場合に触れておくと、
let g:vaffle_show_hidden_files = 1
とVimで記述していた場合、Neovimでは
vim.g.vaffle_show_hidden_files = 1
と記述します。
Lua-guideから引用しておきます。
vim.g: global variables (g:) vim.b: variables for the current buffer (b:) vim.w: variables for the current window (w:) vim.t: variables for the current tabpage (t:) vim.v: predefined Vim variables (v:) vim.env: environment variables defined in the editor session
ヘルプでオプションを調べる
ヘルプを調べる場合、調べたいオプション名にシングルクォーテーションを付けます。
:h 'relativenumber'
なお、オプションがグローバル、バッファローカル、ウィンドウローカルのいずれなのかはヘルプの冒頭に記述されています。以下はrelativenumberのヘルプです。
'relativenumber' 'rnu' boolean (default off) local to window Show the line number relative to the line with the cursor in front of each line. (以下略)
local to windowという記述から、このオプションはウィンドウローカルオプションだと分かります。
booleanという記述があるので指定する値はtrueかfalseです。
vim.opt.relativenumber = true
オプションの一覧を見る
オプションの一覧を見る場合は次のようにします。
:h option-list
失敗談
失敗談を書きます。undoファイルの場所を指定する場合、
vim.opt.undodir = '/home/hoge/.nvim/undo'
のようにしますが、これを
vim.opt.undodir = '~/.nvim/undo'
と記述したら、ホームディレクトリに ~ という名前のディレクトリが作成されていました(汗)。そこで、~を使わずに/home/hoge/という風に書いています。
記法をいくつか試した時のメモ
whichwrapオプションを設定するにあたり、NeovimのLua-guideに載っていた記法をいくつか試しました。以下はその時のメモです(私がLuaという言語を分かっていないので、意味不明なことをしているだけだと思いますが)。
結果だけ先に書いておきますと、
vim.opt.whichwrap = 'h,l,<,>,[,],~'
と記述するのが一番楽だなと思いました。
以下、試したことを羅列します。
Lua-guideにある
vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }
という記述例を真似して
vim.opt.whichwrap = {'h', 'l'}
と記述したらinit.lua読み込み時にエラーとなりました。
Lua-guideに
vim.opt.whichwrap:remove({ 'b', 's' })
という記載があったので、append、prepend、removeは使えそうだと思い、試してみました。
vim.opt.whichwrap:append('h', 'l')
と記述したら、h は機能しますが l は機能しませんでした。先頭のものしかappendされていないようです。
vim.opt.whichwrap:append('h') vim.opt.whichwrap:append('l')
と記述したら、h も l も機能しました。しかし、これだと行数が多くなるので使いたくありませんね。
vim.opt.whichwrap:append('h,l')
と記述すると h も l も機能しましたが、これなら
vim.opt.whichwrap = 'h,l'
と記述した方が文字数が少なくて良いですね。
次に
vim.opt.whichwrap = { h = true, l = true }
と記述したら、これは h も l も機能しました。
しかし、< 等の記号には使用できませんでした。たとえば、
vim.opt.whichwrap = {< = true}
と記述したら、init.lua読み込み時にエラーとなりました(< をエスケープすれば良いのかもしれませんが、Luaの知識が無いので不明です)。
< 等の記号でもappendでは使用できました。たとえば
vim.opt.whichwrap:append('<')
と記述すると、< が機能しました。