diff options
author | TJ DeVries <devries.timothyj@gmail.com> | 2020-10-27 22:20:52 -0400 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2020-12-04 13:29:27 +0100 |
commit | 35767912bbe9da4556aab122ba00488c56dd9f17 (patch) | |
tree | 217d2d3dc9e6b413e268356539a900ac365b0146 | |
parent | 8fb786e415d1c3538452885455b2268d13f640a6 (diff) | |
download | rneovim-35767912bbe9da4556aab122ba00488c56dd9f17.tar.gz rneovim-35767912bbe9da4556aab122ba00488c56dd9f17.tar.bz2 rneovim-35767912bbe9da4556aab122ba00488c56dd9f17.zip |
api/options: add option metadata
-rw-r--r-- | src/nvim/api/vim.c | 56 | ||||
-rw-r--r-- | src/nvim/option.c | 52 | ||||
-rw-r--r-- | src/nvim/option.h | 21 |
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 |