nvimのheadで検証中(v0.10系)
neovim、setlocal
相当のことをnvim_set_option_value
やりたいとき、
buffer localな設定ができるnvim_set_option_value(OPTION, VALUE, { buf = 0 })
を使おうと考えることがあるかもしれない。
ただ、nvim_set_option_value(..., ..., { buf = 0 })
はsetlocal
な動作をするわけではない。
{ buf = 0 }
はbuffer localなセットをするだけで、例えば次のコードはエラーになる。
:lua vim.api.nvim_set_option_value('wrap', true, { buf = 0 })
E5108: Error executing lua [string ":lua"]:1: 'buf' cannot be passed for window-local option 'wrap'
stack traceback:
[C]: in function 'nvim_set_option_value'
[string ":lua"]:1: in main chunk
なぜエラーになるかというと、vimのoptionsにはbuffer localとwindow localという種別があり、
{ buf = ... }
はbuffer localなoptionsに対応するものだからだ(と思う)。
neovimのoptions.txtにこんな感じでbuffer localかwindowlocalか書いてある
*'wrap'* *'nowrap'*
'wrap' boolean (default on)
local to window
*'wrapmargin'* *'wm'*
'wrapmargin' 'wm' number (default 0)
local to buffer
window localなものはnvim_set_option_value(OPTION, VALUE, { win = winid })
(カレントウィンドウなら{ win = 0 }
)でlocalに設定できる。
ただ、毎回buffer/window localを考えてオプションを使い分けるのも面倒なので、setlocal
相当のことをゆるくやりたいときもある。
そんなときには{ scope = local }
オプションを使う。
:lua vim.api.nvim_set_option_value('wrap', true, { scope = 'local' })
:lua vim.api.nvim_set_option_value('wrapmargin', 1, { scope = 'local' })
:help nvim_set_option_value
で出てくるoptsを見れば一発でわかることなんだけど、自分は詰まったのでメモとして。
• {opts} Optional parameters
• scope: One of "global" or "local". Analogous to
|:setglobal| and |:setlocal|, respectively.
• win: |window-ID|. Used for setting window local option.
• buf: Buffer number. Used for setting buffer local option.