diff options
-rw-r--r-- | src/nvim/option.c | 81 |
1 files changed, 45 insertions, 36 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index 10773fffde..c02c30c413 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -726,6 +726,49 @@ void ex_set(exarg_T *eap) (void)do_set(eap->arg, flags); } +static void do_set_bool(int opt_idx, int opt_flags, int prefix, int nextchar, int afterchar, + const char *varp, char **errmsg) +{ + if (nextchar == '=' || nextchar == ':') { + *errmsg = e_invarg; + return; + } + + varnumber_T value; + + // ":set opt!": invert + // ":set opt&": reset to default value + // ":set opt<": reset to global value + if (nextchar == '!') { + value = *(int *)(varp) ^ 1; + } else if (nextchar == '&') { + value = (int)(intptr_t)options[opt_idx].def_val; + } else if (nextchar == '<') { + // For 'autoread' -1 means to use global value. + if ((int *)varp == &curbuf->b_p_ar + && opt_flags == OPT_LOCAL) { + value = -1; + } else { + value = *(int *)get_varp_scope(&(options[opt_idx]), + OPT_GLOBAL); + } + } else { + // ":set invopt": invert + // ":set opt" or ":set noopt": set or reset + if (nextchar != NUL && !ascii_iswhite(afterchar)) { + *errmsg = e_trailing; + return; + } + if (prefix == 2) { // inv + value = *(int *)(varp) ^ 1; + } else { + value = prefix; + } + } + + *errmsg = set_bool_option(opt_idx, (char_u *)varp, (int)value, opt_flags); +} + static void do_set_num(int opt_idx, int opt_flags, char **argp, int nextchar, const set_op_T op, const char *varp, char *errbuf, size_t errbuflen, char **errmsg) { @@ -1367,45 +1410,11 @@ int do_set(char *arg, int opt_flags) } } else { int value_checked = false; - varnumber_T value; - if (flags & P_BOOL) { // boolean - if (nextchar == '=' || nextchar == ':') { - errmsg = e_invarg; + do_set_bool(opt_idx, opt_flags, prefix, nextchar, afterchar, varp, &errmsg); + if (errmsg != NULL) { goto skip; } - - // ":set opt!": invert - // ":set opt&": reset to default value - // ":set opt<": reset to global value - if (nextchar == '!') { - value = *(int *)(varp) ^ 1; - } else if (nextchar == '&') { - value = (int)(intptr_t)options[opt_idx].def_val; - } else if (nextchar == '<') { - // For 'autoread' -1 means to use global value. - if ((int *)varp == &curbuf->b_p_ar - && opt_flags == OPT_LOCAL) { - value = -1; - } else { - value = *(int *)get_varp_scope(&(options[opt_idx]), - OPT_GLOBAL); - } - } else { - // ":set invopt": invert - // ":set opt" or ":set noopt": set or reset - if (nextchar != NUL && !ascii_iswhite(afterchar)) { - errmsg = e_trailing; - goto skip; - } - if (prefix == 2) { // inv - value = *(int *)(varp) ^ 1; - } else { - value = prefix; - } - } - - errmsg = set_bool_option(opt_idx, (char_u *)varp, (int)value, opt_flags); } else { // Numeric or string. if (vim_strchr("=:&<", (uint8_t)nextchar) == NULL || prefix != 1) { |