Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sys9kdr/3e57e650deda1301a45dfe5873e68dd4 to your computer and use it in GitHub Desktop.
Save sys9kdr/3e57e650deda1301a45dfe5873e68dd4 to your computer and use it in GitHub Desktop.
nvim_set_option_valueでsetlocalするために必要なこと

nvimのheadで検証中(v0.10系)

nvim_set_option_valueでなんでもcurrent bufferにしようとしてもうまくいかない

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

buffer localとwindow local

なぜエラーになるかというと、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に設定できる。

setlocal相当の{ scope = 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment