diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | src/nvim/api/vim.c | 6 | ||||
| -rw-r--r-- | src/nvim/ascii.h | 2 | ||||
| -rw-r--r-- | src/nvim/eval.c | 11 | ||||
| -rw-r--r-- | src/nvim/eval/funcs.c | 3 | ||||
| -rw-r--r-- | src/nvim/ex_cmds.c | 13 | ||||
| -rw-r--r-- | src/nvim/ex_cmds2.c | 6 | ||||
| -rw-r--r-- | src/nvim/lua/treesitter.c | 106 | ||||
| -rw-r--r-- | src/nvim/macros.h | 19 | ||||
| -rw-r--r-- | src/nvim/ops.c | 4 | ||||
| -rw-r--r-- | src/nvim/option_defs.h | 1 | ||||
| -rw-r--r-- | src/nvim/options.lua | 9 | ||||
| -rw-r--r-- | src/nvim/os/time.c | 9 | ||||
| -rw-r--r-- | src/nvim/po/check.vim | 1 | ||||
| -rw-r--r-- | src/nvim/po/uk.po | 1197 | ||||
| -rw-r--r-- | src/nvim/spellfile.c | 1 | ||||
| -rw-r--r-- | src/nvim/testdir/check.vim | 56 | ||||
| -rw-r--r-- | src/nvim/testdir/runtest.vim | 14 | ||||
| -rw-r--r-- | src/nvim/testdir/shared.vim | 6 | ||||
| -rw-r--r-- | src/nvim/testdir/test_diffmode.vim | 180 | ||||
| -rw-r--r-- | src/nvim/testdir/test_display.vim | 77 | ||||
| -rw-r--r-- | src/nvim/testdir/test_textformat.vim | 20 | ||||
| -rw-r--r-- | src/nvim/tui/tui.c | 151 | ||||
| -rw-r--r-- | src/nvim/window.c | 2 |
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, ®name, 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, ®type, 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); } } |
