aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/api/vim.c56
-rw-r--r--src/nvim/option.c52
-rw-r--r--src/nvim/option.h21
3 files changed, 104 insertions, 25 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 77002697fe..c5dc89410a 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -970,6 +970,62 @@ Object nvim_get_option(String name, Error *err)
return get_option_from(NULL, SREQ_GLOBAL, name, err);
}
+Dictionary nvim_get_vimoption_info(Error *err)
+ FUNC_API_SINCE(7)
+{
+ Dictionary retval = ARRAY_DICT_INIT;
+
+ vimoption_T *all_options = get_all_vimoptions();
+
+ int i = 0;
+ vimoption_T opt;
+ while (true) {
+ opt = all_options[i++];
+ if (opt.fullname == NULL) {
+ break;
+ }
+
+ Dictionary opt_dict = ARRAY_DICT_INIT;
+
+ PUT(opt_dict, "fullname", STRING_OBJ(cstr_to_string(opt.fullname)));
+ PUT(opt_dict, "shortname", STRING_OBJ(cstr_to_string(opt.shortname)));
+ PUT(opt_dict, "is_global", BOOLEAN_OBJ(opt.flags & OPT_GLOBAL));
+ PUT(opt_dict, "is_local", BOOLEAN_OBJ(opt.flags & OPT_LOCAL));
+ PUT(opt_dict, "flag", INTEGER_OBJ(opt.flags));
+ PUT(opt_dict, "sourced_sid", INTEGER_OBJ(opt.last_set.script_ctx.sc_sid));
+ PUT(opt_dict, "sourced_lnum", INTEGER_OBJ(opt.last_set.script_ctx.sc_lnum));
+ PUT(opt_dict, "type", STRING_OBJ(get_option_type_string(opt)));
+
+ PUT(retval, opt.fullname, DICTIONARY_OBJ(opt_dict));
+ }
+
+ return retval;
+}
+
+Dictionary nvim_get_option_info(String name, Error *err)
+ FUNC_API_SINCE(7)
+{
+ Dictionary retval = ARRAY_DICT_INIT;
+
+ get_option_from(NULL, SREQ_GLOBAL, name, err);
+ if (ERROR_SET(err)) {
+ return retval;
+ }
+
+ int opt_idx = findoption_len((const char *)name.data, name.size);
+ vimoption_T opt = get_vimoption(opt_idx);
+
+ PUT(retval, "fullname", STRING_OBJ(cstr_to_string(opt.fullname)));
+ PUT(retval, "shortname", STRING_OBJ(cstr_to_string(opt.shortname)));
+ PUT(retval, "is_global", BOOLEAN_OBJ(opt.flags & OPT_GLOBAL));
+ PUT(retval, "is_local", BOOLEAN_OBJ(opt.flags & OPT_LOCAL));
+ PUT(retval, "flag", INTEGER_OBJ(opt.flags));
+ PUT(retval, "sourced_sid", INTEGER_OBJ(opt.last_set.script_ctx.sc_sid));
+ PUT(retval, "sourced_lnum", INTEGER_OBJ(opt.last_set.script_ctx.sc_lnum));
+
+ return retval;
+}
+
/// Sets an option value.
///
/// @param channel_id
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 0034117ddc..5e3f917bed 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -102,13 +102,6 @@
#define OPT_BUF(x) (idopt_T)(PV_BUF + (int)(x))
#define OPT_BOTH(x) (idopt_T)(PV_BOTH + (int)(x))
-
-// WV_ and BV_ values get typecasted to this for the "indir" field
-typedef enum {
- PV_NONE = 0,
- PV_MAXVAL = 0xffff // to avoid warnings for value out of range
-} idopt_T;
-
/*
* Options local to a window have a value local to a buffer and global to all
* buffers. Indicate this by setting "var" to VAR_WIN.
@@ -195,20 +188,6 @@ static long p_sts_nopaste;
static long p_tw_nopaste;
static long p_wm_nopaste;
-typedef struct vimoption {
- char *fullname; // full option name
- char *shortname; // permissible abbreviation
- uint32_t flags; // see below
- char_u *var; // global option: pointer to variable;
- // window-local option: VAR_WIN;
- // buffer-local option: global value
- idopt_T indir; // global option: PV_NONE;
- // local option: indirect option index
- char_u *def_val[2]; // default values for variable (vi and vim)
- LastSet last_set; // script in which the option was last set
-# define SCTX_INIT , { 0, 0, 0 }
-} vimoption_T;
-
#define VI_DEFAULT 0 // def_val[VI_DEFAULT] is Vi default value
#define VIM_DEFAULT 1 // def_val[VIM_DEFAULT] is Vim default value
@@ -3617,10 +3596,14 @@ static void set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx)
{
int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
int indir = (int)options[opt_idx].indir;
- const LastSet last_set = { .script_ctx =
- { script_ctx.sc_sid, script_ctx.sc_seq,
- script_ctx.sc_lnum + sourcing_lnum },
- current_channel_id };
+ const LastSet last_set = {
+ .script_ctx = {
+ script_ctx.sc_sid,
+ script_ctx.sc_seq,
+ script_ctx.sc_lnum + sourcing_lnum
+ },
+ current_channel_id
+ };
// Remember where the option was set. For local options need to do that
// in the buffer or window structure.
@@ -7174,3 +7157,22 @@ long get_sidescrolloff_value(void)
{
return curwin->w_p_siso < 0 ? p_siso : curwin->w_p_siso;
}
+
+vimoption_T get_vimoption(int opt_idx)
+{
+ return options[opt_idx];
+}
+
+vimoption_T* get_all_vimoptions(void)
+{
+ return options;
+}
+
+String get_option_type_string(vimoption_T opt)
+{
+ return cstr_to_string(
+ opt.flags & P_BOOL ? "boolean"
+ : opt.flags & P_NUM ? "number"
+ : opt.flags & P_STRING ? "string"
+ : "unknown");
+}
diff --git a/src/nvim/option.h b/src/nvim/option.h
index 60f14dea44..1bf28e1ce8 100644
--- a/src/nvim/option.h
+++ b/src/nvim/option.h
@@ -21,6 +21,27 @@ typedef enum {
OPT_NOWIN = 32, ///< Don’t set window-local options.
} OptionFlags;
+// WV_ and BV_ values get typecasted to this for the "indir" field
+typedef enum {
+ PV_NONE = 0,
+ PV_MAXVAL = 0xffff // to avoid warnings for value out of range
+} idopt_T;
+
+typedef struct vimoption {
+ char *fullname; // full option name
+ char *shortname; // permissible abbreviation
+ uint32_t flags; // see below
+ char_u *var; // global option: pointer to variable;
+ // window-local option: VAR_WIN;
+ // buffer-local option: global value
+ idopt_T indir; // global option: PV_NONE;
+ // local option: indirect option index
+ char_u *def_val[2]; // default values for variable (vi and vim)
+ LastSet last_set; // script in which the option was last set
+# define SCTX_INIT , { 0, 0, 0 }
+} vimoption_T;
+
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "option.h.generated.h"
#endif