mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	refactor(vim.opt): unify vim.bo/wo building
This commit is contained in:
		| @@ -54,76 +54,42 @@ vim.env = setmetatable({}, { | |||||||
|   end, |   end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| do -- buffer option accessor | local function opt_validate(option_name, target_scope) | ||||||
|   local function buf_opt_validate(k) |   local scope = options_info[option_name].scope | ||||||
|     local scope = options_info[k].scope |   if scope ~= target_scope then | ||||||
|     if scope == 'win' then |     local scope_to_string = { buf = 'buffer', win = 'window' } | ||||||
|     error( |     error( | ||||||
|         string.format([['%s' is a window option, not a buffer option. See ":help %s"]], k, k) |       string.format( | ||||||
|  |         [['%s' is a %s option, not a %s option. See ":help %s"]], | ||||||
|  |         option_name, | ||||||
|  |         scope_to_string[scope] or scope, | ||||||
|  |         scope_to_string[target_scope] or target_scope, | ||||||
|  |         option_name | ||||||
|       ) |       ) | ||||||
|     elseif scope == 'global' then |  | ||||||
|       error( |  | ||||||
|         string.format([['%s' is a global option, not a buffer option. See ":help %s"]], k, k) |  | ||||||
|     ) |     ) | ||||||
|   end |   end | ||||||
|   end |  | ||||||
|  |  | ||||||
|   local function new_buf_opt_accessor(bufnr) |  | ||||||
|     return setmetatable({},{ |  | ||||||
|       __index = function(_, k) |  | ||||||
|         if bufnr == nil and type(k) == 'number' then |  | ||||||
|           return new_buf_opt_accessor(k) |  | ||||||
|         end |  | ||||||
|         buf_opt_validate(k) |  | ||||||
|  |  | ||||||
|         return a.nvim_get_option_value(k, { buf = bufnr or 0 }) |  | ||||||
|       end, |  | ||||||
|  |  | ||||||
|       __newindex = function(_, k, v) |  | ||||||
|         buf_opt_validate(k) |  | ||||||
|         return a.nvim_set_option_value(k, v, { buf = bufnr or 0 }) |  | ||||||
|       end, |  | ||||||
|     }) |  | ||||||
|  |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   vim.bo = new_buf_opt_accessor(nil) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| do -- window option accessor | local function new_opt_accessor(handle, scope) | ||||||
|   local function win_opt_validate(k) |  | ||||||
|     local scope = options_info[k].scope |  | ||||||
|     if scope == 'buf' then |  | ||||||
|       error( |  | ||||||
|         string.format([['%s' is a buffer option, not a window option. See ":help %s"]], k, k) |  | ||||||
|       ) |  | ||||||
|     elseif scope == 'global' then |  | ||||||
|       error( |  | ||||||
|         string.format([['%s' is a global option, not a window option. See ":help %s"]], k, k) |  | ||||||
|       ) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   local function new_win_opt_accessor(winnr) |  | ||||||
|   return setmetatable({}, { |   return setmetatable({}, { | ||||||
|     __index = function(_, k) |     __index = function(_, k) | ||||||
|         if winnr == nil and type(k) == 'number' then |       if handle == nil and type(k) == 'number' then | ||||||
|           return new_win_opt_accessor(k) |         return new_opt_accessor(k, scope) | ||||||
|       end |       end | ||||||
|         win_opt_validate(k) |       opt_validate(k, scope) | ||||||
|         return a.nvim_get_option_value(k, { win = winnr or 0 }) |       return a.nvim_get_option_value(k, { [scope] = handle or 0 }) | ||||||
|     end, |     end, | ||||||
|  |  | ||||||
|     __newindex = function(_, k, v) |     __newindex = function(_, k, v) | ||||||
|         win_opt_validate(k) |       opt_validate(k, scope) | ||||||
|         return a.nvim_set_option_value(k, v, { win = winnr or 0 }) |       return a.nvim_set_option_value(k, v, { [scope] = handle or 0 }) | ||||||
|     end, |     end, | ||||||
|   }) |   }) | ||||||
|   end |  | ||||||
|  |  | ||||||
|   vim.wo = new_win_opt_accessor(nil) |  | ||||||
| end | end | ||||||
|  |  | ||||||
|  | vim.bo = new_opt_accessor(nil, 'buf') | ||||||
|  | vim.wo = new_opt_accessor(nil, 'win') | ||||||
|  |  | ||||||
| -- vim global option | -- vim global option | ||||||
| --  this ONLY sets the global option. like `setglobal` | --  this ONLY sets the global option. like `setglobal` | ||||||
| vim.go = setmetatable({}, { | vim.go = setmetatable({}, { | ||||||
|   | |||||||
| @@ -1396,7 +1396,7 @@ describe('lua stdlib', function() | |||||||
|     ]] |     ]] | ||||||
|     eq('', funcs.luaeval "vim.bo.filetype") |     eq('', funcs.luaeval "vim.bo.filetype") | ||||||
|     eq(true, funcs.luaeval "vim.bo[BUF].modifiable") |     eq(true, funcs.luaeval "vim.bo[BUF].modifiable") | ||||||
|     matches("unknown option 'nosuchopt'$", |     matches("no such option: 'nosuchopt'$", | ||||||
|        pcall_err(exec_lua, 'return vim.bo.nosuchopt')) |        pcall_err(exec_lua, 'return vim.bo.nosuchopt')) | ||||||
|     matches("Expected lua string$", |     matches("Expected lua string$", | ||||||
|        pcall_err(exec_lua, 'return vim.bo[0][0].autoread')) |        pcall_err(exec_lua, 'return vim.bo[0][0].autoread')) | ||||||
| @@ -1417,7 +1417,7 @@ describe('lua stdlib', function() | |||||||
|     eq(0, funcs.luaeval "vim.wo.cole") |     eq(0, funcs.luaeval "vim.wo.cole") | ||||||
|     eq(0, funcs.luaeval "vim.wo[0].cole") |     eq(0, funcs.luaeval "vim.wo[0].cole") | ||||||
|     eq(0, funcs.luaeval "vim.wo[1001].cole") |     eq(0, funcs.luaeval "vim.wo[1001].cole") | ||||||
|     matches("unknown option 'notanopt'$", |     matches("no such option: 'notanopt'$", | ||||||
|        pcall_err(exec_lua, 'return vim.wo.notanopt')) |        pcall_err(exec_lua, 'return vim.wo.notanopt')) | ||||||
|     matches("Expected lua string$", |     matches("Expected lua string$", | ||||||
|        pcall_err(exec_lua, 'return vim.wo[0][0].list')) |        pcall_err(exec_lua, 'return vim.wo[0][0].list')) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lewis Russell
					Lewis Russell