Merge pull request #21511 from neovim/backport-21510-to-release-0.8

[Backport release-0.8] fix(options): restore exists() behavior for options
This commit is contained in:
zeertzjq 2022-12-23 14:14:32 +08:00 committed by GitHub
commit b840eb6945
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 9 deletions

View File

@ -3659,6 +3659,7 @@ static int eval_index(char **arg, typval_T *rettv, int evaluate, int verbose)
int get_option_tv(const char **const arg, typval_T *const rettv, const bool evaluate)
FUNC_ATTR_NONNULL_ARG(1)
{
const bool working = (**arg == '+'); // has("+option")
int scope;
// Isolate the option name and find its value.
@ -3703,6 +3704,10 @@ int get_option_tv(const char **const arg, typval_T *const rettv, const bool eval
rettv->v_type = VAR_STRING;
rettv->vval.v_string = stringval;
}
} else if (working && (opt_type == gov_hidden_bool
|| opt_type == gov_hidden_number
|| opt_type == gov_hidden_string)) {
ret = FAIL;
}
*option_end = c; // put back for error messages

View File

@ -1947,14 +1947,9 @@ static void f_exists(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
xfree(exp);
}
} else if (*p == '&' || *p == '+') { // Option.
bool working = (*p == '+'); // whether option needs to be working
int opt_flags;
if (find_option_end(&p, &opt_flags) != NULL) {
int opt_idx = findoption(p);
n = (opt_idx >= 0 && (!working || get_varp_scope(get_option(opt_idx), opt_flags) != NULL));
} else {
n = false;
n = (get_option_tv(&p, NULL, true) == OK);
if (*skipwhite(p) != NUL) {
n = false; // Trailing garbage.
}
} else if (*p == '*') { // Internal or user defined function.
n = function_exists(p + 1, false);

View File

@ -6,6 +6,7 @@ local command, exec = helpers.command, helpers.exec
local eval = helpers.eval
local feed_command, eq = helpers.feed_command, helpers.eq
local curbufmeths = helpers.curbufmeths
local funcs = helpers.funcs
local meths = helpers.meths
describe('colorscheme compatibility', function()
@ -13,7 +14,9 @@ describe('colorscheme compatibility', function()
clear()
end)
it('t_Co is set to 256 by default', function()
it('&t_Co exists and is set to 256 by default', function()
eq(1, funcs.exists('&t_Co'))
eq(1, funcs.exists('+t_Co'))
eq('256', eval('&t_Co'))
end)
end)