aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer.c4
-rw-r--r--src/nvim/eval.c3
-rw-r--r--src/nvim/ex_cmds.c7
-rw-r--r--src/nvim/ex_cmds2.c32
-rw-r--r--src/nvim/ex_docmd.c2
-rw-r--r--src/nvim/fold.c9
-rw-r--r--src/nvim/hardcopy.c2
-rw-r--r--src/nvim/indent.c3
-rw-r--r--src/nvim/lua/treesitter.c170
-rw-r--r--src/nvim/ops.c4
-rw-r--r--src/nvim/option.c80
-rw-r--r--src/nvim/path.c8
-rw-r--r--src/nvim/po/af.po4
-rw-r--r--src/nvim/po/ca.po4
-rw-r--r--src/nvim/po/cs.cp1250.po4
-rw-r--r--src/nvim/po/cs.po4
-rw-r--r--src/nvim/po/da.po3
-rw-r--r--src/nvim/po/de.po6
-rw-r--r--src/nvim/po/en_GB.po4
-rw-r--r--src/nvim/po/eo.po3
-rw-r--r--src/nvim/po/es.po4
-rw-r--r--src/nvim/po/fi.po4
-rw-r--r--src/nvim/po/fr.po6
-rw-r--r--src/nvim/po/ga.po3
-rw-r--r--src/nvim/po/it.po4
-rw-r--r--src/nvim/po/ja.euc-jp.po3
-rw-r--r--src/nvim/po/ja.po3
-rw-r--r--src/nvim/po/ko.UTF-8.po4
-rw-r--r--src/nvim/po/nb.po4
-rw-r--r--src/nvim/po/nl.po4
-rw-r--r--src/nvim/po/no.po4
-rw-r--r--src/nvim/po/pl.UTF-8.po4
-rw-r--r--src/nvim/po/pt_BR.po4
-rw-r--r--src/nvim/po/ru.po4
-rw-r--r--src/nvim/po/sk.cp1250.po4
-rw-r--r--src/nvim/po/sk.po4
-rw-r--r--src/nvim/po/sr.po13
-rw-r--r--src/nvim/po/sv.po4
-rw-r--r--src/nvim/po/uk.po4
-rw-r--r--src/nvim/po/vi.po4
-rw-r--r--src/nvim/po/zh_CN.UTF-8.po4
-rw-r--r--src/nvim/po/zh_TW.UTF-8.po8
-rw-r--r--src/nvim/quickfix.c10
-rw-r--r--src/nvim/screen.c9
-rw-r--r--src/nvim/search.c62
-rw-r--r--src/nvim/testdir/test_filetype.vim2
-rw-r--r--src/nvim/testdir/test_highlight.vim2
-rw-r--r--src/nvim/testdir/test_quickfix.vim35
-rw-r--r--src/nvim/testdir/test_startup.vim21
-rw-r--r--src/nvim/testdir/test_system.vim54
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