aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/eval/funcs.c1
-rw-r--r--src/nvim/ex_docmd.c8
-rw-r--r--src/nvim/mark.c159
-rw-r--r--src/nvim/option.c469
-rw-r--r--src/nvim/option_defs.h1
-rw-r--r--src/nvim/option_vars.h2
-rw-r--r--src/nvim/options.lua34
8 files changed, 391 insertions, 284 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 7f5a2aecce..c7881ed07e 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -542,6 +542,7 @@ struct file_buffer {
#ifdef BACKSLASH_IN_FILENAME
char *b_p_csl; ///< 'completeslash'
#endif
+ char *b_p_umf; ///< 'usermarkfunc'
char *b_p_cfu; ///< 'completefunc'
Callback b_cfu_cb; ///< 'completefunc' callback
char *b_p_ofu; ///< 'omnifunc'
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 310ac29f88..91b3c09824 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -3166,6 +3166,7 @@ static void f_has(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
"title",
"user-commands", // was accidentally included in 5.4
"user_commands",
+ "usermarks",
"vartabs",
"vertsplit",
"vimscript-1",
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 0b466bbe4e..c225e82bc6 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -3224,7 +3224,7 @@ char *skip_range(const char *cmd, int *ctx)
}
}
if (*cmd != NUL) {
- cmd++;
+ cmd += utf_ptr2len(cmd);
}
}
@@ -3368,13 +3368,13 @@ static linenr_T get_address(exarg_T *eap, char **ptr, cmd_addr_T addr_type, int
goto error;
}
if (skip) {
- cmd++;
+ cmd += utfc_ptr2len(cmd);
} else {
// Only accept a mark in another file when it is
// used by itself: ":'M".
MarkGet flag = to_other_file && cmd[1] == NUL ? kMarkAll : kMarkBufLocal;
- fmark_T *fm = mark_get(curbuf, curwin, NULL, flag, *cmd);
- cmd++;
+ fmark_T *fm = mark_get(curbuf, curwin, NULL, flag, utf_ptr2char(cmd));
+ cmd += utf_ptr2len(cmd);
if (fm != NULL && fm->fnum != curbuf->handle) {
(void)mark_move_to(fm, 0);
// Jumped to another file.
diff --git a/src/nvim/mark.c b/src/nvim/mark.c
index 5839cf7a2e..7dacd03891 100644
--- a/src/nvim/mark.c
+++ b/src/nvim/mark.c
@@ -22,6 +22,7 @@
#include "nvim/globals.h"
#include "nvim/highlight.h"
#include "nvim/mark.h"
+#include "nvim/mark_defs.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
@@ -37,6 +38,8 @@
#include "nvim/strings.h"
#include "nvim/textobject.h"
#include "nvim/vim_defs.h"
+#include "nvim/map_defs.h"
+#include "nvim/eval/userfunc.h"
// This file contains routines to maintain and manipulate marks.
@@ -46,6 +49,33 @@
// There are marks 'A - 'Z (set by user) and '0 to '9 (set when writing
// shada).
+static struct {
+ Map(int, ptr_t) named;
+} usermarks;
+bool usermarks_init;
+
+static xfmark_T* lookup_user_mark(int mark)
+{
+ if (!usermarks_init) {
+ usermarks.named = (Map(int, ptr_t)) MAP_INIT;
+ usermarks_init = 1;
+ }
+
+ bool is_new = false;
+ xfmark_T **ret =
+ (xfmark_T**) map_put_ref(int, ptr_t)(&usermarks.named, mark, NULL, &is_new);
+
+ if (ret) {
+ if (is_new) {
+ *ret = xcalloc(sizeof(xfmark_T), 1);
+ }
+
+ return *ret;
+ }
+
+ return NULL;
+}
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "mark.c.generated.h"
#endif
@@ -153,7 +183,8 @@ int setmark_pos(int c, pos_T *pos, int fnum, fmarkv_T *view_pt)
RESET_XFMARK(namedfm + i, *pos, fnum, view, NULL);
return OK;
}
- return FAIL;
+
+ return mark_set_user(buf, c);
}
// Set the previous context mark to the current position and add it to the
@@ -334,6 +365,15 @@ fmark_T *mark_get(buf_T *buf, win_T *win, fmark_T *fmp, MarkGet flag, int name)
// Local Marks
fm = mark_get_local(buf, win, name);
}
+
+ if (!fm) {
+ // Get usermark.
+ xfmark_T* xm = mark_get_user(buf, name);
+ if (xm) {
+ fm = &xm->fmark;
+ }
+ }
+
if (fmp != NULL && fm != NULL) {
*fmp = *fm;
return fmp;
@@ -422,6 +462,123 @@ fmark_T *mark_get_local(buf_T *buf, win_T *win, int name)
return mark;
}
+/// Loads the mark 'out' with the results from calling the usermarkfunc.
+///
+/// @param umf String for the usermarkfunc
+/// @param name name for the mark
+/// @param[out] out the mark to write the results to.
+static int call_umf(
+ const char* umf, int name, typval_T* out, const char* get_or_set_a)
+{
+ char markname_str[5];
+ char get_or_set[4];
+ int len;
+
+ strncpy(get_or_set, get_or_set_a, sizeof(get_or_set));
+ get_or_set[3] = 0;
+
+ len = (*utf_char2len)(name);
+ markname_str[len] = 0;
+ utf_char2bytes(name, markname_str);
+
+ typval_T args[3];
+ args[0].v_type = VAR_STRING;
+ args[1].v_type = VAR_STRING;
+ args[2].v_type = VAR_UNKNOWN;
+
+ args[0].vval.v_string = get_or_set;
+ args[1].vval.v_string = markname_str;
+
+ funcexe_T funcexe = FUNCEXE_INIT;
+ funcexe.fe_evaluate = true;
+
+ return call_func(umf, -1, out, 2, args, &funcexe);
+}
+
+static int typval_to_xfmark(buf_T* buf, xfmark_T* out, typval_T* in)
+{
+ varnumber_T line;
+ varnumber_T col;
+ char* filename = NULL;
+
+ switch (in->v_type) {
+ case VAR_DICT:
+ line = tv_dict_get_number(in->vval.v_dict, "line");
+ col = tv_dict_get_number(in->vval.v_dict, "col");
+ filename = tv_dict_get_string(in->vval.v_dict, "file", true);
+ break;
+
+ case VAR_NUMBER:
+ line = in->vval.v_number;
+ col = 1;
+ break;
+
+ default:
+ return -1;
+ }
+
+ free_xfmark(*out);
+ memset(out, 0, sizeof(*out));
+
+ out->fname = filename;
+ out->fmark.mark.col = (int) col;
+ out->fmark.mark.lnum = (int) line;
+ out->fmark.fnum = 0;
+ out->fmark.timestamp = os_time();
+
+ return 0;
+}
+
+/// Gets marks that are defined by the user.
+///
+/// @param buf the buffer
+/// @param name name fo the mark
+xfmark_T *mark_get_user(buf_T* buf, int name)
+{
+ const char* umf = (const char*) buf->b_p_umf;
+
+ if (!umf) {
+ return NULL;
+ }
+
+ xfmark_T* mark = lookup_user_mark(name);
+ if (mark) {
+ typval_T* typval = xcalloc(sizeof(typval_T), 1);
+ call_umf(umf, name, typval, "get");
+ typval_to_xfmark(buf, mark, typval);
+ tv_free(typval);
+
+ if (mark->fname) {
+ buf_T* buffer =
+ buflist_new(
+ mark->fname, NULL, mark->fmark.mark.lnum, BLN_CURBUF | BLN_LISTED);
+
+ if (buffer) {
+ mark->fmark.fnum = buffer->b_fnum;
+ }
+ } else {
+ mark->fmark.fnum = buf->b_fnum;
+ }
+ }
+
+ return mark;
+}
+
+int mark_set_user(buf_T* buf, int name)
+{
+ const char* umf = (const char*) buf->b_p_umf;
+
+ if (!umf) {
+ return FAIL;
+ }
+
+ typval_T* out = xcalloc(sizeof(typval_T), 1);
+ call_umf(umf, name, out, "set");
+ tv_free(out);
+
+ return OK;
+}
+
/// Get marks that are actually motions but return them as marks
///
/// Gets the following motions as marks: '{', '}', '(', ')'
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 69f02bf2f6..23bdc591cc 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -24,8 +24,6 @@
#include <stdlib.h>
#include <string.h>
-#include "auto/config.h"
-#include "klib/kvec.h"
#include "nvim/api/extmark.h"
#include "nvim/api/private/defs.h"
#include "nvim/api/private/helpers.h"
@@ -99,22 +97,20 @@
#include "nvim/vim_defs.h"
#include "nvim/window.h"
+#include "auto/config.h"
+#include "klib/kvec.h"
+
#ifdef BACKSLASH_IN_FILENAME
# include "nvim/arglist.h"
#endif
-static const char e_unknown_option[]
- = N_("E518: Unknown option");
-static const char e_not_allowed_in_modeline[]
- = N_("E520: Not allowed in a modeline");
+static const char e_unknown_option[] = N_("E518: Unknown option");
+static const char e_not_allowed_in_modeline[] = N_("E520: Not allowed in a modeline");
static const char e_not_allowed_in_modeline_when_modelineexpr_is_off[]
= N_("E992: Not allowed in a modeline when 'modelineexpr' is off");
-static const char e_key_code_not_set[]
- = N_("E846: Key code not set");
-static const char e_number_required_after_equal[]
- = N_("E521: Number required after =");
-static const char e_preview_window_already_exists[]
- = N_("E590: A preview window already exists");
+static const char e_key_code_not_set[] = N_("E846: Key code not set");
+static const char e_number_required_after_equal[] = N_("E521: Number required after =");
+static const char e_preview_window_already_exists[] = N_("E590: A preview window already exists");
static char *p_term = NULL;
static char *p_ttytype = NULL;
@@ -157,13 +153,10 @@ typedef enum {
# include "options.generated.h"
#endif
-static char *(p_bin_dep_opts[]) = {
- "textwidth", "wrapmargin", "modeline", "expandtab", NULL
-};
-static char *(p_paste_dep_opts[]) = {
- "autoindent", "expandtab", "ruler", "showmatch", "smarttab",
- "softtabstop", "textwidth", "wrapmargin", "revins", "varsofttabstop", NULL
-};
+static char *(p_bin_dep_opts[]) = { "textwidth", "wrapmargin", "modeline", "expandtab", NULL };
+static char *(p_paste_dep_opts[])
+ = { "autoindent", "expandtab", "ruler", "showmatch", "smarttab", "softtabstop",
+ "textwidth", "wrapmargin", "revins", "varsofttabstop", NULL };
void set_init_tablocal(void)
{
@@ -226,8 +219,7 @@ static void set_init_default_backupskip(void)
xstrlcpy(item, p, len);
add_pathsep(item);
xstrlcat(item, "*", len);
- if (find_dup_item(ga.ga_data, item, options[opt_idx].flags)
- == NULL) {
+ if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) == NULL) {
ga_grow(&ga, (int)len);
if (!GA_EMPTY(&ga)) {
STRCAT(ga.ga_data, ",");
@@ -257,7 +249,7 @@ static void set_init_default_cdpath(void)
}
char *buf = xmalloc(2 * strlen(cdpath) + 2);
- buf[0] = ','; // start with ",", current dir first
+ buf[0] = ','; // start with ",", current dir first
int j = 1;
for (int i = 0; cdpath[i] != NUL; i++) {
if (vim_ispathlistsep(cdpath[i])) {
@@ -275,7 +267,7 @@ static void set_init_default_cdpath(void)
options[opt_idx].def_val = buf;
options[opt_idx].flags |= P_DEF_ALLOCED;
} else {
- xfree(buf); // cannot happen
+ xfree(buf); // cannot happen
}
xfree(cdpath);
}
@@ -348,12 +340,9 @@ void set_init_1(bool clean_arg)
memmove(backupdir + 2, backupdir, backupdir_len + 1);
memmove(backupdir, ".,", 2);
set_string_default("backupdir", backupdir, true);
- set_string_default("viewdir", stdpaths_user_state_subpath("view", 2, true),
- true);
- set_string_default("directory", stdpaths_user_state_subpath("swap", 2, true),
- true);
- set_string_default("undodir", stdpaths_user_state_subpath("undo", 2, true),
- true);
+ set_string_default("viewdir", stdpaths_user_state_subpath("view", 2, true), true);
+ set_string_default("directory", stdpaths_user_state_subpath("swap", 2, true), true);
+ set_string_default("undodir", stdpaths_user_state_subpath("undo", 2, true), true);
// Set default for &runtimepath. All necessary expansions are performed in
// this function.
char *rtp = runtimepath_default(clean_arg);
@@ -369,7 +358,7 @@ void set_init_1(bool clean_arg)
set_options_default(0);
curbuf->b_p_initialized = true;
- curbuf->b_p_ar = -1; // no local 'autoread' value
+ curbuf->b_p_ar = -1; // no local 'autoread' value
curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL;
check_buf_options(curbuf);
check_win_options(curwin);
@@ -391,7 +380,7 @@ void set_init_1(bool clean_arg)
// Expand environment variables and things like "~" for the defaults.
set_init_expand_env();
- save_file_ff(curbuf); // Buffer is unchanged
+ save_file_ff(curbuf); // Buffer is unchanged
// Detect use of mlterm.
// Mlterm is a terminal emulator akin to xterm that has some special
@@ -429,7 +418,7 @@ static void set_option_default(const int opt_idx, int opt_flags)
vimoption_T *opt = &options[opt_idx];
void *varp = get_varp_scope(opt, both ? OPT_LOCAL : opt_flags);
uint32_t flags = opt->flags;
- if (varp != NULL) { // skip hidden option, nothing to do for it
+ if (varp != NULL) { // skip hidden option, nothing to do for it
if (flags & P_STRING) {
// Use set_string_option_direct() for local options to handle
// freeing and allocating the value.
@@ -447,8 +436,7 @@ static void set_option_default(const int opt_idx, int opt_flags)
win_comp_scroll(curwin);
} else {
OptInt def_val = (OptInt)(intptr_t)opt->def_val;
- if ((OptInt *)varp == &curwin->w_p_so
- || (OptInt *)varp == &curwin->w_p_siso) {
+ if ((OptInt *)varp == &curwin->w_p_so || (OptInt *)varp == &curwin->w_p_siso) {
// 'scrolloff' and 'sidescrolloff' local values have a
// different default value than the global default.
*(OptInt *)varp = -1;
@@ -470,8 +458,7 @@ static void set_option_default(const int opt_idx, int opt_flags)
#endif
// May also set global value for local option.
if (both) {
- *(int *)get_varp_scope(opt, OPT_GLOBAL) =
- *(int *)varp;
+ *(int *)get_varp_scope(opt, OPT_GLOBAL) = *(int *)varp;
}
}
@@ -508,8 +495,7 @@ static void set_options_default(int opt_flags)
/// @param name The name of the option
/// @param val The value of the option
/// @param allocated If true, do not copy default as it was already allocated.
-static void set_string_default(const char *name, char *val, bool allocated)
- FUNC_ATTR_NONNULL_ALL
+static void set_string_default(const char *name, char *val, bool allocated) FUNC_ATTR_NONNULL_ALL
{
int opt_idx = findoption(name);
if (opt_idx >= 0) {
@@ -544,8 +530,7 @@ static char *find_dup_item(char *origval, const char *newval, uint32_t flags)
// Count backslashes. Only a comma with an even number of backslashes
// or a single backslash preceded by a comma before it is recognized as
// a separator.
- if ((s > origval + 1 && s[-1] == '\\' && s[-2] != ',')
- || (s == origval + 1 && s[-1] == '\\')) {
+ if ((s > origval + 1 && s[-1] == '\\' && s[-2] != ',') || (s == origval + 1 && s[-1] == '\\')) {
bs++;
} else {
bs = 0;
@@ -612,19 +597,15 @@ void set_init_2(bool headless)
/// Initialize the options, part three: After reading the .vimrc
void set_init_3(void)
{
- parse_shape_opt(SHAPE_CURSOR); // set cursor shapes from 'guicursor'
+ parse_shape_opt(SHAPE_CURSOR); // set cursor shapes from 'guicursor'
// Set 'shellpipe' and 'shellredir', depending on the 'shell' option.
// This is done after other initializations, where 'shell' might have been
// set, but only if they have not been set before.
int idx_srr = findoption("srr");
- int do_srr = (idx_srr < 0)
- ? false
- : !(options[idx_srr].flags & P_WAS_SET);
+ int do_srr = (idx_srr < 0) ? false : !(options[idx_srr].flags & P_WAS_SET);
int idx_sp = findoption("sp");
- int do_sp = (idx_sp < 0)
- ? false
- : !(options[idx_sp].flags & P_WAS_SET);
+ int do_sp = (idx_sp < 0) ? false : !(options[idx_sp].flags & P_WAS_SET);
size_t len = 0;
char *p = (char *)invocation_path_tail(p_sh, &len);
@@ -635,8 +616,7 @@ void set_init_3(void)
// Default for p_sp is "| tee", for p_srr is ">".
// For known shells it is changed here to include stderr.
//
- if (path_fnamecmp(p, "csh") == 0
- || path_fnamecmp(p, "tcsh") == 0) {
+ if (path_fnamecmp(p, "csh") == 0 || path_fnamecmp(p, "tcsh") == 0) {
if (do_sp) {
p_sp = "|& tee";
options[idx_sp].def_val = p_sp;
@@ -645,16 +625,11 @@ void set_init_3(void)
p_srr = ">&";
options[idx_srr].def_val = p_srr;
}
- } else if (path_fnamecmp(p, "sh") == 0
- || path_fnamecmp(p, "ksh") == 0
- || path_fnamecmp(p, "mksh") == 0
- || path_fnamecmp(p, "pdksh") == 0
- || path_fnamecmp(p, "zsh") == 0
- || path_fnamecmp(p, "zsh-beta") == 0
- || path_fnamecmp(p, "bash") == 0
- || path_fnamecmp(p, "fish") == 0
- || path_fnamecmp(p, "ash") == 0
- || path_fnamecmp(p, "dash") == 0) {
+ } else if (path_fnamecmp(p, "sh") == 0 || path_fnamecmp(p, "ksh") == 0
+ || path_fnamecmp(p, "mksh") == 0 || path_fnamecmp(p, "pdksh") == 0
+ || path_fnamecmp(p, "zsh") == 0 || path_fnamecmp(p, "zsh-beta") == 0
+ || path_fnamecmp(p, "bash") == 0 || path_fnamecmp(p, "fish") == 0
+ || path_fnamecmp(p, "ash") == 0 || path_fnamecmp(p, "dash") == 0) {
// Always use POSIX shell style redirection if we reach this
if (do_sp) {
p_sp = "2>&1| tee";
@@ -796,13 +771,10 @@ static char *stropt_copy_value(char *origval, char **argp, set_op_T op,
while (*arg != NUL && !ascii_iswhite(*arg)) {
if (*arg == '\\' && arg[1] != NUL
#ifdef BACKSLASH_IN_FILENAME
- && !((flags & P_EXPAND)
- && vim_isfilec((uint8_t)arg[1])
- && !ascii_iswhite(arg[1])
- && (arg[1] != '\\'
- || (s == newval && arg[2] != '\\')))
+ && !((flags & P_EXPAND) && vim_isfilec((uint8_t)arg[1]) && !ascii_iswhite(arg[1])
+ && (arg[1] != '\\' || (s == newval && arg[2] != '\\')))
#endif
- ) {
+ ) {
arg++; // remove backslash
}
int i = utfc_ptr2len(arg);
@@ -849,9 +821,7 @@ static void stropt_concat_with_comma(char *origval, char *newval, set_op_T op, u
if (op == OP_ADDING) {
len = (int)strlen(origval);
// Strip a trailing comma, would get 2.
- if (comma && len > 1
- && (flags & P_ONECOMMA) == P_ONECOMMA
- && origval[len - 1] == ','
+ if (comma && len > 1 && (flags & P_ONECOMMA) == P_ONECOMMA && origval[len - 1] == ','
&& origval[len - 2] != '\\') {
len--;
}
@@ -899,15 +869,13 @@ static void stropt_remove_dupflags(char *newval, uint32_t flags)
for (s = newval; *s;) {
// if options have P_FLAGLIST and P_ONECOMMA such as 'whichwrap'
if (flags & P_ONECOMMA) {
- if (*s != ',' && *(s + 1) == ','
- && vim_strchr(s + 2, (uint8_t)(*s)) != NULL) {
+ if (*s != ',' && *(s + 1) == ',' && vim_strchr(s + 2, (uint8_t)(*s)) != NULL) {
// Remove the duplicated value and the next comma.
STRMOVE(s, s + 2);
continue;
}
} else {
- if ((!(flags & P_COMMA) || *s != ',')
- && vim_strchr(s + 1, (uint8_t)(*s)) != NULL) {
+ if ((!(flags & P_COMMA) || *s != ',') && vim_strchr(s + 1, (uint8_t)(*s)) != NULL) {
STRMOVE(s, s + 1);
continue;
}
@@ -1001,11 +969,11 @@ static set_op_T get_op(const char *arg)
set_op_T op = OP_NONE;
if (*arg != NUL && *(arg + 1) == '=') {
if (*arg == '+') {
- op = OP_ADDING; // "+="
+ op = OP_ADDING; // "+="
} else if (*arg == '^') {
- op = OP_PREPENDING; // "^="
+ op = OP_PREPENDING; // "^="
} else if (*arg == '-') {
- op = OP_REMOVING; // "-="
+ op = OP_REMOVING; // "-="
}
}
return op;
@@ -1091,14 +1059,12 @@ static int validate_opt_idx(win_T *win, int opt_idx, int opt_flags, uint32_t fla
// Skip all options that are not window-local (used when showing
// an already loaded buffer in a window).
- if ((opt_flags & OPT_WINONLY)
- && (opt_idx < 0 || options[opt_idx].var != VAR_WIN)) {
+ if ((opt_flags & OPT_WINONLY) && (opt_idx < 0 || options[opt_idx].var != VAR_WIN)) {
return FAIL;
}
// Skip all options that are window-local (used for :vimgrep).
- if ((opt_flags & OPT_NOWIN) && opt_idx >= 0
- && options[opt_idx].var == VAR_WIN) {
+ if ((opt_flags & OPT_NOWIN) && opt_idx >= 0 && options[opt_idx].var == VAR_WIN) {
return FAIL;
}
@@ -1115,10 +1081,8 @@ static int validate_opt_idx(win_T *win, int opt_idx, int opt_flags, uint32_t fla
// In diff mode some options are overruled. This avoids that
// 'foldmethod' becomes "marker" instead of "diff" and that
// "wrap" gets set.
- if (win->w_p_diff
- && opt_idx >= 0 // shut up coverity warning
- && (options[opt_idx].indir == PV_FDM
- || options[opt_idx].indir == PV_WRAP)) {
+ if (win->w_p_diff && opt_idx >= 0 // shut up coverity warning
+ && (options[opt_idx].indir == PV_FDM || options[opt_idx].indir == PV_WRAP)) {
return FAIL;
}
}
@@ -1135,8 +1099,8 @@ static int validate_opt_idx(win_T *win, int opt_idx, int opt_flags, uint32_t fla
/// Get new option value from argp. Allocated OptVal must be freed by caller.
static OptVal get_option_newval(int opt_idx, int opt_flags, set_prefix_T prefix, char **argp,
int nextchar, set_op_T op, uint32_t flags, void *varp, char *errbuf,
- const size_t errbuflen, const char **errmsg)
- FUNC_ATTR_WARN_UNUSED_RESULT
+ const size_t errbuflen,
+ const char **errmsg) FUNC_ATTR_WARN_UNUSED_RESULT
{
assert(varp != NULL);
@@ -1294,21 +1258,20 @@ static void do_one_set_option(int opt_flags, char **argp, bool *did_show, char *
uint8_t nextchar = (uint8_t)arg[len]; // next non-white char after option name
- if (opt_idx == -1 && key == 0) { // found a mismatch: skip
+ if (opt_idx == -1 && key == 0) { // found a mismatch: skip
*errmsg = e_unknown_option;
return;
}
- uint32_t flags; // flags for current option
+ uint32_t flags; // flags for current option
void *varp = NULL; // pointer to variable for current option
if (opt_idx >= 0) {
- if (options[opt_idx].var == NULL) { // hidden option: skip
+ if (options[opt_idx].var == NULL) { // hidden option: skip
// Only give an error message when requesting the value of
// a hidden option, ignore setting it.
if (vim_strchr("=:!&<", nextchar) == NULL
- && (!(options[opt_idx].flags & P_BOOL)
- || nextchar == '?')) {
+ && (!(options[opt_idx].flags & P_BOOL) || nextchar == '?')) {
*errmsg = e_unsupportedoption;
}
return;
@@ -1333,8 +1296,7 @@ static void do_one_set_option(int opt_flags, char **argp, bool *did_show, char *
*argp += 2;
}
}
- if (vim_strchr("?!&<", nextchar) != NULL
- && (*argp)[1] != NUL && !ascii_iswhite((*argp)[1])) {
+ if (vim_strchr("?!&<", nextchar) != NULL && (*argp)[1] != NUL && !ascii_iswhite((*argp)[1])) {
*errmsg = e_trailing;
return;
}
@@ -1345,15 +1307,13 @@ static void do_one_set_option(int opt_flags, char **argp, bool *did_show, char *
// '=' character per "set" command line. grrr. (jw)
//
if (nextchar == '?'
- || (prefix == PREFIX_NONE
- && vim_strchr("=:&<", nextchar) == NULL
- && !(flags & P_BOOL))) {
+ || (prefix == PREFIX_NONE && vim_strchr("=:&<", nextchar) == NULL && !(flags & P_BOOL))) {
// print value
if (*did_show) {
- msg_putchar('\n'); // cursor below last one
+ msg_putchar('\n'); // cursor below last one
} else {
- gotocmdline(true); // cursor at status line
- *did_show = true; // remember that we did a line
+ gotocmdline(true); // cursor at status line
+ *did_show = true; // remember that we did a line
}
if (opt_idx >= 0) {
showoneopt(&options[opt_idx], opt_flags);
@@ -1426,15 +1386,14 @@ static void do_one_set_option(int opt_flags, char **argp, bool *did_show, char *
/// @return FAIL if an error is detected, OK otherwise
int do_set(char *arg, int opt_flags)
{
- bool did_show = false; // already showed one value
+ bool did_show = false; // already showed one value
if (*arg == NUL) {
showoptions(false, opt_flags);
did_show = true;
} else {
- while (*arg != NUL) { // loop to process all options
- if (strncmp(arg, "all", 3) == 0 && !ASCII_ISALPHA(arg[3])
- && !(opt_flags & OPT_MODELINE)) {
+ while (*arg != NUL) { // loop to process all options
+ if (strncmp(arg, "all", 3) == 0 && !ASCII_ISALPHA(arg[3]) && !(opt_flags & OPT_MODELINE)) {
// ":set all" show all options.
// ":set all&" set all options to their default value.
arg += 3;
@@ -1451,7 +1410,7 @@ int do_set(char *arg, int opt_flags)
did_show = true;
}
} else {
- char *startarg = arg; // remember for error message
+ char *startarg = arg; // remember for error message
const char *errmsg = NULL;
char errbuf[80];
@@ -1482,8 +1441,8 @@ int do_set(char *arg, int opt_flags)
// make sure all characters are printable
trans_characters(IObuff, IOSIZE);
- no_wait_return++; // wait_return() done later
- emsg(IObuff); // show error highlighted
+ no_wait_return++; // wait_return() done later
+ emsg(IObuff); // show error highlighted
no_wait_return--;
return FAIL;
@@ -1497,10 +1456,10 @@ int do_set(char *arg, int opt_flags)
if (silent_mode && did_show) {
// After displaying option values in silent mode.
silent_mode = false;
- info_message = true; // use os_msg(), not os_errmsg()
+ info_message = true; // use os_msg(), not os_errmsg()
msg_putchar('\n');
silent_mode = true;
- info_message = false; // use os_msg(), not os_errmsg()
+ info_message = false; // use os_msg(), not os_errmsg()
}
return OK;
@@ -1538,7 +1497,7 @@ void set_options_bin(int oldval, int newval, int opt_flags)
// The option values that are changed when 'bin' changes are
// copied when 'bin is set and restored when 'bin' is reset.
if (newval) {
- if (!oldval) { // switched on
+ if (!oldval) { // switched on
if (!(opt_flags & OPT_GLOBAL)) {
curbuf->b_p_tw_nobin = curbuf->b_p_tw;
curbuf->b_p_wm_nobin = curbuf->b_p_wm;
@@ -1554,19 +1513,19 @@ void set_options_bin(int oldval, int newval, int opt_flags)
}
if (!(opt_flags & OPT_GLOBAL)) {
- curbuf->b_p_tw = 0; // no automatic line wrap
- curbuf->b_p_wm = 0; // no automatic line wrap
- curbuf->b_p_ml = 0; // no modelines
- curbuf->b_p_et = 0; // no expandtab
+ curbuf->b_p_tw = 0; // no automatic line wrap
+ curbuf->b_p_wm = 0; // no automatic line wrap
+ curbuf->b_p_ml = 0; // no modelines
+ curbuf->b_p_et = 0; // no expandtab
}
if (!(opt_flags & OPT_LOCAL)) {
p_tw = 0;
p_wm = 0;
p_ml = false;
p_et = false;
- p_bin = true; // needed when called for the "-b" argument
+ p_bin = true; // needed when called for the "-b" argument
}
- } else if (oldval) { // switched off
+ } else if (oldval) { // switched off
if (!(opt_flags & OPT_GLOBAL)) {
curbuf->b_p_tw = curbuf->b_p_tw_nobin;
curbuf->b_p_wm = curbuf->b_p_wm_nobin;
@@ -1608,11 +1567,11 @@ char *find_shada_parameter(int type)
if (*p == type) {
return p + 1;
}
- if (*p == 'n') { // 'n' is always the last one
+ if (*p == 'n') { // 'n' is always the last one
break;
}
- p = vim_strchr(p, ','); // skip until next ','
- if (p == NULL) { // hit the end without finding parameter
+ p = vim_strchr(p, ','); // skip until next ','
+ if (p == NULL) { // hit the end without finding parameter
break;
}
}
@@ -1644,11 +1603,9 @@ static char *option_expand(int opt_idx, char *val)
// Escape spaces when expanding 'tags', they are used to separate file
// names.
// For 'spellsuggest' expand after "file:".
- expand_env_esc(val, NameBuff, MAXPATHL,
- (char **)options[opt_idx].var == &p_tags, false,
- (char **)options[opt_idx].var == &p_sps ? "file:"
- : NULL);
- if (strcmp(NameBuff, val) == 0) { // they are the same
+ expand_env_esc(val, NameBuff, MAXPATHL, (char **)options[opt_idx].var == &p_tags, false,
+ (char **)options[opt_idx].var == &p_sps ? "file:" : NULL);
+ if (strcmp(NameBuff, val) == 0) { // they are the same
return NULL;
}
@@ -1692,7 +1649,7 @@ static void didset_options2(void)
xfree(curbuf->b_p_vsts_array);
(void)tabstop_set(curbuf->b_p_vsts, &curbuf->b_p_vsts_array);
xfree(curbuf->b_p_vts_array);
- (void)tabstop_set(curbuf->b_p_vts, &curbuf->b_p_vts_array);
+ (void)tabstop_set(curbuf->b_p_vts, &curbuf->b_p_vts_array);
}
/// Check for string options that are NULL (normally only termcap options).
@@ -1763,8 +1720,7 @@ bool valid_name(const char *val, const char *allowed)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
for (const char *s = val; *s != NUL; s++) {
- if (!ASCII_ISALNUM(*s)
- && vim_strchr(allowed, (uint8_t)(*s)) == NULL) {
+ if (!ASCII_ISALNUM(*s) && vim_strchr(allowed, (uint8_t)(*s)) == NULL) {
return false;
}
}
@@ -1773,8 +1729,7 @@ bool valid_name(const char *val, const char *allowed)
void check_blending(win_T *wp)
{
- wp->w_grid_alloc.blending =
- wp->w_p_winbl > 0 || (wp->w_floating && wp->w_float_config.shadow);
+ wp->w_grid_alloc.blending = wp->w_p_winbl > 0 || (wp->w_floating && wp->w_float_config.shadow);
}
/// Handle setting `winhighlight' in window "wp"
@@ -1858,7 +1813,7 @@ void set_option_sctx_idx(int opt_idx, int opt_flags, sctx_T script_ctx)
// Remember where the option was set. For local options need to do that
// in the buffer or window structure.
- if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF|PV_WIN)) == 0) {
+ if (both || (opt_flags & OPT_GLOBAL) || (indir & (PV_BUF | PV_WIN)) == 0) {
options[opt_idx].last_set = last_set;
}
if (both || (opt_flags & OPT_LOCAL)) {
@@ -2018,8 +1973,7 @@ static const char *did_set_buflisted(optset_T *args)
// when 'buflisted' changes, trigger autocommands
if (args->os_oldval.boolean != buf->b_p_bl) {
- apply_autocmds(buf->b_p_bl ? EVENT_BUFADD : EVENT_BUFDELETE,
- NULL, NULL, true, buf);
+ apply_autocmds(buf->b_p_bl ? EVENT_BUFADD : EVENT_BUFDELETE, NULL, NULL, true, buf);
}
return NULL;
}
@@ -2193,7 +2147,7 @@ static const char *did_set_lisp(optset_T *args)
{
buf_T *buf = (buf_T *)args->os_buf;
// When 'lisp' option changes include/exclude '-' in keyword characters.
- (void)buf_init_chartab(buf, false); // ignore errors
+ (void)buf_init_chartab(buf, false); // ignore errors
return NULL;
}
@@ -2262,9 +2216,8 @@ static const char *did_set_paste(optset_T *args FUNC_ATTR_UNUSED)
if (buf->b_p_vsts_nopaste) {
xfree(buf->b_p_vsts_nopaste);
}
- buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_string_option
- ? xstrdup(buf->b_p_vsts)
- : NULL;
+ buf->b_p_vsts_nopaste
+ = buf->b_p_vsts && buf->b_p_vsts != empty_string_option ? xstrdup(buf->b_p_vsts) : NULL;
}
// save global options
@@ -2288,11 +2241,11 @@ static const char *did_set_paste(optset_T *args FUNC_ATTR_UNUSED)
// already on.
// set options for each buffer
FOR_ALL_BUFFERS(buf) {
- buf->b_p_tw = 0; // textwidth is 0
- buf->b_p_wm = 0; // wrapmargin is 0
- buf->b_p_sts = 0; // softtabstop is 0
- buf->b_p_ai = 0; // no auto-indent
- buf->b_p_et = 0; // no expandtab
+ buf->b_p_tw = 0; // textwidth is 0
+ buf->b_p_wm = 0; // wrapmargin is 0
+ buf->b_p_sts = 0; // softtabstop is 0
+ buf->b_p_ai = 0; // no auto-indent
+ buf->b_p_et = 0; // no expandtab
if (buf->b_p_vsts) {
free_string_option(buf->b_p_vsts);
}
@@ -2301,13 +2254,13 @@ static const char *did_set_paste(optset_T *args FUNC_ATTR_UNUSED)
}
// set global options
- p_sm = 0; // no showmatch
- p_sta = 0; // no smarttab
+ p_sm = 0; // no showmatch
+ p_sta = 0; // no smarttab
if (p_ru) {
- status_redraw_all(); // redraw to remove the ruler
+ status_redraw_all(); // redraw to remove the ruler
}
- p_ru = 0; // no ruler
- p_ri = 0; // no reverse insert
+ p_ru = 0; // no ruler
+ p_ri = 0; // no reverse insert
// set global values for local buffer options
p_tw = 0;
p_wm = 0;
@@ -2344,7 +2297,7 @@ static const char *did_set_paste(optset_T *args FUNC_ATTR_UNUSED)
p_sm = save_sm;
p_sta = save_sta;
if (p_ru != save_ru) {
- status_redraw_all(); // redraw to draw the ruler
+ status_redraw_all(); // redraw to draw the ruler
}
p_ru = save_ru;
p_ri = save_ri;
@@ -2525,11 +2478,11 @@ static const char *did_set_swapfile(optset_T *args)
buf_T *buf = (buf_T *)args->os_buf;
// when 'swf' is set, create swapfile, when reset remove swapfile
if (buf->b_p_swf && p_uc) {
- ml_open_file(buf); // create the swap file
+ ml_open_file(buf); // create the swap file
} else {
// no need to reset curbuf->b_may_swap, ml_open_file() will check
// buf->b_p_swf
- mf_close_file(buf, true); // remove the swap file
+ mf_close_file(buf, true); // remove the swap file
}
return NULL;
}
@@ -2582,9 +2535,8 @@ static const char *did_set_undofile(optset_T *args)
// only for the current buffer: Try to read in the undofile,
// if one exists, the buffer wasn't changed and the buffer was
// loaded
- if ((curbuf == bp
- || (args->os_flags & OPT_GLOBAL) || args->os_flags == 0)
- && !bufIsChanged(bp) && bp->b_ml.ml_mfp != NULL) {
+ if ((curbuf == bp || (args->os_flags & OPT_GLOBAL) || args->os_flags == 0) && !bufIsChanged(bp)
+ && bp->b_ml.ml_mfp != NULL) {
u_compute_hash(bp, hash);
u_read_undo(NULL, hash, bp->b_fname);
}
@@ -2620,9 +2572,9 @@ static const char *did_set_undolevels(optset_T *args)
buf_T *buf = (buf_T *)args->os_buf;
OptInt *pp = (OptInt *)args->os_varp;
- if (pp == &p_ul) { // global 'undolevels'
+ if (pp == &p_ul) { // global 'undolevels'
did_set_global_undolevels(args->os_newval.number, args->os_oldval.number);
- } else if (pp == &curbuf->b_p_ul) { // buffer local 'undolevels'
+ } else if (pp == &curbuf->b_p_ul) { // buffer local 'undolevels'
did_set_buflocal_undolevels(buf, args->os_newval.number, args->os_oldval.number);
}
@@ -2729,8 +2681,8 @@ static void do_syntax_autocmd(buf_T *buf, bool value_changed)
syn_recursive++;
// Only pass true for "force" when the value changed or not used
// recursively, to avoid endless recurrence.
- apply_autocmds(EVENT_SYNTAX, buf->b_p_syn, buf->b_fname,
- value_changed || syn_recursive == 1, buf);
+ apply_autocmds(EVENT_SYNTAX, buf->b_p_syn, buf->b_fname, value_changed || syn_recursive == 1,
+ buf);
buf->b_flags |= BF_SYN_SET;
syn_recursive--;
}
@@ -3097,9 +3049,7 @@ int findoption_len(const char *const arg, const size_t len)
bool is_tty_option(const char *name)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
- return (name[0] == 't' && name[1] == '_')
- || strequal(name, "term")
- || strequal(name, "ttytype");
+ return (name[0] == 't' && name[1] == '_') || strequal(name, "term") || strequal(name, "ttytype");
}
#define TCO_BUFFER_SIZE 8
@@ -3170,8 +3120,7 @@ bool set_tty_option(const char *name, char *value)
/// @param[in] arg Option name.
///
/// @return Option index or -1 if option was not found.
-int findoption(const char *const arg)
- FUNC_ATTR_NONNULL_ALL
+int findoption(const char *const arg) FUNC_ATTR_NONNULL_ALL
{
return findoption_len(arg, strlen(arg));
}
@@ -3548,20 +3497,18 @@ static const char *did_set_option(int opt_idx, void *varp, OptVal old_value, Opt
bool free_oldval = (opt->flags & P_ALLOCED);
bool value_changed = false;
- optset_T did_set_cb_args = {
- .os_varp = varp,
- .os_idx = opt_idx,
- .os_flags = opt_flags,
- .os_oldval = old_value.data,
- .os_newval = new_value.data,
- .os_value_checked = false,
- .os_value_changed = false,
- .os_restore_chartab = false,
- .os_errbuf = errbuf,
- .os_errbuflen = errbuflen,
- .os_buf = curbuf,
- .os_win = curwin
- };
+ optset_T did_set_cb_args = { .os_varp = varp,
+ .os_idx = opt_idx,
+ .os_flags = opt_flags,
+ .os_oldval = old_value.data,
+ .os_newval = new_value.data,
+ .os_value_checked = false,
+ .os_value_changed = false,
+ .os_restore_chartab = false,
+ .os_errbuf = errbuf,
+ .os_errbuflen = errbuflen,
+ .os_buf = curbuf,
+ .os_win = curwin };
// Disallow changing immutable options.
if (opt->immutable && !optval_equal(old_value, new_value)) {
@@ -3615,8 +3562,8 @@ static const char *did_set_option(int opt_idx, void *varp, OptVal old_value, Opt
// Check the bound for num options.
if (new_value.type == kOptValTypeNumber) {
- errmsg = check_num_option_bounds((OptInt *)varp, old_value.data.number, errbuf, errbuflen,
- errmsg);
+ errmsg
+ = check_num_option_bounds((OptInt *)varp, old_value.data.number, errbuf, errbuflen, errmsg);
// Re-assign new_value because the new value was modified by the bound check.
new_value = optval_from_varp(opt_idx, varp);
}
@@ -3704,12 +3651,10 @@ static const char *set_option(const int opt_idx, void *varp, OptVal value, int o
vimoption_T *opt = &options[opt_idx];
- static const char *optval_type_names[] = {
- [kOptValTypeNil] = "Nil",
- [kOptValTypeBoolean] = "Boolean",
- [kOptValTypeNumber] = "Number",
- [kOptValTypeString] = "String"
- };
+ static const char *optval_type_names[] = { [kOptValTypeNil] = "Nil",
+ [kOptValTypeBoolean] = "Boolean",
+ [kOptValTypeNumber] = "Number",
+ [kOptValTypeString] = "String" };
if (value.type == kOptValTypeNil) {
// Don't try to unset local value if scope is global.
@@ -3899,8 +3844,8 @@ int find_key_option_len(const char *arg_arg, size_t len, bool has_lt)
} else if (has_lt) {
arg--; // put arg at the '<'
int modifiers = 0;
- key = find_special_key(&arg, len + 1, &modifiers,
- FSK_KEYCODE | FSK_KEEP_X_KEY | FSK_SIMPLIFY, NULL);
+ key = find_special_key(&arg, len + 1, &modifiers, FSK_KEYCODE | FSK_KEEP_X_KEY | FSK_SIMPLIFY,
+ NULL);
if (modifiers) { // can't handle modifiers here
key = 0;
}
@@ -3959,13 +3904,12 @@ static void showoptions(bool all, int opt_flags)
if (opt_flags & OPT_ONECOLUMN) {
len = Columns;
} else if (p->flags & P_BOOL) {
- len = 1; // a toggle option fits always
+ len = 1; // a toggle option fits always
} else {
option_value2string(p, opt_flags);
len = (int)strlen(p->fullname) + vim_strsize(NameBuff) + 1;
}
- if ((len <= INC - GAP && run == 1)
- || (len > INC - GAP && run == 2)) {
+ if ((len <= INC - GAP && run == 1) || (len > INC - GAP && run == 2)) {
items[item_count++] = p;
}
}
@@ -3975,26 +3919,24 @@ static void showoptions(bool all, int opt_flags)
// display the items
if (run == 1) {
- assert(Columns <= INT_MAX - GAP
- && Columns + GAP >= INT_MIN + 3
- && (Columns + GAP - 3) / INC >= INT_MIN
- && (Columns + GAP - 3) / INC <= INT_MAX);
+ assert(Columns <= INT_MAX - GAP && Columns + GAP >= INT_MIN + 3
+ && (Columns + GAP - 3) / INC >= INT_MIN && (Columns + GAP - 3) / INC <= INT_MAX);
int cols = (Columns + GAP - 3) / INC;
if (cols == 0) {
cols = 1;
}
rows = (item_count + cols - 1) / cols;
- } else { // run == 2
+ } else { // run == 2
rows = item_count;
}
for (int row = 0; row < rows && !got_int; row++) {
- msg_putchar('\n'); // go to next line
- if (got_int) { // 'q' typed in more
+ msg_putchar('\n'); // go to next line
+ if (got_int) { // 'q' typed in more
break;
}
int col = 0;
for (int i = row; i < item_count; i += rows) {
- msg_col = col; // make columns
+ msg_col = col; // make columns
showoneopt(items[i], opt_flags);
col += INC;
}
@@ -4008,7 +3950,7 @@ static void showoptions(bool all, int opt_flags)
static int optval_default(vimoption_T *p, const void *varp)
{
if (varp == NULL) {
- return true; // hidden option is always at default
+ return true; // hidden option is always at default
}
if (p->flags & P_NUM) {
return *(OptInt *)varp == (OptInt)(intptr_t)p->def_val;
@@ -4055,13 +3997,13 @@ static void showoneopt(vimoption_T *p, int opt_flags)
int save_silent = silent_mode;
silent_mode = false;
- info_message = true; // use os_msg(), not os_errmsg()
+ info_message = true; // use os_msg(), not os_errmsg()
void *varp = get_varp_scope(p, opt_flags);
// for 'modified' we also need to check if 'ff' or 'fenc' changed.
- if ((p->flags & P_BOOL) && ((int *)varp == &curbuf->b_changed
- ? !curbufIsChanged() : !*(int *)varp)) {
+ if ((p->flags & P_BOOL)
+ && ((int *)varp == &curbuf->b_changed ? !curbufIsChanged() : !*(int *)varp)) {
msg_puts("no");
} else if ((p->flags & P_BOOL) && *(int *)varp < 0) {
msg_puts("--");
@@ -4111,8 +4053,7 @@ int makeset(FILE *fd, int opt_flags, int local_only)
// P_PRI_MKRC flag and once without.
for (int pri = 1; pri >= 0; pri--) {
for (vimoption_T *p = &options[0]; p->fullname; p++) {
- if (!(p->flags & P_NO_MKRC)
- && ((pri == 1) == ((p->flags & P_PRI_MKRC) != 0))) {
+ if (!(p->flags & P_NO_MKRC) && ((pri == 1) == ((p->flags & P_PRI_MKRC) != 0))) {
// skip global option when only doing locals
if (p->indir == PV_NONE && !(opt_flags & OPT_GLOBAL)) {
continue;
@@ -4134,8 +4075,7 @@ int makeset(FILE *fd, int opt_flags, int local_only)
continue;
}
- if ((opt_flags & OPT_SKIPRTP)
- && (p->var == &p_rtp || p->var == &p_pp)) {
+ if ((opt_flags & OPT_SKIPRTP) && (p->var == &p_rtp || p->var == &p_pp)) {
continue;
}
@@ -4178,14 +4118,13 @@ int makeset(FILE *fd, int opt_flags, int local_only)
if (put_setnum(fd, cmd, p->fullname, (OptInt *)varp) == FAIL) {
return FAIL;
}
- } else { // P_STRING
+ } else { // P_STRING
int do_endif = false;
// Don't set 'syntax' and 'filetype' again if the value is
// already right, avoids reloading the syntax file.
if (p->indir == PV_SYN || p->indir == PV_FT) {
- if (fprintf(fd, "if &%s != '%s'", p->fullname,
- *(char **)(varp)) < 0
+ if (fprintf(fd, "if &%s != '%s'", p->fullname, *(char **)(varp)) < 0
|| put_eol(fd) < 0) {
return FAIL;
}
@@ -4245,8 +4184,7 @@ static int put_setstring(FILE *fd, char *cmd, char *name, char **valuep, uint64_
// If the option value is longer than MAXPATHL, we need to append
// each comma separated part of the option separately, so that it
// can be expanded when read back.
- if (size >= MAXPATHL && (flags & P_COMMA) != 0
- && vim_strchr(*valuep, ',') != NULL) {
+ if (size >= MAXPATHL && (flags & P_COMMA) != 0 && vim_strchr(*valuep, ',') != NULL) {
part = xmalloc(size);
// write line break to clear the option, e.g. ':set rtp='
@@ -4310,11 +4248,10 @@ static int put_setnum(FILE *fd, char *cmd, char *name, OptInt *valuep)
static int put_setbool(FILE *fd, char *cmd, char *name, int value)
{
- if (value < 0) { // global/local option using global value
+ if (value < 0) { // global/local option using global value
return OK;
}
- if (fprintf(fd, "%s %s%s", cmd, value ? "" : "no", name) < 0
- || put_eol(fd) < 0) {
+ if (fprintf(fd, "%s %s%s", cmd, value ? "" : "no", name) < 0 || put_eol(fd) < 0) {
return FAIL;
}
return OK;
@@ -4387,7 +4324,7 @@ void *get_varp_scope_from(vimoption_T *p, int scope, buf_T *buf, win_T *win)
case PV_VE:
return &(win->w_p_ve);
}
- return NULL; // "cannot happen"
+ return NULL; // "cannot happen"
}
return get_varp_from(p, buf, win);
}
@@ -4669,6 +4606,8 @@ void *get_varp_from(vimoption_T *p, buf_T *buf, win_T *win)
return &(buf->b_p_sw);
case PV_TFU:
return &(buf->b_p_tfu);
+ case PV_UMF:
+ return &(buf->b_p_umf);
case PV_TS:
return &(buf->b_p_ts);
case PV_TW:
@@ -4792,7 +4731,7 @@ void copy_winopt(winopt_T *from, winopt_T *to)
// Copy the script context so that we know were the value was last set.
memmove(to->wo_script_ctx, from->wo_script_ctx, sizeof(to->wo_script_ctx));
- check_winopt(to); // don't want NULL pointers
+ check_winopt(to); // don't want NULL pointers
}
/// Check string options in a window for a NULL value.
@@ -4900,7 +4839,7 @@ static void init_buf_opt_idx(void)
void buf_copy_options(buf_T *buf, int flags)
{
int should_copy = true;
- char *save_p_isk = NULL; // init for GCC
+ char *save_p_isk = NULL; // init for GCC
int did_isk = false;
// Skip this when the option defaults have not been set yet. Happens when
@@ -4920,8 +4859,7 @@ void buf_copy_options(buf_T *buf, int flags)
///
if ((vim_strchr(p_cpo, CPO_BUFOPTGLOB) == NULL || !(flags & BCO_ENTER))
&& (buf->b_p_initialized
- || (!(flags & BCO_ENTER)
- && vim_strchr(p_cpo, CPO_BUFOPT) != NULL))) {
+ || (!(flags & BCO_ENTER) && vim_strchr(p_cpo, CPO_BUFOPT) != NULL))) {
should_copy = false;
}
@@ -4932,7 +4870,7 @@ void buf_copy_options(buf_T *buf, int flags)
// BCO_NOHELP is given or the options were initialized already
// (jumping back to a help file with CTRL-T or CTRL-O)
bool dont_do_help = ((flags & BCO_NOHELP) && buf->b_help) || buf->b_p_initialized;
- if (dont_do_help) { // don't free b_p_isk
+ if (dont_do_help) { // don't free b_p_isk
save_p_isk = buf->b_p_isk;
buf->b_p_isk = NULL;
}
@@ -4940,7 +4878,7 @@ void buf_copy_options(buf_T *buf, int flags)
// reset 'readonly' and copy 'fileformat'.
if (!buf->b_p_initialized) {
free_buf_options(buf, true);
- buf->b_p_ro = false; // don't copy readonly
+ buf->b_p_ro = false; // don't copy readonly
buf->b_p_fenc = xstrdup(p_fenc);
switch (*p_ffs) {
case 'm':
@@ -5014,6 +4952,8 @@ void buf_copy_options(buf_T *buf, int flags)
set_buflocal_ofu_callback(buf);
buf->b_p_tfu = xstrdup(p_tfu);
COPY_OPT_SCTX(buf, BV_TFU);
+ buf->b_p_umf = xstrdup(p_umf);
+ COPY_OPT_SCTX(buf, BV_UMF);
set_buflocal_tfu_callback(buf);
buf->b_p_sts = p_sts;
COPY_OPT_SCTX(buf, BV_STS);
@@ -5165,7 +5105,7 @@ void buf_copy_options(buf_T *buf, int flags)
}
}
- check_buf_options(buf); // make sure we don't have NULLs
+ check_buf_options(buf); // make sure we don't have NULLs
if (did_isk) {
(void)buf_init_chartab(buf, false);
}
@@ -5251,12 +5191,12 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
if (*arg == '<') {
while (*p != '>') {
- if (*p++ == NUL) { // expand terminal option name
+ if (*p++ == NUL) { // expand terminal option name
return;
}
}
int key = get_special_key_code(arg + 1);
- if (key == 0) { // unknown name
+ if (key == 0) { // unknown name
xp->xp_context = EXPAND_NOTHING;
return;
}
@@ -5271,7 +5211,7 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
p++;
}
if (*p == NUL) {
- return; // expand option name
+ return; // expand option name
}
nextchar = *++p;
is_term_option = true;
@@ -5311,8 +5251,7 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
p++;
nextchar = '=';
}
- if ((nextchar != '=' && nextchar != ':')
- || xp->xp_context == EXPAND_BOOL_SETTINGS) {
+ if ((nextchar != '=' && nextchar != ':') || xp->xp_context == EXPAND_BOOL_SETTINGS) {
xp->xp_context = EXPAND_UNSUCCESSFUL;
return;
}
@@ -5344,8 +5283,7 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
if (expand_option_subtract) {
xp->xp_context = EXPAND_SETTING_SUBTRACT;
return;
- } else if (expand_option_idx >= 0
- && options[expand_option_idx].opt_expand_cb != NULL) {
+ } else if (expand_option_idx >= 0 && options[expand_option_idx].opt_expand_cb != NULL) {
xp->xp_context = EXPAND_STRING_SETTING;
} else if (*xp->xp_pattern == NUL) {
xp->xp_context = EXPAND_OLD_SETTING;
@@ -5363,13 +5301,8 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
// Options that have P_EXPAND are considered to all use file/dir expansion.
if (flags & P_EXPAND) {
p = options[opt_idx].var;
- if (p == (char *)&p_bdir
- || p == (char *)&p_dir
- || p == (char *)&p_path
- || p == (char *)&p_pp
- || p == (char *)&p_rtp
- || p == (char *)&p_cdpath
- || p == (char *)&p_vdir) {
+ if (p == (char *)&p_bdir || p == (char *)&p_dir || p == (char *)&p_path || p == (char *)&p_pp
+ || p == (char *)&p_rtp || p == (char *)&p_cdpath || p == (char *)&p_vdir) {
xp->xp_context = EXPAND_DIRECTORIES;
if (p == (char *)&p_path || p == (char *)&p_cdpath) {
xp->xp_backslash = XP_BS_THREE;
@@ -5493,10 +5426,9 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, char *fuzzystr, int *numM
for (int loop = 0; loop <= 1; loop++) {
regmatch->rm_ic = ic;
if (xp->xp_context != EXPAND_BOOL_SETTINGS) {
- for (int match = 0; match < (int)ARRAY_SIZE(names);
- match++) {
- if (match_str(names[match], regmatch, *matches,
- count, (loop == 0), fuzzy, fuzzystr, fuzmatch)) {
+ for (int match = 0; match < (int)ARRAY_SIZE(names); match++) {
+ if (match_str(names[match], regmatch, *matches, count, (loop == 0), fuzzy, fuzzystr,
+ fuzmatch)) {
if (loop == 0) {
num_normal++;
} else {
@@ -5506,18 +5438,15 @@ int ExpandSettings(expand_T *xp, regmatch_T *regmatch, char *fuzzystr, int *numM
}
}
char *str;
- for (size_t opt_idx = 0; (str = options[opt_idx].fullname) != NULL;
- opt_idx++) {
+ for (size_t opt_idx = 0; (str = options[opt_idx].fullname) != NULL; opt_idx++) {
if (options[opt_idx].var == NULL) {
continue;
}
- if (xp->xp_context == EXPAND_BOOL_SETTINGS
- && !(options[opt_idx].flags & P_BOOL)) {
+ if (xp->xp_context == EXPAND_BOOL_SETTINGS && !(options[opt_idx].flags & P_BOOL)) {
continue;
}
- if (match_str(str, regmatch, *matches, count, (loop == 0),
- fuzzy, fuzzystr, fuzmatch)) {
+ if (match_str(str, regmatch, *matches, count, (loop == 0), fuzzy, fuzzystr, fuzmatch)) {
if (loop == 0) {
num_normal++;
} else {
@@ -5570,10 +5499,8 @@ static char *escape_option_str_cmdline(char *var)
// before a file name character.
// The reverse is found at stropt_copy_value().
for (var = buf; *var != NUL; MB_PTR_ADV(var)) {
- if (var[0] == '\\' && var[1] == '\\'
- && expand_option_idx >= 0
- && (options[expand_option_idx].flags & P_EXPAND)
- && vim_isfilec((uint8_t)var[2])
+ if (var[0] == '\\' && var[1] == '\\' && expand_option_idx >= 0
+ && (options[expand_option_idx].flags & P_EXPAND) && vim_isfilec((uint8_t)var[2])
&& (var[2] != '\\' || (var == buf && var[4] != '\\'))) {
STRMOVE(var, var + 1);
}
@@ -5613,8 +5540,7 @@ int ExpandOldSetting(int *numMatches, char ***matches)
/// Expansion handler for :set=/:set+= when the option has a custom expansion handler.
int ExpandStringSetting(expand_T *xp, regmatch_T *regmatch, int *numMatches, char ***matches)
{
- if (expand_option_idx < 0
- || options[expand_option_idx].opt_expand_cb == NULL) {
+ if (expand_option_idx < 0 || options[expand_option_idx].opt_expand_cb == NULL) {
// Not supposed to reach this. This function is only for options with
// custom expansion callbacks.
return FAIL;
@@ -5651,9 +5577,8 @@ int ExpandSettingSubtract(expand_T *xp, regmatch_T *regmatch, int *numMatches, c
return ExpandOldSetting(numMatches, matches);
}
- char *option_val = *(char **)get_option_varp_scope_from(expand_option_idx,
- expand_option_flags,
- curbuf, curwin);
+ char *option_val
+ = *(char **)get_option_varp_scope_from(expand_option_idx, expand_option_flags, curbuf, curwin);
uint32_t option_flags = options[expand_option_idx].flags;
@@ -5764,10 +5689,7 @@ static void option_value2string(vimoption_T *opp, int scope)
} else if (wc != 0) {
xstrlcpy(NameBuff, transchar((int)wc), sizeof(NameBuff));
} else {
- snprintf(NameBuff,
- sizeof(NameBuff),
- "%" PRId64,
- (int64_t)(*(OptInt *)varp));
+ snprintf(NameBuff, sizeof(NameBuff), "%" PRId64, (int64_t)(*(OptInt *)varp));
}
} else { // P_STRING
varp = *(char **)(varp);
@@ -5801,8 +5723,7 @@ bool shortmess(int x)
{
return (p_shm != NULL
&& (vim_strchr(p_shm, x) != NULL
- || (vim_strchr(p_shm, 'a') != NULL
- && vim_strchr(SHM_ALL_ABBREVIATIONS, x) != NULL)));
+ || (vim_strchr(p_shm, 'a') != NULL && vim_strchr(SHM_ALL_ABBREVIATIONS, x) != NULL)));
}
/// vimrc_found() - Called when a vimrc or "VIMINIT" has been found.
@@ -5926,8 +5847,7 @@ int option_set_callback_func(char *optval, Callback *optcb)
}
typval_T *tv;
- if (*optval == '{'
- || (strncmp(optval, "function(", 9) == 0)
+ if (*optval == '{' || (strncmp(optval, "function(", 9) == 0)
|| (strncmp(optval, "funcref(", 8) == 0)) {
// Lambda expression or a funcref
tv = eval_expr(optval, NULL);
@@ -6013,8 +5933,7 @@ unsigned get_ve_flags(void)
///
/// @param win If not NULL, the window to get the local option from; global
/// otherwise.
-char *get_showbreak_value(win_T *const win)
- FUNC_ATTR_WARN_UNUSED_RESULT
+char *get_showbreak_value(win_T *const win) FUNC_ATTR_WARN_UNUSED_RESULT
{
if (win->w_p_sbr == NULL || *win->w_p_sbr == NUL) {
return p_sbr;
@@ -6044,16 +5963,14 @@ int get_fileformat(const buf_T *buf)
/// argument.
///
/// @param eap can be NULL!
-int get_fileformat_force(const buf_T *buf, const exarg_T *eap)
- FUNC_ATTR_NONNULL_ARG(1)
+int get_fileformat_force(const buf_T *buf, const exarg_T *eap) FUNC_ATTR_NONNULL_ARG(1)
{
int c;
if (eap != NULL && eap->force_ff != 0) {
c = eap->force_ff;
} else {
- if ((eap != NULL && eap->force_bin != 0)
- ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) {
+ if ((eap != NULL && eap->force_bin != 0) ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) {
return EOL_UNIX;
}
c = (unsigned char)(*buf->b_p_ff);
@@ -6156,7 +6073,7 @@ size_t copy_option_part(char **option, char *buf, size_t maxlen, char *sep_chars
if (*p != NUL && *p != ',') { // skip non-standard separator
p++;
}
- p = skip_to_option_part(p); // p points to next file name
+ p = skip_to_option_part(p); // p points to next file name
*option = p;
return len;
@@ -6189,25 +6106,21 @@ int win_signcol_count(win_T *wp)
}
/// Get window or buffer local options
-dict_T *get_winbuf_options(const int bufopt)
- FUNC_ATTR_WARN_UNUSED_RESULT
+dict_T *get_winbuf_options(const int bufopt) FUNC_ATTR_WARN_UNUSED_RESULT
{
dict_T *const d = tv_dict_alloc();
for (int opt_idx = 0; options[opt_idx].fullname; opt_idx++) {
struct vimoption *opt = &options[opt_idx];
- if ((bufopt && (opt->indir & PV_BUF))
- || (!bufopt && (opt->indir & PV_WIN))) {
+ if ((bufopt && (opt->indir & PV_BUF)) || (!bufopt && (opt->indir & PV_WIN))) {
void *varp = get_varp(opt);
if (varp != NULL) {
if (opt->flags & P_STRING) {
- tv_dict_add_str(d, opt->fullname, strlen(opt->fullname),
- *(const char **)varp);
+ tv_dict_add_str(d, opt->fullname, strlen(opt->fullname), *(const char **)varp);
} else if (opt->flags & P_NUM) {
- tv_dict_add_nr(d, opt->fullname, strlen(opt->fullname),
- *(OptInt *)varp);
+ tv_dict_add_nr(d, opt->fullname, strlen(opt->fullname), *(OptInt *)varp);
} else {
tv_dict_add_nr(d, opt->fullname, strlen(opt->fullname), *(int *)varp);
}
@@ -6239,9 +6152,8 @@ int get_sidescrolloff_value(win_T *wp)
Dictionary get_vimoption(String name, int scope, buf_T *buf, win_T *win, Error *err)
{
int opt_idx = findoption_len(name.data, name.size);
- VALIDATE_S(opt_idx >= 0, "option (not found)", name.data, {
- return (Dictionary)ARRAY_DICT_INIT;
- });
+ VALIDATE_S(opt_idx >= 0, "option (not found)", name.data,
+ { return (Dictionary)ARRAY_DICT_INIT; });
return vimoption2dict(&options[opt_idx], scope, buf, win);
}
@@ -6315,7 +6227,8 @@ static Dictionary vimoption2dict(vimoption_T *opt, int req_scope, buf_T *buf, wi
type = "boolean";
def = BOOLEAN_OBJ((intptr_t)def_val);
} else {
- type = ""; def = NIL;
+ type = "";
+ def = NIL;
}
PUT(dict, "type", CSTR_TO_OBJ(type));
PUT(dict, "default", def);
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index b2e8081a08..1bbff8e522 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -23,7 +23,6 @@ typedef union {
String string;
} OptValData;
-/// Option value
typedef struct {
OptValType type;
OptValData data;
diff --git a/src/nvim/option_vars.h b/src/nvim/option_vars.h
index d8d8acb459..af2e31f7c7 100644
--- a/src/nvim/option_vars.h
+++ b/src/nvim/option_vars.h
@@ -733,6 +733,7 @@ EXTERN char *p_udir; ///< 'undodir'
EXTERN int p_udf; ///< 'undofile'
EXTERN OptInt p_ul; ///< 'undolevels'
EXTERN OptInt p_ur; ///< 'undoreload'
+EXTERN char* p_umf; ///< 'usermarkfunc'
EXTERN char* p_urf; ///< 'userregfunction'
EXTERN OptInt p_uc; ///< 'updatecount'
EXTERN OptInt p_ut; ///< 'updatetime'
@@ -875,6 +876,7 @@ enum {
BV_TX,
BV_UDF,
BV_UL,
+ BV_UMF,
BV_URF,
BV_WM,
BV_VSTS,
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index 0e2bd83806..4fdee925ad 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -9217,6 +9217,40 @@ return {
varname = 'p_ut',
},
{
+ abbreviation='umf',
+ full_name='usermarkfunc',
+ desc= [=[
+ This option specifies a function to be used to handle any marks
+ that Neovim does not natively handle. This option unlocks all
+ characters to be used as marks by the user.
+
+ The 'usermarkfunc' function is called each time a user mark is read
+ from or written to.
+
+ The 'usermarkfunc' function must take the following parameters:
+
+ {get_or_set} The action being done on this mark (either 'set'
+ or 'get'
+
+ {markname} The name of the mark either being read or .
+
+ In case the action is 'get', the 'usermarkfunc' function should return
+ the content associated with that mark. This can be a number indicating a
+ line number or it could be a dictionary with the keys:
+
+ {line} the line number
+
+ {col} the column number
+
+ {filename} the filename
+<
+ ]=],
+ short_desc=N_("Function used to define behavior of user-defined marks."),
+ type='string', scope={'buffer'},
+ varname='p_umf',
+ defaults={if_true=""}
+ },
+ {
abbreviation='urf',
full_name='userregfunc',
desc= [=[