aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/option.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/option.c')
-rw-r--r--src/nvim/option.c122
1 files changed, 26 insertions, 96 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 1f4f547759..0d0437d45f 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -1,8 +1,8 @@
// User-settable options. Checklist for adding a new option:
// - Put it in options.lua
-// - For a global option: Add a variable for it in option_defs.h.
+// - For a global option: Add a variable for it in option_vars.h.
// - For a buffer or window local option:
-// - Add a BV_XX or WV_XX entry to option_defs.h
+// - Add a BV_XX or WV_XX entry to option_vars.h
// - Add a variable to the window or buffer struct in buffer_defs.h.
// - For a window option, add some code to copy_winopt().
// - For a window string option, add code to check_winopt()
@@ -12,7 +12,7 @@
// - For a buffer string option, add code to check_buf_options().
// - If it's a numeric option, add any necessary bounds checks to check_num_option_bounds().
// - If it's a list of flags, add some code in do_set(), search for WW_ALL.
-// - Add documentation! doc/options.txt, and any other related places.
+// - Add documentation! "desc" in options.lua, and any other related places.
// - Add an entry in runtime/optwin.vim.
#define IN_OPTION_C
@@ -143,15 +143,13 @@ typedef enum {
# include "option.c.generated.h"
#endif
-// options[] is initialized here.
-// The order of the options MUST be alphabetic for ":set all" and findoption().
-// All option names MUST start with a lowercase letter (for findoption()).
-// Exception: "t_" options are at the end.
+// options[] is initialized in options.generated.h.
// The options with a NULL variable are 'hidden': a set command for them is
// ignored and they are not printed.
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "options.generated.h"
+# include "options_map.generated.h"
#endif
static int p_bin_dep_opts[] = {
@@ -664,7 +662,7 @@ void set_init_3(void)
}
if (buf_is_empty(curbuf)) {
- int idx_ffs = findoption_len(S_LEN("ffs"));
+ int idx_ffs = find_option("ffs");
// Apply the first entry of 'fileformats' to the initial buffer.
if (idx_ffs >= 0 && (options[idx_ffs].flags & P_WAS_SET)) {
@@ -1132,7 +1130,7 @@ const char *find_option_end(const char *arg, OptIndex *opt_idxp)
p++;
}
- *opt_idxp = findoption_len(arg, (size_t)(p - arg));
+ *opt_idxp = find_option_len(arg, (size_t)(p - arg));
return p;
}
@@ -3009,87 +3007,6 @@ void check_redraw(uint32_t flags)
check_redraw_for(curbuf, curwin, flags);
}
-/// Find index for named option
-///
-/// @param[in] arg Option to find index for.
-/// @param[in] len Length of the option.
-///
-/// @return Index of the option or kOptInvalid if option was not found.
-OptIndex findoption_len(const char *const arg, const size_t len)
-{
- const char *s;
- static int quick_tab[27] = { 0, 0 }; // quick access table
-
- // For first call: Initialize the quick-access table.
- // It contains the index for the first option that starts with a certain
- // letter. There are 26 letters, plus the first "t_" option.
- if (quick_tab[1] == 0) {
- const char *p = options[0].fullname;
- for (OptIndex i = 1; i < kOptIndexCount; i++) {
- s = options[i].fullname;
-
- if (s[0] != p[0]) {
- if (s[0] == 't' && s[1] == '_') {
- quick_tab[26] = i;
- } else {
- quick_tab[CHAR_ORD_LOW(s[0])] = i;
- }
- }
- p = s;
- }
- }
-
- // Check for name starting with an illegal character.
- if (len == 0 || arg[0] < 'a' || arg[0] > 'z') {
- return kOptInvalid;
- }
-
- OptIndex opt_idx;
- const bool is_term_opt = (len > 2 && arg[0] == 't' && arg[1] == '_');
- if (is_term_opt) {
- opt_idx = quick_tab[26];
- } else {
- opt_idx = quick_tab[CHAR_ORD_LOW(arg[0])];
- }
- // Match full name
- for (; opt_idx < kOptIndexCount; opt_idx++) {
- s = options[opt_idx].fullname;
-
- // Break if first character no longer matches.
- if (s[0] != arg[0]) {
- opt_idx = kOptIndexCount;
- break;
- }
-
- if (strncmp(arg, s, len) == 0 && s[len] == NUL) {
- break;
- }
- }
- if (opt_idx == kOptIndexCount && !is_term_opt) {
- opt_idx = quick_tab[CHAR_ORD_LOW(arg[0])];
- // Match short name
- for (; opt_idx < kOptIndexCount; opt_idx++) {
- s = options[opt_idx].shortname;
- if (s != NULL && strncmp(arg, s, len) == 0 && s[len] == NUL) {
- break;
- }
- }
- }
- if (opt_idx == kOptIndexCount) {
- opt_idx = kOptInvalid;
- } else {
- // Nvim: handle option aliases.
- if (strncmp(options[opt_idx].fullname, "viminfo", 7) == 0) {
- if (strlen(options[opt_idx].fullname) == 7) {
- return findoption_len("shada", 5);
- }
- assert(strcmp(options[opt_idx].fullname, "viminfofile") == 0);
- return findoption_len("shadafile", 9);
- }
- }
- return opt_idx;
-}
-
bool is_tty_option(const char *name)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
@@ -3147,15 +3064,28 @@ bool set_tty_option(const char *name, char *value)
return false;
}
+/// Find index for an option. Don't go beyond `len` length.
+///
+/// @param[in] name Option name.
+/// @param len Option name length.
+///
+/// @return Option index or kOptInvalid if option was not found.
+OptIndex find_option_len(const char *const name, size_t len)
+ FUNC_ATTR_NONNULL_ALL
+{
+ int index = find_option_hash(name, len);
+ return index >= 0 ? option_hash_elems[index].opt_idx : kOptInvalid;
+}
+
/// Find index for an option.
///
-/// @param[in] arg Option name.
+/// @param[in] name Option name.
///
/// @return Option index or kOptInvalid if option was not found.
-OptIndex findoption(const char *const arg)
+OptIndex find_option(const char *const name)
FUNC_ATTR_NONNULL_ALL
{
- return findoption_len(arg, strlen(arg));
+ return find_option_len(name, strlen(name));
}
/// Free an allocated OptVal.
@@ -5229,7 +5159,7 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
return;
}
nextchar = *p;
- opt_idx = findoption_len(arg, (size_t)(p - arg));
+ opt_idx = find_option_len(arg, (size_t)(p - arg));
if (opt_idx == kOptInvalid || options[opt_idx].var == NULL) {
xp->xp_context = EXPAND_NOTHING;
return;
@@ -5534,7 +5464,7 @@ int ExpandOldSetting(int *numMatches, char ***matches)
// For a terminal key code expand_option_idx is kOptInvalid.
if (expand_option_idx == kOptInvalid) {
- expand_option_idx = findoption(expand_option_name);
+ expand_option_idx = find_option(expand_option_name);
}
if (expand_option_idx != kOptInvalid) {
@@ -6146,7 +6076,7 @@ int get_sidescrolloff_value(win_T *wp)
Dictionary get_vimoption(String name, int scope, buf_T *buf, win_T *win, Error *err)
{
- OptIndex opt_idx = findoption_len(name.data, name.size);
+ OptIndex opt_idx = find_option_len(name.data, name.size);
VALIDATE_S(opt_idx != kOptInvalid, "option (not found)", name.data, {
return (Dictionary)ARRAY_DICT_INIT;
});