diff options
Diffstat (limited to 'src/nvim/option.h')
-rw-r--r-- | src/nvim/option.h | 126 |
1 files changed, 106 insertions, 20 deletions
diff --git a/src/nvim/option.h b/src/nvim/option.h index 636257bfe8..ebf8e0417d 100644 --- a/src/nvim/option.h +++ b/src/nvim/option.h @@ -1,27 +1,113 @@ -#ifndef NVIM_OPTION_H -#define NVIM_OPTION_H +#pragma once -#include "nvim/ex_cmds_defs.h" +#include <stdint.h> +#include <stdio.h> // IWYU pragma: keep -/// Returned by get_option_value(). +#include "nvim/api/private/defs.h" // IWYU pragma: keep +#include "nvim/api/private/helpers.h" +#include "nvim/cmdexpand_defs.h" // IWYU pragma: keep +#include "nvim/eval/typval_defs.h" +#include "nvim/ex_cmds_defs.h" // IWYU pragma: keep +#include "nvim/option_defs.h" // IWYU pragma: export +#include "nvim/types_defs.h" // IWYU pragma: keep + +/// The options that are local to a window or buffer have "indir" set to one of +/// these values. Special values: +/// PV_NONE: global option. +/// PV_WIN is added: window-local option +/// PV_BUF is added: buffer-local option +/// PV_BOTH is added: global option which also has a local value. +enum { + PV_BOTH = 0x1000, + PV_WIN = 0x2000, + PV_BUF = 0x4000, + PV_MASK = 0x0fff, +}; +#define OPT_WIN(x) (idopt_T)(PV_WIN + (int)(x)) +#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 { - gov_unknown, - gov_bool, - gov_number, - gov_string, - gov_hidden_bool, - gov_hidden_number, - gov_hidden_string, -} getoption_T; - -// flags for buf_copy_options() -#define BCO_ENTER 1 // going to enter the buffer -#define BCO_ALWAYS 2 // always copy the options -#define BCO_NOHELP 4 // don't touch the help related options - -#define MAX_NUMBERWIDTH 20 // used for 'numberwidth' and 'statuscolumn' + 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. +#define VAR_WIN ((char *)-1) + +typedef struct vimoption { + char *fullname; ///< full option name + char *shortname; ///< permissible abbreviation + uint32_t flags; ///< see above + void *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 + ///< callback function to invoke after an option is modified to validate and + ///< apply the new value. + bool immutable; ///< option value cannot be changed from the default value. + + /// callback function to invoke after an option is modified to validate and + /// apply the new value. + opt_did_set_cb_T opt_did_set_cb; + + /// callback function to invoke when expanding possible values on the + /// cmdline. Only useful for string options. + opt_expand_cb_T opt_expand_cb; + + // TODO(famiu): Use OptVal for def_val. + void *def_val; ///< default values for variable (neovim!!) + LastSet last_set; ///< script in which the option was last set +} vimoption_T; + +/// flags for buf_copy_options() +enum { + BCO_ENTER = 1, ///< going to enter the buffer + BCO_ALWAYS = 2, ///< always copy the options + BCO_NOHELP = 4, ///< don't touch the help related options +}; + +/// Flags for option-setting functions +/// +/// When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global +/// values, get local value. +typedef enum { + // TODO(famiu): See if `OPT_FREE` is really necessary and remove it if not. + OPT_FREE = 0x01, ///< Free old value if it was allocated. + OPT_GLOBAL = 0x02, ///< Use global value. + OPT_LOCAL = 0x04, ///< Use local value. + OPT_MODELINE = 0x08, ///< Option in modeline. + OPT_WINONLY = 0x10, ///< Only set window-local options. + OPT_NOWIN = 0x20, ///< Don’t set window-local options. + OPT_ONECOLUMN = 0x40, ///< list options one per line + OPT_NO_REDRAW = 0x80, ///< ignore redraw flags on option + OPT_SKIPRTP = 0x100, ///< "skiprtp" in 'sessionoptions' +} OptionFlags; + +/// Return value from get_option_value_strict +enum { + SOPT_BOOL = 0x01, ///< Boolean option + SOPT_NUM = 0x02, ///< Number option + SOPT_STRING = 0x04, ///< String option + SOPT_GLOBAL = 0x08, ///< Option has global value + SOPT_WIN = 0x10, ///< Option has window-local value + SOPT_BUF = 0x20, ///< Option has buffer-local value +}; + +// OptVal helper macros. +#define NIL_OPTVAL ((OptVal) { .type = kOptValTypeNil }) +#define BOOLEAN_OPTVAL(b) ((OptVal) { .type = kOptValTypeBoolean, .data.boolean = b }) +#define NUMBER_OPTVAL(n) ((OptVal) { .type = kOptValTypeNumber, .data.number = n }) +#define STRING_OPTVAL(s) ((OptVal) { .type = kOptValTypeString, .data.string = s }) + +#define CSTR_AS_OPTVAL(s) STRING_OPTVAL(cstr_as_string(s)) +#define CSTR_TO_OPTVAL(s) STRING_OPTVAL(cstr_to_string(s)) +#define STATIC_CSTR_AS_OPTVAL(s) STRING_OPTVAL(STATIC_CSTR_AS_STRING(s)) +#define STATIC_CSTR_TO_OPTVAL(s) STRING_OPTVAL(STATIC_CSTR_TO_STRING(s)) #ifdef INCLUDE_GENERATED_DECLARATIONS # include "option.h.generated.h" #endif -#endif // NVIM_OPTION_H |