summaryrefslogtreecommitdiff
path: root/src/option.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/option.c')
-rw-r--r--src/option.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/option.c b/src/option.c
index 39b48dea..c9607632 100644
--- a/src/option.c
+++ b/src/option.c
@@ -8820,6 +8820,144 @@ get_option_value(name, numval, stringval, opt_flags)
}
#endif
+#if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
+/*
+ * Returns the option attributes and its value. Unlike the above function it
+ * will return either global value or local value of the option depending on
+ * what was requested, but it will never return global value if it was
+ * requested to return local one and vice versa. Neither it will return
+ * buffer-local value if it was requested to return window-local one.
+ *
+ * Pretends that option is absent if it is not present in the requested scope
+ * (i.e. has no global, window-local or buffer-local value depending on
+ * opt_type). Uses
+ *
+ * Returned flags:
+ * 0 hidden or unknown option
+ * see SOPT_* in vim.h for other flags
+ *
+ * Possible opt_type values: see SREQ_* in vim.h
+ */
+ int
+get_option_value_strict(name, numval, stringval, opt_type, from)
+ char_u *name;
+ long *numval;
+ char_u **stringval; /* NULL when only obtaining attributes */
+ int opt_type;
+ void *from;
+{
+ int opt_idx;
+ char_u *varp;
+ struct vimoption *p;
+ int r = 0;
+
+ opt_idx = findoption(name);
+ if (opt_idx < 0)
+ return 0;
+
+ p = &(options[opt_idx]);
+
+ /* Hidden option */
+ if (p->var == NULL)
+ return 0;
+
+ if (p->flags & P_BOOL)
+ r |= SOPT_BOOL;
+ else if (p->flags & P_NUM)
+ r |= SOPT_NUM;
+ else if (p->flags & P_STRING)
+ r |= SOPT_STRING;
+
+ if (p->indir == PV_NONE)
+ {
+ if (opt_type == SREQ_GLOBAL)
+ r |= SOPT_GLOBAL;
+ else
+ return 0; /* Did not request global-only option */
+ }
+ else
+ {
+ if (p->indir & PV_BOTH)
+ r |= SOPT_GLOBAL;
+ else if (opt_type == SREQ_GLOBAL)
+ return 0; /* Requested global option */
+
+ if (p->indir & PV_WIN)
+ {
+ if (opt_type == SREQ_BUF)
+ return 0; /* Did not request window-local option */
+ else
+ r |= SOPT_WIN;
+ }
+ else if (p->indir & PV_BUF)
+ {
+ if (opt_type == SREQ_WIN)
+ return 0; /* Did not request buffer-local option */
+ else
+ r |= SOPT_BUF;
+ }
+ }
+
+ if (stringval == NULL)
+ return r;
+
+ if (opt_type == SREQ_GLOBAL)
+ varp = p->var;
+ else
+ {
+ if (opt_type == SREQ_BUF)
+ {
+ /* Special case: 'modified' is b_changed, but we also want to
+ * consider it set when 'ff' or 'fenc' changed. */
+ if (p->indir == PV_MOD)
+ {
+ *numval = bufIsChanged((buf_T *) from);
+ varp = NULL;
+ }
+#ifdef FEAT_CRYPT
+ else if (p->indir == PV_KEY)
+ {
+ /* never return the value of the crypt key */
+ *stringval = NULL;
+ varp = NULL;
+ }
+#endif
+ else
+ {
+ aco_save_T aco;
+ aucmd_prepbuf(&aco, (buf_T *) from);
+ varp = get_varp(p);
+ aucmd_restbuf(&aco);
+ }
+ }
+ else if (opt_type == SREQ_WIN)
+ {
+ win_T *save_curwin;
+ save_curwin = curwin;
+ curwin = (win_T *) from;
+ curbuf = curwin->w_buffer;
+ varp = get_varp(p);
+ curwin = save_curwin;
+ curbuf = curwin->w_buffer;
+ }
+ if (varp == p->var)
+ return (r | SOPT_UNSET);
+ }
+
+ if (varp != NULL)
+ {
+ if (p->flags & P_STRING)
+ *stringval = vim_strsave(*(char_u **)(varp));
+ else if (p->flags & P_NUM)
+ *numval = *(long *) varp;
+ else
+ *numval = *(int *)varp;
+ }
+
+ return r;
+}
+#endif
+
/*
* Set the value of option "name".
* Use "string" for string options, use "number" for other options.
@@ -9557,6 +9695,87 @@ comp_col()
}
/*
+ * Unset local option value, similar to ":set opt<".
+ */
+
+ void
+unset_global_local_option(name, from)
+ char_u *name;
+ void *from;
+{
+ struct vimoption *p;
+ int opt_idx;
+
+ buf_T *buf = (buf_T *) from;
+ win_T *win = (win_T *) from;
+
+ opt_idx = findoption(name);
+ p = &(options[opt_idx]);
+
+ switch ((int)p->indir)
+ {
+ /* global option with local value: use local value if it's been set */
+ case PV_EP:
+ *buf->b_p_ep = NUL;
+ break;
+ case PV_KP:
+ *buf->b_p_kp = NUL;
+ break;
+ case PV_PATH:
+ *buf->b_p_path = NUL;
+ break;
+ case PV_AR:
+ buf->b_p_ar = -1;
+ break;
+ case PV_TAGS:
+ *buf->b_p_tags = NUL;
+ break;
+#ifdef FEAT_FIND_ID
+ case PV_DEF:
+ *buf->b_p_def = NUL;
+ break;
+ case PV_INC:
+ *buf->b_p_inc = NUL;
+ break;
+#endif
+#ifdef FEAT_INS_EXPAND
+ case PV_DICT:
+ *buf->b_p_dict = NUL;
+ break;
+ case PV_TSR:
+ *buf->b_p_tsr = NUL;
+ break;
+#endif
+#ifdef FEAT_QUICKFIX
+ case PV_EFM:
+ *buf->b_p_efm = NUL;
+ break;
+ case PV_GP:
+ *buf->b_p_gp = NUL;
+ break;
+ case PV_MP:
+ *buf->b_p_mp = NUL;
+ break;
+#endif
+#if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
+ case PV_BEXPR:
+ *buf->b_p_bexpr = NUL;
+ break;
+#endif
+#if defined(FEAT_CRYPT)
+ case PV_CM:
+ *buf->b_p_cm = NUL;
+ break;
+#endif
+#ifdef FEAT_STL_OPT
+ case PV_STL:
+ *win->w_p_stl = NUL;
+ break;
+#endif
+ }
+}
+
+/*
* Get pointer to option variable, depending on local or global scope.
*/
static char_u *