aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/CMakeLists.txt6
-rw-r--r--src/nvim/api/vim.c6
-rw-r--r--src/nvim/ascii.h2
-rw-r--r--src/nvim/eval.c11
-rw-r--r--src/nvim/eval/funcs.c3
-rw-r--r--src/nvim/ex_cmds.c13
-rw-r--r--src/nvim/ex_cmds2.c6
-rw-r--r--src/nvim/lua/treesitter.c106
-rw-r--r--src/nvim/macros.h19
-rw-r--r--src/nvim/ops.c4
-rw-r--r--src/nvim/option_defs.h1
-rw-r--r--src/nvim/options.lua9
-rw-r--r--src/nvim/os/time.c9
-rw-r--r--src/nvim/po/check.vim1
-rw-r--r--src/nvim/po/uk.po1197
-rw-r--r--src/nvim/spellfile.c1
-rw-r--r--src/nvim/testdir/check.vim56
-rw-r--r--src/nvim/testdir/runtest.vim14
-rw-r--r--src/nvim/testdir/shared.vim6
-rw-r--r--src/nvim/testdir/test_diffmode.vim180
-rw-r--r--src/nvim/testdir/test_display.vim77
-rw-r--r--src/nvim/testdir/test_textformat.vim20
-rw-r--r--src/nvim/tui/tui.c151
-rw-r--r--src/nvim/window.c2
24 files changed, 1229 insertions, 671 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index c7258dde12..7b4438b896 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -189,7 +189,11 @@ if(NOT MSVC)
endif()
# tree-sitter: inlined external project, we don't maintain it. #10124
- set_source_files_properties(${TREESITTER_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-conversion -Wno-pedantic -Wno-shadow -Wno-missing-prototypes -Wno-unused-variable")
+ set(TS_FLAGS "-Wno-conversion -Wno-pedantic -Wno-shadow -Wno-missing-prototypes -Wno-unused-variable")
+ if(HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
+ set(TS_FLAGS "${TS_FLAGS} -Wno-implicit-fallthrough")
+ endif()
+ set_source_files_properties(${TREESITTER_SOURCES} PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} ${TS_FLAGS}")
endif()
if(NOT "${MIN_LOG_LEVEL}" MATCHES "^$")
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 305d5e6968..fbd6511161 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -204,9 +204,9 @@ Integer nvim_get_hl_id_by_name(String name)
///
/// On execution error: does not fail, but updates v:errmsg.
///
-/// If you need to input sequences like <C-o> use |nvim_replace_termcodes|
-/// to replace the termcodes and then pass the resulting string to
-/// nvim_feedkeys. You'll also want to enable escape_csi.
+/// If you need to input sequences like <C-o> use |nvim_replace_termcodes| to
+/// replace the termcodes and then pass the resulting string to nvim_feedkeys.
+/// You'll also want to enable escape_csi.
///
/// Example:
/// <pre>
diff --git a/src/nvim/ascii.h b/src/nvim/ascii.h
index 31423e79af..2397af27cc 100644
--- a/src/nvim/ascii.h
+++ b/src/nvim/ascii.h
@@ -31,9 +31,7 @@
#define CSI 0x9b // Control Sequence Introducer
#define CSI_STR "\233"
#define DCS 0x90 // Device Control String
-#define DCS_STR "\033P"
#define STERM 0x9c // String Terminator
-#define STERM_STR "\033\\"
#define POUND 0xA3
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 5aeb6fa746..21a5603b93 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -10383,10 +10383,13 @@ void script_host_eval(char *name, typval_T *argvars, typval_T *rettv)
list_T *args = tv_list_alloc(1);
tv_list_append_string(args, (const char *)argvars[0].vval.v_string, -1);
- *rettv = eval_call_provider(name, "eval", args);
+ *rettv = eval_call_provider(name, "eval", args, false);
}
-typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
+/// @param discard Clears the value returned by the provider and returns
+/// an empty typval_T.
+typval_T eval_call_provider(char *provider, char *method, list_T *arguments,
+ bool discard)
{
if (!eval_has_provider(provider)) {
emsgf("E319: No \"%s\" provider found. Run \":checkhealth provider\"",
@@ -10445,6 +10448,10 @@ typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
provider_call_nesting--;
assert(provider_call_nesting >= 0);
+ if (discard) {
+ tv_clear(&rettv);
+ }
+
return rettv;
}
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 8e0e420eb0..ac560124bf 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -32,6 +32,7 @@
#include "nvim/indent.h"
#include "nvim/indent_c.h"
#include "nvim/lua/executor.h"
+#include "nvim/macros.h"
#include "nvim/mark.h"
#include "nvim/math.h"
#include "nvim/memline.h"
@@ -86,8 +87,10 @@ KHASH_MAP_INIT_STR(functions, VimLFuncDef)
#endif
PRAGMA_DIAG_PUSH_IGNORE_MISSING_PROTOTYPES
+PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH
#include "funcs.generated.h"
PRAGMA_DIAG_POP
+PRAGMA_DIAG_POP
#endif
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 519978f4fb..2bac6cba58 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -326,14 +326,19 @@ static int linelen(int *has_tab)
int save;
int len;
- /* find the first non-blank character */
+ // Get the line. If it's empty bail out early (could be the empty string
+ // for an unloaded buffer).
line = get_cursor_line_ptr();
+ if (*line == NUL) {
+ return 0;
+ }
+ // find the first non-blank character
first = skipwhite(line);
- /* find the character after the last non-blank character */
+ // find the character after the last non-blank character
for (last = first + STRLEN(first);
- last > first && ascii_iswhite(last[-1]); --last)
- ;
+ last > first && ascii_iswhite(last[-1]); last--) {
+ }
save = *last;
*last = NUL;
// Get line length.
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index 7a06cb7ca6..636fc96bde 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -4157,7 +4157,7 @@ static void script_host_execute(char *name, exarg_T *eap)
tv_list_append_number(args, (int)eap->line1);
tv_list_append_number(args, (int)eap->line2);
- (void)eval_call_provider(name, "execute", args);
+ (void)eval_call_provider(name, "execute", args, true);
}
}
@@ -4172,7 +4172,7 @@ static void script_host_execute_file(char *name, exarg_T *eap)
// 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);
+ (void)eval_call_provider(name, "execute_file", args, true);
}
static void script_host_do_range(char *name, exarg_T *eap)
@@ -4181,7 +4181,7 @@ static void script_host_do_range(char *name, exarg_T *eap)
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);
+ (void)eval_call_provider(name, "do_range", args, true);
}
/// ":drop"
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c
index 138031237e..9a58823d64 100644
--- a/src/nvim/lua/treesitter.c
+++ b/src/nvim/lua/treesitter.c
@@ -62,6 +62,7 @@ static struct luaL_Reg node_meta[] = {
{ "end_", node_end },
{ "type", node_type },
{ "symbol", node_symbol },
+ { "field", node_field },
{ "named", node_named },
{ "missing", node_missing },
{ "has_error", node_has_error },
@@ -73,6 +74,7 @@ static struct luaL_Reg node_meta[] = {
{ "descendant_for_range", node_descendant_for_range },
{ "named_descendant_for_range", node_named_descendant_for_range },
{ "parent", node_parent },
+ { "iter_children", node_iter_children },
{ "_rawquery", node_rawquery },
{ NULL, NULL }
};
@@ -84,12 +86,17 @@ static struct luaL_Reg query_meta[] = {
{ NULL, NULL }
};
-// cursor is not exposed, but still needs garbage collection
+// cursors are not exposed, but still needs garbage collection
static struct luaL_Reg querycursor_meta[] = {
{ "__gc", querycursor_gc },
{ NULL, NULL }
};
+static struct luaL_Reg treecursor_meta[] = {
+ { "__gc", treecursor_gc },
+ { NULL, NULL }
+};
+
static PMap(cstr_t) *langs;
static void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta)
@@ -116,6 +123,7 @@ void tslua_init(lua_State *L)
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);
}
int tslua_has_language(lua_State *L)
@@ -646,6 +654,34 @@ static int node_symbol(lua_State *L)
return 1;
}
+static int node_field(lua_State *L)
+{
+ TSNode node;
+ if (!node_check(L, 1, &node)) {
+ return 0;
+ }
+
+ size_t name_len;
+ const char *field_name = luaL_checklstring(L, 2, &name_len);
+
+ TSTreeCursor cursor = ts_tree_cursor_new(node);
+
+ lua_newtable(L); // [table]
+ unsigned int curr_index = 0;
+
+ if (ts_tree_cursor_goto_first_child(&cursor)) {
+ do {
+ if (!STRCMP(field_name, ts_tree_cursor_current_field_name(&cursor))) {
+ push_node(L, ts_tree_cursor_current_node(&cursor), 1); // [table, node]
+ lua_rawseti(L, -2, ++curr_index);
+ }
+ } while (ts_tree_cursor_goto_next_sibling(&cursor));
+ }
+
+ ts_tree_cursor_delete(&cursor);
+ return 1;
+}
+
static int node_named(lua_State *L)
{
TSNode node;
@@ -746,6 +782,74 @@ static int node_named_descendant_for_range(lua_State *L)
return 1;
}
+static int node_next_child(lua_State *L)
+{
+ TSTreeCursor *ud = luaL_checkudata(
+ L, lua_upvalueindex(1), "treesitter_treecursor");
+ if (!ud) {
+ return 0;
+ }
+
+ TSNode source;
+ if (!node_check(L, lua_upvalueindex(2), &source)) {
+ return 0;
+ }
+
+ // First call should return first child
+ if (ts_node_eq(source, ts_tree_cursor_current_node(ud))) {
+ if (ts_tree_cursor_goto_first_child(ud)) {
+ goto push;
+ } else {
+ goto end;
+ }
+ }
+
+ if (ts_tree_cursor_goto_next_sibling(ud)) {
+push:
+ push_node(
+ L,
+ ts_tree_cursor_current_node(ud),
+ lua_upvalueindex(2)); // [node]
+
+ const char * field = ts_tree_cursor_current_field_name(ud);
+
+ if (field != NULL) {
+ lua_pushstring(L, ts_tree_cursor_current_field_name(ud));
+ } else {
+ lua_pushnil(L);
+ } // [node, field_name_or_nil]
+ return 2;
+ }
+
+end:
+ return 0;
+}
+
+static int node_iter_children(lua_State *L)
+{
+ TSNode source;
+ if (!node_check(L, 1, &source)) {
+ return 0;
+ }
+
+ TSTreeCursor *ud = lua_newuserdata(L, sizeof(TSTreeCursor)); // [udata]
+ *ud = ts_tree_cursor_new(source);
+
+ lua_getfield(L, LUA_REGISTRYINDEX, "treesitter_treecursor"); // [udata, mt]
+ lua_setmetatable(L, -2); // [udata]
+ lua_pushvalue(L, 1); // [udata, source_node]
+ lua_pushcclosure(L, node_next_child, 2);
+
+ return 1;
+}
+
+static int treecursor_gc(lua_State *L)
+{
+ TSTreeCursor *ud = luaL_checkudata(L, 1, "treesitter_treecursor");
+ ts_tree_cursor_delete(ud);
+ return 0;
+}
+
static int node_parent(lua_State *L)
{
TSNode node;
diff --git a/src/nvim/macros.h b/src/nvim/macros.h
index 3df7fa768d..0bbaa87aba 100644
--- a/src/nvim/macros.h
+++ b/src/nvim/macros.h
@@ -1,6 +1,8 @@
#ifndef NVIM_MACROS_H
#define NVIM_MACROS_H
+#include "auto/config.h"
+
// EXTERN is only defined in main.c. That's where global variables are
// actually defined and initialized.
#ifndef EXTERN
@@ -203,16 +205,33 @@
# define PRAGMA_DIAG_PUSH_IGNORE_MISSING_PROTOTYPES \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wmissing-prototypes\"")
+# ifdef HAVE_WIMPLICIT_FALLTHROUGH_FLAG
+# define PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH \
+ _Pragma("clang diagnostic push") \
+ _Pragma("clang diagnostic ignored \"-Wimplicit-fallthrough\"")
+# else
+# define PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH \
+ _Pragma("clang diagnostic push")
+# endif
# define PRAGMA_DIAG_POP \
_Pragma("clang diagnostic pop")
#elif defined(__GNUC__)
# define PRAGMA_DIAG_PUSH_IGNORE_MISSING_PROTOTYPES \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wmissing-prototypes\"")
+# ifdef HAVE_WIMPLICIT_FALLTHROUGH_FLAG
+# define PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
+# else
+# define PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH \
+ _Pragma("GCC diagnostic push")
+# endif
# define PRAGMA_DIAG_POP \
_Pragma("GCC diagnostic pop")
#else
# define PRAGMA_DIAG_PUSH_IGNORE_MISSING_PROTOTYPES
+# define PRAGMA_DIAG_PUSH_IGNORE_IMPLICIT_FALLTHROUGH
# define PRAGMA_DIAG_POP
#endif
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index d31328219f..7e0cd737ca 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -5919,7 +5919,7 @@ static bool get_clipboard(int name, yankreg_T **target, bool quiet)
const char regname = (char)name;
tv_list_append_string(args, &regname, 1);
- typval_T result = eval_call_provider("clipboard", "get", args);
+ typval_T result = eval_call_provider("clipboard", "get", args, false);
if (result.v_type != VAR_LIST) {
if (result.v_type == VAR_NUMBER && result.vval.v_number == 0) {
@@ -6067,7 +6067,7 @@ static void set_clipboard(int name, yankreg_T *reg)
tv_list_append_string(args, &regtype, 1); // -V614
tv_list_append_string(args, ((char[]) { (char)name }), 1);
- (void)eval_call_provider("clipboard", "set", args);
+ (void)eval_call_provider("clipboard", "set", args, true);
}
/// Avoid slow things (clipboard) during batch operations (while/for-loops).
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index ecaa941082..eb8f051b9c 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -453,7 +453,6 @@ EXTERN char_u *p_header; // 'printheader'
EXTERN int p_prompt; // 'prompt'
EXTERN char_u *p_guicursor; // 'guicursor'
EXTERN char_u *p_guifont; // 'guifont'
-EXTERN char_u *p_guifontset; // 'guifontset'
EXTERN char_u *p_guifontwide; // 'guifontwide'
EXTERN char_u *p_hf; // 'helpfile'
EXTERN long p_hh; // 'helpheight'
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index 60a38dc2e3..79fea1f628 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -1022,15 +1022,6 @@ return {
defaults={if_true={vi=""}}
},
{
- full_name='guifontset', abbreviation='gfs',
- type='string', list='onecomma', scope={'global'},
- deny_duplicates=true,
- vi_def=true,
- varname='p_guifontset',
- redraw={'ui_option'},
- defaults={if_true={vi=""}}
- },
- {
full_name='guifontwide', abbreviation='gfw',
type='string', list='onecomma', scope={'global'},
deny_duplicates=true,
diff --git a/src/nvim/os/time.c b/src/nvim/os/time.c
index 346e40e02e..4b6533cd0c 100644
--- a/src/nvim/os/time.c
+++ b/src/nvim/os/time.c
@@ -56,6 +56,8 @@ uint64_t os_now(void)
/// Sleeps for `ms` milliseconds.
///
+/// @see uv_sleep() (libuv v1.34.0)
+///
/// @param ms Number of milliseconds to sleep
/// @param ignoreinput If true, only SIGINT (CTRL-C) can interrupt.
void os_delay(uint64_t ms, bool ignoreinput)
@@ -72,6 +74,8 @@ void os_delay(uint64_t ms, bool ignoreinput)
/// Sleeps for `us` microseconds.
///
+/// @see uv_sleep() (libuv v1.34.0)
+///
/// @param us Number of microseconds to sleep.
/// @param ignoreinput If true, ignore all input (including SIGINT/CTRL-C).
/// If false, waiting is aborted on any input.
@@ -172,10 +176,11 @@ char *os_ctime_r(const time_t *restrict clock, char *restrict result,
struct tm *clock_local_ptr = os_localtime_r(clock, &clock_local);
// MSVC returns NULL for an invalid value of seconds.
if (clock_local_ptr == NULL) {
- snprintf(result, result_len, "%s\n", _("(Invalid)"));
+ xstrlcpy(result, _("(Invalid)"), result_len);
} else {
- strftime(result, result_len, "%a %b %d %H:%M:%S %Y\n", clock_local_ptr);
+ strftime(result, result_len, _("%a %b %d %H:%M:%S %Y"), clock_local_ptr);
}
+ xstrlcat(result, "\n", result_len);
return result;
}
diff --git a/src/nvim/po/check.vim b/src/nvim/po/check.vim
index 650c6155e2..d55d4cfa4d 100644
--- a/src/nvim/po/check.vim
+++ b/src/nvim/po/check.vim
@@ -25,6 +25,7 @@ func! GetMline()
" remove '%', not used for formatting.
let idline = substitute(idline, "'%'", '', 'g')
+ let idline = substitute(idline, "%%", '', 'g')
" remove '%' used for plural forms.
let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '')
diff --git a/src/nvim/po/uk.po b/src/nvim/po/uk.po
index 19ea8e897a..f2179f4f1b 100644
--- a/src/nvim/po/uk.po
+++ b/src/nvim/po/uk.po
@@ -14,8 +14,8 @@ msgid ""
msgstr ""
"Project-Id-Version: vim 7.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-18 22:42+0200\n"
-"PO-Revision-Date: 2018-12-18 22:42+0200\n"
+"POT-Creation-Date: 2020-08-23 18:45+0300\n"
+"PO-Revision-Date: 2020-08-23 20:19+0300\n"
"Last-Translator: Анатолій Сахнік <sakhnik@gmail.com>\n"
"Language-Team: Ukrainian\n"
"Language: uk\n"
@@ -95,6 +95,12 @@ msgid ""
"E89: No write since last change for buffer %<PRId64> (add ! to override)"
msgstr "E89: Буфер %<PRId64> має зміни (! щоб не зважати)"
+msgid "E37: No write since last change (add ! to override)"
+msgstr "E37: Зміни не було записано (! щоб не зважати)"
+
+msgid "E37: No write since last change"
+msgstr "E37: Не записано після останніх змін"
+
msgid "W14: Warning: List of file names overflow"
msgstr "W14: Обережно: Список назв файлів переповнено"
@@ -123,9 +129,6 @@ msgstr " [Змінено]"
msgid "[Not edited]"
msgstr "[Не редаговано]"
-msgid "[New file]"
-msgstr "[Новий файл]"
-
msgid "[Read errors]"
msgstr "[Помилки читання]"
@@ -168,23 +171,17 @@ msgstr "Знизу"
msgid "Top"
msgstr "Вгорі"
-msgid "[Scratch]"
-msgstr "[З нуля]"
+msgid "E382: Cannot write, 'buftype' option is set"
+msgstr "E382: Не можу записати, вказана опція 'buftype'"
-msgid ""
-"\n"
-"--- Signs ---"
-msgstr ""
-"\n"
-"--- Позначки ---"
+msgid "[Prompt]"
+msgstr "[Запит]"
-#, c-format
-msgid "Signs for %s:"
-msgstr "Позначки для %s:"
+msgid "[Scratch]"
+msgstr "[З нуля]"
-#, c-format
-msgid " line=%<PRId64> id=%d name=%s"
-msgstr " рядок=%<PRId64> id=%d назва=%s"
+msgid "W10: Warning: Changing a readonly file"
+msgstr "W10: Застереження: Змінюється файл призначений лише для читання"
msgid "can only be opened in headless mode"
msgstr "можна відкрити тільки без інтерфейсу користувача"
@@ -198,6 +195,9 @@ msgstr "Неможливо надіслати дані у закритий по
msgid "Can't send raw data to rpc channel"
msgstr "Неможливо надіслати дані у канал завдання"
+msgid "E474: Failed to convert list to msgpack string buffer"
+msgstr "E474: Не вдалося перетворити список у текстовий буфер msgpack"
+
msgid "E545: Missing colon"
msgstr "E545: Пропущено двокрапку"
@@ -233,9 +233,6 @@ msgstr "E816: Не вдалося прочитати результат patch"
msgid "E98: Cannot read diff output"
msgstr "E98: Не вдалося прочитати результат diff"
-msgid "E959: Invalid diff format."
-msgstr "E959: Неправильний формат порівняння."
-
msgid "E99: Current buffer is not in diff mode"
msgstr "E99: Цей буфер не в режимі порівняння"
@@ -264,6 +261,81 @@ msgstr "E787: Буфер несподівано змінився"
msgid "E104: Escape not allowed in digraph"
msgstr "E104: У диграфах не може міститися escape"
+msgid "Custom"
+msgstr "Власне"
+
+msgid "Latin supplement"
+msgstr "Латиниця доповнення"
+
+msgid "Greek and Coptic"
+msgstr "Грецька і коптська"
+
+msgid "Cyrillic"
+msgstr "Кирилиця"
+
+msgid "Hebrew"
+msgstr "Іврит"
+
+msgid "Arabic"
+msgstr "Арабська"
+
+msgid "Latin extended"
+msgstr "Латиниця розширена"
+
+msgid "Greek extended"
+msgstr "Грецька розширена"
+
+msgid "Punctuation"
+msgstr "Пунктуація"
+
+msgid "Super- and subscripts"
+msgstr "Над- і підписи"
+
+msgid "Currency"
+msgstr "Валюта"
+
+msgid "Other"
+msgstr "Інше"
+
+msgid "Roman numbers"
+msgstr "Римські цифри"
+
+msgid "Arrows"
+msgstr "Стрілки"
+
+msgid "Mathematical operators"
+msgstr "Математичні оператори"
+
+msgid "Technical"
+msgstr "Технічне"
+
+msgid "Box drawing"
+msgstr "Малювання прямокутників"
+
+msgid "Block elements"
+msgstr "Частини блоків"
+
+msgid "Geometric shapes"
+msgstr "Геометричні фігури"
+
+msgid "Symbols"
+msgstr "Символи"
+
+msgid "Dingbats"
+msgstr "Дурниці"
+
+msgid "CJK symbols and punctuation"
+msgstr "Символи і пунктуація CJK"
+
+msgid "Hiragana"
+msgstr "Хірагана"
+
+msgid "Katakana"
+msgstr "Катакана"
+
+msgid "Bopomofo"
+msgstr "Бопомофо"
+
msgid "E544: Keymap file not found"
msgstr "E544: Не знайдено файл розкладки"
@@ -379,55 +451,18 @@ msgstr "E18: Неочікувані символи у :let"
msgid "E111: Missing ']'"
msgstr "E111: Бракує ']'"
-#, c-format
-msgid "E686: Argument of %s must be a List"
-msgstr "E686: Аргумент у %s має бути списком"
-
-#, c-format
-msgid "E712: Argument of %s must be a List or Dictionary"
-msgstr "E712: Аргумент у %s має бути списком чи словником"
-
-msgid "E714: List required"
-msgstr "E714: Потрібен список"
-
-msgid "E715: Dictionary required"
-msgstr "E715: Потрібен словник"
-
-msgid "E928: String required"
-msgstr "E928: Потрібен String"
-
-#, c-format
-msgid "E118: Too many arguments for function: %s"
-msgstr "E118: Забагато аргументів для функції: %s"
-
-#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Немає такого ключа у словнику: %s"
-
-#, c-format
-msgid "E122: Function %s already exists, add ! to replace it"
-msgstr "E122: Функція %s уже існує, ! щоб замінити"
-
-msgid "E717: Dictionary entry already exists"
-msgstr "E717: Запис у словнику вже існує"
-
-msgid "E718: Funcref required"
-msgstr "E718: Треба посилання на функцію"
-
msgid "E719: Cannot use [:] with a Dictionary"
msgstr "E719: Не можна використати [:] зі словником"
#, c-format
-msgid "E130: Unknown function: %s"
-msgstr "E130: Невідома функція: %s"
-
-#, c-format
msgid "E461: Illegal variable name: %s"
msgstr "E461: Неприпустима назва змінної: %s"
-#, c-format
-msgid "E46: Cannot change read-only variable \"%.*s\""
-msgstr "E46: Змінна тільки для читання: «%.*s»"
+msgid "E995: Cannot modify existing variable"
+msgstr "E995: Неможливо змінити наявну змінну"
+
+msgid "E957: Invalid window number"
+msgstr "E957: Некоректний номер вікна"
#, c-format
msgid "E734: Wrong variable type for %s="
@@ -439,6 +474,19 @@ msgid ""
msgstr ""
"E5700: Вираз із 'spellsuggest' має повертати список із рівно двома елементами"
+msgid "E991: cannot use =<< here"
+msgstr "E991: Тут не можна використати =<<"
+
+msgid "E221: Marker cannot start with lower case letter"
+msgstr "E221: Позначка не може починатися із малої літери"
+
+msgid "E172: Missing marker"
+msgstr "E172: Бракує позначки"
+
+#, c-format
+msgid "E990: Missing end marker '%s'"
+msgstr "E990: Бракує позначки кінця «%s»"
+
msgid "E687: Less targets than List items"
msgstr "E687: Цілей менше, ніж елементів списку"
@@ -452,6 +500,15 @@ msgstr "Друга ; у списку змінних"
msgid "E738: Can't list variables for %s"
msgstr "E738: Не можна перерахувати змінні у %s"
+msgid "E996: Cannot lock an environment variable"
+msgstr "E996: Неможливо заблокувати змінну оточення"
+
+msgid "E996: Cannot lock an option"
+msgstr "E996: Неможливо заблокувати опцію"
+
+msgid "E996: Cannot lock a register"
+msgstr "E996: Неможливо заблокувати регістр"
+
#, c-format
msgid "E121: Undefined variable: %.*s"
msgstr "E121: Невизначена змінна: %.*s"
@@ -468,20 +525,22 @@ msgstr "E713: Неможливо вжити порожній ключ після
msgid "E709: [:] requires a List value"
msgstr "E709: [:] вимагає список"
+msgid "E996: Cannot lock a range"
+msgstr "E996: Неможливо заблокувати діапазон"
+
msgid "E710: List value has more items than target"
msgstr "E710: Список має більше елементів, ніж ціль"
msgid "E711: List value has not enough items"
msgstr "E711: Список має недостатньо елементів"
+msgid "E996: Cannot lock a list or dict"
+msgstr "E996: Неможливо заблокувати список чи словник"
+
msgid "E690: Missing \"in\" after :for"
msgstr "E690: Пропущено «in» після :for"
#, c-format
-msgid "E107: Missing parentheses: %s"
-msgstr "E107: Пропущено дужки: %s"
-
-#, c-format
msgid "E108: No such variable: \"%s\""
msgstr "E108: Змінної немає: «%s»"
@@ -563,68 +622,6 @@ msgstr "E722: Бракує коми у словнику: %s"
msgid "E723: Missing end of Dictionary '}': %s"
msgstr "E723: Немає кінцівки словника '}': %s"
-#, c-format
-msgid "E125: Illegal argument: %s"
-msgstr "E125: Недозволений аргумент: %s"
-
-#, c-format
-msgid "E853: Duplicate argument name: %s"
-msgstr "E853: Назва аргументу повторюється: %s"
-
-#, c-format
-msgid "E740: Too many arguments for function %s"
-msgstr "E740: Забагато аргументів для функції %s"
-
-#, c-format
-msgid "E116: Invalid arguments for function %s"
-msgstr "E116: Неправильні аргументи функції %s"
-
-#, c-format
-msgid "E117: Unknown function: %s"
-msgstr "E117: Невідома функція: %s"
-
-#, c-format
-msgid "E933: Function was deleted: %s"
-msgstr "E933: Функцію було видалено: %s"
-
-#, c-format
-msgid "E119: Not enough arguments for function: %s"
-msgstr "E119: Замало аргументів для функції %s"
-
-#, c-format
-msgid "E120: Using <SID> not in a script context: %s"
-msgstr "E120: <SID> використовується не у контексті скрипту: %s"
-
-#, c-format
-msgid "E725: Calling dict function without Dictionary: %s"
-msgstr "E725: Виклик dict-функції без словника: %s"
-
-#, c-format
-msgid "Error converting the call result: %s"
-msgstr "Не вдалося перетворити результат виклику: %s"
-
-msgid "add() argument"
-msgstr "аргумент add()"
-
-msgid "E699: Too many arguments"
-msgstr "E699: Забагато аргументів"
-
-#, c-format
-msgid "Invalid channel stream \"%s\""
-msgstr "Некоректний потік завдання «%s»"
-
-msgid "E785: complete() can only be used in Insert mode"
-msgstr "E785: complete() можна вживати тільки в режимі вставляння"
-
-msgid "&Ok"
-msgstr "&O:Гаразд"
-
-msgid "dictwatcheradd() argument"
-msgstr "аргумент dictwatcheradd()"
-
-msgid "extend() argument"
-msgstr "аргумент extend()"
-
msgid "map() argument"
msgstr "аргумент map()"
@@ -641,124 +638,13 @@ msgstr "E922: очікується словник"
msgid "E923: Second argument of function() must be a list or a dict"
msgstr "E923: Другий аргумент function() має бути списком чи словником"
-msgid "E5000: Cannot find tab number."
-msgstr "E5000: Не можна знайти номер вкладки."
-
-msgid "E5001: Higher scope cannot be -1 if lower scope is >= 0."
-msgstr "E5001: Вища область не може бути -1, якщо нижча область >= 0."
-
-msgid "E5002: Cannot find window number."
-msgstr "E5002: Неможливо знайти номер вікна."
-
msgid "E5050: {opts} must be the only argument"
msgstr "E5050: {opts} має бути єдиним аргументом"
-msgid "called inputrestore() more often than inputsave()"
-msgstr "Виклики до inputrestore() частіше, ніж до inputsave()"
-
-msgid "insert() argument"
-msgstr "аргумент insert()"
-
-msgid "E786: Range not allowed"
-msgstr "E786: Інтервал не дозволено"
-
-msgid "E474: Failed to convert list to string"
-msgstr "E474: Не вдалося перетворити список у текст"
-
-#, c-format
-msgid "E474: Failed to parse %.*s"
-msgstr "E474: Не вдалося розібрати %.*s"
-
-msgid "E701: Invalid type for len()"
-msgstr "E701: Некоректний тип для len()"
-
-#, c-format
-msgid "E798: ID is reserved for \":match\": %<PRId64>"
-msgstr "E798: ID зарезервовано для \":match\": %<PRId64>"
-
-#, c-format
-msgid "E798: ID is reserved for \"match\": %<PRId64>"
-msgstr "E798: ID зарезервовано для \"match\": %<PRId64>"
-
-#, c-format
-msgid "msgpackdump() argument, index %i"
-msgstr "аргумент msgpackdump(), індекс %i"
-
-msgid "E5070: Character number must not be less than zero"
-msgstr "E5070: Номер символа має бути невід’ємним"
-
-#, c-format
-msgid "E5071: Character number must not be greater than INT_MAX (%i)"
-msgstr "E5071: Номер символа не може бути більшим, ніж INT_MAX (%i)"
-
-msgid "E726: Stride is zero"
-msgstr "E726: Крок нульовий"
-
-msgid "E727: Start past end"
-msgstr "E727: Початок за кінцем"
-
-msgid "<empty>"
-msgstr "<нічого>"
-
-msgid "remove() argument"
-msgstr "аргумент remove()"
-
-msgid "E655: Too many symbolic links (cycle?)"
-msgstr "E655: Забагато символьних посилань (цикл?)"
-
-msgid "reverse() argument"
-msgstr "аргумент reverse()"
-
-#, c-format
-msgid "E5010: List item %d of the second argument is not a string"
-msgstr "E5010: Елемент списку %d другого аргументу не текст"
-
-#, c-format
-msgid "E927: Invalid action: '%s'"
-msgstr "E927: Неправильна дія: «%s»"
-
-#, c-format
-msgid "E474: List item %d is either not a dictionary or an empty one"
-msgstr "E474: Елемент списку %d або не словник або порожній"
-
-#, c-format
-msgid "E474: List item %d is missing one of the required keys"
-msgstr "E474: Елемент списку %d немає одного з обов’язкових ключів"
-
-#, c-format
-msgid "connection failed: %s"
-msgstr "з’єднання не вдалося: %s"
-
-msgid "sort() argument"
-msgstr "аргумент sort()"
-
-msgid "uniq() argument"
-msgstr "аргумент uniq()"
-
-msgid "E702: Sort compare function failed"
-msgstr "E702: Помилка у функції порівняння"
-
-msgid "E882: Uniq compare function failed"
-msgstr "E882: Помилка у функції порівняння uniq"
-
-#, c-format
-msgid "E6100: \"%s\" is not a valid stdpath"
-msgstr "E6100: \"%s\" — некоректний stdpath"
-
-msgid "(Invalid)"
-msgstr "(Неможливо)"
-
-#, c-format
-msgid "E935: invalid submatch number: %d"
-msgstr "E935: неправильний номер групи співпадіння: %d"
-
#, c-format
msgid "Executing command: \"%s\""
msgstr "Виконується команда: «%s»"
-msgid "Can only call this function in an unmodified buffer"
-msgstr "Цю функцію можна викликати тільки у незміненому буфері"
-
msgid "E921: Invalid callback argument"
msgstr "E921: Некоректний аргумент функції зворотнього виклику"
@@ -767,21 +653,6 @@ msgid "E80: Error while writing: %s"
msgstr "E80: Помилка під час запису: %s"
#, c-format
-msgid "E5060: Unknown flag: %s"
-msgstr "E5060: Невідомий прапорець: %s"
-
-msgid "E482: Can't open file with an empty name"
-msgstr "E482: Не вдалося відкрити файл з порожнім ім’ям"
-
-#, c-format
-msgid "E482: Can't open file %s for writing: %s"
-msgstr "E482: Не вдалося відкрити файл %s для запису: %s"
-
-#, c-format
-msgid "E80: Error when closing file %s: %s"
-msgstr "E80: Помилка при закритті файлу %s: %s"
-
-#, c-format
msgid "E963: setting %s to value with wrong type"
msgstr "E963: встановлення %s до значення з неправильним типом"
@@ -799,90 +670,11 @@ msgstr "E704: Назва змінної Funcref має починатися з
#, c-format
msgid "E705: Variable name conflicts with existing function: %s"
-msgstr "E705: Назва змінної співпадає з існуючою функцією: %s"
+msgstr "E705: Назва змінної співпадає з наявною функцією: %s"
msgid "E698: variable nested too deep for making a copy"
msgstr "E698: Змінна вкладена занадто глибоко щоб зробити її копію"
-#, c-format
-msgid "E123: Undefined function: %s"
-msgstr "E123: Невизначена функція: %s"
-
-#, c-format
-msgid "E124: Missing '(': %s"
-msgstr "E124: Бракує '(': %s"
-
-msgid "E862: Cannot use g: here"
-msgstr "E862: Тут не можна використати g:"
-
-#, c-format
-msgid "E932: Closure function should not be at top level: %s"
-msgstr "E932: Функція замикання не може бути на верхньому рівні: %s"
-
-msgid "E126: Missing :endfunction"
-msgstr "E126: Бракує :endfunction"
-
-#, c-format
-msgid "W22: Text found after :endfunction: %s"
-msgstr "W22: Трапився текст після :endfunction: %s"
-
-#, c-format
-msgid "E707: Function name conflicts with variable: %s"
-msgstr "E707: Назва функції співпадає зі змінною: %s"
-
-#, c-format
-msgid "E127: Cannot redefine function %s: It is in use"
-msgstr "E127: Не вдалося перевизначити функцію %s: вона використовується"
-
-#, c-format
-msgid "E746: Function name does not match script file name: %s"
-msgstr "E746: Назва функції не збігається з назвою файлу скрипту: %s"
-
-msgid "E129: Function name required"
-msgstr "E129: Не вказано назву функції"
-
-#, c-format
-msgid "E128: Function name must start with a capital or \"s:\": %s"
-msgstr "E128: Назва функції має починатися з великої літери або \"s:\": %s"
-
-#, c-format
-msgid "E884: Function name cannot contain a colon: %s"
-msgstr "E884: Назва функції не може містити двокрапку: %s"
-
-#, c-format
-msgid "E131: Cannot delete function %s: It is in use"
-msgstr "E131: Не вдалося знищити функцію %s: Вона використовується"
-
-#, c-format
-msgid "Cannot delete function %s: It is being used internally"
-msgstr "Не вдалося знищити функцію %s: Вона використовується"
-
-msgid "E132: Function call depth is higher than 'maxfuncdepth'"
-msgstr "E132: Глибина викликів функції перевищує 'maxfuncdepth'"
-
-#, c-format
-msgid "calling %s"
-msgstr "викликається %s"
-
-#, c-format
-msgid "%s aborted"
-msgstr "%s припинено"
-
-#, c-format
-msgid "%s returning #%<PRId64>"
-msgstr "%s повертає #%<PRId64>"
-
-#, c-format
-msgid "%s returning %s"
-msgstr "%s повертає %s"
-
-#, c-format
-msgid "continuing in %s"
-msgstr "продовження в %s"
-
-msgid "E133: :return not inside a function"
-msgstr "E133: :return поза межами функції"
-
msgid ""
"\n"
"\tLast set from "
@@ -1155,6 +947,179 @@ msgid "E684: list index out of range: %<PRId64>"
msgstr "E684: Індекс списку поза межами: %<PRId64>"
#, c-format
+msgid "E686: Argument of %s must be a List"
+msgstr "E686: Аргумент у %s має бути списком"
+
+msgid "E928: String required"
+msgstr "E928: Потрібен String"
+
+#, c-format
+msgid "Error converting the call result: %s"
+msgstr "Не вдалося перетворити результат виклику: %s"
+
+msgid "add() argument"
+msgstr "аргумент add()"
+
+#, c-format
+msgid "E158: Invalid buffer name: %s"
+msgstr "E158: Некоректна назва буфера: %s"
+
+#, c-format
+msgid "Invalid channel stream \"%s\""
+msgstr "Некоректний потік завдання «%s»"
+
+msgid "E785: complete() can only be used in Insert mode"
+msgstr "E785: complete() можна вживати тільки в режимі вставляння"
+
+msgid "&Ok"
+msgstr "&O:Гаразд"
+
+msgid "Context stack is empty"
+msgstr "Стек контексту порожній"
+
+msgid "dictwatcheradd() argument"
+msgstr "аргумент dictwatcheradd()"
+
+msgid "E900: maxdepth must be non-negative number"
+msgstr "E900: maxdepth має бути невід’ємним числом"
+
+msgid "flatten() argument"
+msgstr "аргумент flatten()"
+
+msgid "extend() argument"
+msgstr "аргумент extend()"
+
+msgid "E5000: Cannot find tab number."
+msgstr "E5000: Не можна знайти номер вкладки."
+
+msgid "E5001: Higher scope cannot be -1 if lower scope is >= 0."
+msgstr "E5001: Вища область не може бути -1, якщо нижча область >= 0."
+
+msgid "E5002: Cannot find window number."
+msgstr "E5002: Неможливо знайти номер вікна."
+
+msgid "called inputrestore() more often than inputsave()"
+msgstr "Виклики до inputrestore() частіше, ніж до inputsave()"
+
+msgid "insert() argument"
+msgstr "аргумент insert()"
+
+msgid "E786: Range not allowed"
+msgstr "E786: Інтервал не дозволено"
+
+msgid "E474: Failed to convert list to string"
+msgstr "E474: Не вдалося перетворити список у текст"
+
+#, c-format
+msgid "E474: Failed to parse %.*s"
+msgstr "E474: Не вдалося розібрати %.*s"
+
+msgid "E701: Invalid type for len()"
+msgstr "E701: Некоректний тип для len()"
+
+#, c-format
+msgid "E798: ID is reserved for \":match\": %<PRId64>"
+msgstr "E798: ID зарезервовано для \":match\": %<PRId64>"
+
+#, c-format
+msgid "E798: ID is reserved for \"match\": %<PRId64>"
+msgstr "E798: ID зарезервовано для \"match\": %<PRId64>"
+
+#, c-format
+msgid "msgpackdump() argument, index %i"
+msgstr "аргумент msgpackdump(), індекс %i"
+
+msgid "E5070: Character number must not be less than zero"
+msgstr "E5070: Номер символа має бути невід’ємним"
+
+#, c-format
+msgid "E5071: Character number must not be greater than INT_MAX (%i)"
+msgstr "E5071: Номер символа не може бути більшим, ніж INT_MAX (%i)"
+
+msgid "E726: Stride is zero"
+msgstr "E726: Крок нульовий"
+
+msgid "E727: Start past end"
+msgstr "E727: Початок за кінцем"
+
+msgid "<empty>"
+msgstr "<нічого>"
+
+msgid "remove() argument"
+msgstr "аргумент remove()"
+
+msgid "E655: Too many symbolic links (cycle?)"
+msgstr "E655: Забагато символьних посилань (цикл?)"
+
+msgid "reverse() argument"
+msgstr "аргумент reverse()"
+
+#, c-format
+msgid "E5010: List item %d of the second argument is not a string"
+msgstr "E5010: Елемент списку %d другого аргументу не текст"
+
+#, c-format
+msgid "E927: Invalid action: '%s'"
+msgstr "E927: Неправильна дія: «%s»"
+
+#, c-format
+msgid "E474: List item %d is either not a dictionary or an empty one"
+msgstr "E474: Елемент списку %d або не словник або порожній"
+
+#, c-format
+msgid "E474: List item %d is missing one of the required keys"
+msgstr "E474: Елемент списку %d немає одного з обов’язкових ключів"
+
+#, c-format
+msgid "E962: Invalid action: '%s'"
+msgstr "E962: Неправильна дія: «%s»"
+
+#, c-format
+msgid "connection failed: %s"
+msgstr "з’єднання не вдалося: %s"
+
+msgid "sort() argument"
+msgstr "аргумент sort()"
+
+msgid "uniq() argument"
+msgstr "аргумент uniq()"
+
+msgid "E702: Sort compare function failed"
+msgstr "E702: Помилка у функції порівняння"
+
+msgid "E882: Uniq compare function failed"
+msgstr "E882: Помилка у функції порівняння uniq"
+
+#, c-format
+msgid "E6100: \"%s\" is not a valid stdpath"
+msgstr "E6100: \"%s\" — некоректний stdpath"
+
+msgid "(Invalid)"
+msgstr "(Неможливо)"
+
+#, c-format
+msgid "E935: invalid submatch number: %d"
+msgstr "E935: неправильний номер групи співпадіння: %d"
+
+msgid "Can only call this function in an unmodified buffer"
+msgstr "Цю функцію можна викликати тільки у незміненому буфері"
+
+#, c-format
+msgid "E5060: Unknown flag: %s"
+msgstr "E5060: Невідомий прапорець: %s"
+
+msgid "E482: Can't open file with an empty name"
+msgstr "E482: Не вдалося відкрити файл з порожнім ім’ям"
+
+#, c-format
+msgid "E482: Can't open file %s for writing: %s"
+msgstr "E482: Не вдалося відкрити файл %s для запису: %s"
+
+#, c-format
+msgid "E80: Error when closing file %s: %s"
+msgstr "E80: Помилка при закритті файлу %s: %s"
+
+#, c-format
msgid "E5142: Failed to open file %s: %s"
msgstr "E5142: Не вдалося відкрити файл %s: %s"
@@ -1199,6 +1164,9 @@ msgstr "E745: Очікується Number чи String, трапився List"
msgid "E728: Expected a Number or a String, Dictionary found"
msgstr "E728: Очікується Number чи String, трапився Dictionary"
+msgid "E5299: Expected a Number or a String, Boolean found"
+msgstr "E5299: Очікується Number чи String, трапився Boolean"
+
msgid "E5300: Expected a Number or a String"
msgstr "E5300: Очікується Number чи String"
@@ -1235,12 +1203,151 @@ msgstr "E893: List вжито як Float"
msgid "E894: Using a Dictionary as a Float"
msgstr "E894: Dictionary вжито як Float"
+msgid "E362: Using a boolean value as a Float"
+msgstr "E362: Використано логічне значення як Float"
+
msgid "E907: Using a special value as a Float"
msgstr "E907: Використано спеціальне значення як Float"
msgid "E808: Number or Float required"
msgstr "E808: Треба вказати Number чи Float"
+#, c-format
+msgid "E122: Function %s already exists, add ! to replace it"
+msgstr "E122: Функція %s уже існує, ! щоб замінити"
+
+msgid "E717: Dictionary entry already exists"
+msgstr "E717: Запис у словнику вже існує"
+
+msgid "E718: Funcref required"
+msgstr "E718: Треба посилання на функцію"
+
+#, c-format
+msgid "E130: Unknown function: %s"
+msgstr "E130: Невідома функція: %s"
+
+#, c-format
+msgid "E125: Illegal argument: %s"
+msgstr "E125: Недозволений аргумент: %s"
+
+#, c-format
+msgid "E853: Duplicate argument name: %s"
+msgstr "E853: Назва аргументу повторюється: %s"
+
+#, c-format
+msgid "E740: Too many arguments for function %s"
+msgstr "E740: Забагато аргументів для функції %s"
+
+#, c-format
+msgid "E116: Invalid arguments for function %s"
+msgstr "E116: Неправильні аргументи функції %s"
+
+msgid "E132: Function call depth is higher than 'maxfuncdepth'"
+msgstr "E132: Глибина викликів функції перевищує 'maxfuncdepth'"
+
+#, c-format
+msgid "calling %s"
+msgstr "викликається %s"
+
+#, c-format
+msgid "%s aborted"
+msgstr "%s припинено"
+
+#, c-format
+msgid "%s returning #%<PRId64>"
+msgstr "%s повертає #%<PRId64>"
+
+#, c-format
+msgid "%s returning %s"
+msgstr "%s повертає %s"
+
+#, c-format
+msgid "continuing in %s"
+msgstr "продовження в %s"
+
+msgid "E699: Too many arguments"
+msgstr "E699: Забагато аргументів"
+
+#, c-format
+msgid "E117: Unknown function: %s"
+msgstr "E117: Невідома функція: %s"
+
+#, c-format
+msgid "E933: Function was deleted: %s"
+msgstr "E933: Функцію було видалено: %s"
+
+#, c-format
+msgid "E119: Not enough arguments for function: %s"
+msgstr "E119: Замало аргументів для функції %s"
+
+#, c-format
+msgid "E120: Using <SID> not in a script context: %s"
+msgstr "E120: <SID> використовується не у контексті скрипту: %s"
+
+#, c-format
+msgid "E725: Calling dict function without Dictionary: %s"
+msgstr "E725: Виклик dict-функції без словника: %s"
+
+msgid "E129: Function name required"
+msgstr "E129: Не вказано назву функції"
+
+#, c-format
+msgid "E128: Function name must start with a capital or \"s:\": %s"
+msgstr "E128: Назва функції має починатися з великої літери або \"s:\": %s"
+
+#, c-format
+msgid "E884: Function name cannot contain a colon: %s"
+msgstr "E884: Назва функції не може містити двокрапку: %s"
+
+#, c-format
+msgid "E123: Undefined function: %s"
+msgstr "E123: Невизначена функція: %s"
+
+#, c-format
+msgid "E124: Missing '(': %s"
+msgstr "E124: Бракує '(': %s"
+
+msgid "E862: Cannot use g: here"
+msgstr "E862: Тут не можна використати g:"
+
+#, c-format
+msgid "E932: Closure function should not be at top level: %s"
+msgstr "E932: Функція замикання не може бути на верхньому рівні: %s"
+
+msgid "E126: Missing :endfunction"
+msgstr "E126: Бракує :endfunction"
+
+#, c-format
+msgid "W22: Text found after :endfunction: %s"
+msgstr "W22: Трапився текст після :endfunction: %s"
+
+#, c-format
+msgid "E707: Function name conflicts with variable: %s"
+msgstr "E707: Назва функції співпадає зі змінною: %s"
+
+#, c-format
+msgid "E127: Cannot redefine function %s: It is in use"
+msgstr "E127: Не вдалося перевизначити функцію %s: вона використовується"
+
+#, c-format
+msgid "E746: Function name does not match script file name: %s"
+msgstr "E746: Назва функції не збігається з назвою файлу скрипту: %s"
+
+#, c-format
+msgid "E131: Cannot delete function %s: It is in use"
+msgstr "E131: Не вдалося знищити функцію %s: Вона використовується"
+
+#, c-format
+msgid "Cannot delete function %s: It is being used internally"
+msgstr "Не вдалося знищити функцію %s: Вона використовується"
+
+msgid "E133: :return not inside a function"
+msgstr "E133: :return поза межами функції"
+
+#, c-format
+msgid "E107: Missing parentheses: %s"
+msgstr "E107: Пропущено дужки: %s"
+
msgid "tcp address must be host:port"
msgstr "адреса tcp має бути вузол:порт"
@@ -1306,7 +1413,7 @@ msgstr "E140: Використайте ! для запису частини бу
#, c-format
msgid "Overwrite existing file \"%s\"?"
-msgstr "Переписати існуючий файл «%s»?"
+msgstr "Переписати наявний файл «%s»?"
#, c-format
msgid "Swap file \"%s\" exists, overwrite anyway?"
@@ -1352,8 +1459,9 @@ msgstr "E143: Автокоманди несподівано знищили но
msgid "E144: non-numeric argument to :z"
msgstr "E144: нечисловий аргумент для :z"
-msgid "E145: Shell commands not allowed in restricted mode"
-msgstr "E145: У обмеженому режимі не дозволені команди оболонки"
+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: Регулярні вирази не можна розділяти літерами"
@@ -1439,48 +1547,6 @@ msgstr "E154: Повторення мітки «%s» у файлі %s/%s"
msgid "E150: Not a directory: %s"
msgstr "E150: Не є каталогом: %s"
-#, c-format
-msgid "E160: Unknown sign command: %s"
-msgstr "E160: Невідома команда надпису: %s"
-
-msgid "E156: Missing sign name"
-msgstr "E156: Пропущено назву надпису"
-
-msgid "E612: Too many signs defined"
-msgstr "E612: Визначено забагато надписів"
-
-#, c-format
-msgid "E239: Invalid sign text: %s"
-msgstr "E239: Некоректний надпис: %s"
-
-#, c-format
-msgid "E155: Unknown sign: %s"
-msgstr "E155: Невідомий надпис: %s"
-
-msgid "E159: Missing sign number"
-msgstr "E159: Пропущено номер надпису"
-
-#, c-format
-msgid "E158: Invalid buffer name: %s"
-msgstr "E158: Некоректна назва буфера: %s"
-
-msgid "E934: Cannot jump to a buffer that does not have a name"
-msgstr "E934: Не можна перейти до буфера без назви"
-
-#, c-format
-msgid "E157: Invalid sign ID: %<PRId64>"
-msgstr "E157: Неправильний ID надпису: %<PRId64>"
-
-#, c-format
-msgid "E885: Not possible to change sign %s"
-msgstr "E885: Неможливо змінити знак %s"
-
-msgid " (not supported)"
-msgstr " (не підтримується)"
-
-msgid "[Deleted]"
-msgstr "[Знищено]"
-
msgid "No old files"
msgstr "Жодного старого файлу"
@@ -1545,6 +1611,9 @@ msgstr "E164: Це вже найперший файл"
msgid "E165: Cannot go beyond last file"
msgstr "E165: Це вже останній файл"
+msgid "E610: No argument to delete"
+msgstr "E610: Немає аргументів для знищення"
+
#, c-format
msgid "E666: compiler not supported: %s"
msgstr "E666: Компілятор не підтримується: %s"
@@ -1562,6 +1631,10 @@ msgid "not found in '%s': \"%s\""
msgstr "не знайдено в '%s': «%s»"
#, c-format
+msgid ":source error parsing command %s"
+msgstr ":source помилка розбору команди %s"
+
+#, c-format
msgid "Cannot source a directory: \"%s\""
msgstr "Не вдалося прочитати каталог: «%s»"
@@ -1607,6 +1680,9 @@ msgstr "Lua"
msgid "API client (channel id %<PRIu64>)"
msgstr "Клієнт API (канал «%<PRIu64>»)"
+msgid "anonymous :source"
+msgstr "анонімний :source"
+
msgid "W15: Warning: Wrong line separator, ^M may be missing"
msgstr "W15: Застереження: Неправильний роздільник рядків, можливо, бракує ^M"
@@ -1652,6 +1728,9 @@ msgstr "E464: Неоднозначний вжиток команди корис
msgid "E492: Not an editor command"
msgstr "E492: Це не команда редактора"
+msgid "E981: Command not allowed in restricted mode"
+msgstr "E981: Команду не дозволено у обмеженому режимі"
+
msgid "E493: Backwards range given"
msgstr "E493: Інтервал задано навиворіт"
@@ -1661,6 +1740,9 @@ msgstr "Інтервал задано навиворіт, щоб помінят
msgid "E494: Use w or w>>"
msgstr "E494: Спробуйте w або w>>"
+msgid "E943: Command table needs to be updated, run 'make'"
+msgstr "E943: Потрібно поновити таблицю команд, запустіть 'make'"
+
msgid "E319: The command is not available in this version"
msgstr "E319: Вибачте, цієї команди немає у цій версії"
@@ -1678,15 +1760,16 @@ msgstr "E173: Залишилося відредагувати ще один фа
msgid "E173: %<PRId64> more files to edit"
msgstr "E173: Залишилося %<PRId64> не редагованих файлів"
-msgid "E174: Command already exists: add ! to replace it"
-msgstr "E174: Команда вже існує, ! щоб замінити її"
+#, c-format
+msgid "E174: Command already exists: add ! to replace it: %s"
+msgstr "E174: Команда вже існує, ! щоб замінити її: %s"
msgid ""
"\n"
-" Name Args Address Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" Назва Арг. Адреса Доповнення Визначення"
+" Назва Арг. Адреса Доповнення Визначення"
msgid "No user-defined commands found"
msgstr "Не знайдено команд користувача"
@@ -1805,6 +1888,9 @@ msgstr "E498: Немає назви файлу :source для заміни «<sf
msgid "E842: no line number to use for \"<slnum>\""
msgstr "E842: немає номера рядка, щоб використати з «<sfile>»"
+msgid "E961: no line number to use for \"<sflnum>\""
+msgstr "E961: немає номера рядка, щоб використати з «<sflnum>»"
+
#, c-format
msgid "E499: Empty file name for '%' or '#', only works with \":p:h\""
msgstr "E499: Назва файлу для '%' чи '#' порожня, працює лише з «:p:h»"
@@ -1962,9 +2048,6 @@ msgstr " тип файлу\n"
msgid "'history' option is zero"
msgstr "Опція 'history' порожня"
-msgid "E198: cmd_pchar beyond the command length"
-msgstr "E198: cmd_pchar поза межами команди"
-
msgid "E199: Active window or buffer deleted"
msgstr "E199: Активне вікно або буфер було знищено"
@@ -2007,9 +2090,6 @@ msgstr "каталог"
msgid "is not a file"
msgstr "не файл"
-msgid "[New File]"
-msgstr "[Новий файл]"
-
msgid "[New DIRECTORY]"
msgstr "[Новий каталог]"
@@ -2043,6 +2123,9 @@ msgstr "[спец. символьний]"
msgid "[CR missing]"
msgstr "[Бракує CR]"
+msgid "[long lines split]"
+msgstr "[довгі рядки розбито]"
+
msgid "[NOT converted]"
msgstr "[НЕ конвертовано]"
@@ -2069,6 +2152,12 @@ msgstr "Конвертація з 'charconvert' не вдалася"
msgid "can't read output of 'charconvert'"
msgstr "не вдалося прочитати вивід 'charconvert'"
+msgid "[New File]"
+msgstr "[Новий файл]"
+
+msgid "[New]"
+msgstr "[Новий]"
+
msgid "E676: No matching autocommands for acwrite buffer"
msgstr "E676: Немає відповідних автокоманд"
@@ -2087,15 +2176,6 @@ msgstr "лише для читання (! щоб не зважати)"
msgid "E506: Can't write to backup file (add ! to override)"
msgstr "E506: Не вдалося записати резервний файл (! щоб не зважати)"
-#, c-format
-msgid "E507: Close error for backup file (add ! to override): %s"
-msgstr "E507: Помилка закриття резервного файлу (! щоб не зважати): %s"
-
-msgid "E508: Can't read file for backup (add ! to override)"
-msgstr ""
-"E508: Не вдалося прочитати файл щоб створити резервну копію (! щоб не "
-"зважати)"
-
msgid "E509: Cannot create backup file (add ! to override)"
msgstr "E509: Не вдалося створити резервну копію (! щоб не зважати)"
@@ -2116,10 +2196,6 @@ msgid "E212: Can't open file for writing: %s"
msgstr "E212: Не вдалося відкрити файл для запису: %s"
#, c-format
-msgid "E667: Fsync failed: %s"
-msgstr "E667: Не вдалося виконати fsync: %s"
-
-#, c-format
msgid "E512: Close failed: %s"
msgstr "E512: Не вдалося закрити: %s"
@@ -2142,9 +2218,6 @@ msgstr " у рядку %<PRId64>;"
msgid "[Device]"
msgstr "[Пристрій]"
-msgid "[New]"
-msgstr "[Новий]"
-
msgid " [a]"
msgstr "[д]"
@@ -2461,6 +2534,18 @@ msgid "E475: Invalid argument: %s"
msgstr "E475: Некоректний аргумент: %s"
#, c-format
+msgid "E475: Invalid value for argument %s"
+msgstr "E475: Некоректне значення аргументу %s"
+
+#, c-format
+msgid "E475: Invalid value for argument %s: %s"
+msgstr "E475: Некоректне значення аргументу %s: %s"
+
+#, c-format
+msgid "E983: Duplicate argument: %s"
+msgstr "E983: Аргумент повторюється: %s"
+
+#, c-format
msgid "E15: Invalid expression: %s"
msgstr "E15: Неправильний вираз: %s"
@@ -2512,6 +2597,10 @@ msgid "E364: Library call failed for \"%s()\""
msgstr "E364: Бібліотечний виклик до «%s()» не вдався"
#, c-format
+msgid "E667: Fsync failed: %s"
+msgstr "E667: Не вдалося виконати fsync: %s"
+
+#, c-format
msgid "E739: Cannot create directory %s: %s"
msgstr "E739: Не вдалося створити каталог %s: %s"
@@ -2589,12 +2678,6 @@ msgstr "E484: Не вдалося відкрити файл %s: %s"
msgid "E485: Can't read file %s"
msgstr "E485: Не вдалося прочитати файл %s"
-msgid "E37: No write since last change (add ! to override)"
-msgstr "E37: Зміни не було записано (! щоб не зважати)"
-
-msgid "E37: No write since last change"
-msgstr "E37: Не записано після останніх змін"
-
msgid "E38: Null argument"
msgstr "E38: Відсутній аргумент"
@@ -2636,6 +2719,28 @@ msgstr "E44: Зіпсована програма регулярних вираз
msgid "E45: 'readonly' option is set (add ! to override)"
msgstr "E45: Встановлено опцію 'readonly' (! щоб не зважати)"
+#, c-format
+msgid "E46: Cannot change read-only variable \"%.*s\""
+msgstr "E46: Змінна тільки для читання: «%.*s»"
+
+msgid "E715: Dictionary required"
+msgstr "E715: Потрібен словник"
+
+#, c-format
+msgid "E118: Too many arguments for function: %s"
+msgstr "E118: Забагато аргументів для функції: %s"
+
+#, c-format
+msgid "E716: Key not present in Dictionary: %s"
+msgstr "E716: Немає такого ключа у словнику: %s"
+
+msgid "E714: List required"
+msgstr "E714: Потрібен список"
+
+#, c-format
+msgid "E712: Argument of %s must be a List or Dictionary"
+msgstr "E712: Аргумент у %s має бути списком чи словником"
+
msgid "E47: Error while reading errorfile"
msgstr "E47: Помилка читання файлу помилок"
@@ -2756,12 +2861,29 @@ msgstr "E5521: Заміна клавіш <Cmd> має закінчуватися
msgid "E5522: <Cmd> mapping must not include %s key"
msgstr "E5522: Заміна клавіш <Cmd> не може містити ключ %s"
+#, c-format
+msgid "E5555: API call: %s"
+msgstr "E5555: виклик API: %s"
+
+#, c-format
+msgid "E5560: %s must not be called in a lua loop callback"
+msgstr "E5560: %s має бути викликане у контексті циклу lua"
+
+msgid "E5601: Cannot close window, only floating window would remain"
+msgstr "E5601: Не вдалося закрити вікно, залишилося б тільки плавуче вікно"
+
+msgid "E5602: Cannot exchange or rotate float"
+msgstr "E5602: Не можна обміняти чи покрутити плавуче вікно"
+
msgid "search hit TOP, continuing at BOTTOM"
msgstr "Пошук дійшов до ПОЧАТКУ, продовжується з КІНЦЯ"
msgid "search hit BOTTOM, continuing at TOP"
msgstr "Пошук дійшов до КІНЦЯ, продовжується з ПОЧАТКУ"
+msgid " line "
+msgstr " рядок "
+
msgid "E550: Missing colon"
msgstr "E550: Пропущено двокрапку"
@@ -3032,6 +3154,14 @@ msgid "E5102: Lua failed to grow stack to %i"
msgstr "E5102: Lua не вдалося збільшити стек до %i"
#, c-format
+msgid "Error executing vim.schedule lua callback: %.*s"
+msgstr "Помилка виконання обробника lua vim.schedule: %.*s"
+
+#, c-format
+msgid "E5106: Error while creating shared module: %.*s"
+msgstr "E5106: Помилка створення розділюваного модуля: %.*s"
+
+#, c-format
msgid "E5106: Error while creating vim module: %.*s"
msgstr "E5106: Помилка створення модуля vim: %.*s"
@@ -3043,14 +3173,6 @@ msgid "E5117: Error while updating package paths: %.*s"
msgstr "E5117: Помилка оновлення шляхів пакунку: %.*s"
#, c-format
-msgid "E5104: Error while creating lua chunk: %.*s"
-msgstr "E5104: Помилка створення шматку lua: %.*s"
-
-#, c-format
-msgid "E5105: Error while calling lua chunk: %.*s"
-msgstr "E5105: Помилка виклику шматку lua: %.*s"
-
-#, c-format
msgid "E5114: Error while converting print argument #%i: %.*s"
msgstr "E5114: Не вдалося перетворити аргумент #%i друку: %.*s"
@@ -3063,27 +3185,31 @@ msgid "E5116: Error while calling debug string: %.*s"
msgstr "E5116: Помилка виклику налагодження: %.*s"
#, c-format
-msgid "E5107: Error while creating lua chunk for luaeval(): %.*s"
-msgstr "E5107: Помилка створення шматку lua для luaeval(): %.*s"
+msgid "E5107: Error loading lua %.*s"
+msgstr "E5107: Помилка завантаження lua %.*s"
#, c-format
-msgid "E5108: Error while calling lua chunk for luaeval(): %.*s"
-msgstr "E5108: Помилка виклику шматку lua для luaeval(): %.*s"
+msgid "E5108: Error executing lua %.*s"
+msgstr "E5108: Помилка виконання lua %.*s"
+
+#, c-format
+msgid "Error executing lua callback: %.*s"
+msgstr "Помилка виконання обробника lua: %.*s"
msgid "cannot save undo information"
msgstr "Не вдалося записати інформацію повернення"
#, c-format
-msgid "E5109: Error while creating lua chunk: %.*s"
-msgstr "E5109: Помилка створення шматку lua: %.*s"
+msgid "E5109: Error loading lua: %.*s"
+msgstr "E5109: Помилка завантаження lua: %.*s"
#, c-format
-msgid "E5110: Error while creating lua function: %.*s"
-msgstr "E5110: Помилка створення функції lua: %.*s"
+msgid "E5110: Error executing lua: %.*s"
+msgstr "E5110: Помилка виконання lua: %.*s"
#, c-format
-msgid "E5111: Error while calling lua function: %.*s"
-msgstr "E5111: Помилка виклику функції lua: %.*s"
+msgid "E5111: Error calling lua: %.*s"
+msgstr "E5111: Помилка виклику lua: %.*s"
#, c-format
msgid "E5112: Error while creating lua chunk: %.*s"
@@ -3093,6 +3219,10 @@ msgstr "E5112: Помилка створення шматку lua: %.*s"
msgid "E5113: Error while calling lua chunk: %.*s"
msgstr "E5113: Помилка виклику шматку lua: %.*s"
+#, c-format
+msgid "Error executing vim.log_keystroke lua callback: %.*s"
+msgstr "Помилка виконання обробника lua vim.log_keystroke: %.*s"
+
msgid "Argument missing after"
msgstr "Пропущено аргумент після"
@@ -3123,6 +3253,9 @@ msgstr "Не вдалося відкрити для читання: \"%s\": %s\n
msgid "Cannot open for script output: \""
msgstr "Не вдалося відкрити як вихідний файл: \""
+msgid "--embed conflicts with -es/-Es"
+msgstr "--embed конфліктує з -es/-Es"
+
msgid "pre-vimrc command line"
msgstr "команди перед vimrc"
@@ -3567,8 +3700,8 @@ msgid "E315: ml_get: invalid lnum: %<PRId64>"
msgstr "E315: ml_get: неправильний lnum: %<PRId64>"
#, c-format
-msgid "E316: ml_get: cannot find line %<PRId64>"
-msgstr "E316: ml_get: не знайшов рядок %<PRId64>"
+msgid "E316: ml_get: cannot find line %<PRId64> in buffer %d %s"
+msgstr "E316: ml_get: не знайшов рядок %<PRId64> у буфері %d %s"
msgid "E317: pointer block id wrong 3"
msgstr "E317: Вказівник блоку помилковий 3"
@@ -3666,6 +3799,9 @@ msgstr ""
"»,\n"
" щоб позбутися цього повідомлення.\n"
+msgid "Found a swap file that is not useful, deleting it"
+msgstr "Знайдено файл обміну, яким не можна скористатися, знищення"
+
msgid "Swap file \""
msgstr "Файл обміну «"
@@ -3750,6 +3886,10 @@ msgstr ""
"\n"
"--- Меню ---"
+#, c-format
+msgid "E335: Menu not defined for %s mode"
+msgstr "E335: Для режиму %s меню не визначено"
+
msgid "E333: Menu path must lead to a menu item"
msgstr "E333: Шлях повинен вести до елемента меню"
@@ -3758,10 +3898,6 @@ msgid "E334: Menu not found: %s"
msgstr "E334: Меню не знайдено: %s"
#, c-format
-msgid "E335: Menu not defined for %s mode"
-msgstr "E335: Для режиму %s меню не визначено"
-
-#, c-format
msgid "Error detected while processing %s:"
msgstr "Виявлено помилку під час виконання %s:"
@@ -3821,9 +3957,6 @@ msgstr ""
"&D:Жодного\n"
"&C:Скасувати"
-msgid "W10: Warning: Changing a readonly file"
-msgstr "W10: Застереження: Змінюється файл призначений лише для читання"
-
msgid "Type number and <Enter> or click with mouse (empty cancels): "
msgstr "Наберіть число й <Enter> чи клацніть мишкою (порожнє скасовує): "
@@ -3856,9 +3989,6 @@ msgstr "E349: Немає ідентифікатора над курсором"
msgid "E774: 'operatorfunc' is empty"
msgstr "E774: 'operatorfunc' порожня"
-msgid "Warning: terminal cannot highlight"
-msgstr "Застереження: Термінал не підтримує кольори"
-
msgid "E348: No string under cursor"
msgstr "E348: Немає рядка на курсорі"
@@ -3878,6 +4008,10 @@ msgid "Type :qa! and press <Enter> to abandon all changes and exit Nvim"
msgstr ""
"Введіть :qa! і натисність <Enter> щоб відкинути всі зміни і вийти Nvim"
+msgid "Type :qa and press <Enter> to exit Nvim"
+msgstr ""
+"Введіть :qa і натисність <Enter> щоб вийти з Nvim"
+
#, c-format
msgid "1 line %sed 1 time"
msgstr "Один рядок %s-но"
@@ -3998,6 +4132,9 @@ msgstr "E518: Невідома опція"
msgid "E520: Not allowed in a modeline"
msgstr "E520: Не дозволено у modeline"
+msgid "E992: Not allowed in a modeline when 'modelineexpr' is off"
+msgstr "E992: Не дозволено у modeline, коли вимкнено 'modelineexpr'"
+
msgid "E846: Key code not set"
msgstr "E846: Код ключа не встановлено"
@@ -4144,24 +4281,16 @@ msgstr ""
msgid "E5677: Error writing input to shell-command: %s"
msgstr "E5677: Не вдалося записати на вхід команди оболонки: %s"
-msgid ""
-"\n"
-"Could not get security context for "
-msgstr ""
-"\n"
-"Не вдалося отримати контекст безпеки для "
-
-msgid ""
-"\n"
-"Could not set security context for "
-msgstr ""
-"\n"
-"Не вдалося встановити контекст безпеки для "
-
#, c-format
msgid "E447: Can't find file \"%s\" in path"
msgstr "E447: Файл «%s» не знайдено у шляху пошуку"
+msgid "E553: No more items"
+msgstr "E553: Немає більше елементів"
+
+msgid "E926: Current location list was changed"
+msgstr "E926: Цей список місць було змінено"
+
#, c-format
msgid "E372: Too many %%%c in format string"
msgstr "E372: Забагато %%%c у рядку формату"
@@ -4191,18 +4320,12 @@ msgstr "E378: 'errorformat' не містить зразок"
msgid "E379: Missing or empty directory name"
msgstr "E379: Пропущена чи порожня назва каталогу"
-msgid "E553: No more items"
-msgstr "E553: Немає більше елементів"
-
msgid "E924: Current window was closed"
msgstr "E924: Активне вікно було закрито"
msgid "E925: Current quickfix was changed"
msgstr "E925: Цей quickfix було змінено"
-msgid "E926: Current location list was changed"
-msgstr "E926: Цей список місць було змінено"
-
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d з %d)%s%s: "
@@ -4223,9 +4346,6 @@ msgstr "E381: Вершина стеку виправлень"
msgid "No entries"
msgstr "Нічого"
-msgid "E382: Cannot write, 'buftype' option is set"
-msgstr "E382: Не можу записати, вказана опція 'buftype'"
-
msgid "E683: File name missing or invalid pattern"
msgstr "E683: Пропущено назву файлу чи некоректний шаблон"
@@ -4279,6 +4399,12 @@ msgstr "E69: Пропущено ] після %s%%["
msgid "E70: Empty %s%%[]"
msgstr "E70: %s%%[] порожній"
+msgid "E956: Cannot use pattern recursively"
+msgstr "E956: Не можна рекурсивно використати шаблон"
+
+msgid "E65: Illegal back reference"
+msgstr "E65: Некоректне зворотнє посилання"
+
msgid "E339: Pattern too long"
msgstr "E339: Зразок занадто довгий"
@@ -4315,9 +4441,6 @@ msgstr "E63: Некоректно вжито \\_"
msgid "E64: %s%c follows nothing"
msgstr "E64: Після %s%c нічого немає"
-msgid "E65: Illegal back reference"
-msgstr "E65: Некоректне зворотнє посилання"
-
msgid "E68: Invalid character after \\z"
msgstr "E68: Неправильний символ після \\z"
@@ -4658,6 +4781,63 @@ msgstr ""
"Помилка при читанні файлу ShaDa: список буферів у позиції %<PRIu64> містить "
"поле, яке не має назву файлу"
+msgid "[Deleted]"
+msgstr "[Знищено]"
+
+msgid ""
+"\n"
+"--- Signs ---"
+msgstr ""
+"\n"
+"--- Позначки ---"
+
+#, c-format
+msgid "Signs for %s:"
+msgstr "Позначки для %s:"
+
+#, c-format
+msgid " group=%s"
+msgstr " група=%s"
+
+#, c-format
+msgid " line=%ld id=%d%s name=%s priority=%d"
+msgstr " рядок=%ld id=%d%s назва=%s пріоритет=%d"
+
+msgid "E612: Too many signs defined"
+msgstr "E612: Визначено забагато надписів"
+
+#, c-format
+msgid "E239: Invalid sign text: %s"
+msgstr "E239: Некоректний надпис: %s"
+
+#, c-format
+msgid "E155: Unknown sign: %s"
+msgstr "E155: Невідомий надпис: %s"
+
+#, c-format
+msgid "E885: Not possible to change sign %s"
+msgstr "E885: Неможливо змінити знак %s"
+
+msgid "E159: Missing sign number"
+msgstr "E159: Пропущено номер надпису"
+
+#, c-format
+msgid "E157: Invalid sign ID: %<PRId64>"
+msgstr "E157: Неправильний ID надпису: %<PRId64>"
+
+msgid "E934: Cannot jump to a buffer that does not have a name"
+msgstr "E934: Не можна перейти до буфера без назви"
+
+#, c-format
+msgid "E160: Unknown sign command: %s"
+msgstr "E160: Невідома команда надпису: %s"
+
+msgid "E156: Missing sign name"
+msgstr "E156: Пропущено назву надпису"
+
+msgid " (not supported)"
+msgstr " (не підтримується)"
+
msgid "E759: Format error in spell file"
msgstr "E759: Помилка формату у файлі орфографії"
@@ -4709,12 +4889,6 @@ msgstr "Зайвий текст у %s у рядку %d: %s"
msgid "Affix name too long in %s line %d: %s"
msgstr "Назва афіксу завелика у %s у рядку %d: %s"
-msgid "E761: Format error in affix file FOL, LOW or UPP"
-msgstr "E761: Помилка формату у файлі афіксів FOL, LOW чи UPP"
-
-msgid "E762: Character in FOL, LOW or UPP is out of range"
-msgstr "E762: Символ у FOL, LOW чи UPP поза межами"
-
msgid "Compressing word tree..."
msgstr "Стискується дерево слів..."
@@ -4855,10 +5029,6 @@ msgstr "Повторення символу у MAP у %s у рядку %d"
msgid "Unrecognized or duplicate item in %s line %d: %s"
msgstr "Нерозпізнаний чи повторний елемент у %s у рядку %d: %s"
-#, c-format
-msgid "Missing FOL/LOW/UPP line in %s"
-msgstr "Пропущено рядок FOL/LOW/UPP у %s"
-
msgid "COMPOUNDSYLMAX used without SYLLABLE"
msgstr "Вжито COMPOUNDSYLMAX без SYLLABLE"
@@ -4960,8 +5130,8 @@ msgid "Ignored %d words with non-ASCII characters"
msgstr "Проігноровано %d слів із не-ASCII символами"
#, c-format
-msgid "Compressed %d of %d nodes; %d (%d%%) remaining"
-msgstr "Стиснено %d з %d вузлів; залишилося %d (%d%%)"
+msgid "Compressed %s of %ld nodes; %ld (%ld%%) remaining"
+msgstr "Стиснено %s з %ld вузлів; залишилося %ld (%ld%%)"
msgid "Reading back spell file..."
msgstr "Перечитується файл орфографії..."
@@ -5033,25 +5203,34 @@ msgstr "E807: Очікується аргумент Float для printf()"
msgid "E767: Too many arguments to printf()"
msgstr "E767: Забагато аргументів для printf()"
+#, c-format
+msgid "E390: Illegal argument: %s"
+msgstr "E390: Неправильний аргумент: %s"
+
msgid "No Syntax items defined for this buffer"
msgstr "Для буфера не визначено елементів синтаксису"
+msgid "'redrawtime' exceeded, syntax highlighting disabled"
+msgstr "'redrawtime' перевищено, підсвічування синтаксису вимкнено"
+
msgid "syntax conceal on"
msgstr "синтаксичне приховування увімк"
msgid "syntax conceal off"
msgstr "синтаксичне приховування вимк"
-#, c-format
-msgid "E390: Illegal argument: %s"
-msgstr "E390: Неправильний аргумент: %s"
-
msgid "syntax case ignore"
msgstr "синтаксис ігнорувати регістр"
msgid "syntax case match"
msgstr "синтаксис дотримуватися регістру"
+msgid "syntax foldlevel start"
+msgstr "рівень згортки синтаксису початок"
+
+msgid "syntax foldlevel minimum"
+msgstr "рівень згортки синтаксису мінімум"
+
msgid "syntax spell toplevel"
msgstr "синтаксис перевіряти всюди"
@@ -5064,6 +5243,9 @@ msgstr "синтаксис початково"
msgid "syntax iskeyword "
msgstr "синтаксис iskeyword "
+msgid "syntax iskeyword not set"
+msgstr "не встановлено синтаксис iskeyword"
+
#, c-format
msgid "E391: No such syntax cluster: %s"
msgstr "E391: Немає такого синтаксичного кластера: %s"
@@ -5124,7 +5306,7 @@ msgid "E844: invalid cchar value"
msgstr "E844: Некоректне значення cchar"
msgid "E393: group[t]here not accepted here"
-msgstr "E393: group[t]hete тут неприйнятний"
+msgstr "E393: group[t]here тут неприйнятний"
#, c-format
msgid "E394: Didn't find region item for %s"
@@ -5266,6 +5448,12 @@ msgstr "E555: Кінець стеку міток"
msgid "E556: at top of tag stack"
msgstr "E556: Вершина стеку міток"
+msgid "E986: cannot modify the tag stack within tagfunc"
+msgstr "E986: Не можна змінювати стек міток у tagfunc"
+
+msgid "E987: invalid return value from tagfunc"
+msgstr "E987: Некоректне повернене значення з tagfunc"
+
msgid "E425: Cannot go before first matching tag"
msgstr "E425: Це вже найперша відповідна мітка"
@@ -5273,12 +5461,6 @@ msgstr "E425: Це вже найперша відповідна мітка"
msgid "E426: tag not found: %s"
msgstr "E426: Мітку не знайдено: %s"
-msgid " # pri kind tag"
-msgstr " # прі тип мітка"
-
-msgid "file\n"
-msgstr "файл\n"
-
msgid "E427: There is only one matching tag"
msgstr "E427: Лише одна відповідна мітка"
@@ -5303,6 +5485,12 @@ msgstr " Використано мітку, не розрізняючи вел
msgid "E429: File \"%s\" does not exist"
msgstr "E429: Файл «%s» не існує"
+msgid " # pri kind tag"
+msgstr " # прі тип мітка"
+
+msgid "file\n"
+msgstr "файл\n"
+
msgid ""
"\n"
" # TO tag FROM line in file/text"
@@ -5314,9 +5502,6 @@ msgstr ""
msgid "Searching tags file %s"
msgstr "Шукається у файлі теґів %s"
-msgid "Ignoring long line in tags file"
-msgstr "Ігнорується довгий рядок у файлі з позначками"
-
#, c-format
msgid "E431: Format error in tags file \"%s\""
msgstr "E431: Помилка формату у файлі теґів «%s»"
@@ -5453,10 +5638,6 @@ msgstr "Немає нічого скасовувати"
msgid "number changes when saved"
msgstr "номер зміни час збережено"
-#, c-format
-msgid "%<PRId64> seconds ago"
-msgstr "%<PRId64> секунд тому"
-
msgid "E790: undojoin is not allowed after undo"
msgstr "E790: Не можна виконати undojoin після undo"
@@ -5468,22 +5649,22 @@ msgstr "E440: Відсутній рядок скасування"
msgid ""
"\n"
-"Compiled "
+"\n"
+"Features: "
msgstr ""
"\n"
-"Скомпілював "
-
-msgid "by "
-msgstr " "
+"\n"
+"Характеристики: "
msgid ""
"\n"
-"\n"
-"Features: "
+"Compiled "
msgstr ""
"\n"
-"\n"
-"Характеристики: "
+"Скомпілював "
+
+msgid "by "
+msgstr " "
msgid " system vimrc file: \""
msgstr " системний vimrc: \""
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
index 6b9348e55d..a7d26e2a8e 100644
--- a/src/nvim/spellfile.c
+++ b/src/nvim/spellfile.c
@@ -628,6 +628,7 @@ spell_load_file (
case SP_OTHERERROR: {
emsgf(_("E5042: Failed to read spell file %s: %s"),
fname, strerror(ferror(fd)));
+ goto endFAIL;
}
case 0: {
break;
diff --git a/src/nvim/testdir/check.vim b/src/nvim/testdir/check.vim
index 57a8eb57b8..073873bcb0 100644
--- a/src/nvim/testdir/check.vim
+++ b/src/nvim/testdir/check.vim
@@ -1,6 +1,46 @@
source shared.vim
source term_util.vim
+" Command to check for the presence of a feature.
+command -nargs=1 CheckFeature call CheckFeature(<f-args>)
+func CheckFeature(name)
+ if !has(a:name)
+ throw 'Skipped: ' .. a:name .. ' feature missing'
+ endif
+endfunc
+
+" Command to check for the presence of a working option.
+command -nargs=1 CheckOption call CheckOption(<f-args>)
+func CheckOption(name)
+ if !exists('+' .. a:name)
+ throw 'Skipped: ' .. a:name .. ' option not supported'
+ endif
+endfunc
+
+" Command to check for the presence of a function.
+command -nargs=1 CheckFunction call CheckFunction(<f-args>)
+func CheckFunction(name)
+ if !exists('*' .. a:name)
+ throw 'Skipped: ' .. a:name .. ' function missing'
+ endif
+endfunc
+
+" Command to check for running on MS-Windows
+command CheckMSWindows call CheckMSWindows()
+func CheckMSWindows()
+ if !has('win32')
+ throw 'Skipped: only works on MS-Windows'
+ endif
+endfunc
+
+" Command to check for running on Unix
+command CheckUnix call CheckUnix()
+func CheckUnix()
+ if !has('unix')
+ throw 'Skipped: only works on Unix'
+ endif
+endfunc
+
" Command to check that making screendumps is supported.
" Caller must source screendump.vim
command CheckScreendump call CheckScreendump()
@@ -9,3 +49,19 @@ func CheckScreendump()
throw 'Skipped: cannot make screendumps'
endif
endfunc
+
+" Command to check that we can Run Vim in a terminal window
+command CheckRunVimInTerminal call CheckRunVimInTerminal()
+func CheckRunVimInTerminal()
+ if !CanRunVimInTerminal()
+ throw 'Skipped: cannot run Vim in a terminal window'
+ endif
+endfunc
+
+" Command to check that we can run the GUI
+command CheckCanRunGui call CheckCanRunGui()
+func CheckCanRunGui()
+ if !has('gui') || ($DISPLAY == "" && !has('gui_running'))
+ throw 'Skipped: cannot start the GUI'
+ endif
+endfunc
diff --git a/src/nvim/testdir/runtest.vim b/src/nvim/testdir/runtest.vim
index 4f16aa807c..765ba2cbb6 100644
--- a/src/nvim/testdir/runtest.vim
+++ b/src/nvim/testdir/runtest.vim
@@ -101,6 +101,8 @@ let &runtimepath .= ','.expand($BUILD_DIR).'/runtime/'
" Always use forward slashes.
set shellslash
+let s:t_bold = &t_md
+let s:t_normal = &t_me
if has('win32')
" avoid prompt that is long or contains a line break
let $PROMPT = '$P$G'
@@ -209,7 +211,15 @@ func RunTheTest(test)
let message = 'Executed ' . a:test
if has('reltime')
- let message ..= ' in ' .. reltimestr(reltime(func_start)) .. ' seconds'
+ let message ..= repeat(' ', 50 - len(message))
+ let time = reltime(func_start)
+ if has('float') && reltimefloat(time) > 0.1
+ let message = s:t_bold .. message
+ endif
+ let message ..= ' in ' .. reltimestr(time) .. ' seconds'
+ if has('float') && reltimefloat(time) > 0.1
+ let message ..= s:t_normal
+ endif
endif
call add(s:messages, message)
let s:done += 1
@@ -277,7 +287,9 @@ func FinishTesting()
let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test')
endif
if s:done > 0 && has('reltime')
+ let message = s:t_bold .. message .. repeat(' ', 40 - len(message))
let message ..= ' in ' .. reltimestr(reltime(s:start_time)) .. ' seconds'
+ let message ..= s:t_normal
endif
echo message
call add(s:messages, message)
diff --git a/src/nvim/testdir/shared.vim b/src/nvim/testdir/shared.vim
index 41ff9b2bd6..6180d542ff 100644
--- a/src/nvim/testdir/shared.vim
+++ b/src/nvim/testdir/shared.vim
@@ -271,7 +271,7 @@ func GetVimCommand(...)
let cmd = cmd . ' -u ' . name
endif
let cmd .= ' --headless -i NONE'
- let cmd = substitute(cmd, 'VIMRUNTIME=.*VIMRUNTIME;', '', '')
+ let cmd = substitute(cmd, 'VIMRUNTIME=\S\+', '', '')
" If using valgrind, make sure every run uses a different log file.
if cmd =~ 'valgrind.*--log-file='
@@ -329,7 +329,3 @@ func RunVimPiped(before, after, arguments, pipecmd)
endif
return 1
endfunc
-
-func CanRunGui()
- return has('gui') && ($DISPLAY != "" || has('gui_running'))
-endfunc
diff --git a/src/nvim/testdir/test_diffmode.vim b/src/nvim/testdir/test_diffmode.vim
index a1f1dd3bab..f09a64c329 100644
--- a/src/nvim/testdir/test_diffmode.vim
+++ b/src/nvim/testdir/test_diffmode.vim
@@ -724,10 +724,140 @@ func Test_diff_lastline()
bwipe!
endfunc
+func Test_diff_screen()
+ CheckScreendump
+ CheckFeature menu
+
+ " clean up already existing swap files, just in case
+ call delete('.Xfile1.swp')
+ call delete('.Xfile2.swp')
+
+ " Test 1: Add a line in beginning of file 2
+ call WriteDiffFiles(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ let buf = RunVimInTerminal('-d Xfile1 Xfile2', {})
+ " Set autoread mode, so that Vim won't complain once we re-write the test
+ " files
+ call term_sendkeys(buf, ":set autoread\<CR>\<c-w>w:set autoread\<CR>\<c-w>w")
+
+ call VerifyBoth(buf, 'Test_diff_01', '')
+
+ " Test 2: Add a line in beginning of file 1
+ call WriteDiffFiles(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ call VerifyBoth(buf, 'Test_diff_02', '')
+
+ " Test 3: Add a line at the end of file 2
+ call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
+ call VerifyBoth(buf, 'Test_diff_03', '')
+
+ " Test 4: Add a line at the end of file 1
+ call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ call VerifyBoth(buf, 'Test_diff_04', '')
+
+ " Test 5: Add a line in the middle of file 2, remove on at the end of file 1
+ call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10])
+ call VerifyBoth(buf, 'Test_diff_05', '')
+
+ " Test 6: Add a line in the middle of file 1, remove on at the end of file 2
+ call WriteDiffFiles(buf, [1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
+ call VerifyBoth(buf, 'Test_diff_06', '')
+
+ " Variants on test 6 with different context settings
+ call term_sendkeys(buf, ":set diffopt+=context:2\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_06.2', {})
+ call term_sendkeys(buf, ":set diffopt-=context:2\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=context:1\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_06.1', {})
+ call term_sendkeys(buf, ":set diffopt-=context:1\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=context:0\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_06.0', {})
+ call term_sendkeys(buf, ":set diffopt-=context:0\<cr>")
+
+ " Test 7 - 9: Test normal/patience/histogram diff algorithm
+ call WriteDiffFiles(buf, ['#include <stdio.h>', '', '// Frobs foo heartily', 'int frobnitz(int foo)', '{',
+ \ ' int i;', ' for(i = 0; i < 10; i++)', ' {', ' printf("Your answer is: ");',
+ \ ' printf("%d\n", foo);', ' }', '}', '', 'int fact(int n)', '{', ' if(n > 1)', ' {',
+ \ ' return fact(n-1) * n;', ' }', ' return 1;', '}', '', 'int main(int argc, char **argv)',
+ \ '{', ' frobnitz(fact(10));', '}'],
+ \ ['#include <stdio.h>', '', 'int fib(int n)', '{', ' if(n > 2)', ' {',
+ \ ' return fib(n-1) + fib(n-2);', ' }', ' return 1;', '}', '', '// Frobs foo heartily',
+ \ 'int frobnitz(int foo)', '{', ' int i;', ' for(i = 0; i < 10; i++)', ' {',
+ \ ' printf("%d\n", foo);', ' }', '}', '',
+ \ 'int main(int argc, char **argv)', '{', ' frobnitz(fib(10));', '}'])
+ call term_sendkeys(buf, ":diffupdate!\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_07', {})
+
+ call term_sendkeys(buf, ":set diffopt+=algorithm:patience\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_08', {})
+
+ call term_sendkeys(buf, ":set diffopt+=algorithm:histogram\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_09', {})
+
+ " Test 10-11: normal/indent-heuristic
+ call term_sendkeys(buf, ":set diffopt&vim\<cr>")
+ call WriteDiffFiles(buf, ['', ' def finalize(values)', '', ' values.each do |v|', ' v.finalize', ' end'],
+ \ ['', ' def finalize(values)', '', ' values.each do |v|', ' v.prepare', ' end', '',
+ \ ' values.each do |v|', ' v.finalize', ' end'])
+ call term_sendkeys(buf, ":diffupdate!\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_10', {})
+
+ " Leave trailing : at commandline!
+ call term_sendkeys(buf, ":set diffopt+=indent-heuristic\<cr>:\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_11', {}, 'one')
+ " shouldn't matter, if indent-algorithm comes before or after the algorithm
+ call term_sendkeys(buf, ":set diffopt&\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=indent-heuristic,algorithm:patience\<cr>:\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_11', {}, 'two')
+ call term_sendkeys(buf, ":set diffopt&\<cr>")
+ call term_sendkeys(buf, ":set diffopt+=algorithm:patience,indent-heuristic\<cr>:\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_11', {}, 'three')
+
+ " Test 12: diff the same file
+ call WriteDiffFiles(buf, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ call VerifyBoth(buf, 'Test_diff_12', '')
+
+ " Test 13: diff an empty file
+ call WriteDiffFiles(buf, [], [])
+ call VerifyBoth(buf, 'Test_diff_13', '')
+
+ " Test 14: test diffopt+=icase
+ call WriteDiffFiles(buf, ['a', 'b', 'cd'], ['A', 'b', 'cDe'])
+ call VerifyBoth(buf, 'Test_diff_14', " diffopt+=filler diffopt+=icase")
+
+ " Test 15-16: test diffopt+=iwhite
+ call WriteDiffFiles(buf, ['int main()', '{', ' printf("Hello, World!");', ' return 0;', '}'],
+ \ ['int main()', '{', ' if (0)', ' {', ' printf("Hello, World!");', ' return 0;', ' }', '}'])
+ call term_sendkeys(buf, ":diffupdate!\<cr>")
+ call term_sendkeys(buf, ":set diffopt&vim diffopt+=filler diffopt+=iwhite\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_15', {})
+ call term_sendkeys(buf, ":set diffopt+=internal\<cr>")
+ call VerifyScreenDump(buf, 'Test_diff_16', {})
+
+ " Test 17: test diffopt+=iblank
+ call WriteDiffFiles(buf, ['a', ' ', 'cd', 'ef', 'xxx'], ['a', 'cd', '', 'ef', 'yyy'])
+ call VerifyInternal(buf, 'Test_diff_17', " diffopt+=iblank")
+
+ " Test 18: test diffopt+=iblank,iwhite / iwhiteall / iwhiteeol
+ call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhite")
+ call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteall")
+ call VerifyInternal(buf, 'Test_diff_18', " diffopt+=iblank,iwhiteeol")
+
+ " Test 19: test diffopt+=iwhiteeol
+ call WriteDiffFiles(buf, ['a ', 'x', 'cd', 'ef', 'xx xx', 'foo', 'bar'], ['a', 'x', 'c d', ' ef', 'xx xx', 'foo', '', 'bar'])
+ call VerifyInternal(buf, 'Test_diff_19', " diffopt+=iwhiteeol")
+
+ " Test 19: test diffopt+=iwhiteall
+ call VerifyInternal(buf, 'Test_diff_20', " diffopt+=iwhiteall")
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xfile1')
+ call delete('Xfile2')
+endfunc
+
func Test_diff_with_cursorline()
- if !CanRunVimInTerminal()
- throw 'Skipped: cannot run Vim in a terminal window'
- endif
+ CheckScreendump
call writefile([
\ 'hi CursorLine ctermbg=red ctermfg=white',
@@ -751,13 +881,45 @@ func Test_diff_with_cursorline()
call delete('Xtest_diff_cursorline')
endfunc
+func Test_diff_with_syntax()
+ CheckScreendump
+
+ let lines =<< trim END
+ void doNothing() {
+ int x = 0;
+ char *s = "hello";
+ return 5;
+ }
+ END
+ call writefile(lines, 'Xprogram1.c')
+ let lines =<< trim END
+ void doSomething() {
+ int x = 0;
+ char *s = "there";
+ return 5;
+ }
+ END
+ call writefile(lines, 'Xprogram2.c')
+
+ let lines =<< trim END
+ edit Xprogram1.c
+ diffsplit Xprogram2.c
+ END
+ call writefile(lines, 'Xtest_diff_syntax')
+ let buf = RunVimInTerminal('-S Xtest_diff_syntax', {})
+
+ call VerifyScreenDump(buf, 'Test_diff_syntax_1', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xtest_diff_syntax')
+ call delete('Xprogram1.c')
+ call delete('Xprogram2.c')
+endfunc
+
func Test_diff_of_diff()
- if !CanRunVimInTerminal()
- throw 'Skipped: cannot run Vim in a terminal window'
- endif
- if !has("rightleft")
- throw 'Skipped: rightleft not supported'
- endif
+ CheckScreendump
+ CheckFeature rightleft
call writefile([
\ 'call setline(1, ["aa","bb","cc","@@ -3,2 +5,7 @@","dd","ee","ff"])',
diff --git a/src/nvim/testdir/test_display.vim b/src/nvim/testdir/test_display.vim
index 1c2f5a05ff..429253a863 100644
--- a/src/nvim/testdir/test_display.vim
+++ b/src/nvim/testdir/test_display.vim
@@ -6,11 +6,12 @@
" endif
source view_util.vim
+source check.vim
+source screendump.vim
+
+func Test_display_foldcolumn()
+ CheckFeature folding
-func! Test_display_foldcolumn()
- if !has("folding")
- return
- endif
new
vnew
vert resize 25
@@ -26,10 +27,10 @@ func! Test_display_foldcolumn()
call cursor(2, 1)
norm! zt
- let lines=ScreenLines([1,2], winwidth(0))
+ let lines = ScreenLines([1,2], winwidth(0))
call assert_equal(expect, lines)
set fdc=2
- let lines=ScreenLines([1,2], winwidth(0))
+ let lines = ScreenLines([1,2], winwidth(0))
let expect = [
\ " e more noise blah blah<",
\ " 82> more stuff here "
@@ -41,9 +42,8 @@ func! Test_display_foldcolumn()
endfunc
func! Test_display_foldtext_mbyte()
- if !has("folding")
- return
- endif
+ CheckFeature folding
+
call NewWindow(10, 40)
call append(0, range(1,20))
exe "set foldmethod=manual foldtext=foldtext() fillchars=fold:\u2500,vert:\u2502 fdc=2"
@@ -70,6 +70,42 @@ func! Test_display_foldtext_mbyte()
bw!
endfunc
+" check that win_ins_lines() and win_del_lines() work when t_cs is empty.
+func Test_scroll_without_region()
+ CheckScreendump
+
+ let lines =<< trim END
+ call setline(1, range(1, 20))
+ set t_cs=
+ set laststatus=2
+ END
+ call writefile(lines, 'Xtestscroll')
+ let buf = RunVimInTerminal('-S Xtestscroll', #{rows: 10})
+
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_1', {})
+
+ call term_sendkeys(buf, ":3delete\<cr>")
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_2', {})
+
+ call term_sendkeys(buf, ":4put\<cr>")
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_3', {})
+
+ call term_sendkeys(buf, ":undo\<cr>")
+ call term_sendkeys(buf, ":undo\<cr>")
+ call term_sendkeys(buf, ":set laststatus=0\<cr>")
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_4', {})
+
+ call term_sendkeys(buf, ":3delete\<cr>")
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_5', {})
+
+ call term_sendkeys(buf, ":4put\<cr>")
+ call VerifyScreenDump(buf, 'Test_scroll_no_region_6', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('Xtestscroll')
+endfunc
+
func Test_display_listchars_precedes()
set fillchars+=vert:\|
call NewWindow(10, 10)
@@ -125,3 +161,26 @@ func Test_display_listchars_precedes()
set list& listchars& wrap&
bw!
endfunc
+
+" Check that win_lines() works correctly with the number_only parameter=TRUE
+" should break early to optimize cost of drawing, but needs to make sure
+" that the number column is correctly highlighted.
+func Test_scroll_CursorLineNr_update()
+ CheckScreendump
+
+ let lines =<< trim END
+ hi CursorLineNr ctermfg=73 ctermbg=236
+ set nu rnu cursorline cursorlineopt=number
+ exe ":norm! o\<esc>110ia\<esc>"
+ END
+ let filename = 'Xdrawscreen'
+ call writefile(lines, filename)
+ let buf = RunVimInTerminal('-S '.filename, #{rows: 5, cols: 50})
+ call term_sendkeys(buf, "k")
+ call term_wait(buf)
+ call VerifyScreenDump(buf, 'Test_winline_rnu', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete(filename)
+endfunc
diff --git a/src/nvim/testdir/test_textformat.vim b/src/nvim/testdir/test_textformat.vim
index 75673adf0a..2223be952c 100644
--- a/src/nvim/testdir/test_textformat.vim
+++ b/src/nvim/testdir/test_textformat.vim
@@ -1,4 +1,7 @@
" Tests for the various 'formatoptions' settings
+
+source check.vim
+
func Test_text_format()
enew!
@@ -490,6 +493,23 @@ func Test_format_list_auto()
set fo& ai& bs&
endfunc
+func Test_crash_github_issue_5095()
+ CheckFeature autocmd
+
+ " This used to segfault, see https://github.com/vim/vim/issues/5095
+ augroup testing
+ au BufNew x center
+ augroup END
+
+ next! x
+
+ bw
+ augroup testing
+ au!
+ augroup END
+ augroup! testing
+endfunc
+
" Test for formatting multi-byte text with 'fo=t'
func Test_tw_2_fo_t()
new
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 860271d209..3b71066094 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -52,15 +52,10 @@
#define OUTBUF_SIZE 0xffff
#define TOO_MANY_EVENTS 1000000
-#define STARTS_WITH(str, prefix) \
- (strlen(str) >= (sizeof(prefix) - 1) && 0 == memcmp((str), (prefix), \
- sizeof(prefix) - 1))
-#define SCREEN_WRAP(is_screen, seq) ((is_screen) \
- ? DCS_STR seq STERM_STR : seq)
-#define SCREEN_TMUX_WRAP(is_screen, is_tmux, seq) \
- ((is_screen) \
- ? DCS_STR seq STERM_STR : (is_tmux) \
- ? DCS_STR "tmux;\x1b" seq STERM_STR : seq)
+#define STARTS_WITH(str, prefix) (strlen(str) >= (sizeof(prefix) - 1) \
+ && 0 == memcmp((str), (prefix), sizeof(prefix) - 1))
+#define TMUX_WRAP(is_tmux, seq) ((is_tmux) \
+ ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
#define LINUXSET0C "\x1b[?0c"
#define LINUXSET1C "\x1b[?1c"
@@ -1591,10 +1586,6 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
bool mate_pretending_xterm = xterm && colorterm
&& strstr(colorterm, "mate-terminal");
bool true_xterm = xterm && !!xterm_version && !bsdvt;
- bool true_screen = screen && !os_getenv("TMUX");
- bool screen_host_linuxvt =
- terminfo_is_term_family(true_screen && term[6] == '.'
- ? term + 7 : NULL, "linux");
bool cygwin = terminfo_is_term_family(term, "cygwin");
char *fix_normal = (char *)unibi_get_str(ut, unibi_cursor_normal);
@@ -1737,10 +1728,8 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
#define XTERM_SETAB_16 \
"\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e39%;m"
- data->unibi_ext.get_bg =
- (int)unibi_add_ext_str(ut, "ext.get_bg",
- SCREEN_TMUX_WRAP(true_screen,
- tmux, "\x1b]11;?\x07"));
+ data->unibi_ext.get_bg = (int)unibi_add_ext_str(ut, "ext.get_bg",
+ "\x1b]11;?\x07");
// Terminals with 256-colour SGR support despite what terminfo says.
if (unibi_get_num(ut, unibi_max_colors) < 256) {
@@ -1775,32 +1764,6 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
data->unibi_ext.set_cursor_style = unibi_find_ext_str(ut, "Ss");
}
- // GNU Screen does not have Ss/Se. When terminfo has Ss/Se, it is wrapped with
- // DCS because it is inherited from the host terminal.
- if (true_screen) {
- size_t len;
- size_t dcs_st_len = strlen(DCS_STR) + strlen(STERM_STR);
- if (-1 != data->unibi_ext.set_cursor_style) {
- const char *orig_ss =
- unibi_get_ext_str(data->ut, (size_t)data->unibi_ext.reset_cursor_style);
- len = STRLEN(orig_ss) + dcs_st_len + 1;
- char *ss = xmalloc(len);
- snprintf(ss, len, "%s%s%s", DCS_STR, orig_ss, STERM_STR);
- unibi_set_ext_str(data->ut, (size_t)data->unibi_ext.set_cursor_style, ss);
- xfree(ss);
- }
- if (-1 != data->unibi_ext.reset_cursor_style) {
- const char *orig_se =
- unibi_get_ext_str(data->ut, (size_t)data->unibi_ext.reset_cursor_style);
- len = strlen(orig_se) + dcs_st_len + 1;
- char *se = xmalloc(len);
- snprintf(se, len, "%s%s%s", DCS_STR, orig_se, STERM_STR);
- unibi_set_ext_str(data->ut,
- (size_t)data->unibi_ext.reset_cursor_style, se);
- xfree(se);
- }
- }
-
// Dickey ncurses terminfo includes Ss/Se capabilities since 2011-07-14. So
// adding them to terminal types, that have such control sequences but lack
// the correct terminfo entries, is a fixup, not an augmentation.
@@ -1816,11 +1779,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|| (konsolev >= 180770) // #9364
|| tmux // per tmux manual page
// https://lists.gnu.org/archive/html/screen-devel/2013-03/msg00000.html
- || (true_screen
- && (screen_host_linuxvt
- && (xterm_version || (vte_version > 0) || colorterm)))
- // Since GNU Screen does not support DECSCUSR, DECSCUSR is wrapped
- // in DCS and output to the host terminal.
+ || screen
|| st // #7641
|| rxvt // per command.C
// per analysis of VT100Terminal.m
@@ -1833,72 +1792,58 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|| (linuxvt
&& (xterm_version || (vte_version > 0) || colorterm)))) {
data->unibi_ext.set_cursor_style =
- (int)unibi_add_ext_str(ut, "Ss",
- SCREEN_WRAP(true_screen, "\x1b[%p1%d q"));
+ (int)unibi_add_ext_str(ut, "Ss", "\x1b[%p1%d q");
if (-1 == data->unibi_ext.reset_cursor_style) {
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
"");
}
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
- SCREEN_WRAP(true_screen, "\x1b[ q"));
- } else if (linuxvt || screen_host_linuxvt) {
+ "\x1b[ q");
+ } else if (linuxvt) {
// Linux uses an idiosyncratic escape code to set the cursor shape and
// does not support DECSCUSR.
// See http://linuxgazette.net/137/anonymous.html for more info
- //
- // Since gnu Screen does not have Ss/Se, if the host terminal is a linux
- // console that does not support xterm extensions, it will wraps the
- // linux-specific sequence in DCS and outputs it.
- data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(
- ut, "Ss",
- SCREEN_WRAP(true_screen,
- "\x1b[?"
- "%?"
- // The parameter passed to Ss is the DECSCUSR parameter,
- // so the
- // terminal capability has to translate into the Linux
- // idiosyncratic parameter.
- //
- // linuxvt only supports block and underline. It is also
- // only possible to have a steady block (no steady
- // underline)
- "%p1%{2}%<" "%t%{8}" // blink block
- "%e%p1%{2}%=" "%t%{112}" // steady block
- "%e%p1%{3}%=" "%t%{4}" // blink underline (set to half
- // block)
- "%e%p1%{4}%=" "%t%{4}" // steady underline
- "%e%p1%{5}%=" "%t%{2}" // blink bar (set to underline)
- "%e%p1%{6}%=" "%t%{2}" // steady bar
- "%e%{0}" // anything else
- "%;" "%dc"));
+ data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
+ "\x1b[?"
+ "%?"
+ // The parameter passed to Ss is the DECSCUSR parameter, so the
+ // terminal capability has to translate into the Linux idiosyncratic
+ // parameter.
+ //
+ // linuxvt only supports block and underline. It is also only
+ // possible to have a steady block (no steady underline)
+ "%p1%{2}%<" "%t%{8}" // blink block
+ "%e%p1%{2}%=" "%t%{112}" // steady block
+ "%e%p1%{3}%=" "%t%{4}" // blink underline (set to half block)
+ "%e%p1%{4}%=" "%t%{4}" // steady underline
+ "%e%p1%{5}%=" "%t%{2}" // blink bar (set to underline)
+ "%e%p1%{6}%=" "%t%{2}" // steady bar
+ "%e%{0}" // anything else
+ "%;" "%dc");
if (-1 == data->unibi_ext.reset_cursor_style) {
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
"");
}
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
- SCREEN_WRAP(true_screen, "\x1b[?c"));
+ "\x1b[?c");
} else if (konsolev > 0 && konsolev < 180770) {
// Konsole before version 18.07.70: set up a nonce profile. This has
// side-effects on temporary font resizing. #6798
- data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(
- ut, "Ss",
- SCREEN_TMUX_WRAP(true_screen, tmux,
- "\x1b]50;CursorShape=%?"
- "%p1%{3}%<" "%t%{0}" // block
- "%e%p1%{5}%<" "%t%{2}" // underline
- "%e%{1}" // everything else is bar
- "%;%d;BlinkingCursorEnabled=%?"
- "%p1%{1}%<" "%t%{1}" // Fortunately if we exclude
- // zero as special,
- "%e%p1%{1}%&" // in all other c2ses we can treat bit
- // #0 as a flag.
- "%;%d\x07"));
+ data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
+ TMUX_WRAP(tmux, "\x1b]50;CursorShape=%?"
+ "%p1%{3}%<" "%t%{0}" // block
+ "%e%p1%{5}%<" "%t%{2}" // underline
+ "%e%{1}" // everything else is bar
+ "%;%d;BlinkingCursorEnabled=%?"
+ "%p1%{1}%<" "%t%{1}" // Fortunately if we exclude zero as special,
+ "%e%p1%{1}%&" // in all other cases we can treat bit #0 as a flag.
+ "%;%d\x07"));
if (-1 == data->unibi_ext.reset_cursor_style) {
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
"");
}
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
- SCREEN_TMUX_WRAP(true_screen, tmux, "\x1b]50;\x07"));
+ "\x1b]50;\x07");
}
}
}
@@ -1930,10 +1875,6 @@ static void augment_terminfo(TUIData *data, const char *term,
const char *xterm_version = os_getenv("XTERM_VERSION");
bool true_xterm = xterm && !!xterm_version && !bsdvt;
- bool true_screen = screen && !os_getenv("TMUX");
- bool screen_host_rxvt =
- terminfo_is_term_family(true_screen
- && term[6] == '.' ? term + 7 : NULL, "rxvt");
// Only define this capability for terminal types that we know understand it.
if (dtterm // originated this extension
@@ -2000,7 +1941,7 @@ static void augment_terminfo(TUIData *data, const char *term,
// all panes, which is not particularly desirable. A better approach
// would use a tmux control sequence and an extra if(screen) test.
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
- ut, NULL, SCREEN_TMUX_WRAP(true_screen, tmux, "\033]Pl%p1%06x\033\\"));
+ ut, NULL, TMUX_WRAP(tmux, "\033]Pl%p1%06x\033\\"));
} else if ((xterm || rxvt || tmux || alacritty)
&& (vte_version == 0 || vte_version >= 3900)) {
// Supported in urxvt, newer VTE.
@@ -2020,27 +1961,21 @@ static void augment_terminfo(TUIData *data, const char *term,
/// Terminals usually ignore unrecognized private modes, and there is no
/// known ambiguity with these. So we just set them unconditionally.
- /// If the DECSET is not supported by GNU Screen, it is wrapped with DCS and
- /// sent to the host terminal.
data->unibi_ext.enable_lr_margin = (int)unibi_add_ext_str(
ut, "ext.enable_lr_margin", "\x1b[?69h");
data->unibi_ext.disable_lr_margin = (int)unibi_add_ext_str(
ut, "ext.disable_lr_margin", "\x1b[?69l");
data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(
- ut, "ext.enable_bpaste", SCREEN_WRAP(true_screen, "\x1b[?2004h"));
+ ut, "ext.enable_bpaste", "\x1b[?2004h");
data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(
- ut, "ext.disable_bpaste", SCREEN_WRAP(true_screen, "\x1b[?2004l"));
+ ut, "ext.disable_bpaste", "\x1b[?2004l");
// For urxvt send BOTH xterm and old urxvt sequences. #8695
data->unibi_ext.enable_focus_reporting = (int)unibi_add_ext_str(
ut, "ext.enable_focus",
- (rxvt || screen_host_rxvt)
- ? SCREEN_WRAP(true_screen, "\x1b[?1004h\x1b]777;focus;on\x7")
- : SCREEN_WRAP(true_screen, "\x1b[?1004h"));
+ rxvt ? "\x1b[?1004h\x1b]777;focus;on\x7" : "\x1b[?1004h");
data->unibi_ext.disable_focus_reporting = (int)unibi_add_ext_str(
ut, "ext.disable_focus",
- (rxvt || screen_host_rxvt)
- ? SCREEN_WRAP(true_screen, "\x1b[?1004l\x1b]777;focus;off\x7")
- : SCREEN_WRAP(true_screen, "\x1b[?1004l"));
+ rxvt ? "\x1b[?1004l\x1b]777;focus;off\x7" : "\x1b[?1004l");
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(
ut, "ext.enable_mouse", "\x1b[?1002h\x1b[?1006h");
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 0fff93d984..cec0dfd67f 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -6986,7 +6986,7 @@ void win_findbuf(typval_T *argvars, list_T *list)
int bufnr = tv_get_number(&argvars[0]);
FOR_ALL_TAB_WINDOWS(tp, wp) {
- if (wp->w_buffer->b_fnum == bufnr) {
+ if (!wp->w_closing && wp->w_buffer->b_fnum == bufnr) {
tv_list_append_number(list, wp->handle);
}
}