refactor(options): set option value for non-current context directly

Problem: Currently, we use `switch_option_context` to temporarily switch the current option context before setting an option for a different buffer / window. This is not ideal because we already support getting and setting option values for non-current contexts in the underlying implementation.

Solution: Set option value for non-current context by passing the context directly to the lower level functions. Also introduce a new `OptCtx` struct to store option context information, this will scale much better if we add more option scopes and other context information in the future.
This commit is contained in:
Famiu Haque
2024-11-08 11:57:59 +06:00
parent 98763ce4e9
commit 6257270040
12 changed files with 407 additions and 485 deletions

View File

@@ -982,10 +982,10 @@ Buffer nvim_create_buf(Boolean listed, Boolean scratch, Error *err)
buf_copy_options(buf, BCO_ENTER | BCO_NOHELP);
if (scratch) {
set_option_direct_for(kOptBufhidden, STATIC_CSTR_AS_OPTVAL("hide"), OPT_LOCAL, 0,
kOptScopeBuf, buf);
set_option_direct_for(kOptBuftype, STATIC_CSTR_AS_OPTVAL("nofile"), OPT_LOCAL, 0,
kOptScopeBuf, buf);
set_option_direct_for(kOptBufhidden, STATIC_CSTR_AS_OPTVAL("hide"),
option_ctx_from(kOptScopeBuf, buf), OPT_LOCAL, 0);
set_option_direct_for(kOptBuftype, STATIC_CSTR_AS_OPTVAL("nofile"),
option_ctx_from(kOptScopeBuf, buf), OPT_LOCAL, 0);
assert(buf->b_ml.ml_mfp->mf_fd < 0); // ml_open() should not have opened swapfile already
buf->b_p_swf = false;
buf->b_p_ml = false;