mirror of
https://github.com/neovim/neovim.git
synced 2025-09-10 13:28:19 +00:00
api/options: add option metadata
This commit is contained in:
@@ -970,6 +970,62 @@ Object nvim_get_option(String name, Error *err)
|
|||||||
return get_option_from(NULL, SREQ_GLOBAL, name, 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.
|
/// Sets an option value.
|
||||||
///
|
///
|
||||||
/// @param channel_id
|
/// @param channel_id
|
||||||
|
@@ -102,13 +102,6 @@
|
|||||||
#define OPT_BUF(x) (idopt_T)(PV_BUF + (int)(x))
|
#define OPT_BUF(x) (idopt_T)(PV_BUF + (int)(x))
|
||||||
#define OPT_BOTH(x) (idopt_T)(PV_BOTH + (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
|
* 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.
|
* 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_tw_nopaste;
|
||||||
static long p_wm_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 VI_DEFAULT 0 // def_val[VI_DEFAULT] is Vi default value
|
||||||
#define VIM_DEFAULT 1 // def_val[VIM_DEFAULT] is Vim 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 both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0;
|
||||||
int indir = (int)options[opt_idx].indir;
|
int indir = (int)options[opt_idx].indir;
|
||||||
const LastSet last_set = { .script_ctx =
|
const LastSet last_set = {
|
||||||
{ script_ctx.sc_sid, script_ctx.sc_seq,
|
.script_ctx = {
|
||||||
script_ctx.sc_lnum + sourcing_lnum },
|
script_ctx.sc_sid,
|
||||||
current_channel_id };
|
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
|
// Remember where the option was set. For local options need to do that
|
||||||
// in the buffer or window structure.
|
// 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;
|
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");
|
||||||
|
}
|
||||||
|
@@ -21,6 +21,27 @@ typedef enum {
|
|||||||
OPT_NOWIN = 32, ///< Don’t set window-local options.
|
OPT_NOWIN = 32, ///< Don’t set window-local options.
|
||||||
} OptionFlags;
|
} 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
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "option.h.generated.h"
|
# include "option.h.generated.h"
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user