diff options
Diffstat (limited to 'src')
50 files changed, 358 insertions, 293 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 99cdde300d..ffa44c33cd 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -3198,7 +3198,7 @@ void maketitle(void) int use_sandbox = false; int save_called_emsg = called_emsg; - use_sandbox = was_set_insecurely((char_u *)"titlestring", 0); + use_sandbox = was_set_insecurely(curwin, (char_u *)"titlestring", 0); called_emsg = false; build_stl_str_hl(curwin, (char_u *)buf, sizeof(buf), p_titlestring, use_sandbox, @@ -3309,7 +3309,7 @@ void maketitle(void) int use_sandbox = false; int save_called_emsg = called_emsg; - use_sandbox = was_set_insecurely((char_u *)"iconstring", 0); + use_sandbox = was_set_insecurely(curwin, (char_u *)"iconstring", 0); called_emsg = false; build_stl_str_hl(curwin, icon_str, sizeof(buf), p_iconstring, use_sandbox, diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 402211080b..054b788940 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -1178,8 +1178,7 @@ int eval_foldexpr(char_u *arg, int *cp) { typval_T tv; varnumber_T retval; - int use_sandbox = was_set_insecurely((char_u *)"foldexpr", - OPT_LOCAL); + int use_sandbox = was_set_insecurely(curwin, (char_u *)"foldexpr", OPT_LOCAL); ++emsg_off; if (use_sandbox) diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index b8a0c3184b..d2ccbe3e6d 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -1182,6 +1182,7 @@ static void do_filter( char_u *cmd_buf; buf_T *old_curbuf = curbuf; int shell_flags = 0; + const int stmp = p_stmp; if (*cmd == NUL) /* no filter command */ return; @@ -1210,16 +1211,16 @@ static void do_filter( if (do_out) shell_flags |= kShellOptDoOut; - if (!do_in && do_out && !p_stmp) { + if (!do_in && do_out && !stmp) { // Use a pipe to fetch stdout of the command, do not use a temp file. shell_flags |= kShellOptRead; curwin->w_cursor.lnum = line2; - } else if (do_in && !do_out && !p_stmp) { + } else if (do_in && !do_out && !stmp) { // Use a pipe to write stdin of the command, do not use a temp file. shell_flags |= kShellOptWrite; curbuf->b_op_start.lnum = line1; curbuf->b_op_end.lnum = line2; - } else if (do_in && do_out && !p_stmp) { + } else if (do_in && do_out && !stmp) { // Use a pipe to write stdin and fetch stdout of the command, do not // use a temp file. shell_flags |= kShellOptRead | kShellOptWrite; diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 42454b7c9a..04624be9a2 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -4232,25 +4232,29 @@ static void script_host_execute(char *name, exarg_T *eap) static void script_host_execute_file(char *name, exarg_T *eap) { - uint8_t buffer[MAXPATHL]; - vim_FullName((char *)eap->arg, (char *)buffer, sizeof(buffer), false); + if (!eap->skip) { + uint8_t buffer[MAXPATHL]; + vim_FullName((char *)eap->arg, (char *)buffer, sizeof(buffer), false); - list_T *args = tv_list_alloc(3); - // filename - tv_list_append_string(args, (const char *)buffer, -1); - // current range - tv_list_append_number(args, (int)eap->line1); - tv_list_append_number(args, (int)eap->line2); - (void)eval_call_provider(name, "execute_file", args, true); + list_T *args = tv_list_alloc(3); + // filename + tv_list_append_string(args, (const char *)buffer, -1); + // current range + tv_list_append_number(args, (int)eap->line1); + tv_list_append_number(args, (int)eap->line2); + (void)eval_call_provider(name, "execute_file", args, true); + } } static void script_host_do_range(char *name, exarg_T *eap) { - list_T *args = tv_list_alloc(3); - tv_list_append_number(args, (int)eap->line1); - tv_list_append_number(args, (int)eap->line2); - tv_list_append_string(args, (const char *)eap->arg, -1); - (void)eval_call_provider(name, "do_range", args, true); + if (!eap->skip) { + list_T *args = tv_list_alloc(3); + tv_list_append_number(args, (int)eap->line1); + tv_list_append_number(args, (int)eap->line2); + tv_list_append_string(args, (const char *)eap->arg, -1); + (void)eval_call_provider(name, "do_range", args, true); + } } /// ":drop" diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index fc699e8826..d65387f83b 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1873,8 +1873,6 @@ static char_u * do_one_cmd(char_u **cmdlinep, case CMD_python3: case CMD_pythonx: case CMD_pyx: - case CMD_pyxdo: - case CMD_pyxfile: case CMD_return: case CMD_rightbelow: case CMD_ruby: diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 5e28ca6538..654aa6d5ba 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -1835,10 +1835,11 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume, curwin = wp; curbuf = wp->w_buffer; - ++emsg_silent; /* handle exceptions, but don't display errors */ - text = eval_to_string_safe(wp->w_p_fdt, NULL, - was_set_insecurely((char_u *)"foldtext", OPT_LOCAL)); - --emsg_silent; + emsg_silent++; // handle exceptions, but don't display errors + text = eval_to_string_safe( + wp->w_p_fdt, NULL, + was_set_insecurely(wp, (char_u *)"foldtext", OPT_LOCAL)); + emsg_silent--; if (text == NULL || did_emsg) got_fdt_error = TRUE; diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index 4a64cc31b1..2c954008b3 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -546,7 +546,7 @@ static void prt_header(prt_settings_T *const psettings, const int pagenum, curwin->w_botline = lnum + 63; printer_page_num = pagenum; - use_sandbox = was_set_insecurely((char_u *)"printheader", 0); + use_sandbox = was_set_insecurely(curwin, (char_u *)"printheader", 0); build_stl_str_hl(curwin, tbuf, (size_t)width + IOSIZE, p_header, use_sandbox, ' ', width, NULL, NULL); diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 9e6693afdf..fae971b3b3 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -453,7 +453,8 @@ int get_expr_indent(void) colnr_T save_curswant; int save_set_curswant; int save_State; - int use_sandbox = was_set_insecurely((char_u *)"indentexpr", OPT_LOCAL); + int use_sandbox = was_set_insecurely( + curwin, (char_u *)"indentexpr", OPT_LOCAL); // Save and restore cursor position and curswant, in case it was changed // * via :normal commands. diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index a9a57d386b..a640b97d3b 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -22,6 +22,13 @@ #include "nvim/memline.h" #include "nvim/buffer.h" +#define TS_META_PARSER "treesitter_parser" +#define TS_META_TREE "treesitter_tree" +#define TS_META_NODE "treesitter_node" +#define TS_META_QUERY "treesitter_query" +#define TS_META_QUERYCURSOR "treesitter_querycursor" +#define TS_META_TREECURSOR "treesitter_treecursor" + typedef struct { TSQueryCursor *cursor; int predicated_match; @@ -115,12 +122,12 @@ void tslua_init(lua_State *L) langs = pmap_new(cstr_t)(); // type metatables - build_meta(L, "treesitter_parser", parser_meta); - build_meta(L, "treesitter_tree", tree_meta); - build_meta(L, "treesitter_node", node_meta); - build_meta(L, "treesitter_query", query_meta); - build_meta(L, "treesitter_querycursor", querycursor_meta); - build_meta(L, "treesitter_treecursor", treecursor_meta); + build_meta(L, TS_META_PARSER, parser_meta); + build_meta(L, TS_META_TREE, tree_meta); + build_meta(L, TS_META_NODE, node_meta); + build_meta(L, TS_META_QUERY, query_meta); + build_meta(L, TS_META_QUERYCURSOR, querycursor_meta); + build_meta(L, TS_META_TREECURSOR, treecursor_meta); } int tslua_has_language(lua_State *L) @@ -132,12 +139,8 @@ int tslua_has_language(lua_State *L) int tslua_add_language(lua_State *L) { - if (lua_gettop(L) < 2 || !lua_isstring(L, 1) || !lua_isstring(L, 2)) { - return luaL_error(L, "string expected"); - } - - const char *path = lua_tostring(L, 1); - const char *lang_name = lua_tostring(L, 2); + const char *path = luaL_checkstring(L, 1); + const char *lang_name = luaL_checkstring(L, 2); if (pmap_has(cstr_t)(langs, lang_name)) { return 0; @@ -176,8 +179,9 @@ int tslua_add_language(lua_State *L) || lang_version > TREE_SITTER_LANGUAGE_VERSION) { return luaL_error( L, - "ABI version mismatch : expected %d, found %d", - TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION, lang_version); + "ABI version mismatch : supported between %d and %d, found %d", + TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION, + TREE_SITTER_LANGUAGE_VERSION, lang_version); } pmap_put(cstr_t)(langs, xstrdup(lang_name), lang); @@ -188,10 +192,7 @@ int tslua_add_language(lua_State *L) int tslua_inspect_lang(lua_State *L) { - if (lua_gettop(L) < 1 || !lua_isstring(L, 1)) { - return luaL_error(L, "string expected"); - } - const char *lang_name = lua_tostring(L, 1); + const char *lang_name = luaL_checkstring(L, 1); TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name); if (!lang) { @@ -232,11 +233,9 @@ int tslua_inspect_lang(lua_State *L) int tslua_push_parser(lua_State *L) { - // Gather language - if (lua_gettop(L) < 1 || !lua_isstring(L, 1)) { - return luaL_error(L, "string expected"); - } - const char *lang_name = lua_tostring(L, 1); + // Gather language name + const char *lang_name = luaL_checkstring(L, 1); + TSLanguage *lang = pmap_get(cstr_t)(langs, lang_name); if (!lang) { return luaL_error(L, "no such language: %s", lang_name); @@ -250,14 +249,14 @@ int tslua_push_parser(lua_State *L) return luaL_error(L, "Failed to load language : %s", lang_name); } - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_parser"); // [udata, meta] + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_PARSER); // [udata, meta] lua_setmetatable(L, -2); // [udata] return 1; } static TSParser ** parser_check(lua_State *L, uint16_t index) { - return luaL_checkudata(L, index, "treesitter_parser"); + return luaL_checkudata(L, index, TS_META_PARSER); } static int parser_gc(lua_State *L) @@ -388,7 +387,7 @@ static int parser_parse(lua_State *L) TSRange *changed = old_tree ? ts_tree_get_changed_ranges( old_tree, new_tree, &n_ranges) : NULL; - tslua_push_tree(L, new_tree, false); // [tree] + push_tree(L, new_tree, false); // [tree] push_ranges(L, changed, n_ranges); // [tree, ranges] @@ -403,7 +402,7 @@ static int tree_copy(lua_State *L) return 0; } - tslua_push_tree(L, *tree, true); // [tree] + push_tree(L, *tree, true); // [tree] return 1; } @@ -435,6 +434,72 @@ static int tree_edit(lua_State *L) return 0; } +// Use the top of the stack (without popping it) to create a TSRange, it can be +// either a lua table or a TSNode +static void range_from_lua(lua_State *L, TSRange *range) +{ + TSNode node; + + if (lua_istable(L, -1)) { + // should be a table of 6 elements + if (lua_objlen(L, -1) != 6) { + goto error; + } + + uint32_t start_row, start_col, start_byte, end_row, end_col, end_byte; + lua_rawgeti(L, -1, 1); // [ range, start_row] + start_row = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 2); // [ range, start_col] + start_col = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 3); // [ range, start_byte] + start_byte = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 4); // [ range, end_row] + end_row = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 5); // [ range, end_col] + end_col = luaL_checkinteger(L, -1); + lua_pop(L, 1); + + lua_rawgeti(L, -1, 6); // [ range, end_byte] + end_byte = luaL_checkinteger(L, -1); + lua_pop(L, 1); // [ range ] + + *range = (TSRange) { + .start_point = (TSPoint) { + .row = start_row, + .column = start_col + }, + .end_point = (TSPoint) { + .row = end_row, + .column = end_col + }, + .start_byte = start_byte, + .end_byte = end_byte, + }; + } else if (node_check(L, -1, &node)) { + *range = (TSRange) { + .start_point = ts_node_start_point(node), + .end_point = ts_node_end_point(node), + .start_byte = ts_node_start_byte(node), + .end_byte = ts_node_end_byte(node) + }; + } else { + goto error; + } + return; +error: + luaL_error( + L, + "Ranges can only be made from 6 element long tables or nodes."); +} + static int parser_set_ranges(lua_State *L) { if (lua_gettop(L) < 2) { @@ -461,22 +526,8 @@ static int parser_set_ranges(lua_State *L) // [ parser, ranges ] for (size_t index = 0; index < tbl_len; index++) { lua_rawgeti(L, 2, index + 1); // [ parser, ranges, range ] - - TSNode node; - if (!node_check(L, -1, &node)) { - xfree(ranges); - return luaL_error( - L, - "ranges should be tables of nodes."); - } - lua_pop(L, 1); // [ parser, ranges ] - - ranges[index] = (TSRange) { - .start_point = ts_node_start_point(node), - .end_point = ts_node_end_point(node), - .start_byte = ts_node_start_byte(node), - .end_byte = ts_node_end_byte(node) - }; + range_from_lua(L, ranges + index); + lua_pop(L, 1); } // This memcpies ranges, thus we can free it afterwards @@ -506,7 +557,7 @@ static int parser_get_ranges(lua_State *L) /// push tree interface on lua stack. /// /// This makes a copy of the tree, so ownership of the argument is unaffected. -void tslua_push_tree(lua_State *L, TSTree *tree, bool do_copy) +void push_tree(lua_State *L, TSTree *tree, bool do_copy) { if (tree == NULL) { lua_pushnil(L); @@ -520,7 +571,7 @@ void tslua_push_tree(lua_State *L, TSTree *tree, bool do_copy) *ud = tree; } - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_tree"); // [udata, meta] + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_TREE); // [udata, meta] lua_setmetatable(L, -2); // [udata] // table used for node wrappers to keep a reference to tree wrapper @@ -534,7 +585,7 @@ void tslua_push_tree(lua_State *L, TSTree *tree, bool do_copy) static TSTree **tree_check(lua_State *L, uint16_t index) { - TSTree **ud = luaL_checkudata(L, index, "treesitter_tree"); + TSTree **ud = luaL_checkudata(L, index, TS_META_TREE); return ud; } @@ -582,7 +633,7 @@ static void push_node(lua_State *L, TSNode node, int uindex) } TSNode *ud = lua_newuserdata(L, sizeof(TSNode)); // [udata] *ud = node; - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_node"); // [udata, meta] + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_NODE); // [udata, meta] lua_setmetatable(L, -2); // [udata] lua_getfenv(L, uindex); // [udata, reftable] lua_setfenv(L, -2); // [udata] @@ -590,7 +641,7 @@ static void push_node(lua_State *L, TSNode node, int uindex) static bool node_check(lua_State *L, int index, TSNode *res) { - TSNode *ud = luaL_checkudata(L, index, "treesitter_node"); + TSNode *ud = luaL_checkudata(L, index, TS_META_NODE); if (ud) { *res = *ud; return true; @@ -618,13 +669,12 @@ static int node_eq(lua_State *L) if (!node_check(L, 1, &node)) { return 0; } - // This should only be called if both x and y in "x == y" has the - // treesitter_node metatable. So it is ok to error out otherwise. - TSNode *ud = luaL_checkudata(L, 2, "treesitter_node"); - if (!ud) { + + TSNode node2; + if (!node_check(L, 2, &node2)) { return 0; } - TSNode node2 = *ud; + lua_pushboolean(L, ts_node_eq(node, node2)); return 1; } @@ -859,7 +909,7 @@ static int node_named_descendant_for_range(lua_State *L) static int node_next_child(lua_State *L) { TSTreeCursor *ud = luaL_checkudata( - L, lua_upvalueindex(1), "treesitter_treecursor"); + L, lua_upvalueindex(1), TS_META_TREECURSOR); if (!ud) { return 0; } @@ -909,7 +959,7 @@ static int node_iter_children(lua_State *L) TSTreeCursor *ud = lua_newuserdata(L, sizeof(TSTreeCursor)); // [udata] *ud = ts_tree_cursor_new(source); - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_treecursor"); // [udata, mt] + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_TREECURSOR); // [udata, mt] lua_setmetatable(L, -2); // [udata] lua_pushvalue(L, 1); // [udata, source_node] lua_pushcclosure(L, node_next_child, 2); @@ -919,7 +969,7 @@ static int node_iter_children(lua_State *L) static int treecursor_gc(lua_State *L) { - TSTreeCursor *ud = luaL_checkudata(L, 1, "treesitter_treecursor"); + TSTreeCursor *ud = luaL_checkudata(L, 1, TS_META_TREECURSOR); ts_tree_cursor_delete(ud); return 0; } @@ -1031,7 +1081,7 @@ static int node_rawquery(lua_State *L) ud->cursor = cursor; ud->predicated_match = -1; - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_querycursor"); + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_QUERYCURSOR); lua_setmetatable(L, -2); // [udata] lua_pushvalue(L, 1); // [udata, node] @@ -1051,7 +1101,7 @@ static int node_rawquery(lua_State *L) static int querycursor_gc(lua_State *L) { - TSLua_cursor *ud = luaL_checkudata(L, 1, "treesitter_querycursor"); + TSLua_cursor *ud = luaL_checkudata(L, 1, TS_META_QUERYCURSOR); ts_query_cursor_delete(ud->cursor); return 0; } @@ -1084,7 +1134,7 @@ int ts_lua_parse_query(lua_State *L) TSQuery **ud = lua_newuserdata(L, sizeof(TSQuery *)); // [udata] *ud = query; - lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_query"); // [udata, meta] + lua_getfield(L, LUA_REGISTRYINDEX, TS_META_QUERY); // [udata, meta] lua_setmetatable(L, -2); // [udata] return 1; } @@ -1102,7 +1152,7 @@ static const char *query_err_string(TSQueryError err) { static TSQuery *query_check(lua_State *L, int index) { - TSQuery **ud = luaL_checkudata(L, index, "treesitter_query"); + TSQuery **ud = luaL_checkudata(L, index, TS_META_QUERY); return *ud; } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 9e7d81fc82..40dd5f0b5c 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -4117,8 +4117,8 @@ fex_format( int c /* character to be inserted */ ) { - int use_sandbox = was_set_insecurely((char_u *)"formatexpr", - OPT_LOCAL); + int use_sandbox = was_set_insecurely( + curwin, (char_u *)"formatexpr", OPT_LOCAL); int r; char_u *fex; diff --git a/src/nvim/option.c b/src/nvim/option.c index 0a91687352..c1b071b04e 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -652,7 +652,14 @@ void set_init_1(bool clean_arg) { const char *shell = os_getenv("SHELL"); if (shell != NULL) { - set_string_default("sh", (char *) shell, false); + if (vim_strchr((const char_u *)shell, ' ') != NULL) { + const size_t len = strlen(shell) + 3; // two quotes and a trailing NUL + char *const cmd = xmalloc(len); + snprintf(cmd, len, "\"%s\"", shell); + set_string_default("sh", cmd, true); + } else { + set_string_default("sh", (char *)shell, false); + } } } @@ -945,7 +952,7 @@ set_option_default( } // The default value is not insecure. - uint32_t *flagsp = insecure_flag(opt_idx, opt_flags); + uint32_t *flagsp = insecure_flag(curwin, opt_idx, opt_flags); *flagsp = *flagsp & ~P_INSECURE; } @@ -987,10 +994,9 @@ static void set_string_default(const char *name, char *val, bool allocated) xfree(options[opt_idx].def_val[VI_DEFAULT]); } - options[opt_idx].def_val[VI_DEFAULT] = (char_u *) ( - allocated - ? (char_u *) val - : (char_u *) xstrdup(val)); + options[opt_idx].def_val[VI_DEFAULT] = allocated + ? (char_u *)val + : (char_u *)xstrdup(val); options[opt_idx].flags |= P_DEF_ALLOCED; } } @@ -1880,7 +1886,7 @@ int do_set( saved_newval = (newval != NULL) ? xstrdup((char *)newval) : 0; { - uint32_t *p = insecure_flag(opt_idx, opt_flags); + uint32_t *p = insecure_flag(curwin, opt_idx, opt_flags); const int secure_saved = secure; // When an option is set in the sandbox, from a @@ -2007,7 +2013,7 @@ static void did_set_option( /* When an option is set in the sandbox, from a modeline or in secure mode * set the P_INSECURE flag. Otherwise, if a new value is stored reset the * flag. */ - uint32_t *p = insecure_flag(opt_idx, opt_flags); + uint32_t *p = insecure_flag(curwin, opt_idx, opt_flags); if (!value_checked && (secure || sandbox != 0 || (opt_flags & OPT_MODELINE))) { @@ -2346,12 +2352,12 @@ static void check_string_option(char_u **pp) /// Return true when option "opt" was set from a modeline or in secure mode. /// Return false when it wasn't. /// Return -1 for an unknown option. -int was_set_insecurely(char_u *opt, int opt_flags) +int was_set_insecurely(win_T *const wp, char_u *opt, int opt_flags) { int idx = findoption((const char *)opt); if (idx >= 0) { - uint32_t *flagp = insecure_flag(idx, opt_flags); + uint32_t *flagp = insecure_flag(wp, idx, opt_flags); return (*flagp & P_INSECURE) != 0; } internal_error("was_set_insecurely()"); @@ -2360,16 +2366,16 @@ int was_set_insecurely(char_u *opt, int opt_flags) /// Get a pointer to the flags used for the P_INSECURE flag of option /// "opt_idx". For some local options a local flags field is used. -static uint32_t *insecure_flag(int opt_idx, int opt_flags) +static uint32_t *insecure_flag(win_T *const wp, int opt_idx, int opt_flags) { if (opt_flags & OPT_LOCAL) switch ((int)options[opt_idx].indir) { - case PV_STL: return &curwin->w_p_stl_flags; - case PV_FDE: return &curwin->w_p_fde_flags; - case PV_FDT: return &curwin->w_p_fdt_flags; - case PV_INDE: return &curbuf->b_p_inde_flags; - case PV_FEX: return &curbuf->b_p_fex_flags; - case PV_INEX: return &curbuf->b_p_inex_flags; + case PV_STL: return &wp->w_p_stl_flags; + case PV_FDE: return &wp->w_p_fde_flags; + case PV_FDT: return &wp->w_p_fdt_flags; + case PV_INDE: return &wp->w_buffer->b_p_inde_flags; + case PV_FEX: return &wp->w_buffer->b_p_fex_flags; + case PV_INEX: return &wp->w_buffer->b_p_inex_flags; } // Nothing special, return global flags field. @@ -7173,46 +7179,6 @@ int get_sts_value(void) return (int)result; } -/// Check matchpairs option for "*initc". -/// If there is a match set "*initc" to the matching character and "*findc" to -/// the opposite character. Set "*backwards" to the direction. -/// When "switchit" is true swap the direction. -void find_mps_values(int *initc, int *findc, int *backwards, int switchit) -{ - char_u *ptr = curbuf->b_p_mps; - - while (*ptr != NUL) { - if (utf_ptr2char(ptr) == *initc) { - if (switchit) { - *findc = *initc; - *initc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1); - *backwards = true; - } else { - *findc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1); - *backwards = false; - } - return; - } - char_u *prev = ptr; - ptr += utfc_ptr2len(ptr) + 1; - if (utf_ptr2char(ptr) == *initc) { - if (switchit) { - *findc = *initc; - *initc = utf_ptr2char(prev); - *backwards = false; - } else { - *findc = utf_ptr2char(prev); - *backwards = true; - } - return; - } - ptr += utfc_ptr2len(ptr); - if (*ptr == ',') { - ptr++; - } - } -} - /// This is called when 'breakindentopt' is changed and when a window is /// initialized static bool briopt_check(win_T *wp) diff --git a/src/nvim/path.c b/src/nvim/path.c index 793f917f06..f52fbbd5c8 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -1610,10 +1610,10 @@ void simplify_filename(char_u *filename) static char *eval_includeexpr(const char *const ptr, const size_t len) { - set_vim_var_string(VV_FNAME, ptr, (ptrdiff_t) len); - char *res = (char *) eval_to_string_safe( - curbuf->b_p_inex, NULL, was_set_insecurely((char_u *)"includeexpr", - OPT_LOCAL)); + set_vim_var_string(VV_FNAME, ptr, (ptrdiff_t)len); + char *res = (char *)eval_to_string_safe( + curbuf->b_p_inex, NULL, + was_set_insecurely(curwin, (char_u *)"includeexpr", OPT_LOCAL)); set_vim_var_string(VV_FNAME, NULL, 0); return res; } diff --git a/src/nvim/po/af.po b/src/nvim/po/af.po index 79048eac39..fa6674469c 100644 --- a/src/nvim/po/af.po +++ b/src/nvim/po/af.po @@ -1348,10 +1348,6 @@ msgstr "E143: Outobevele het nuwe buffer %s onverwags geskrap" msgid "E144: non-numeric argument to :z" msgstr "E144: nie-numeriese parameter vir :z" -#, fuzzy -#~ msgid "E145: Shell commands not allowed in restricted mode" -#~ msgstr "E145: Dop bevele nie toegelaat in rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Patrone kan nie deur letters afgebaken word nie" diff --git a/src/nvim/po/ca.po b/src/nvim/po/ca.po index 7e83cb08ed..be4206f36e 100644 --- a/src/nvim/po/ca.po +++ b/src/nvim/po/ca.po @@ -1234,10 +1234,6 @@ msgstr "E143: Una auto-ordre ha eliminat el buffer nou %s inesperadament" msgid "E144: non-numeric argument to :z" msgstr "E144: Argument no numric per a :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Les ordres shell no estan permeses en l'rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Les expressions regulars no poden estar delimitades per lletres" diff --git a/src/nvim/po/cs.cp1250.po b/src/nvim/po/cs.cp1250.po index 26bdbe8c45..5b9f3d3a58 100644 --- a/src/nvim/po/cs.cp1250.po +++ b/src/nvim/po/cs.cp1250.po @@ -1249,10 +1249,6 @@ msgstr "E143: Automatick pkazy neoekvan smazaly nov buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: neseln argument pro :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim nepovoluje pouit pkaz shellu" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulrn vrazy nesm bt oddleny psmeny" diff --git a/src/nvim/po/cs.po b/src/nvim/po/cs.po index 986d6753a8..31a90dc514 100644 --- a/src/nvim/po/cs.po +++ b/src/nvim/po/cs.po @@ -1249,10 +1249,6 @@ msgstr "E143: Automatick pkazy neoekvan smazaly nov buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: neseln argument pro :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim nepovoluje pouit pkaz shellu" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulrn vrazy nesm bt oddleny psmeny" diff --git a/src/nvim/po/da.po b/src/nvim/po/da.po index 58cd19210b..f35272810b 100644 --- a/src/nvim/po/da.po +++ b/src/nvim/po/da.po @@ -980,9 +980,6 @@ msgstr "E143: Autokommandoer slettede uventede ny buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: ikke-numerisk argument til :z" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Skalkommandoer er ikke tilladt i rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulære udtryk kan ikke afgrænses af bogstaver" diff --git a/src/nvim/po/de.po b/src/nvim/po/de.po index a6ba8476d8..a2e04965e5 100644 --- a/src/nvim/po/de.po +++ b/src/nvim/po/de.po @@ -3,7 +3,7 @@ # Do ":help uganda" in Vim to read copying and usage conditions. # Do ":help credits" in Vim to see a list of people who contributed. # -# Previous-Translator(s): +# Previous-Translator(s): # Johannes Zellner <johannes@zellner.org> # Gerfried Fuchs <alfie@ist.org> msgid "" @@ -659,10 +659,6 @@ msgstr "E143: Autokommandos lschten unerwartet neuen Puffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: Nicht-numerisches Argument fr :z" -#: ../ex_cmds.c:3398 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Shell-Befehle sind in rvim nicht erlaubt" - #: ../ex_cmds.c:3492 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulre Ausdrcke knnen nicht durch Buchstaben begrenzt werden" diff --git a/src/nvim/po/en_GB.po b/src/nvim/po/en_GB.po index 00a05195b4..7919fc8946 100644 --- a/src/nvim/po/en_GB.po +++ b/src/nvim/po/en_GB.po @@ -1194,10 +1194,6 @@ msgstr "" msgid "E144: non-numeric argument to :z" msgstr "" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regular expressions cannot be delimited by letters" diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po index d1ce47d97c..99c46c7275 100644 --- a/src/nvim/po/eo.po +++ b/src/nvim/po/eo.po @@ -969,9 +969,6 @@ msgstr "E143: Aŭtokomandoj neatendite forviŝis novan bufron %s" msgid "E144: non-numeric argument to :z" msgstr "E144: nenumera argumento de :z" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Ŝelkomandoj nepermeseblaj en rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Ne eblas limigi regulesprimon per literoj" diff --git a/src/nvim/po/es.po b/src/nvim/po/es.po index f30e8780f9..eeea27610d 100644 --- a/src/nvim/po/es.po +++ b/src/nvim/po/es.po @@ -1234,10 +1234,6 @@ msgstr "E143: Las auto-órdenes han eliminado al nuevo búfer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: Argumento no numérico para \":z\"" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: No se permiten órdenes de consola en rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Las expresiones regulares no se pueden delimitar con letras" diff --git a/src/nvim/po/fi.po b/src/nvim/po/fi.po index f568a34b3c..4489139cfb 100644 --- a/src/nvim/po/fi.po +++ b/src/nvim/po/fi.po @@ -1515,10 +1515,6 @@ msgstr "E143: Autocommand poisti uuden puskurin odotuksen vastaisesti %s" msgid "E144: non-numeric argument to :z" msgstr "E144: :z:n argumentti ei ole numero" -#, fuzzy -#~ msgid "E145: Shell commands not allowed in restricted mode" -#~ msgstr "E145: Kuoren komennot eivät toimi rvimissä" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Säännöllistä ilmausta ei voi rajata kirjaimilla" diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po index ea6fe302fe..bb60649c91 100644 --- a/src/nvim/po/fr.po +++ b/src/nvim/po/fr.po @@ -1117,12 +1117,6 @@ msgstr "E143: Une autocommande a effac le nouveau tampon %s" msgid "E144: non-numeric argument to :z" msgstr "E144: L'argument de :z n'est pas numrique" -# AB - La version franaise fera peut-tre mieux passer l'amre pilule. -# La consultation de l'aide donnera l'explication complte ceux qui -# ne comprendraient pas quoi ce message est d. -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Les commandes externes sont indisponibles dans rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "" "E146: Les expressions rgulires ne peuvent pas tre dlimites par des " diff --git a/src/nvim/po/ga.po b/src/nvim/po/ga.po index 617b805eb8..1104b31c32 100644 --- a/src/nvim/po/ga.po +++ b/src/nvim/po/ga.po @@ -967,9 +967,6 @@ msgstr "E143: Scrios na huathorduithe maoln nua %s go tobann" msgid "E144: non-numeric argument to :z" msgstr "E144: argint neamhuimhriil chun :z" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: N cheadatear orduithe blaoisce i rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "" "E146: N cheadatear litreacha mar theormharcir ar shloinn ionadaochta" diff --git a/src/nvim/po/it.po b/src/nvim/po/it.po index 9d5709e1ab..511f910b71 100644 --- a/src/nvim/po/it.po +++ b/src/nvim/po/it.po @@ -1220,10 +1220,6 @@ msgstr "" msgid "E144: non-numeric argument to :z" msgstr "E144: argomento non-numerico a :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Comandi Shell non permessi in rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Le espressioni regolari non possono essere delimitate da lettere" diff --git a/src/nvim/po/ja.euc-jp.po b/src/nvim/po/ja.euc-jp.po index dc3c4368ab..523e9ca4e3 100644 --- a/src/nvim/po/ja.euc-jp.po +++ b/src/nvim/po/ja.euc-jp.po @@ -987,9 +987,6 @@ msgstr "E143: autocommandͽХåե %s ޤ" msgid "E144: non-numeric argument to :z" msgstr "E144: ǤϤʤ :z Ϥޤ" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvimǤϥ륳ޥɤȤޤ" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: ɽʸǶڤ뤳ȤǤޤ" diff --git a/src/nvim/po/ja.po b/src/nvim/po/ja.po index 4c5661464a..5a69d0c5bf 100644 --- a/src/nvim/po/ja.po +++ b/src/nvim/po/ja.po @@ -987,9 +987,6 @@ msgstr "E143: autocommandが予期せず新しいバッファ %s を削除しま msgid "E144: non-numeric argument to :z" msgstr "E144: 数ではない引数が :z に渡されました" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvimではシェルコマンドを使えません" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: 正規表現は文字で区切ることができません" diff --git a/src/nvim/po/ko.UTF-8.po b/src/nvim/po/ko.UTF-8.po index e90081bcfd..128b238f8b 100644 --- a/src/nvim/po/ko.UTF-8.po +++ b/src/nvim/po/ko.UTF-8.po @@ -1215,10 +1215,6 @@ msgstr "E143: Autocommand가 뜻 밖에 새 버퍼 %s을(를) 지웠습니다" msgid "E144: non-numeric argument to :z" msgstr "E144: 숫자가 아닌 인자가 :z에 주어졌습니다" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim에서는 쉘 명령을 사용할 수 없습니다" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: 정규표현식은 글자로 구분될 수 없습니다" diff --git a/src/nvim/po/nb.po b/src/nvim/po/nb.po index b99e8ce465..34617ccf18 100644 --- a/src/nvim/po/nb.po +++ b/src/nvim/po/nb.po @@ -1231,10 +1231,6 @@ msgstr "E143: Autokommandoer slettet uventet den nye bufferen %s" msgid "E144: non-numeric argument to :z" msgstr "E144: Ikke-numerisk parameter til :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Skallkommandoer er ikke tillatt i rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulre uttrykk kan ikke bli adskilt av bokstaver" diff --git a/src/nvim/po/nl.po b/src/nvim/po/nl.po index 56bcd94e79..30f34508f5 100644 --- a/src/nvim/po/nl.po +++ b/src/nvim/po/nl.po @@ -1217,10 +1217,6 @@ msgstr "E143: 'Autocommands' hebben het nieuwe buffer %s onverwacht verwijderd" msgid "E144: non-numeric argument to :z" msgstr "E144: niet-numeriek argument voor :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: in rvim zijn shell-opdrachten zijn niet toegestaan" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: reguliere expressies kunnen niet begrensd worden door letters" diff --git a/src/nvim/po/no.po b/src/nvim/po/no.po index b99e8ce465..34617ccf18 100644 --- a/src/nvim/po/no.po +++ b/src/nvim/po/no.po @@ -1231,10 +1231,6 @@ msgstr "E143: Autokommandoer slettet uventet den nye bufferen %s" msgid "E144: non-numeric argument to :z" msgstr "E144: Ikke-numerisk parameter til :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Skallkommandoer er ikke tillatt i rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulre uttrykk kan ikke bli adskilt av bokstaver" diff --git a/src/nvim/po/pl.UTF-8.po b/src/nvim/po/pl.UTF-8.po index a348bf6203..f5c452e924 100644 --- a/src/nvim/po/pl.UTF-8.po +++ b/src/nvim/po/pl.UTF-8.po @@ -1201,10 +1201,6 @@ msgstr "E143: Autokomendy nieoczekiwanie skasowały nowy bufor %s" msgid "E144: non-numeric argument to :z" msgstr "E144: nienumeryczny argument dla :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Komendy powłoki są niedozwolone w rvim" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Wzorce regularne nie mogą być rozgraniczane literami" diff --git a/src/nvim/po/pt_BR.po b/src/nvim/po/pt_BR.po index 543f0bce27..4f39cb5bdb 100644 --- a/src/nvim/po/pt_BR.po +++ b/src/nvim/po/pt_BR.po @@ -4210,10 +4210,6 @@ msgstr "" msgid "E144: non-numeric argument to :z" msgstr "E144: argumento no-numrico passado a :z" -#: ../ex_cmds.c:3398 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Comandos do shell no so permitidos no rvim" - #: ../ex_cmds.c:3492 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Expresses regulares no podem ser delimitadas por letras" diff --git a/src/nvim/po/ru.po b/src/nvim/po/ru.po index e5be489d72..62f892d257 100644 --- a/src/nvim/po/ru.po +++ b/src/nvim/po/ru.po @@ -1205,10 +1205,6 @@ msgstr "E143: Автокоманды неожиданно убили новый msgid "E144: non-numeric argument to :z" msgstr "E144: Параметр команды :z должен быть числом" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Использование команд оболочки не допускается в rvim." - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Регулярные выражения не могут разделяться буквами" diff --git a/src/nvim/po/sk.cp1250.po b/src/nvim/po/sk.cp1250.po index 74b8e1039c..ced343bf6b 100644 --- a/src/nvim/po/sk.cp1250.po +++ b/src/nvim/po/sk.cp1250.po @@ -1219,10 +1219,6 @@ msgstr "E143: Automatick prkazy neoakvane zmazali nov buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: neseln argument pre :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim nepovouje pouitie prkazov shellu" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulrne vrazy nesm by oddelen psmenami" diff --git a/src/nvim/po/sk.po b/src/nvim/po/sk.po index d3f954f6d8..66b3d5abb1 100644 --- a/src/nvim/po/sk.po +++ b/src/nvim/po/sk.po @@ -1219,10 +1219,6 @@ msgstr "E143: Automatick prkazy neoakvane zmazali nov buffer %s" msgid "E144: non-numeric argument to :z" msgstr "E144: neseln argument pre :z" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim nepovouje pouitie prkazov shellu" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regulrne vrazy nesm by oddelen psmenami" diff --git a/src/nvim/po/sr.po b/src/nvim/po/sr.po index 88c5d18866..4c157658e5 100644 --- a/src/nvim/po/sr.po +++ b/src/nvim/po/sr.po @@ -424,7 +424,7 @@ msgstr "Опција 'dictionary' је празна" msgid "'thesaurus' option is empty" msgstr "Опција 'thesaurus' је празна" -#, c-format +#, c-format msgid "Scanning dictionary: %s" msgstr "Скенирање речника: %s" @@ -702,7 +702,7 @@ msgstr "E785: complete() може да се користи само у режи msgid "&Ok" msgstr "&Ок" -#, c-format +#, c-format msgid "+-%s%3ld line: " msgid_plural "+-%s%3ld lines: " msgstr[0] "+-%s%3ld линија: " @@ -810,7 +810,7 @@ msgstr "E677: Грешка при упису temp датотеке" msgid "E921: Invalid callback argument" msgstr "E921: Неисправан callback аргумент" -#, c-format +#, c-format msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s" msgstr "<%s>%s%s %d, Хекс %02x, Окт %03o, Дигр %s" @@ -818,11 +818,11 @@ msgstr "<%s>%s%s %d, Хекс %02x, Окт %03o, Дигр %s" msgid "<%s>%s%s %d, Hex %02x, Octal %03o" msgstr "<%s>%s%s %d, Хекс %02x, Октално %03o" -#, c-format +#, c-format msgid "> %d, Hex %04x, Oct %o, Digr %s" msgstr "> %d, Хекс %04x, Окт %o, Дигр %s" -#, c-format +#, c-format msgid "> %d, Hex %08x, Oct %o, Digr %s" msgstr "> %d, Хекс %08x, Окт %o, Дигр %s" @@ -981,9 +981,6 @@ msgstr "E143: Аутокоманде су неочекивано обрисал msgid "E144: non-numeric argument to :z" msgstr "E144: ненумерички аргумент за :z" -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Shell команде нису дозвољене у rvim" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Регуларни изрази не могу да се раздвајају словима" diff --git a/src/nvim/po/sv.po b/src/nvim/po/sv.po index 4770db15de..db7bada888 100644 --- a/src/nvim/po/sv.po +++ b/src/nvim/po/sv.po @@ -2622,10 +2622,6 @@ msgstr "E143: Autokommandon tog ovntat bort ny buffert %s" msgid "E144: non-numeric argument to :z" msgstr "E144: ickenumeriskt argument till :z" -#: ../ex_cmds.c:3398 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Skalkommandon inte tilltna i rvim" - #: ../ex_cmds.c:3492 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Reguljra uttryck kan inte vara tskilda av bokstver" diff --git a/src/nvim/po/uk.po b/src/nvim/po/uk.po index f2179f4f1b..604e425bd0 100644 --- a/src/nvim/po/uk.po +++ b/src/nvim/po/uk.po @@ -1459,10 +1459,6 @@ msgstr "E143: Автокоманди несподівано знищили но msgid "E144: non-numeric argument to :z" msgstr "E144: нечисловий аргумент для :z" -msgid "" -"E145: Shell commands and some functionality not allowed in restricted mode" -msgstr "E145: У обмеженому режимі не дозволені команди оболонки і деяка функіональність" - msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Регулярні вирази не можна розділяти літерами" diff --git a/src/nvim/po/vi.po b/src/nvim/po/vi.po index 7dbf19c263..a954ea6e34 100644 --- a/src/nvim/po/vi.po +++ b/src/nvim/po/vi.po @@ -1229,10 +1229,6 @@ msgstr "E143: Các lệnh tự động xóa bộ đệm mới ngoài ý muốn % msgid "E144: non-numeric argument to :z" msgstr "E144: Tham số của lệnh :z phải là số" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: Không cho phép sử dụng lệnh shell trong rvim." - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Không thể phân cách biểu thức chính quy bằng chữ cái" diff --git a/src/nvim/po/zh_CN.UTF-8.po b/src/nvim/po/zh_CN.UTF-8.po index 76204a43a8..542157002a 100644 --- a/src/nvim/po/zh_CN.UTF-8.po +++ b/src/nvim/po/zh_CN.UTF-8.po @@ -1222,10 +1222,6 @@ msgstr "E143: 自动命令意外地删除了新缓冲区 %s" msgid "E144: non-numeric argument to :z" msgstr "E144: :z 不接受非数字的参数" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim 中禁止使用 shell 命令" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: 正则表达式不能用字母作分界" diff --git a/src/nvim/po/zh_TW.UTF-8.po b/src/nvim/po/zh_TW.UTF-8.po index 3c1dd463b7..6a11b5e669 100644 --- a/src/nvim/po/zh_TW.UTF-8.po +++ b/src/nvim/po/zh_TW.UTF-8.po @@ -32,8 +32,8 @@ # So please change [行"] to [行 "] # # Q. How to use UTF8 mode on Win32? -# A. A simple configuration: -# set encoding=utf-8; let $LANG='zh_TW.UTF-8'; +# A. A simple configuration: +# set encoding=utf-8; let $LANG='zh_TW.UTF-8'; # (set langmenu=none or ..) # set fileencodings=ucs-bom,utf-8,japan,taiwan,prc # set fileencoding=taiwan (or utf-8) @@ -1262,10 +1262,6 @@ msgstr "E143: Autocommands 意外地刪除新緩衝區 %s" msgid "E144: non-numeric argument to :z" msgstr "E144: :z 不接受非數字的參數" -#: ../ex_cmds.c:3404 -msgid "E145: Shell commands not allowed in rvim" -msgstr "E145: rvim 中禁止使用 shell 命令" - #: ../ex_cmds.c:3498 msgid "E146: Regular expressions can't be delimited by letters" msgstr "E146: Regular expression 無法用字母分隔 (?)" diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index d3ca65c53c..3d7d587ed2 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -3608,11 +3608,15 @@ static int qf_open_new_cwindow(qf_info_T *qi, int height) } if (qf_buf != NULL) { // Use the existing quickfix buffer - (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, - ECMD_HIDE + ECMD_OLDBUF, oldwin); + if (do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, + ECMD_HIDE + ECMD_OLDBUF, oldwin) == FAIL) { + return FAIL; + } } else { // Create a new quickfix buffer - (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin); + if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin) == FAIL) { + return FAIL; + } } // Set the options for the quickfix buffer/window (if not already done) diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 5f09912116..425458f210 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -2196,6 +2196,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } if (wp->w_p_spell + && foldinfo.fi_lines == 0 && *wp->w_s->b_p_spl != NUL && !GA_EMPTY(&wp->w_s->b_langp) && *(char **)(wp->w_s->b_langp.ga_data) != NULL) { @@ -5205,7 +5206,7 @@ win_redr_custom ( fillchar = ' '; attr = HL_ATTR(HLF_TPF); maxwidth = Columns; - use_sandbox = was_set_insecurely((char_u *)"tabline", 0); + use_sandbox = was_set_insecurely(wp, (char_u *)"tabline", 0); } else { row = W_ENDROW(wp); fillchar = fillchar_status(&attr, wp); @@ -5236,14 +5237,14 @@ win_redr_custom ( attr = HL_ATTR(HLF_MSG); } - use_sandbox = was_set_insecurely((char_u *)"rulerformat", 0); + use_sandbox = was_set_insecurely(wp, (char_u *)"rulerformat", 0); } else { if (*wp->w_p_stl != NUL) stl = wp->w_p_stl; else stl = p_stl; - use_sandbox = was_set_insecurely((char_u *)"statusline", - *wp->w_p_stl == NUL ? 0 : OPT_LOCAL); + use_sandbox = was_set_insecurely( + wp, (char_u *)"statusline", *wp->w_p_stl == NUL ? 0 : OPT_LOCAL); } col += wp->w_wincol; diff --git a/src/nvim/search.c b/src/nvim/search.c index f979889540..90e1e25de2 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -1658,6 +1658,48 @@ static bool find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos) return found; } +/// Check matchpairs option for "*initc". +/// If there is a match set "*initc" to the matching character and "*findc" to +/// the opposite character. Set "*backwards" to the direction. +/// When "switchit" is true swap the direction. +static void find_mps_values(int *initc, int *findc, bool *backwards, + bool switchit) + FUNC_ATTR_NONNULL_ALL +{ + char_u *ptr = curbuf->b_p_mps; + + while (*ptr != NUL) { + if (utf_ptr2char(ptr) == *initc) { + if (switchit) { + *findc = *initc; + *initc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1); + *backwards = true; + } else { + *findc = utf_ptr2char(ptr + utfc_ptr2len(ptr) + 1); + *backwards = false; + } + return; + } + char_u *prev = ptr; + ptr += utfc_ptr2len(ptr) + 1; + if (utf_ptr2char(ptr) == *initc) { + if (switchit) { + *findc = *initc; + *initc = utf_ptr2char(prev); + *backwards = false; + } else { + *findc = utf_ptr2char(prev); + *backwards = true; + } + return; + } + ptr += utfc_ptr2len(ptr); + if (*ptr == ',') { + ptr++; + } + } +} + /* * findmatchlimit -- find the matching paren or brace, if it exists within * maxtravel lines of the cursor. A maxtravel of 0 means search until falling @@ -1684,7 +1726,7 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) static pos_T pos; // current search position int findc = 0; // matching brace int count = 0; // cumulative number of braces - int backwards = false; // init for gcc + bool backwards = false; // init for gcc bool raw_string = false; // search for raw string bool inquote = false; // true when inside quotes char_u *ptr; @@ -1729,9 +1771,10 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) raw_string = (initc == 'R'); initc = NUL; } else if (initc != '#' && initc != NUL) { - find_mps_values(&initc, &findc, &backwards, TRUE); - if (findc == NUL) + find_mps_values(&initc, &findc, &backwards, true); + if (findc == NUL) { return NULL; + } } else { /* * Either initc is '#', or no initc was given and we need to look @@ -1759,20 +1802,20 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) else if (linep[pos.col] == '/') { if (linep[pos.col + 1] == '*') { comment_dir = FORWARD; - backwards = FALSE; + backwards = false; pos.col++; } else if (pos.col > 0 && linep[pos.col - 1] == '*') { comment_dir = BACKWARD; - backwards = TRUE; + backwards = true; pos.col--; } } else if (linep[pos.col] == '*') { if (linep[pos.col + 1] == '/') { comment_dir = BACKWARD; - backwards = TRUE; + backwards = true; } else if (pos.col > 0 && linep[pos.col - 1] == '/') { comment_dir = FORWARD; - backwards = FALSE; + backwards = false; } } } @@ -1794,9 +1837,10 @@ pos_T *findmatchlimit(oparg_T *oap, int initc, int flags, int64_t maxtravel) if (initc == NUL) break; - find_mps_values(&initc, &findc, &backwards, FALSE); - if (findc) + find_mps_values(&initc, &findc, &backwards, false); + if (findc) { break; + } pos.col += utfc_ptr2len(linep + pos.col); } if (!findc) { diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim index af8482bdbe..ed75bda7a5 100644 --- a/src/nvim/testdir/test_filetype.vim +++ b/src/nvim/testdir/test_filetype.vim @@ -86,6 +86,8 @@ let s:filename_checks = { \ 'bzr': ['bzr_log.any'], \ 'c': ['enlightenment/file.cfg', 'file.qc', 'file.c'], \ 'cabal': ['file.cabal'], + \ 'cabalconfig': ['cabal.config'], + \ 'cabalproject': ['cabal.project', 'cabal.project.local'], \ 'calendar': ['calendar'], \ 'catalog': ['catalog', 'sgml.catalogfile'], \ 'cdl': ['file.cdl'], diff --git a/src/nvim/testdir/test_highlight.vim b/src/nvim/testdir/test_highlight.vim index 00e42733a7..a80a73161f 100644 --- a/src/nvim/testdir/test_highlight.vim +++ b/src/nvim/testdir/test_highlight.vim @@ -516,7 +516,7 @@ func Test_termguicolors() if !exists('+termguicolors') return endif - if has('vtp') && !has('vcon') + if has('vtp') && !has('vcon') && !has('gui_running') " Win32: 'guicolors' doesn't work without virtual console. call assert_fails('set termguicolors', 'E954:') return diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index 3e97cd2dd0..9c5f0777c6 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -4423,4 +4423,39 @@ func Test_add_invalid_entry_with_qf_window() cclose endfunc +" Test for very weird problem: autocommand causes a failure, resulting opening +" the quickfix window to fail. This still splits the window, but otherwise +" should not mess up buffers. +func Test_quickfix_window_fails_to_open() + CheckScreendump + + let lines =<< trim END + anything + try + anything + endtry + END + call writefile(lines, 'XquickfixFails') + + let lines =<< trim END + split XquickfixFails + silent vimgrep anything % + normal o + au BufLeave * ++once source XquickfixFails + " This will trigger the autocommand, which causes an error, what follows + " is aborted but the window was already split. + silent! cwindow + END + call writefile(lines, 'XtestWinFails') + let buf = RunVimInTerminal('-S XtestWinFails', #{rows: 13}) + call VerifyScreenDump(buf, 'Test_quickfix_window_fails', {}) + + " clean up + call term_sendkeys(buf, ":bwipe!\<CR>") + call term_wait(buf) + call StopVimInTerminal(buf) + call delete('XtestWinFails') + call delete('XquickfixFails') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim index 7fe0168356..6214975ef5 100644 --- a/src/nvim/testdir/test_startup.vim +++ b/src/nvim/testdir/test_startup.vim @@ -581,6 +581,27 @@ func Test_read_stdin() call delete('Xtestout') endfunc +func Test_set_shell() + let after =<< trim [CODE] + call writefile([&shell], "Xtestout") + quit! + [CODE] + + if has('win32') + let $SHELL = 'C:\with space\cmd.exe' + let expected = '"C:\with space\cmd.exe"' + else + let $SHELL = '/bin/with space/sh' + let expected = '"/bin/with space/sh"' + endif + + if RunVimPiped([], after, '', '') + let lines = readfile('Xtestout') + call assert_equal(expected, lines[0]) + endif + call delete('Xtestout') +endfunc + func Test_progpath() " Tests normally run with "./vim" or "../vim", these must have been expanded " to a full path. diff --git a/src/nvim/testdir/test_system.vim b/src/nvim/testdir/test_system.vim index d3c0594c03..424cb4abd0 100644 --- a/src/nvim/testdir/test_system.vim +++ b/src/nvim/testdir/test_system.vim @@ -1,5 +1,8 @@ " Tests for system() and systemlist() +source shared.vim +source check.vim + function! Test_System() if !executable('echo') || !executable('cat') || !executable('wc') return @@ -88,3 +91,54 @@ function! Test_system_exmode() let a = system(v:progpath. cmd) call assert_notequal(0, v:shell_error) endfunc + +func Test_system_with_shell_quote() + throw 'skipped: enable after porting method patches' + CheckMSWindows + + call mkdir('Xdir with spaces', 'p') + call system('copy "%COMSPEC%" "Xdir with spaces\cmd.exe"') + + let shell_save = &shell + let shellxquote_save = &shellxquote + try + " Set 'shell' always needs noshellslash. + let shellslash_save = &shellslash + set noshellslash + let shell_tests = [ + \ expand('$COMSPEC'), + \ '"' . fnamemodify('Xdir with spaces\cmd.exe', ':p') . '"', + \] + let &shellslash = shellslash_save + + let sxq_tests = ['', '(', '"'] + + " Matrix tests: 'shell' * 'shellxquote' + for shell in shell_tests + let &shell = shell + for sxq in sxq_tests + let &shellxquote = sxq + + let msg = printf('shell=%s shellxquote=%s', &shell, &shellxquote) + + try + let out = 'echo 123'->system() + catch + call assert_report(printf('%s: %s', msg, v:exception)) + continue + endtry + + " On Windows we may get a trailing space and CR. + if out != "123 \n" + call assert_equal("123\n", out, msg) + endif + + endfor + endfor + + finally + let &shell = shell_save + let &shellxquote = shellxquote_save + call delete('Xdir with spaces', 'rf') + endtry +endfunc |