diff options
Diffstat (limited to 'src')
139 files changed, 19177 insertions, 5546 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 2c9d655a15..e4d7115654 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -505,12 +505,10 @@ if(WIN32) set(EXTERNAL_BLOBS_SCRIPT "file(MAKE_DIRECTORY \"${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms\")") foreach(DEP_FILE IN ITEMS - ca-bundle.crt - cat.exe + curl-ca-bundle.crt curl.exe diff.exe tee.exe - tidy.exe win32yank.exe winpty-agent.exe winpty.dll diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 66c4454f7b..11a4647d1c 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -27,6 +27,7 @@ #include "nvim/map_defs.h" #include "nvim/map.h" #include "nvim/mark.h" +#include "nvim/ops.h" #include "nvim/extmark.h" #include "nvim/decoration.h" #include "nvim/fileio.h" @@ -222,11 +223,7 @@ Boolean nvim_buf_attach(uint64_t channel_id, return buf_updates_register(buf, channel_id, cb, send_buffer); error: - // TODO(bfredl): ASAN build should check that the ref table is empty? - api_free_luaref(cb.on_lines); - api_free_luaref(cb.on_bytes); - api_free_luaref(cb.on_changedtick); - api_free_luaref(cb.on_detach); + buffer_update_callbacks_free(cb); return false; } @@ -445,6 +442,8 @@ void nvim_buf_set_lines(uint64_t channel_id, goto end; } + bcount_t deleted_bytes = get_region_bytecount(curbuf, start, end, 0, 0); + // If the size of the range is reducing (ie, new_len < old_len) we // need to delete some old_len. We do this at the start, by // repeatedly deleting line "start". @@ -464,6 +463,7 @@ void nvim_buf_set_lines(uint64_t channel_id, // new old_len. This is a more efficient operation, as it requires // less memory allocation and freeing. size_t to_replace = old_len < new_len ? old_len : new_len; + bcount_t inserted_bytes = 0; for (size_t i = 0; i < to_replace; i++) { int64_t lnum = start + (int64_t)i; @@ -476,6 +476,8 @@ void nvim_buf_set_lines(uint64_t channel_id, api_set_error(err, kErrorTypeException, "Failed to replace line"); goto end; } + + inserted_bytes += (bcount_t)strlen(lines[i]) + 1; // Mark lines that haven't been passed to the buffer as they need // to be freed later lines[i] = NULL; @@ -495,6 +497,8 @@ void nvim_buf_set_lines(uint64_t channel_id, goto end; } + inserted_bytes += (bcount_t)strlen(lines[i]) + 1; + // Same as with replacing, but we also need to free lines xfree(lines[i]); lines[i] = NULL; @@ -509,7 +513,11 @@ void nvim_buf_set_lines(uint64_t channel_id, (linenr_T)(end - 1), MAXLNUM, (long)extra, - kExtmarkUndo); + kExtmarkNOOP); + + extmark_splice(curbuf, (int)start-1, 0, (int)(end-start), 0, + deleted_bytes, (int)new_len, 0, inserted_bytes, + kExtmarkUndo); changed_lines((linenr_T)start, 0, (linenr_T)end, (long)extra, true); fix_cursor((linenr_T)start, (linenr_T)end, (linenr_T)extra); @@ -1430,6 +1438,10 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, /// - "eol": right after eol character (default) /// - "overlay": display over the specified column, without /// shifting the underlying text. +/// - "right_align": display right aligned in the window. +/// - virt_text_win_col : position the virtual text at a fixed +/// window column (starting from the first +/// text column) /// - virt_text_hide : hide the virtual text when the background /// text is selected or hidden due to /// horizontal scroll 'nowrap' @@ -1441,6 +1453,10 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, /// default /// - "combine": combine with background text color /// - "blend": blend with background text color. +/// - hl_eol : when true, for a multiline highlight covering the +/// EOL of a line, continue the highlight for the rest +/// of the screen line (just like for diff and +/// cursorline highlight). /// /// - ephemeral : for use with |nvim_set_decoration_provider| /// callbacks. The mark will only be used for the current @@ -1453,6 +1469,8 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, /// the extmark end position (if it exists) will be shifted /// in when new text is inserted (true for right, false /// for left). Defaults to false. +/// - priority: a priority value for the highlight group. For +/// example treesitter highlighting uses a value of 100. /// @param[out] err Error details, if any /// @return Id of the created/updated extmark Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, @@ -1572,17 +1590,33 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, decor.virt_text_pos = kVTEndOfLine; } else if (strequal("overlay", str.data)) { decor.virt_text_pos = kVTOverlay; + } else if (strequal("right_align", str.data)) { + decor.virt_text_pos = kVTRightAlign; } else { api_set_error(err, kErrorTypeValidation, "virt_text_pos: invalid value"); goto error; } + } else if (strequal("virt_text_win_col", k.data)) { + if (v->type != kObjectTypeInteger) { + api_set_error(err, kErrorTypeValidation, + "virt_text_win_col is not a Number of the correct size"); + goto error; + } + + decor.col = (int)v->data.integer; + decor.virt_text_pos = kVTWinCol; } else if (strequal("virt_text_hide", k.data)) { decor.virt_text_hide = api_object_to_bool(*v, "virt_text_hide", false, err); if (ERROR_SET(err)) { goto error; } + } else if (strequal("hl_eol", k.data)) { + decor.hl_eol = api_object_to_bool(*v, "hl_eol", false, err); + if (ERROR_SET(err)) { + goto error; + } } else if (strequal("hl_mode", k.data)) { if (v->type != kObjectTypeString) { api_set_error(err, kErrorTypeValidation, @@ -1666,12 +1700,22 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, col2 = 0; } + if (decor.virt_text_pos == kVTRightAlign) { + decor.col = 0; + for (size_t i = 0; i < kv_size(decor.virt_text); i++) { + decor.col + += (int)mb_string2cells((char_u *)kv_A(decor.virt_text, i).text); + } + } + + Decoration *d = NULL; if (ephemeral) { d = &decor; } else if (kv_size(decor.virt_text) - || decor.priority != DECOR_PRIORITY_BASE) { + || decor.priority != DECOR_PRIORITY_BASE + || decor.hl_eol) { // TODO(bfredl): this is a bit sketchy. eventually we should // have predefined decorations for both marks/ephemerals d = xcalloc(1, sizeof(*d)); @@ -1682,7 +1726,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, // TODO(bfredl): synergize these two branches even more if (ephemeral && decor_state.buf == buf) { - decor_add_ephemeral((int)line, (int)col, line2, col2, &decor, 0); + decor_add_ephemeral((int)line, (int)col, line2, col2, &decor); } else { if (ephemeral) { api_set_error(err, kErrorTypeException, "not yet implemented"); diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index d2b787a6f5..5abdc33709 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -177,42 +177,47 @@ Object dict_get_value(dict_T *dict, String key, Error *err) return vim_to_object(&di->di_tv); } -/// Set a value in a scope dict. Objects are recursively expanded into their -/// vimscript equivalents. -/// -/// @param dict The vimscript dict -/// @param key The key -/// @param value The new value -/// @param del Delete key in place of setting it. Argument `value` is ignored in -/// this case. -/// @param retval If true the old value will be converted and returned. -/// @param[out] err Details of an error that may have occurred -/// @return The old value if `retval` is true and the key was present, else NIL -Object dict_set_var(dict_T *dict, String key, Object value, bool del, - bool retval, Error *err) +dictitem_T *dict_check_writable(dict_T *dict, String key, bool del, Error *err) { - Object rv = OBJECT_INIT; dictitem_T *di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size); if (di != NULL) { if (di->di_flags & DI_FLAGS_RO) { api_set_error(err, kErrorTypeException, "Key is read-only: %s", key.data); - return rv; } else if (di->di_flags & DI_FLAGS_LOCK) { api_set_error(err, kErrorTypeException, "Key is locked: %s", key.data); - return rv; } else if (del && (di->di_flags & DI_FLAGS_FIX)) { api_set_error(err, kErrorTypeException, "Key is fixed: %s", key.data); - return rv; } } else if (dict->dv_lock) { api_set_error(err, kErrorTypeException, "Dictionary is locked"); - return rv; } else if (key.size == 0) { api_set_error(err, kErrorTypeValidation, "Key name is empty"); - return rv; } else if (key.size > INT_MAX) { api_set_error(err, kErrorTypeValidation, "Key name is too long"); + } + + return di; +} + +/// Set a value in a scope dict. Objects are recursively expanded into their +/// vimscript equivalents. +/// +/// @param dict The vimscript dict +/// @param key The key +/// @param value The new value +/// @param del Delete key in place of setting it. Argument `value` is ignored in +/// this case. +/// @param retval If true the old value will be converted and returned. +/// @param[out] err Details of an error that may have occurred +/// @return The old value if `retval` is true and the key was present, else NIL +Object dict_set_var(dict_T *dict, String key, Object value, bool del, + bool retval, Error *err) +{ + Object rv = OBJECT_INIT; + dictitem_T *di = dict_check_writable(dict, key, del, err); + + if (ERROR_SET(err)) { return rv; } @@ -1708,33 +1713,6 @@ const char *describe_ns(NS ns_id) return "(UNKNOWN PLUGIN)"; } -DecorProvider *get_provider(NS ns_id, bool force) -{ - ssize_t i; - for (i = 0; i < (ssize_t)kv_size(decor_providers); i++) { - DecorProvider *item = &kv_A(decor_providers, i); - if (item->ns_id == ns_id) { - return item; - } else if (item->ns_id > ns_id) { - break; - } - } - - if (!force) { - return NULL; - } - - for (ssize_t j = (ssize_t)kv_size(decor_providers)-1; j >= i; j++) { - // allocates if needed: - (void)kv_a(decor_providers, (size_t)j+1); - kv_A(decor_providers, (size_t)j+1) = kv_A(decor_providers, j); - } - DecorProvider *item = &kv_a(decor_providers, (size_t)i); - *item = DECORATION_PROVIDER_INIT(ns_id); - - return item; -} - static bool parse_float_anchor(String anchor, FloatAnchor *out) { if (anchor.size == 0) { @@ -1787,10 +1765,13 @@ static void parse_border_style(Object style, FloatConfig *fconfig, Error *err) struct { const char *name; schar_T chars[8]; + bool shadow_color; } defaults[] = { - { "double", { "╔", "═", "╗", "║", "╝", "═", "╚", "║" } }, - { "single", { "┌", "─", "┐", "│", "┘", "─", "└", "│" } }, - { NULL, { { NUL } } }, + { "double", { "╔", "═", "╗", "║", "╝", "═", "╚", "║" }, false }, + { "single", { "┌", "─", "┐", "│", "┘", "─", "└", "│" }, false }, + { "shadow", { "", "", " ", " ", " ", " ", " ", "" }, true }, + { "solid", { " ", " ", " ", " ", " ", " ", " ", " " }, false }, + { NULL, { { NUL } } , false }, }; schar_T *chars = fconfig->border_chars; @@ -1834,13 +1815,16 @@ static void parse_border_style(Object style, FloatConfig *fconfig, Error *err) api_set_error(err, kErrorTypeValidation, "invalid border char"); return; } - if (!string.size - || mb_string2cells_len((char_u *)string.data, string.size) != 1) { + if (string.size + && mb_string2cells_len((char_u *)string.data, string.size) > 1) { api_set_error(err, kErrorTypeValidation, "border chars must be one cell"); + return; } size_t len = MIN(string.size, sizeof(*chars)-1); - memcpy(chars[i], string.data, len); + if (len) { + memcpy(chars[i], string.data, len); + } chars[i][len] = NUL; hl_ids[i] = hl_id; } @@ -1849,6 +1833,13 @@ static void parse_border_style(Object style, FloatConfig *fconfig, Error *err) memcpy(hl_ids+size, hl_ids, sizeof(*hl_ids) * size); size <<= 1; } + if ((chars[7][0] && chars[1][0] && !chars[0][0]) + || (chars[1][0] && chars[3][0] && !chars[2][0]) + || (chars[3][0] && chars[5][0] && !chars[4][0]) + || (chars[5][0] && chars[7][0] && !chars[6][0])) { + api_set_error(err, kErrorTypeValidation, + "corner between used edges must be specified"); + } } else if (style.type == kObjectTypeString) { String str = style.data.string; if (str.size == 0 || strequal(str.data, "none")) { @@ -1859,6 +1850,15 @@ static void parse_border_style(Object style, FloatConfig *fconfig, Error *err) if (strequal(str.data, defaults[i].name)) { memcpy(chars, defaults[i].chars, sizeof(defaults[i].chars)); memset(hl_ids, 0, 8 * sizeof(*hl_ids)); + if (defaults[i].shadow_color) { + int hl_blend = SYN_GROUP_STATIC("FloatShadow"); + int hl_through = SYN_GROUP_STATIC("FloatShadowThrough"); + hl_ids[2] = hl_through; + hl_ids[3] = hl_blend; + hl_ids[4] = hl_blend; + hl_ids[5] = hl_blend; + hl_ids[6] = hl_through; + } return; } } @@ -1914,7 +1914,7 @@ bool parse_float_config(Dictionary config, FloatConfig *fconfig, bool reconf, } else if (strequal(key, "height")) { has_height = true; if (val.type == kObjectTypeInteger && val.data.integer > 0) { - fconfig->height= (int)val.data.integer; + fconfig->height = (int)val.data.integer; } else { api_set_error(err, kErrorTypeValidation, "'height' key must be a positive Integer"); @@ -1988,6 +1988,14 @@ bool parse_float_config(Dictionary config, FloatConfig *fconfig, bool reconf, "'focusable' key must be Boolean"); return false; } + } else if (strequal(key, "zindex")) { + if (val.type == kObjectTypeInteger && val.data.integer > 0) { + fconfig->zindex = (int)val.data.integer; + } else { + api_set_error(err, kErrorTypeValidation, + "'zindex' key must be a positive Integer"); + return false; + } } else if (!strcmp(key, "border")) { parse_border_style(val, fconfig, err); if (ERROR_SET(err)) { diff --git a/src/nvim/api/ui_events.in.h b/src/nvim/api/ui_events.in.h index e934d5dc92..11e21a88ea 100644 --- a/src/nvim/api/ui_events.in.h +++ b/src/nvim/api/ui_events.in.h @@ -106,7 +106,8 @@ void win_pos(Integer grid, Window win, Integer startrow, Integer startcol, Integer width, Integer height) FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY; void win_float_pos(Integer grid, Window win, String anchor, Integer anchor_grid, - Float anchor_row, Float anchor_col, Boolean focusable) + Float anchor_row, Float anchor_col, Boolean focusable, + Integer zindex) FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY; void win_external_pos(Integer grid, Window win) FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY; diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index 9dde62f0ee..e9a0b0df2e 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -104,10 +104,14 @@ String nvim_exec(String src, Boolean output, Error *err) } try_start(); - msg_silent++; + if (output) { + msg_silent++; + } do_source_str(src.data, "nvim_exec()"); - capture_ga = save_capture_ga; - msg_silent = save_msg_silent; + if (output) { + capture_ga = save_capture_ga; + msg_silent = save_msg_silent; + } try_end(err); if (ERROR_SET(err)) { @@ -217,6 +221,12 @@ Dictionary nvim__get_hl_defs(Integer ns_id, Error *err) /// in addition the following keys are also recognized: /// `default`: don't override existing definition, /// like `hi default` +/// `ctermfg`: sets foreground of cterm color +/// `ctermbg`: sets background of cterm color +/// `cterm` : cterm attribute map. sets attributed for +/// cterm colors. similer to `hi cterm` +/// Note: by default cterm attributes are +/// same as attributes of gui color /// @param[out] err Error details, if any /// /// TODO: ns_id = 0, should modify :highlight namespace @@ -1263,6 +1273,7 @@ fail: /// @param buffer the buffer to use (expected to be empty) /// @param opts Optional parameters. Reserved for future use. /// @param[out] err Error details, if any +/// @return Channel id, or 0 on error Integer nvim_open_term(Buffer buffer, Dictionary opts, Error *err) FUNC_API_SINCE(7) { @@ -1333,7 +1344,8 @@ void nvim_chan_send(Integer chan, String data, Error *err) return; } - channel_send((uint64_t)chan, data.data, data.size, &error); + channel_send((uint64_t)chan, data.data, data.size, + false, &error); if (error) { api_set_error(err, kErrorTypeValidation, "%s", error); } @@ -1405,6 +1417,15 @@ void nvim_chan_send(Integer chan, String data, Error *err) /// - `external`: GUI should display the window as an external /// top-level window. Currently accepts no other positioning /// configuration together with this. +/// - `zindex`: Stacking order. floats with higher `zindex` go on top on +/// floats with lower indices. Must be larger than zero. The +/// following screen elements have hard-coded z-indices: +/// - 100: insert completion popupmenu +/// - 200: message scrollback +/// - 250: cmdline completion popupmenu (when wildoptions+=pum) +/// The default value for floats are 50. In general, values below 100 are +/// recommended, unless there is a good reason to overshadow builtin +/// elements. /// - `style`: Configure the appearance of the window. Currently only takes /// one non-empty value: /// - "minimal" Nvim will display the window with many UI options @@ -1421,6 +1442,7 @@ void nvim_chan_send(Integer chan, String data, Error *err) /// - "none" No border. This is the default /// - "single" a single line box /// - "double" a double line box +/// - "shadow" a drop shadow effect by blending with the background. /// If it is an array it should be an array of eight items or any divisor of /// eight. The array will specifify the eight chars building up the border /// in a clockwise fashion starting with the top-left corner. As, an @@ -1431,6 +1453,9 @@ void nvim_chan_send(Integer chan, String data, Error *err) /// [ "/", "-", "\\", "|" ] /// or all chars the same as: /// [ "x" ] +/// An empty string can be used to turn off a specific border, for instance: +/// [ "", "", "", ">", "", "", "", "<" ] +/// will only make vertical borders but not horizontal ones. /// By default `FloatBorder` highlight is used which links to `VertSplit` /// when not defined. It could also be specified by character: /// [ {"+", "MyCorner"}, {"x", "MyBorder"} ] @@ -2708,6 +2733,7 @@ Dictionary nvim__stats(void) Dictionary rv = ARRAY_DICT_INIT; PUT(rv, "fsync", INTEGER_OBJ(g_stats.fsync)); PUT(rv, "redraw", INTEGER_OBJ(g_stats.redraw)); + PUT(rv, "lua_refcount", INTEGER_OBJ(nlua_refcount)); return rv; } @@ -2880,19 +2906,6 @@ void nvim__screenshot(String path) ui_call_screenshot(path); } -static void clear_provider(DecorProvider *p) -{ - if (p == NULL) { - return; - } - NLUA_CLEAR_REF(p->redraw_start); - NLUA_CLEAR_REF(p->redraw_buf); - NLUA_CLEAR_REF(p->redraw_win); - NLUA_CLEAR_REF(p->redraw_line); - NLUA_CLEAR_REF(p->redraw_end); - p->active = false; -} - /// Set or change decoration provider for a namespace /// /// This is a very general purpose interface for having lua callbacks @@ -2937,8 +2950,8 @@ void nvim_set_decoration_provider(Integer ns_id, DictionaryOf(LuaRef) opts, Error *err) FUNC_API_SINCE(7) FUNC_API_LUA_ONLY { - DecorProvider *p = get_provider((NS)ns_id, true); - clear_provider(p); + DecorProvider *p = get_decor_provider((NS)ns_id, true); + decor_provider_clear(p); // regardless of what happens, it seems good idea to redraw redraw_all_later(NOT_VALID); // TODO(bfredl): too soon? @@ -2960,7 +2973,7 @@ void nvim_set_decoration_provider(Integer ns_id, DictionaryOf(LuaRef) opts, String k = opts.items[i].key; Object *v = &opts.items[i].value; size_t j; - for (j = 0; cbs[j].name; j++) { + for (j = 0; cbs[j].name && cbs[j].dest; j++) { if (strequal(cbs[j].name, k.data)) { if (v->type != kObjectTypeLuaRef) { api_set_error(err, kErrorTypeValidation, @@ -2981,5 +2994,5 @@ void nvim_set_decoration_provider(Integer ns_id, DictionaryOf(LuaRef) opts, p->active = true; return; error: - clear_provider(p); + decor_provider_clear(p); } diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index 89fa2f86fb..158e149628 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -54,7 +54,7 @@ void nvim_win_set_buf(Window window, Buffer buffer, Error *err) return; } - if (switch_win(&save_curwin, &save_curtab, win, tab, false) == FAIL) { + if (switch_win_noblock(&save_curwin, &save_curtab, win, tab, false) == FAIL) { api_set_error(err, kErrorTypeException, "Failed to switch to window %d", @@ -74,7 +74,7 @@ void nvim_win_set_buf(Window window, Buffer buffer, Error *err) // So do it now. validate_cursor(); - restore_win(save_curwin, save_curtab, false); + restore_win_noblock(save_curwin, save_curtab, false); } /// Gets the (1,0)-indexed cursor position in the window. |api-indexing| @@ -381,7 +381,7 @@ Integer nvim_win_get_number(Window window, Error *err) } int tabnr; - win_get_tabwin(window, &tabnr, &rv); + win_get_tabwin(win->handle, &tabnr, &rv); return rv; } diff --git a/src/nvim/ascii.h b/src/nvim/ascii.h index f41068ea70..7e4dee3d34 100644 --- a/src/nvim/ascii.h +++ b/src/nvim/ascii.h @@ -31,7 +31,9 @@ #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/autocmd.c b/src/nvim/autocmd.c index f71075ae74..145f6f5601 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -1621,13 +1621,21 @@ static bool apply_autocmds_group(event_T event, ap->last = false; } ap->last = true; - check_lnums(true); // make sure cursor and topline are valid + + if (nesting == 1) { + // make sure cursor and topline are valid + check_lnums(true); + } // Execute the autocmd. The `getnextac` callback handles iteration. do_cmdline(NULL, getnextac, (void *)&patcmd, DOCMD_NOWAIT | DOCMD_VERBOSE | DOCMD_REPEAT); - reset_lnums(); // restore cursor and topline, unless they were changed + if (nesting == 1) { + // restore cursor and topline, unless they were changed + reset_lnums(); + } + if (eap != NULL) { (void)set_cmdarg(NULL, save_cmdarg); diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index c7ec3a456c..6a50264e0f 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -85,6 +85,9 @@ # include "buffer.c.generated.h" #endif +// Determines how deeply nested %{} blocks will be evaluated in statusline. +#define MAX_STL_EVAL_DEPTH 100 + static char *msg_loclist = N_("[Location List]"); static char *msg_qflist = N_("[Quickfix List]"); static char *e_auabort = N_("E855: Autocommands caused command to abort"); @@ -407,7 +410,8 @@ bool buf_valid(buf_T *buf) /// there to be only one window with this buffer. e.g. when /// ":quit" is supposed to close the window but autocommands /// close all other windows. -void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) +/// @returns true when we got to the end and b_nwindows was decremented. +bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) { bool unload_buf = (action != 0); bool del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE); @@ -444,7 +448,7 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) // halfway a command that relies on it). Unloading is allowed. if (buf->b_locked > 0 && (del_buf || wipe_buf)) { EMSG(_("E937: Attempt to delete a buffer that is in use")); - return; + return false; } if (win != NULL // Avoid bogus clang warning. @@ -471,13 +475,13 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) buf) && !bufref_valid(&bufref)) { // Autocommands deleted the buffer. EMSG(_(e_auabort)); - return; + return false; } buf->b_locked--; if (abort_if_last && last_nonfloat(win)) { // Autocommands made this the only window. EMSG(_(e_auabort)); - return; + return false; } // When the buffer becomes hidden, but is not unloaded, trigger @@ -488,17 +492,17 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) buf) && !bufref_valid(&bufref)) { // Autocommands deleted the buffer. EMSG(_(e_auabort)); - return; + return false; } buf->b_locked--; if (abort_if_last && last_nonfloat(win)) { // Autocommands made this the only window. EMSG(_(e_auabort)); - return; + return false; } } if (aborting()) { // autocmds may abort script processing - return; + return false; } } @@ -525,7 +529,7 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) /* Return when a window is displaying the buffer or when it's not * unloaded. */ if (buf->b_nwindows > 0 || !unload_buf) { - return; + return false; } if (buf->terminal) { @@ -561,11 +565,11 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) if (!bufref_valid(&bufref)) { // Autocommands may have deleted the buffer. - return; + return false; } if (aborting()) { // Autocmds may abort script processing. - return; + return false; } /* @@ -576,7 +580,7 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) * deleted buffer. */ if (buf == curbuf && !is_curbuf) { - return; + return false; } if (win != NULL // Avoid bogus clang warning. @@ -636,6 +640,8 @@ void close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last) buf->b_p_bl = false; } } + // NOTE: at this point "curbuf" may be invalid! + return true; } /// Make buffer not contain a file. @@ -1844,7 +1850,7 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, EMSG(_("W14: Warning: List of file names overflow")); if (emsg_silent == 0) { ui_flush(); - os_delay(3000L, true); // make sure it is noticed + os_delay(3001L, true); // make sure it is noticed } top_file_num = 1; } @@ -3569,6 +3575,7 @@ int build_stl_str_hl( } int groupdepth = 0; + int evaldepth = 0; int curitem = 0; bool prevchar_isflag = true; @@ -3906,6 +3913,13 @@ int build_stl_str_hl( continue; } + // Denotes end of expanded %{} block + if (*fmt_p == '}' && evaldepth > 0) { + fmt_p++; + evaldepth--; + continue; + } + // An invalid item was specified. // Continue processing on the next character of the format string. if (vim_strchr(STL_ALL, *fmt_p) == NULL) { @@ -3947,18 +3961,30 @@ int build_stl_str_hl( } case STL_VIM_EXPR: // '{' { + char_u *block_start = fmt_p - 1; + int reevaluate = (*fmt_p == '%'); itemisflag = true; + if (reevaluate) { + fmt_p++; + } + // Attempt to copy the expression to evaluate into // the output buffer as a null-terminated string. char_u *t = out_p; - while (*fmt_p != '}' && *fmt_p != NUL && out_p < out_end_p) + while ((*fmt_p != '}' || (reevaluate && fmt_p[-1] != '%')) + && *fmt_p != NUL && out_p < out_end_p) { *out_p++ = *fmt_p++; + } if (*fmt_p != '}') { // missing '}' or out of space break; } fmt_p++; - *out_p = 0; + if (reevaluate) { + out_p[-1] = 0; // remove the % at the end of %{% expr %} + } else { + *out_p = 0; + } // Move our position in the output buffer // to the beginning of the expression @@ -4004,6 +4030,40 @@ int build_stl_str_hl( itemisflag = false; } } + + + // If the output of the expression needs to be evaluated + // replace the %{} block with the result of evaluation + if (reevaluate && str != NULL && *str != 0 + && strchr((const char *)str, '%') != NULL + && evaldepth < MAX_STL_EVAL_DEPTH) { + size_t parsed_usefmt = (size_t)(block_start - usefmt); + size_t str_length = strlen((const char *)str); + size_t fmt_length = strlen((const char *)fmt_p); + size_t new_fmt_len = parsed_usefmt + + str_length + fmt_length + 3; + char_u *new_fmt = (char_u *)xmalloc(new_fmt_len * sizeof(char_u)); + char_u *new_fmt_p = new_fmt; + + new_fmt_p = (char_u *)memcpy(new_fmt_p, usefmt, parsed_usefmt) + + parsed_usefmt; + new_fmt_p = (char_u *)memcpy(new_fmt_p , str, str_length) + + str_length; + new_fmt_p = (char_u *)memcpy(new_fmt_p, "%}", 2) + 2; + new_fmt_p = (char_u *)memcpy(new_fmt_p , fmt_p, fmt_length) + + fmt_length; + *new_fmt_p = 0; + new_fmt_p = NULL; + + if (usefmt != fmt) { + xfree(usefmt); + } + XFREE_CLEAR(str); + usefmt = new_fmt; + fmt_p = usefmt + parsed_usefmt; + evaldepth++; + continue; + } break; } @@ -5489,20 +5549,20 @@ bool find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp) int buf_signcols(buf_T *buf) { if (buf->b_signcols_max == -1) { - signlist_T *sign; // a sign in the signlist + sign_entry_T *sign; // a sign in the sign list buf->b_signcols_max = 0; int linesum = 0; linenr_T curline = 0; FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (sign->lnum > curline) { + if (sign->se_lnum > curline) { if (linesum > buf->b_signcols_max) { buf->b_signcols_max = linesum; } - curline = sign->lnum; + curline = sign->se_lnum; linesum = 0; } - if (sign->has_text_or_icon) { + if (sign->se_has_text_or_icon) { linesum++; } } diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index b36b7beab8..0c839ba12a 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -110,7 +110,7 @@ typedef uint16_t disptick_T; // display tick type #include "nvim/regexp_defs.h" // for synstate_T (needs reg_extmatch_T, win_T, buf_T) #include "nvim/syntax_defs.h" -// for signlist_T +// for sign_entry_T #include "nvim/sign_defs.h" #include "nvim/os/fs_defs.h" // for FileID @@ -848,7 +848,7 @@ struct file_buffer { // normally points to this, but some windows // may use a different synblock_T. - signlist_T *b_signlist; // list of signs to draw + sign_entry_T *b_signlist; // list of placed signs int b_signcols_max; // cached maximum number of sign columns int b_signcols; // last calculated number of sign columns @@ -1083,8 +1083,10 @@ typedef struct { FloatRelative relative; bool external; bool focusable; + int zindex; WinStyle style; bool border; + bool shadow; schar_T border_chars[8]; int border_hl_ids[8]; int border_attr[8]; @@ -1095,6 +1097,7 @@ typedef struct { .row = 0, .col = 0, .anchor = 0, \ .relative = 0, .external = false, \ .focusable = true, \ + .zindex = kZIndexFloatDefault, \ .style = kWinStyleUnused }) // Structure to store last cursor position and topline. Used by check_lnums() @@ -1266,7 +1269,7 @@ struct window_S { int w_height_request; int w_width_request; - int w_border_adj; + int w_border_adj[4]; // top, right, bottom, left // outer size of window grid, including border int w_height_outer; int w_width_outer; diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c index 97562eace6..5c573530d1 100644 --- a/src/nvim/buffer_updates.c +++ b/src/nvim/buffer_updates.c @@ -176,7 +176,7 @@ void buf_updates_unload(buf_T *buf, bool can_reload) if (keep) { kv_A(buf->update_callbacks, j++) = kv_A(buf->update_callbacks, i); } else { - free_update_callbacks(cb); + buffer_update_callbacks_free(cb); } } kv_size(buf->update_callbacks) = j; @@ -290,7 +290,7 @@ void buf_updates_send_changes(buf_T *buf, textlock--; if (res.type == kObjectTypeBoolean && res.data.boolean == true) { - free_update_callbacks(cb); + buffer_update_callbacks_free(cb); keep = false; } api_free_object(res); @@ -342,7 +342,7 @@ void buf_updates_send_splice( textlock--; if (res.type == kObjectTypeBoolean && res.data.boolean == true) { - free_update_callbacks(cb); + buffer_update_callbacks_free(cb); keep = false; } } @@ -378,7 +378,7 @@ void buf_updates_changedtick(buf_T *buf) textlock--; if (res.type == kObjectTypeBoolean && res.data.boolean == true) { - free_update_callbacks(cb); + buffer_update_callbacks_free(cb); keep = false; } api_free_object(res); @@ -406,8 +406,11 @@ void buf_updates_changedtick_single(buf_T *buf, uint64_t channel_id) rpc_send_event(channel_id, "nvim_buf_changedtick_event", args); } -static void free_update_callbacks(BufUpdateCallbacks cb) +void buffer_update_callbacks_free(BufUpdateCallbacks cb) { api_free_luaref(cb.on_lines); + api_free_luaref(cb.on_bytes); api_free_luaref(cb.on_changedtick); + api_free_luaref(cb.on_reload); + api_free_luaref(cb.on_detach); } diff --git a/src/nvim/change.c b/src/nvim/change.c index 38bd591eca..74e27ca880 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -68,7 +68,7 @@ void change_warning(int col) (void)msg_end(); if (msg_silent == 0 && !silent_mode && ui_active()) { ui_flush(); - os_delay(1000L, true); // give the user time to think about it + os_delay(1002L, true); // give the user time to think about it } curbuf->b_did_warn = true; redraw_cmdline = false; // don't redraw and erase the message @@ -109,7 +109,7 @@ void changed(void) // and don't let the emsg() set msg_scroll. if (need_wait_return && emsg_silent == 0) { ui_flush(); - os_delay(2000L, true); + os_delay(2002L, true); wait_return(true); msg_scroll = save_msg_scroll; } else { diff --git a/src/nvim/channel.c b/src/nvim/channel.c index 7a08ba58d0..60af11e94b 100644 --- a/src/nvim/channel.c +++ b/src/nvim/channel.c @@ -162,6 +162,7 @@ void channel_init(void) /// Channel is allocated with refcount 1, which should be decreased /// when the underlying stream closes. Channel *channel_alloc(ChannelStreamType type) + FUNC_ATTR_NONNULL_RET { Channel *chan = xcalloc(1, sizeof(*chan)); if (type == kChannelStreamStdio) { @@ -499,48 +500,54 @@ uint64_t channel_from_stdio(bool rpc, CallbackReader on_output, } /// @param data will be consumed -size_t channel_send(uint64_t id, char *data, size_t len, const char **error) +size_t channel_send(uint64_t id, char *data, size_t len, + bool data_owned, const char **error) { Channel *chan = find_channel(id); + size_t written = 0; if (!chan) { *error = _(e_invchan); - goto err; + goto retfree; } if (chan->streamtype == kChannelStreamStderr) { if (chan->stream.err.closed) { *error = _("Can't send data to closed stream"); - goto err; + goto retfree; } // unbuffered write - size_t written = fwrite(data, len, 1, stderr); - xfree(data); - return len * written; + written = len * fwrite(data, len, 1, stderr); + goto retfree; } if (chan->streamtype == kChannelStreamInternal && chan->term) { terminal_receive(chan->term, data, len); - return len; + written = len; + goto retfree; } Stream *in = channel_instream(chan); if (in->closed) { *error = _("Can't send data to closed stream"); - goto err; + goto retfree; } if (chan->is_rpc) { *error = _("Can't send raw data to rpc channel"); - goto err; + goto retfree; } - WBuffer *buf = wstream_new_buffer(data, len, 1, xfree); + // write can be delayed indefinitely, so always use an allocated buffer + WBuffer *buf = wstream_new_buffer(data_owned ? data : xmemdup(data, len), + len, 1, xfree); return wstream_write(in, buf) ? len : 0; -err: - xfree(data); - return 0; +retfree: + if (data_owned) { + xfree(data); + } + return written; } /// Convert binary byte array to a readfile()-style list diff --git a/src/nvim/cursor.c b/src/nvim/cursor.c index 74a6f77a6d..5d2210dc7d 100644 --- a/src/nvim/cursor.c +++ b/src/nvim/cursor.c @@ -14,6 +14,7 @@ #include "nvim/misc1.h" #include "nvim/move.h" #include "nvim/screen.h" +#include "nvim/extmark.h" #include "nvim/state.h" #include "nvim/vim.h" #include "nvim/ascii.h" @@ -181,7 +182,7 @@ static int coladvance2( memset(newline + idx, ' ', (size_t)correct); ml_replace(pos->lnum, newline, false); - changed_bytes(pos->lnum, (colnr_T)idx); + inserted_bytes(pos->lnum, (colnr_T)idx, 0, correct); idx += correct; col = wcol; } else { @@ -206,7 +207,7 @@ static int coladvance2( memcpy(newline + idx + csize, line + idx + 1, n); ml_replace(pos->lnum, newline, false); - changed_bytes(pos->lnum, idx); + inserted_bytes(pos->lnum, idx, 1, csize); idx += (csize - 1 + correct); col += correct; } diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c index e16598e7d2..f3000f4430 100644 --- a/src/nvim/decoration.c +++ b/src/nvim/decoration.c @@ -2,6 +2,7 @@ // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com #include "nvim/vim.h" +#include "nvim/lua/executor.h" #include "nvim/extmark.h" #include "nvim/decoration.h" #include "nvim/screen.h" @@ -143,9 +144,9 @@ bool decor_redraw_reset(buf_T *buf, DecorState *state) state->row = -1; state->buf = buf; for (size_t i = 0; i < kv_size(state->active); i++) { - HlRange item = kv_A(state->active, i); + DecorRange item = kv_A(state->active, i); if (item.virt_text_owned) { - clear_virttext(&item.virt_text); + clear_virttext(&item.decor.virt_text); } } kv_size(state->active) = 0; @@ -189,14 +190,14 @@ bool decor_redraw_start(buf_T *buf, int top_row, DecorState *state) if (mark.id&MARKTREE_END_FLAG) { decor_add(state, altpos.row, altpos.col, mark.row, mark.col, - decor, false, 0); + decor, false); } else { if (altpos.row == -1) { altpos.row = mark.row; altpos.col = mark.col; } decor_add(state, mark.row, mark.col, altpos.row, altpos.col, - decor, false, 0); + decor, false); } next_mark: @@ -221,22 +222,23 @@ bool decor_redraw_line(buf_T *buf, int row, DecorState *state) } static void decor_add(DecorState *state, int start_row, int start_col, - int end_row, int end_col, Decoration *decor, bool owned, - DecorPriority priority) + int end_row, int end_col, Decoration *decor, bool owned) { int attr_id = decor->hl_id > 0 ? syn_id2attr(decor->hl_id) : 0; - HlRange range = { start_row, start_col, end_row, end_col, - attr_id, MAX(priority, decor->priority), - decor->virt_text, - decor->virt_text_pos, decor->virt_text_hide, decor->hl_mode, + DecorRange range = { start_row, start_col, end_row, end_col, + *decor, attr_id, kv_size(decor->virt_text) && owned, -1 }; + if (decor->virt_text_pos == kVTEndOfLine) { + range.win_col = -2; // handled separately + } + kv_pushp(state->active); size_t index; for (index = kv_size(state->active)-1; index > 0; index--) { - HlRange item = kv_A(state->active, index-1); - if (item.priority <= range.priority) { + DecorRange item = kv_A(state->active, index-1); + if (item.decor.priority <= range.decor.priority) { break; } kv_A(state->active, index) = kv_A(state->active, index-1); @@ -244,7 +246,7 @@ static void decor_add(DecorState *state, int start_row, int start_col, kv_A(state->active, index) = range; } -int decor_redraw_col(buf_T *buf, int col, int virt_col, bool hidden, +int decor_redraw_col(buf_T *buf, int col, int win_col, bool hidden, DecorState *state) { if (col <= state->col_until) { @@ -290,7 +292,7 @@ int decor_redraw_col(buf_T *buf, int col, int virt_col, bool hidden, } decor_add(state, mark.row, mark.col, endpos.row, endpos.col, - decor, false, 0); + decor, false); next_mark: marktree_itr_next(buf->b_marktree, state->itr); @@ -299,11 +301,11 @@ next_mark: int attr = 0; size_t j = 0; for (size_t i = 0; i < kv_size(state->active); i++) { - HlRange item = kv_A(state->active, i); + DecorRange item = kv_A(state->active, i); bool active = false, keep = true; if (item.end_row < state->row || (item.end_row == state->row && item.end_col <= col)) { - if (!(item.start_row >= state->row && kv_size(item.virt_text))) { + if (!(item.start_row >= state->row && kv_size(item.decor.virt_text))) { keep = false; } } else { @@ -323,13 +325,14 @@ next_mark: attr = hl_combine_attr(attr, item.attr_id); } if ((item.start_row == state->row && item.start_col <= col) - && kv_size(item.virt_text) && item.virt_col == -1) { - item.virt_col = (item.virt_text_hide && hidden) ? -2 : virt_col; + && kv_size(item.decor.virt_text) + && item.decor.virt_text_pos == kVTOverlay && item.win_col == -1) { + item.win_col = (item.decor.virt_text_hide && hidden) ? -2 : win_col; } if (keep) { kv_A(state->active, j++) = item; } else if (item.virt_text_owned) { - clear_virttext(&item.virt_text); + clear_virttext(&item.decor.virt_text); } } kv_size(state->active) = j; @@ -342,26 +345,91 @@ void decor_redraw_end(DecorState *state) state->buf = NULL; } -VirtText decor_redraw_virt_text(buf_T *buf, DecorState *state) +VirtText decor_redraw_eol(buf_T *buf, DecorState *state, int *eol_attr, + bool *aligned) { decor_redraw_col(buf, MAXCOL, MAXCOL, false, state); + VirtText text = VIRTTEXT_EMPTY; for (size_t i = 0; i < kv_size(state->active); i++) { - HlRange item = kv_A(state->active, i); - if (item.start_row == state->row && kv_size(item.virt_text) - && item.virt_text_pos == kVTEndOfLine) { - return item.virt_text; + DecorRange item = kv_A(state->active, i); + if (item.start_row == state->row && kv_size(item.decor.virt_text)) { + if (!kv_size(text) && item.decor.virt_text_pos == kVTEndOfLine) { + text = item.decor.virt_text; + } else if (item.decor.virt_text_pos == kVTRightAlign + || item.decor.virt_text_pos == kVTWinCol) { + *aligned = true; + } + } + + + if (item.decor.hl_eol && item.start_row <= state->row) { + *eol_attr = hl_combine_attr(*eol_attr, item.attr_id); } } - return VIRTTEXT_EMPTY; + + return text; } void decor_add_ephemeral(int start_row, int start_col, int end_row, int end_col, - Decoration *decor, DecorPriority priority) + Decoration *decor) { if (end_row == -1) { end_row = start_row; end_col = start_col; } - decor_add(&decor_state, start_row, start_col, end_row, end_col, decor, true, - priority); + decor_add(&decor_state, start_row, start_col, end_row, end_col, decor, true); +} + + +DecorProvider *get_decor_provider(NS ns_id, bool force) +{ + size_t i; + size_t len = kv_size(decor_providers); + for (i = 0; i < len; i++) { + DecorProvider *item = &kv_A(decor_providers, i); + if (item->ns_id == ns_id) { + return item; + } else if (item->ns_id > ns_id) { + break; + } + } + + if (!force) { + return NULL; + } + + // Adding a new provider, so allocate room in the vector + (void)kv_a(decor_providers, len); + if (i < len) { + // New ns_id needs to be inserted between existing providers to maintain + // ordering, so shift other providers with larger ns_id + memmove(&kv_A(decor_providers, i + 1), + &kv_A(decor_providers, i), + (len - i) * sizeof(kv_a(decor_providers, i))); + } + DecorProvider *item = &kv_a(decor_providers, i); + *item = DECORATION_PROVIDER_INIT(ns_id); + + return item; +} + +void decor_provider_clear(DecorProvider *p) +{ + if (p == NULL) { + return; + } + NLUA_CLEAR_REF(p->redraw_start); + NLUA_CLEAR_REF(p->redraw_buf); + NLUA_CLEAR_REF(p->redraw_win); + NLUA_CLEAR_REF(p->redraw_line); + NLUA_CLEAR_REF(p->redraw_end); + p->active = false; +} + +void decor_free_all_mem(void) +{ + for (size_t i = 0; i < kv_size(decor_providers); i++) { + decor_provider_clear(&kv_A(decor_providers, i)); + } + kv_destroy(decor_providers); } diff --git a/src/nvim/decoration.h b/src/nvim/decoration.h index c5424a1642..4cebc0b731 100644 --- a/src/nvim/decoration.h +++ b/src/nvim/decoration.h @@ -21,6 +21,8 @@ typedef uint16_t DecorPriority; typedef enum { kVTEndOfLine, kVTOverlay, + kVTWinCol, + kVTRightAlign, } VirtTextPos; typedef enum { @@ -37,33 +39,29 @@ struct Decoration VirtTextPos virt_text_pos; bool virt_text_hide; HlMode hl_mode; + bool hl_eol; // TODO(bfredl): style, signs, etc DecorPriority priority; bool shared; // shared decoration, don't free + int col; // fixed col value, like win_col }; #define DECORATION_INIT { 0, KV_INITIAL_VALUE, kVTEndOfLine, false, \ - kHlModeUnknown, DECOR_PRIORITY_BASE, false } + kHlModeUnknown, false, DECOR_PRIORITY_BASE, false, 0 } typedef struct { int start_row; int start_col; int end_row; int end_col; - int attr_id; - // TODO(bfredl): embed decoration instead, perhaps using an arena - // for ephemerals? - DecorPriority priority; - VirtText virt_text; - VirtTextPos virt_text_pos; - bool virt_text_hide; - HlMode hl_mode; + Decoration decor; + int attr_id; // cached lookup of decor.hl_id bool virt_text_owned; - int virt_col; -} HlRange; + int win_col; +} DecorRange; typedef struct { MarkTreeIter itr[1]; - kvec_t(HlRange) active; + kvec_t(DecorRange) active; buf_T *buf; int top_row; int row; diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 49bd170bcd..1579f3ff98 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -992,6 +992,7 @@ static int insert_handle_key(InsertState *s) case K_LEFTDRAG: case K_LEFTRELEASE: case K_LEFTRELEASE_NM: + case K_MOUSEMOVE: case K_MIDDLEMOUSE: case K_MIDDLEDRAG: case K_MIDDLERELEASE: @@ -1604,13 +1605,20 @@ void edit_putchar(int c, bool highlight) } } +/// Return the effective prompt for the specified buffer. +char_u *buf_prompt_text(const buf_T *const buf) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT +{ + if (buf->b_prompt_text == NULL) { + return (char_u *)"% "; + } + return buf->b_prompt_text; +} + // Return the effective prompt for the current buffer. -char_u *prompt_text(void) +char_u *prompt_text(void) FUNC_ATTR_WARN_UNUSED_RESULT { - if (curbuf->b_prompt_text == NULL) { - return (char_u *)"% "; - } - return curbuf->b_prompt_text; + return buf_prompt_text(curbuf); } // Prepare for prompt mode: Make sure the last line has the prompt text. @@ -2058,7 +2066,7 @@ static bool check_compl_option(bool dict_opt) vim_beep(BO_COMPL); setcursor(); ui_flush(); - os_delay(2000L, false); + os_delay(2004L, false); } return false; } @@ -2319,7 +2327,11 @@ static int ins_compl_add(char_u *const str, int len, const Direction dir = (cdir == kDirectionNotSet ? compl_direction : cdir); int flags = flags_arg; - os_breakcheck(); + if (flags & CP_FAST) { + fast_breakcheck(); + } else { + os_breakcheck(); + } #define FREE_CPTEXT(cptext, cptext_allocated) \ do { \ if (cptext != NULL && cptext_allocated) { \ @@ -2523,7 +2535,8 @@ static void ins_compl_add_matches(int num_matches, char_u **matches, int icase) for (int i = 0; i < num_matches && add_r != FAIL; i++) { if ((add_r = ins_compl_add(matches[i], -1, NULL, NULL, false, NULL, dir, - icase ? CP_ICASE : 0, false)) == OK) { + CP_FAST | (icase ? CP_ICASE : 0), + false)) == OK) { // If dir was BACKWARD then honor it just once. dir = FORWARD; } @@ -2598,7 +2611,7 @@ void set_completion(colnr_T startcol, list_T *list) flags |= CP_ICASE; } if (ins_compl_add(compl_orig_text, -1, NULL, NULL, false, NULL, 0, - flags, false) != OK) { + flags | CP_FAST, false) != OK) { return; } @@ -3137,9 +3150,7 @@ static void ins_compl_clear(void) XFREE_CLEAR(compl_orig_text); compl_enter_selects = false; // clear v:completed_item - dict_T *const d = tv_dict_alloc(); - d->dv_lock = VAR_FIXED; - set_vim_var_dict(VV_COMPLETED_ITEM, d); + set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc_lock(VAR_FIXED)); } /// Check that Insert completion is active. @@ -3318,8 +3329,8 @@ static int ins_compl_bs(void) // allow the word to be deleted, we won't match everything. // Respect the 'backspace' option. if ((int)(p - line) - (int)compl_col < 0 - || ((int)(p - line) - (int)compl_col == 0 - && ctrl_x_mode != CTRL_X_OMNI) || ctrl_x_mode == CTRL_X_EVAL + || ((int)(p - line) - (int)compl_col == 0 && ctrl_x_mode != CTRL_X_OMNI) + || ctrl_x_mode == CTRL_X_EVAL || (!can_bs(BS_START) && (int)(p - line) - (int)compl_col - compl_length < 0)) { return K_BS; @@ -3934,7 +3945,7 @@ static void ins_compl_add_list(list_T *const list) // Go through the List with matches and add each of them. TV_LIST_ITER(list, li, { - if (ins_compl_add_tv(TV_LIST_ITEM_TV(li), dir) == OK) { + if (ins_compl_add_tv(TV_LIST_ITEM_TV(li), dir, true) == OK) { // If dir was BACKWARD then honor it just once. dir = FORWARD; } else if (did_emsg) { @@ -3973,17 +3984,18 @@ static void ins_compl_add_dict(dict_T *dict) /// /// @param[in] tv Object to get matches from. /// @param[in] dir Completion direction. +/// @param[in] fast use fast_breakcheck() instead of os_breakcheck(). /// /// @return NOTDONE if the given string is already in the list of completions, /// otherwise it is added to the list and OK is returned. FAIL will be /// returned in case of error. -int ins_compl_add_tv(typval_T *const tv, const Direction dir) +int ins_compl_add_tv(typval_T *const tv, const Direction dir, bool fast) FUNC_ATTR_NONNULL_ALL { const char *word; bool dup = false; bool empty = false; - int flags = 0; + int flags = fast ? CP_FAST : 0; char *(cptext[CPT_COUNT]); typval_T user_data; @@ -4483,9 +4495,7 @@ static void ins_compl_delete(void) // causes flicker, thus we can't do that. changed_cline_bef_curs(); // clear v:completed_item - dict_T *const d = tv_dict_alloc(); - d->dv_lock = VAR_FIXED; - set_vim_var_dict(VV_COMPLETED_ITEM, d); + set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc_lock(VAR_FIXED)); } // Insert the new text being completed. @@ -4506,8 +4516,7 @@ static void ins_compl_insert(int in_compl_func) static dict_T *ins_compl_dict_alloc(compl_T *match) { // { word, abbr, menu, kind, info } - dict_T *dict = tv_dict_alloc(); - dict->dv_lock = VAR_FIXED; + dict_T *dict = tv_dict_alloc_lock(VAR_FIXED); tv_dict_add_str( dict, S_LEN("word"), (const char *)EMPTY_IF_NULL(match->cp_str)); @@ -8787,10 +8796,6 @@ static bool ins_tab(void) getvcol(curwin, &fpos, &vcol, NULL, NULL); getvcol(curwin, cursor, &want_vcol, NULL, NULL); - // save start of changed region for extmark_splice - int start_row = fpos.lnum; - colnr_T start_col = fpos.col; - // Use as many TABs as possible. Beware of 'breakindent', 'showbreak' // and 'linebreak' adding extra virtual columns. while (ascii_iswhite(*ptr)) { @@ -8841,8 +8846,8 @@ static bool ins_tab(void) } } if (!(State & VREPLACE_FLAG)) { - extmark_splice_cols(curbuf, start_row - 1, start_col, - cursor->col - start_col, fpos.col - start_col, + extmark_splice_cols(curbuf, fpos.lnum - 1, change_col, + cursor->col - change_col, fpos.col - change_col, kExtmarkUndo); } } diff --git a/src/nvim/edit.h b/src/nvim/edit.h index 09f401ee82..ef5dce738a 100644 --- a/src/nvim/edit.h +++ b/src/nvim/edit.h @@ -19,6 +19,7 @@ typedef enum { CP_CONT_S_IPOS = 4, // use CONT_S_IPOS for compl_cont_status CP_EQUAL = 8, // ins_compl_equal() always returns true CP_ICASE = 16, // ins_compl_equal ignores case + CP_FAST = 32, // use fast_breakcheck instead of os_breakcheck } cp_flags_T; typedef int (*IndentGetter)(void); diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 9c3941b0fd..a75cc78b7e 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -213,6 +213,9 @@ static struct vimvar { VV(VV_FALSE, "false", VAR_BOOL, VV_RO), VV(VV_TRUE, "true", VAR_BOOL, VV_RO), VV(VV_NULL, "null", VAR_SPECIAL, VV_RO), + VV(VV_NUMBERMAX, "numbermax", VAR_NUMBER, VV_RO), + VV(VV_NUMBERMIN, "numbermin", VAR_NUMBER, VV_RO), + VV(VV_NUMBERSIZE, "numbersize", VAR_NUMBER, VV_RO), VV(VV_VIM_DID_ENTER, "vim_did_enter", VAR_NUMBER, VV_RO), VV(VV_TESTING, "testing", VAR_NUMBER, 0), VV(VV_TYPE_NUMBER, "t_number", VAR_NUMBER, VV_RO), @@ -225,10 +228,12 @@ static struct vimvar { VV(VV_EVENT, "event", VAR_DICT, VV_RO), VV(VV_ECHOSPACE, "echospace", VAR_NUMBER, VV_RO), VV(VV_ARGV, "argv", VAR_LIST, VV_RO), + VV(VV_COLLATE, "collate", VAR_STRING, VV_RO), VV(VV_EXITING, "exiting", VAR_NUMBER, VV_RO), // Neovim VV(VV_STDERR, "stderr", VAR_NUMBER, VV_RO), VV(VV_MSGPACK_TYPES, "msgpack_types", VAR_DICT, VV_RO), + VV(VV__NULL_STRING, "_null_string", VAR_STRING, VV_RO), VV(VV__NULL_LIST, "_null_list", VAR_LIST, VV_RO), VV(VV__NULL_DICT, "_null_dict", VAR_DICT, VV_RO), VV(VV_LUA, "lua", VAR_PARTIAL, VV_RO), @@ -372,11 +377,9 @@ void eval_init(void) msgpack_types_dict->dv_lock = VAR_FIXED; set_vim_var_dict(VV_MSGPACK_TYPES, msgpack_types_dict); - set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc()); + set_vim_var_dict(VV_COMPLETED_ITEM, tv_dict_alloc_lock(VAR_FIXED)); - dict_T *v_event = tv_dict_alloc(); - v_event->dv_lock = VAR_FIXED; - set_vim_var_dict(VV_EVENT, v_event); + set_vim_var_dict(VV_EVENT, tv_dict_alloc_lock(VAR_FIXED)); set_vim_var_list(VV_ERRORS, tv_list_alloc(kListLenUnknown)); set_vim_var_nr(VV_STDERR, CHAN_STDERR); set_vim_var_nr(VV_SEARCHFORWARD, 1L); @@ -393,6 +396,9 @@ void eval_init(void) set_vim_var_bool(VV_FALSE, kBoolVarFalse); set_vim_var_bool(VV_TRUE, kBoolVarTrue); set_vim_var_special(VV_NULL, kSpecialVarNull); + set_vim_var_nr(VV_NUMBERMAX, VARNUMBER_MAX); + set_vim_var_nr(VV_NUMBERMIN, VARNUMBER_MIN); + set_vim_var_nr(VV_NUMBERSIZE, sizeof(varnumber_T) * 8); set_vim_var_special(VV_EXITING, kSpecialVarNull); set_vim_var_nr(VV_ECHOSPACE, sc_col - 1); @@ -916,6 +922,17 @@ varnumber_T eval_to_number(char_u *expr) return retval; } +// Top level evaluation function. +// Returns an allocated typval_T with the result. +// Returns NULL when there is an error. +typval_T *eval_expr(char_u *arg) +{ + typval_T *tv = xmalloc(sizeof(*tv)); + if (eval0(arg, tv, NULL, true) == FAIL) { + XFREE_CLEAR(tv); + } + return tv; +} /* * Prepare v: variable "idx" to be used. @@ -1557,7 +1574,7 @@ static const char_u *skip_var_list(const char_u *arg, int *var_count, break; else if (*p == ';') { if (*semicolon == 1) { - EMSG(_("Double ; in list of variables")); + EMSG(_("E452: Double ; in list of variables")); return NULL; } *semicolon = 1; @@ -1602,7 +1619,7 @@ void list_hashtable_vars(hashtab_T *ht, const char *prefix, int empty, char buf[IOSIZE]; // apply :filter /pat/ to variable name - xstrlcpy(buf, prefix, IOSIZE - 1); + xstrlcpy(buf, prefix, IOSIZE); xstrlcat(buf, (char *)di->di_key, IOSIZE); if (message_filtered((char_u *)buf)) { continue; @@ -3129,21 +3146,6 @@ static int pattern_match(char_u *pat, char_u *text, bool ic) return matches; } -/* - * types for expressions. - */ -typedef enum { - TYPE_UNKNOWN = 0, - TYPE_EQUAL, // == - TYPE_NEQUAL, // != - TYPE_GREATER, // > - TYPE_GEQUAL, // >= - TYPE_SMALLER, // < - TYPE_SEQUAL, // <= - TYPE_MATCH, // =~ - TYPE_NOMATCH, // !~ -} exptype_T; - // TODO(ZyX-I): move to eval/expressions /* @@ -3420,11 +3422,8 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate) { typval_T var2; char_u *p; - int i; - exptype_T type = TYPE_UNKNOWN; - bool type_is = false; // true for "is" and "isnot" + exprtype_T type = EXPR_UNKNOWN; int len = 2; - varnumber_T n1, n2; bool ic; /* @@ -3435,35 +3434,42 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate) p = *arg; switch (p[0]) { - case '=': if (p[1] == '=') - type = TYPE_EQUAL; - else if (p[1] == '~') - type = TYPE_MATCH; + case '=': + if (p[1] == '=') { + type = EXPR_EQUAL; + } else if (p[1] == '~') { + type = EXPR_MATCH; + } break; - case '!': if (p[1] == '=') - type = TYPE_NEQUAL; - else if (p[1] == '~') - type = TYPE_NOMATCH; + case '!': + if (p[1] == '=') { + type = EXPR_NEQUAL; + } else if (p[1] == '~') { + type = EXPR_NOMATCH; + } break; - case '>': if (p[1] != '=') { - type = TYPE_GREATER; + case '>': + if (p[1] != '=') { + type = EXPR_GREATER; len = 1; - } else - type = TYPE_GEQUAL; + } else { + type = EXPR_GEQUAL; + } break; - case '<': if (p[1] != '=') { - type = TYPE_SMALLER; + case '<': + if (p[1] != '=') { + type = EXPR_SMALLER; len = 1; - } else - type = TYPE_SEQUAL; + } else { + type = EXPR_SEQUAL; + } break; case 'i': if (p[1] == 's') { if (p[2] == 'n' && p[3] == 'o' && p[4] == 't') { len = 5; } if (!isalnum(p[len]) && p[len] != '_') { - type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL; - type_is = true; + type = len == 2 ? EXPR_IS : EXPR_ISNOT; } } break; @@ -3472,7 +3478,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate) /* * If there is a comparative operator, use it. */ - if (type != TYPE_UNKNOWN) { + if (type != EXPR_UNKNOWN) { // extra question mark appended: ignore case if (p[len] == '?') { ic = true; @@ -3490,173 +3496,11 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate) tv_clear(rettv); return FAIL; } - if (evaluate) { - if (type_is && rettv->v_type != var2.v_type) { - /* For "is" a different type always means FALSE, for "notis" - * it means TRUE. */ - n1 = (type == TYPE_NEQUAL); - } else if (rettv->v_type == VAR_LIST || var2.v_type == VAR_LIST) { - if (type_is) { - n1 = (rettv->v_type == var2.v_type - && rettv->vval.v_list == var2.vval.v_list); - if (type == TYPE_NEQUAL) - n1 = !n1; - } else if (rettv->v_type != var2.v_type - || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) { - if (rettv->v_type != var2.v_type) { - EMSG(_("E691: Can only compare List with List")); - } else { - EMSG(_("E692: Invalid operation for List")); - } - tv_clear(rettv); - tv_clear(&var2); - return FAIL; - } else { - // Compare two Lists for being equal or unequal. - n1 = tv_list_equal(rettv->vval.v_list, var2.vval.v_list, ic, false); - if (type == TYPE_NEQUAL) { - n1 = !n1; - } - } - } else if (rettv->v_type == VAR_DICT || var2.v_type == VAR_DICT) { - if (type_is) { - n1 = (rettv->v_type == var2.v_type - && rettv->vval.v_dict == var2.vval.v_dict); - if (type == TYPE_NEQUAL) - n1 = !n1; - } else if (rettv->v_type != var2.v_type - || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) { - if (rettv->v_type != var2.v_type) - EMSG(_("E735: Can only compare Dictionary with Dictionary")); - else - EMSG(_("E736: Invalid operation for Dictionary")); - tv_clear(rettv); - tv_clear(&var2); - return FAIL; - } else { - // Compare two Dictionaries for being equal or unequal. - n1 = tv_dict_equal(rettv->vval.v_dict, var2.vval.v_dict, - ic, false); - if (type == TYPE_NEQUAL) { - n1 = !n1; - } - } - } else if (tv_is_func(*rettv) || tv_is_func(var2)) { - if (type != TYPE_EQUAL && type != TYPE_NEQUAL) { - EMSG(_("E694: Invalid operation for Funcrefs")); - tv_clear(rettv); - tv_clear(&var2); - return FAIL; - } - if ((rettv->v_type == VAR_PARTIAL - && rettv->vval.v_partial == NULL) - || (var2.v_type == VAR_PARTIAL - && var2.vval.v_partial == NULL)) { - // when a partial is NULL assume not equal - n1 = false; - } else if (type_is) { - if (rettv->v_type == VAR_FUNC && var2.v_type == VAR_FUNC) { - // strings are considered the same if their value is - // the same - n1 = tv_equal(rettv, &var2, ic, false); - } else if (rettv->v_type == VAR_PARTIAL - && var2.v_type == VAR_PARTIAL) { - n1 = (rettv->vval.v_partial == var2.vval.v_partial); - } else { - n1 = false; - } - } else { - n1 = tv_equal(rettv, &var2, ic, false); - } - if (type == TYPE_NEQUAL) { - n1 = !n1; - } - } - /* - * If one of the two variables is a float, compare as a float. - * When using "=~" or "!~", always compare as string. - */ - else if ((rettv->v_type == VAR_FLOAT || var2.v_type == VAR_FLOAT) - && type != TYPE_MATCH && type != TYPE_NOMATCH) { - float_T f1, f2; + const int ret = typval_compare(rettv, &var2, type, ic); - if (rettv->v_type == VAR_FLOAT) { - f1 = rettv->vval.v_float; - } else { - f1 = tv_get_number(rettv); - } - if (var2.v_type == VAR_FLOAT) { - f2 = var2.vval.v_float; - } else { - f2 = tv_get_number(&var2); - } - n1 = false; - switch (type) { - case TYPE_EQUAL: n1 = (f1 == f2); break; - case TYPE_NEQUAL: n1 = (f1 != f2); break; - case TYPE_GREATER: n1 = (f1 > f2); break; - case TYPE_GEQUAL: n1 = (f1 >= f2); break; - case TYPE_SMALLER: n1 = (f1 < f2); break; - case TYPE_SEQUAL: n1 = (f1 <= f2); break; - case TYPE_UNKNOWN: - case TYPE_MATCH: - case TYPE_NOMATCH: break; - } - } - /* - * If one of the two variables is a number, compare as a number. - * When using "=~" or "!~", always compare as string. - */ - else if ((rettv->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER) - && type != TYPE_MATCH && type != TYPE_NOMATCH) { - n1 = tv_get_number(rettv); - n2 = tv_get_number(&var2); - switch (type) { - case TYPE_EQUAL: n1 = (n1 == n2); break; - case TYPE_NEQUAL: n1 = (n1 != n2); break; - case TYPE_GREATER: n1 = (n1 > n2); break; - case TYPE_GEQUAL: n1 = (n1 >= n2); break; - case TYPE_SMALLER: n1 = (n1 < n2); break; - case TYPE_SEQUAL: n1 = (n1 <= n2); break; - case TYPE_UNKNOWN: - case TYPE_MATCH: - case TYPE_NOMATCH: break; - } - } else { - char buf1[NUMBUFLEN]; - char buf2[NUMBUFLEN]; - const char *const s1 = tv_get_string_buf(rettv, buf1); - const char *const s2 = tv_get_string_buf(&var2, buf2); - if (type != TYPE_MATCH && type != TYPE_NOMATCH) { - i = mb_strcmp_ic(ic, s1, s2); - } else { - i = 0; - } - n1 = false; - switch (type) { - case TYPE_EQUAL: n1 = (i == 0); break; - case TYPE_NEQUAL: n1 = (i != 0); break; - case TYPE_GREATER: n1 = (i > 0); break; - case TYPE_GEQUAL: n1 = (i >= 0); break; - case TYPE_SMALLER: n1 = (i < 0); break; - case TYPE_SEQUAL: n1 = (i <= 0); break; - - case TYPE_MATCH: - case TYPE_NOMATCH: { - n1 = pattern_match((char_u *)s2, (char_u *)s1, ic); - if (type == TYPE_NOMATCH) { - n1 = !n1; - } - break; - } - case TYPE_UNKNOWN: break; // Avoid gcc warning. - } - } - tv_clear(rettv); tv_clear(&var2); - rettv->v_type = VAR_NUMBER; - rettv->vval.v_number = n1; + return ret; } } @@ -5981,6 +5825,35 @@ static void assert_append_cmd_or_arg(garray_T *gap, typval_T *argvars, } } +int assert_beeps(typval_T *argvars, bool no_beep) + FUNC_ATTR_NONNULL_ALL +{ + const char *const cmd = tv_get_string_chk(&argvars[0]); + int ret = 0; + + called_vim_beep = false; + suppress_errthrow = true; + emsg_silent = false; + do_cmdline_cmd(cmd); + if (no_beep ? called_vim_beep : !called_vim_beep) { + garray_T ga; + prepare_assert_error(&ga); + if (no_beep) { + ga_concat(&ga, (const char_u *)"command did beep: "); + } else { + ga_concat(&ga, (const char_u *)"command did not beep: "); + } + ga_concat(&ga, (const char_u *)cmd); + assert_error(&ga); + ga_clear(&ga); + ret = 1; + } + + suppress_errthrow = false; + emsg_on_display = false; + return ret; +} + int assert_fails(typval_T *argvars) FUNC_ATTR_NONNULL_ALL { @@ -6234,6 +6107,7 @@ void common_function(typval_T *argvars, typval_T *rettv, // function(dict.MyFunc, [arg]) arg_pt = argvars[0].vval.v_partial; s = partial_name(arg_pt); + // TODO(bfredl): do the entire nlua_is_table_from_lua dance } else { // function('MyFunc', [arg], dict) s = (char_u *)tv_get_string(&argvars[0]); @@ -6452,7 +6326,7 @@ void get_qf_loc_list(int is_qf, win_T *wp, typval_T *what_arg, if (what_arg->v_type == VAR_UNKNOWN) { tv_list_alloc_ret(rettv, kListLenMayKnow); if (is_qf || wp != NULL) { - (void)get_errorlist(NULL, wp, -1, rettv->vval.v_list); + (void)get_errorlist(NULL, wp, -1, 0, rettv->vval.v_list); } } else { tv_dict_alloc_ret(rettv); @@ -7333,7 +7207,6 @@ bool callback_from_typval(Callback *const callback, typval_T *const arg) char_u *name = nlua_register_table_as_callable(arg); if (name != NULL) { - func_ref(name); callback->data.funcref = vim_strsave(name); callback->type = kCallbackFuncref; } else { @@ -7742,7 +7615,7 @@ char *save_tv_as_string(typval_T *tv, ptrdiff_t *const len, bool endnl) /// @param[out] ret_fnum Set to fnum for marks. /// /// @return Pointer to position or NULL in case of error (e.g. invalid type). -pos_T *var2fpos(const typval_T *const tv, const int dollar_lnum, +pos_T *var2fpos(const typval_T *const tv, const bool dollar_lnum, int *const ret_fnum) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL { @@ -7971,8 +7844,8 @@ int get_id_len(const char **const arg) */ int get_name_len(const char **const arg, char **alias, - int evaluate, - int verbose) + bool evaluate, + bool verbose) { int len; @@ -8457,10 +8330,8 @@ char_u *set_cmdarg(exarg_T *eap, char_u *oldarg) return oldval; } -/* - * Get the value of internal variable "name". - * Return OK or FAIL. - */ +// Get the value of internal variable "name". +// Return OK or FAIL. If OK is returned "rettv" must be cleared. int get_var_tv( const char *name, int len, // length of "name" @@ -10717,3 +10588,209 @@ bool invoke_prompt_interrupt(void) tv_clear(&rettv); return true; } + +// Compare "typ1" and "typ2". Put the result in "typ1". +int typval_compare( + typval_T *typ1, // first operand + typval_T *typ2, // second operand + exprtype_T type, // operator + bool ic // ignore case +) + FUNC_ATTR_NONNULL_ALL +{ + varnumber_T n1, n2; + const bool type_is = type == EXPR_IS || type == EXPR_ISNOT; + + if (type_is && typ1->v_type != typ2->v_type) { + // For "is" a different type always means false, for "notis" + // it means true. + n1 = type == EXPR_ISNOT; + } else if (typ1->v_type == VAR_LIST || typ2->v_type == VAR_LIST) { + if (type_is) { + n1 = typ1->v_type == typ2->v_type + && typ1->vval.v_list == typ2->vval.v_list; + if (type == EXPR_ISNOT) { + n1 = !n1; + } + } else if (typ1->v_type != typ2->v_type + || (type != EXPR_EQUAL && type != EXPR_NEQUAL)) { + if (typ1->v_type != typ2->v_type) { + EMSG(_("E691: Can only compare List with List")); + } else { + EMSG(_("E692: Invalid operation for List")); + } + tv_clear(typ1); + return FAIL; + } else { + // Compare two Lists for being equal or unequal. + n1 = tv_list_equal(typ1->vval.v_list, typ2->vval.v_list, ic, false); + if (type == EXPR_NEQUAL) { + n1 = !n1; + } + } + } else if (typ1->v_type == VAR_DICT || typ2->v_type == VAR_DICT) { + if (type_is) { + n1 = typ1->v_type == typ2->v_type + && typ1->vval.v_dict == typ2->vval.v_dict; + if (type == EXPR_ISNOT) { + n1 = !n1; + } + } else if (typ1->v_type != typ2->v_type + || (type != EXPR_EQUAL && type != EXPR_NEQUAL)) { + if (typ1->v_type != typ2->v_type) { + EMSG(_("E735: Can only compare Dictionary with Dictionary")); + } else { + EMSG(_("E736: Invalid operation for Dictionary")); + } + tv_clear(typ1); + return FAIL; + } else { + // Compare two Dictionaries for being equal or unequal. + n1 = tv_dict_equal(typ1->vval.v_dict, typ2->vval.v_dict, ic, false); + if (type == EXPR_NEQUAL) { + n1 = !n1; + } + } + } else if (tv_is_func(*typ1) || tv_is_func(*typ2)) { + if (type != EXPR_EQUAL && type != EXPR_NEQUAL + && type != EXPR_IS && type != EXPR_ISNOT) { + EMSG(_("E694: Invalid operation for Funcrefs")); + tv_clear(typ1); + return FAIL; + } + if ((typ1->v_type == VAR_PARTIAL && typ1->vval.v_partial == NULL) + || (typ2->v_type == VAR_PARTIAL && typ2->vval.v_partial == NULL)) { + // when a partial is NULL assume not equal + n1 = false; + } else if (type_is) { + if (typ1->v_type == VAR_FUNC && typ2->v_type == VAR_FUNC) { + // strings are considered the same if their value is + // the same + n1 = tv_equal(typ1, typ2, ic, false); + } else if (typ1->v_type == VAR_PARTIAL && typ2->v_type == VAR_PARTIAL) { + n1 = typ1->vval.v_partial == typ2->vval.v_partial; + } else { + n1 = false; + } + } else { + n1 = tv_equal(typ1, typ2, ic, false); + } + if (type == EXPR_NEQUAL || type == EXPR_ISNOT) { + n1 = !n1; + } + } else if ((typ1->v_type == VAR_FLOAT || typ2->v_type == VAR_FLOAT) + && type != EXPR_MATCH && type != EXPR_NOMATCH) { + // If one of the two variables is a float, compare as a float. + // When using "=~" or "!~", always compare as string. + const float_T f1 = tv_get_float(typ1); + const float_T f2 = tv_get_float(typ2); + n1 = false; + switch (type) { + case EXPR_IS: + case EXPR_EQUAL: n1 = f1 == f2; break; + case EXPR_ISNOT: + case EXPR_NEQUAL: n1 = f1 != f2; break; + case EXPR_GREATER: n1 = f1 > f2; break; + case EXPR_GEQUAL: n1 = f1 >= f2; break; + case EXPR_SMALLER: n1 = f1 < f2; break; + case EXPR_SEQUAL: n1 = f1 <= f2; break; + case EXPR_UNKNOWN: + case EXPR_MATCH: + case EXPR_NOMATCH: break; // avoid gcc warning + } + } else if ((typ1->v_type == VAR_NUMBER || typ2->v_type == VAR_NUMBER) + && type != EXPR_MATCH && type != EXPR_NOMATCH) { + // If one of the two variables is a number, compare as a number. + // When using "=~" or "!~", always compare as string. + n1 = tv_get_number(typ1); + n2 = tv_get_number(typ2); + switch (type) { + case EXPR_IS: + case EXPR_EQUAL: n1 = n1 == n2; break; + case EXPR_ISNOT: + case EXPR_NEQUAL: n1 = n1 != n2; break; + case EXPR_GREATER: n1 = n1 > n2; break; + case EXPR_GEQUAL: n1 = n1 >= n2; break; + case EXPR_SMALLER: n1 = n1 < n2; break; + case EXPR_SEQUAL: n1 = n1 <= n2; break; + case EXPR_UNKNOWN: + case EXPR_MATCH: + case EXPR_NOMATCH: break; // avoid gcc warning + } + } else { + char buf1[NUMBUFLEN]; + char buf2[NUMBUFLEN]; + const char *const s1 = tv_get_string_buf(typ1, buf1); + const char *const s2 = tv_get_string_buf(typ2, buf2); + int i; + if (type != EXPR_MATCH && type != EXPR_NOMATCH) { + i = mb_strcmp_ic(ic, s1, s2); + } else { + i = 0; + } + n1 = false; + switch (type) { + case EXPR_IS: + case EXPR_EQUAL: n1 = i == 0; break; + case EXPR_ISNOT: + case EXPR_NEQUAL: n1 = i != 0; break; + case EXPR_GREATER: n1 = i > 0; break; + case EXPR_GEQUAL: n1 = i >= 0; break; + case EXPR_SMALLER: n1 = i < 0; break; + case EXPR_SEQUAL: n1 = i <= 0; break; + + case EXPR_MATCH: + case EXPR_NOMATCH: + n1 = pattern_match((char_u *)s2, (char_u *)s1, ic); + if (type == EXPR_NOMATCH) { + n1 = !n1; + } + break; + case EXPR_UNKNOWN: break; // avoid gcc warning + } + } + tv_clear(typ1); + typ1->v_type = VAR_NUMBER; + typ1->vval.v_number = n1; + return OK; +} + +char *typval_tostring(typval_T *arg) +{ + if (arg == NULL) { + return xstrdup("(does not exist)"); + } + return encode_tv2string(arg, NULL); +} + +bool var_exists(const char *var) + FUNC_ATTR_NONNULL_ALL +{ + char *tofree; + bool n = false; + + // get_name_len() takes care of expanding curly braces + const char *name = var; + const int len = get_name_len((const char **)&var, &tofree, true, false); + if (len > 0) { + typval_T tv; + + if (tofree != NULL) { + name = tofree; + } + n = get_var_tv(name, len, &tv, NULL, false, true) == OK; + if (n) { + // Handle d.key, l[idx], f(expr). + n = handle_subscript(&var, &tv, true, false) == OK; + if (n) { + tv_clear(&tv); + } + } + } + if (*var != NUL) { + n = false; + } + + xfree(tofree); + return n; +} diff --git a/src/nvim/eval.h b/src/nvim/eval.h index 4f03d5d259..41120b3c78 100644 --- a/src/nvim/eval.h +++ b/src/nvim/eval.h @@ -142,6 +142,9 @@ typedef enum { VV_FALSE, VV_TRUE, VV_NULL, + VV_NUMBERMAX, + VV_NUMBERMIN, + VV_NUMBERSIZE, VV_VIM_DID_ENTER, VV_TESTING, VV_TYPE_NUMBER, @@ -154,10 +157,12 @@ typedef enum { VV_EVENT, VV_ECHOSPACE, VV_ARGV, + VV_COLLATE, VV_EXITING, // Neovim VV_STDERR, VV_MSGPACK_TYPES, + VV__NULL_STRING, // String with NULL value. For test purposes only. VV__NULL_LIST, // List with NULL value. For test purposes only. VV__NULL_DICT, // Dictionary with NULL value. For test purposes only. VV_LUA, @@ -227,6 +232,21 @@ typedef enum ASSERT_OTHER, } assert_type_T; +/// types for expressions. +typedef enum { + EXPR_UNKNOWN = 0, + EXPR_EQUAL, ///< == + EXPR_NEQUAL, ///< != + EXPR_GREATER, ///< > + EXPR_GEQUAL, ///< >= + EXPR_SMALLER, ///< < + EXPR_SEQUAL, ///< <= + EXPR_MATCH, ///< =~ + EXPR_NOMATCH, ///< !~ + EXPR_IS, ///< is + EXPR_ISNOT, ///< isnot +} exprtype_T; + /// Type for dict_list function typedef enum { kDictListKeys, ///< List dictionary keys. diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index 72168060cc..33c6fae5cf 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -26,7 +26,7 @@ return { arglistid={args={0, 2}}, argv={args={0, 2}}, asin={args=1, func="float_op_wrapper", data="&asin"}, -- WJMc - assert_beeps={args={1, 2}}, + assert_beeps={args={1}}, assert_equal={args={2, 3}}, assert_equalfile={args={2, 3}}, assert_exception={args={1, 2}}, @@ -34,6 +34,7 @@ return { assert_false={args={1, 2}}, assert_inrange={args={3, 4}}, assert_match={args={2, 3}}, + assert_nobeep={args={1}}, assert_notequal={args={2, 3}}, assert_notmatch={args={2, 3}}, assert_report={args=1}, @@ -216,7 +217,7 @@ return { len={args=1}, libcall={args=3}, libcallnr={args=3}, - line={args=1}, + line={args={1, 2}}, line2byte={args=1}, lispindent={args=1}, list2str={args={1, 2}}, @@ -250,6 +251,7 @@ return { pow={args=2}, prevnonblank={args=1}, printf={args=varargs(1)}, + prompt_getprompt={args=1}, prompt_setcallback={args={2, 2}}, prompt_setinterrupt={args={2, 2}}, prompt_setprompt={args={2, 2}}, @@ -284,6 +286,7 @@ return { screenpos={args=3}, screenrow={}, search={args={1, 4}}, + searchcount={args={0,1}}, searchdecl={args={1, 3}}, searchpair={args={3, 7}}, searchpairpos={args={3, 7}}, @@ -315,8 +318,10 @@ return { sign_getplaced={args={0, 2}}, sign_jump={args={3, 3}}, sign_place={args={4, 5}}, + sign_placelist={args={1}}, sign_undefine={args={0, 1}}, sign_unplace={args={1, 2}}, + sign_unplacelist={args={1}}, simplify={args=1}, sin={args=1, func="float_op_wrapper", data="&sin"}, sinh={args=1, func="float_op_wrapper", data="&sinh"}, @@ -386,6 +391,7 @@ return { visualmode={args={0, 1}}, wait={args={2,3}}, wildmenumode={}, + win_execute={args={2, 3}}, win_findbuf={args=1}, win_getid={args={0,2}}, win_gettype={args={0,1}}, diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index deeda28571..caaf675db2 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -391,28 +391,16 @@ static void f_argv(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } +// "assert_beeps(cmd [, error])" function static void f_assert_beeps(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - const char *const cmd = tv_get_string_chk(&argvars[0]); - garray_T ga; - int ret = 0; - - called_vim_beep = false; - suppress_errthrow = true; - emsg_silent = false; - do_cmdline_cmd(cmd); - if (!called_vim_beep) { - prepare_assert_error(&ga); - ga_concat(&ga, (const char_u *)"command did not beep: "); - ga_concat(&ga, (const char_u *)cmd); - assert_error(&ga); - ga_clear(&ga); - ret = 1; - } + rettv->vval.v_number = assert_beeps(argvars, false); +} - suppress_errthrow = false; - emsg_on_display = false; - rettv->vval.v_number = ret; +// "assert_nobeep(cmd [, error])" function +static void f_assert_nobeep(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv->vval.v_number = assert_beeps(argvars, true); } // "assert_equal(expected, actual[, msg])" function @@ -614,12 +602,7 @@ static void f_bufname(typval_T *argvars, typval_T *rettv, FunPtr fptr) if (argvars[0].v_type == VAR_UNKNOWN) { buf = curbuf; } else { - if (!tv_check_str_or_nr(&argvars[0])) { - return; - } - emsg_off++; - buf = tv_get_buf(&argvars[0], false); - emsg_off--; + buf = tv_get_buf_from_arg(&argvars[0]); } if (buf != NULL && buf->b_fname != NULL) { rettv->vval.v_string = (char_u *)xstrdup((char *)buf->b_fname); @@ -639,6 +622,9 @@ static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) if (argvars[0].v_type == VAR_UNKNOWN) { buf = curbuf; } else { + // Don't use tv_get_buf_from_arg(); we continue if the buffer wasn't found + // and the second argument isn't zero, but we want to return early if the + // first argument isn't a string or number so only one error is shown. if (!tv_check_str_or_nr(&argvars[0])) { return; } @@ -665,18 +651,12 @@ static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void buf_win_common(typval_T *argvars, typval_T *rettv, bool get_nr) { - if (!tv_check_str_or_nr(&argvars[0])) { + const buf_T *const buf = tv_get_buf_from_arg(&argvars[0]); + if (buf == NULL) { // no need to search if invalid arg or buffer not found rettv->vval.v_number = -1; return; } - emsg_off++; - buf_T *buf = tv_get_buf(&argvars[0], true); - if (buf == NULL) { // no need to search if buffer was not found - rettv->vval.v_number = -1; - goto end; - } - int winnr = 0; int winid; bool found_buf = false; @@ -689,8 +669,6 @@ static void buf_win_common(typval_T *argvars, typval_T *rettv, bool get_nr) } } rettv->vval.v_number = (found_buf ? (get_nr ? winnr : winid) : -1); -end: - emsg_off--; } /// "bufwinid(nr)" function @@ -743,6 +721,18 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only) return buf; } +/// Like tv_get_buf() but give an error message if the type is wrong. +buf_T *tv_get_buf_from_arg(typval_T *const tv) FUNC_ATTR_NONNULL_ALL +{ + if (!tv_check_str_or_nr(tv)) { + return NULL; + } + emsg_off++; + buf_T *const buf = tv_get_buf(tv, false); + emsg_off--; + return buf; +} + /// Get the buffer from "arg" and give an error and return NULL if it is not /// valid. buf_T * get_buf_arg(typval_T *arg) @@ -822,6 +812,7 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } + bool owned = false; char_u *func; partial_T *partial = NULL; dict_T *selfdict = NULL; @@ -832,6 +823,7 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) func = partial_name(partial); } else if (nlua_is_table_from_lua(&argvars[0])) { func = nlua_register_table_as_callable(&argvars[0]); + owned = true; } else { func = (char_u *)tv_get_string(&argvars[0]); } @@ -849,6 +841,9 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) } func_call(func, &argvars[1], partial, selfdict, rettv); + if (owned) { + func_unref(func); + } } /* @@ -923,7 +918,7 @@ static void f_chansend(typval_T *argvars, typval_T *rettv, FunPtr fptr) } uint64_t id = argvars[0].vval.v_number; const char *error = NULL; - rettv->vval.v_number = channel_send(id, input, input_len, &error); + rettv->vval.v_number = channel_send(id, input, input_len, true, &error); if (error) { EMSG(error); } @@ -1105,7 +1100,7 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) */ static void f_complete_add(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0); + rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0, false); } /* @@ -1855,15 +1850,30 @@ static void f_environ(typval_T *argvars, typval_T *rettv, FunPtr fptr) ptrdiff_t len = end - str; assert(len > 0); const char * value = str + len + 1; - if (tv_dict_find(rettv->vval.v_dict, str, len) != NULL) { + + char c = env[i][len]; + env[i][len] = NUL; + +#ifdef WIN32 + // Upper-case all the keys for Windows so we can detect duplicates + char *const key = strcase_save(str, true); +#else + char *const key = xstrdup(str); +#endif + + env[i][len] = c; + + if (tv_dict_find(rettv->vval.v_dict, key, len) != NULL) { // Since we're traversing from the end of the env block to the front, any // duplicate names encountered should be ignored. This preserves the // semantics of env vars defined later in the env block taking precedence. + xfree(key); continue; } tv_dict_add_str(rettv->vval.v_dict, - str, len, + key, len, value); + xfree(key); } os_free_fullenv(env); } @@ -1958,8 +1968,8 @@ static char_u *get_list_line(int c, void *cookie, int indent, bool do_concat) return (char_u *)(s == NULL ? NULL : xstrdup(s)); } -// "execute(command)" function -static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) +static void execute_common(typval_T *argvars, typval_T *rettv, FunPtr fptr, + int arg_off) { const int save_msg_silent = msg_silent; const int save_emsg_silent = emsg_silent; @@ -1973,9 +1983,9 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - if (argvars[1].v_type != VAR_UNKNOWN) { + if (argvars[arg_off + 1].v_type != VAR_UNKNOWN) { char buf[NUMBUFLEN]; - const char *const s = tv_get_string_buf_chk(&argvars[1], buf); + const char *const s = tv_get_string_buf_chk(&argvars[arg_off + 1], buf); if (s == NULL) { return; @@ -2002,10 +2012,10 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) msg_col = 0; // prevent leading spaces } - if (argvars[0].v_type != VAR_LIST) { - do_cmdline_cmd(tv_get_string(&argvars[0])); - } else if (argvars[0].vval.v_list != NULL) { - list_T *const list = argvars[0].vval.v_list; + if (argvars[arg_off].v_type != VAR_LIST) { + do_cmdline_cmd(tv_get_string(&argvars[arg_off])); + } else if (argvars[arg_off].vval.v_list != NULL) { + list_T *const list = argvars[arg_off].vval.v_list; tv_list_ref(list); GetListLineCookie cookie = { .l = list, @@ -2037,6 +2047,39 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) capture_ga = save_capture_ga; } +// "execute(command)" function +static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + execute_common(argvars, rettv, fptr, 0); +} + +// "win_execute(win_id, command)" function +static void f_win_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + tabpage_T *tp; + win_T *wp = win_id2wp_tp(argvars, &tp); + win_T *save_curwin; + tabpage_T *save_curtab; + // Return an empty string if something fails. + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; + + if (wp != NULL && tp != NULL) { + pos_T curpos = wp->w_cursor; + if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, true) == + OK) { + check_cursor(); + execute_common(argvars, rettv, fptr, 1); + } + restore_win_noblock(save_curwin, save_curtab, true); + + // Update the status line if the cursor moved. + if (win_valid(wp) && !equalpos(curpos, wp->w_cursor)) { + wp->w_redr_status = true; + } + } +} + /// "exepath()" function static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr) { @@ -2058,7 +2101,6 @@ static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr) { int n = false; - int len = 0; const char *p = tv_get_string(&argvars[0]); if (*p == '$') { // Environment variable. @@ -2089,29 +2131,7 @@ static void f_exists(typval_T *argvars, typval_T *rettv, FunPtr fptr) n = au_exists(p + 1); } } else { // Internal variable. - typval_T tv; - - // get_name_len() takes care of expanding curly braces - const char *name = p; - char *tofree; - len = get_name_len((const char **)&p, &tofree, true, false); - if (len > 0) { - if (tofree != NULL) { - name = tofree; - } - n = (get_var_tv(name, len, &tv, NULL, false, true) == OK); - if (n) { - // Handle d.key, l[idx], f(expr). - n = (handle_subscript(&p, &tv, true, false) == OK); - if (n) { - tv_clear(&tv); - } - } - } - if (*p != NUL) - n = FALSE; - - xfree(tofree); + n = var_exists(p); } rettv->vval.v_number = n; @@ -2765,10 +2785,9 @@ static void f_get(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } else if (strcmp(what, "args") == 0) { rettv->v_type = VAR_LIST; - if (tv_list_alloc_ret(rettv, pt->pt_argc) != NULL) { - for (int i = 0; i < pt->pt_argc; i++) { - tv_list_append_tv(rettv->vval.v_list, &pt->pt_argv[i]); - } + tv_list_alloc_ret(rettv, pt->pt_argc); + for (int i = 0; i < pt->pt_argc; i++) { + tv_list_append_tv(rettv->vval.v_list, &pt->pt_argv[i]); } } else { EMSG2(_(e_invarg2), what); @@ -2829,13 +2848,9 @@ static void f_getbufinfo(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } else if (argvars[0].v_type != VAR_UNKNOWN) { // Information about one buffer. Argument specifies the buffer - if (tv_check_num(&argvars[0])) { // issue errmsg if type error - emsg_off++; - argbuf = tv_get_buf(&argvars[0], false); - emsg_off--; - if (argbuf == NULL) { - return; - } + argbuf = tv_get_buf_from_arg(&argvars[0]); + if (argbuf == NULL) { + return; } } @@ -2905,13 +2920,7 @@ static void get_buffer_lines(buf_T *buf, */ static void f_getbufline(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - buf_T *buf = NULL; - - if (tv_check_str_or_nr(&argvars[0])) { - emsg_off++; - buf = tv_get_buf(&argvars[0], false); - emsg_off--; - } + buf_T *const buf = tv_get_buf_from_arg(&argvars[0]); const linenr_T lnum = tv_get_lnum_buf(&argvars[1], buf); const linenr_T end = (argvars[2].v_type == VAR_UNKNOWN @@ -3054,7 +3063,10 @@ static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr) n = safe_vgetc(); } - if (n == K_IGNORE || n == K_VER_SCROLLBAR || n == K_HOR_SCROLLBAR) { + if (n == K_IGNORE + || n == K_MOUSEMOVE + || n == K_VER_SCROLLBAR + || n == K_HOR_SCROLLBAR) { continue; } break; @@ -5099,7 +5111,21 @@ static dict_T *create_environment(const dictitem_T *job_env, } if (job_env) { +#ifdef WIN32 + TV_DICT_ITER(job_env->di_tv.vval.v_dict, var, { + // Always use upper-case keys for Windows so we detect duplicate keys + char *const key = strcase_save((const char *)var->di_key, true); + size_t len = strlen(key); + dictitem_T *dv = tv_dict_find(env, key, len); + if (dv) { + tv_dict_item_remove(env, dv); + } + tv_dict_add_str(env, key, len, tv_get_string(&var->di_tv)); + xfree(key); + }); +#else tv_dict_extend(env, job_env->di_tv.vval.v_dict, "force"); +#endif } if (pty) { @@ -5542,18 +5568,36 @@ static void f_libcallnr(typval_T *argvars, typval_T *rettv, FunPtr fptr) libcall_common(argvars, rettv, VAR_NUMBER); } -/* - * "line(string)" function - */ +// "line(string, [winid])" function static void f_line(typval_T *argvars, typval_T *rettv, FunPtr fptr) { linenr_T lnum = 0; - pos_T *fp; + pos_T *fp = NULL; int fnum; - fp = var2fpos(&argvars[0], TRUE, &fnum); - if (fp != NULL) + if (argvars[1].v_type != VAR_UNKNOWN) { + tabpage_T *tp; + win_T *save_curwin; + tabpage_T *save_curtab; + + // use window specified in the second argument + win_T *wp = win_id2wp_tp(&argvars[1], &tp); + if (wp != NULL && tp != NULL) { + if (switch_win_noblock(&save_curwin, &save_curtab, wp, tp, true) + == OK) { + check_cursor(); + fp = var2fpos(&argvars[0], true, &fnum); + } + restore_win_noblock(save_curwin, save_curtab, true); + } + } else { + // use current window + fp = var2fpos(&argvars[0], true, &fnum); + } + + if (fp != NULL) { lnum = fp->lnum; + } rettv->vval.v_number = lnum; } @@ -6529,6 +6573,26 @@ static void f_prompt_setinterrupt(typval_T *argvars, buf->b_prompt_interrupt= interrupt_callback; } +/// "prompt_getprompt({buffer})" function +void f_prompt_getprompt(typval_T *argvars, typval_T *rettv, FunPtr fptr) + FUNC_ATTR_NONNULL_ALL +{ + // return an empty string by default, e.g. it's not a prompt buffer + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; + + buf_T *const buf = tv_get_buf_from_arg(&argvars[0]); + if (buf == NULL) { + return; + } + + if (!bt_prompt(buf)) { + return; + } + + rettv->vval.v_string = vim_strsave(buf_prompt_text(buf)); +} + // "prompt_setprompt({buffer}, {text})" function static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv, FunPtr fptr) @@ -8868,56 +8932,30 @@ static void f_shiftwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void f_sign_define(typval_T *argvars, typval_T *rettv, FunPtr fptr) { const char *name; - dict_T *dict; - char *icon = NULL; - char *linehl = NULL; - char *text = NULL; - char *texthl = NULL; - char *numhl = NULL; - rettv->vval.v_number = -1; + if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_UNKNOWN) { + // Define multiple signs + tv_list_alloc_ret(rettv, kListLenMayKnow); - name = tv_get_string_chk(&argvars[0]); - if (name == NULL) { + sign_define_multiple(argvars[0].vval.v_list, rettv->vval.v_list); return; } - if (argvars[1].v_type != VAR_UNKNOWN) { - if (argvars[1].v_type != VAR_DICT) { - EMSG(_(e_dictreq)); - return; - } + // Define a single sign + rettv->vval.v_number = -1; - // sign attributes - dict = argvars[1].vval.v_dict; - if (tv_dict_find(dict, "icon", -1) != NULL) { - icon = tv_dict_get_string(dict, "icon", true); - } - if (tv_dict_find(dict, "linehl", -1) != NULL) { - linehl = tv_dict_get_string(dict, "linehl", true); - } - if (tv_dict_find(dict, "text", -1) != NULL) { - text = tv_dict_get_string(dict, "text", true); - } - if (tv_dict_find(dict, "texthl", -1) != NULL) { - texthl = tv_dict_get_string(dict, "texthl", true); - } - if (tv_dict_find(dict, "numhl", -1) != NULL) { - numhl = tv_dict_get_string(dict, "numhl", true); - } + name = tv_get_string_chk(&argvars[0]); + if (name == NULL) { + return; } - if (sign_define_by_name((char_u *)name, (char_u *)icon, (char_u *)linehl, - (char_u *)text, (char_u *)texthl, (char_u *)numhl) - == OK) { - rettv->vval.v_number = 0; + if (argvars[1].v_type != VAR_UNKNOWN && argvars[1].v_type != VAR_DICT) { + EMSG(_(e_dictreq)); + return; } - xfree(icon); - xfree(linehl); - xfree(text); - xfree(texthl); - xfree(numhl); + rettv->vval.v_number = sign_define_from_dict( + name, argvars[1].v_type == VAR_DICT ? argvars[1].vval.v_dict : NULL); } /// "sign_getdefined()" function @@ -9038,83 +9076,44 @@ cleanup: /// "sign_place()" function static void f_sign_place(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - int sign_id; - char_u *group = NULL; - const char *sign_name; - buf_T *buf; - dict_T *dict; - dictitem_T *di; - linenr_T lnum = 0; - int prio = SIGN_DEF_PRIO; - bool notanum = false; + dict_T *dict = NULL; rettv->vval.v_number = -1; - // Sign identifier - sign_id = (int)tv_get_number_chk(&argvars[0], ¬anum); - if (notanum) { - return; - } - if (sign_id < 0) { - EMSG(_(e_invarg)); + if (argvars[4].v_type != VAR_UNKNOWN + && (argvars[4].v_type != VAR_DICT + || ((dict = argvars[4].vval.v_dict) == NULL))) { + EMSG(_(e_dictreq)); return; } - // Sign group - const char *group_chk = tv_get_string_chk(&argvars[1]); - if (group_chk == NULL) { - return; - } - if (group_chk[0] == '\0') { - group = NULL; // global sign group - } else { - group = vim_strsave((const char_u *)group_chk); - } + rettv->vval.v_number = sign_place_from_dict( + &argvars[0], &argvars[1], &argvars[2], &argvars[3], dict); +} - // Sign name - sign_name = tv_get_string_chk(&argvars[2]); - if (sign_name == NULL) { - goto cleanup; - } +/// "sign_placelist()" function. Place multiple signs. +static void f_sign_placelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + int sign_id; - // Buffer to place the sign - buf = get_buf_arg(&argvars[3]); - if (buf == NULL) { - goto cleanup; + tv_list_alloc_ret(rettv, kListLenMayKnow); + + if (argvars[0].v_type != VAR_LIST) { + EMSG(_(e_listreq)); + return; } - if (argvars[4].v_type != VAR_UNKNOWN) { - if (argvars[4].v_type != VAR_DICT - || ((dict = argvars[4].vval.v_dict) == NULL)) { + // Process the List of sign attributes + TV_LIST_ITER_CONST(argvars[0].vval.v_list, li, { + sign_id = -1; + if (TV_LIST_ITEM_TV(li)->v_type == VAR_DICT) { + sign_id = sign_place_from_dict( + NULL, NULL, NULL, NULL, TV_LIST_ITEM_TV(li)->vval.v_dict); + } else { EMSG(_(e_dictreq)); - goto cleanup; - } - - // Line number where the sign is to be placed - if ((di = tv_dict_find(dict, "lnum", -1)) != NULL) { - lnum = (linenr_T)tv_get_number_chk(&di->di_tv, ¬anum); - if (notanum) { - goto cleanup; - } - (void)lnum; - lnum = tv_get_lnum(&di->di_tv); } - if ((di = tv_dict_find(dict, "priority", -1)) != NULL) { - // Sign priority - prio = (int)tv_get_number_chk(&di->di_tv, ¬anum); - if (notanum) { - goto cleanup; - } - } - } - - if (sign_place(&sign_id, group, (const char_u *)sign_name, buf, lnum, prio) - == OK) { - rettv->vval.v_number = sign_id; - } - -cleanup: - xfree(group); + tv_list_append_number(rettv->vval.v_list, sign_id); + }); } /// "sign_undefine()" function @@ -9122,6 +9121,14 @@ static void f_sign_undefine(typval_T *argvars, typval_T *rettv, FunPtr fptr) { const char *name; + if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_UNKNOWN) { + // Undefine multiple signs + tv_list_alloc_ret(rettv, kListLenMayKnow); + + sign_undefine_multiple(argvars[0].vval.v_list, rettv->vval.v_list); + return; + } + rettv->vval.v_number = -1; if (argvars[0].v_type == VAR_UNKNOWN) { @@ -9144,11 +9151,7 @@ static void f_sign_undefine(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "sign_unplace()" function static void f_sign_unplace(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - dict_T *dict; - dictitem_T *di; - int sign_id = 0; - buf_T *buf = NULL; - char_u *group = NULL; + dict_T *dict = NULL; rettv->vval.v_number = -1; @@ -9157,46 +9160,38 @@ static void f_sign_unplace(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - const char *group_chk = tv_get_string(&argvars[0]); - if (group_chk[0] == '\0') { - group = NULL; // global sign group - } else { - group = vim_strsave((const char_u *)group_chk); - } - if (argvars[1].v_type != VAR_UNKNOWN) { if (argvars[1].v_type != VAR_DICT) { EMSG(_(e_dictreq)); - goto cleanup; + return; } dict = argvars[1].vval.v_dict; - - if ((di = tv_dict_find(dict, "buffer", -1)) != NULL) { - buf = get_buf_arg(&di->di_tv); - if (buf == NULL) { - goto cleanup; - } - } - if (tv_dict_find(dict, "id", -1) != NULL) { - sign_id = tv_dict_get_number(dict, "id"); - } } - if (buf == NULL) { - // Delete the sign in all the buffers - FOR_ALL_BUFFERS(cbuf) { - if (sign_unplace(sign_id, group, cbuf, 0) == OK) { - rettv->vval.v_number = 0; - } - } - } else { - if (sign_unplace(sign_id, group, buf, 0) == OK) { - rettv->vval.v_number = 0; - } + rettv->vval.v_number = sign_unplace_from_dict(&argvars[0], dict); +} + +/// "sign_unplacelist()" function +static void f_sign_unplacelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + int retval; + + tv_list_alloc_ret(rettv, kListLenMayKnow); + + if (argvars[0].v_type != VAR_LIST) { + EMSG(_(e_listreq)); + return; } -cleanup: - xfree(group); + TV_LIST_ITER_CONST(argvars[0].vval.v_list, li, { + retval = -1; + if (TV_LIST_ITEM_TV(li)->v_type == VAR_DICT) { + retval = sign_unplace_from_dict(NULL, TV_LIST_ITEM_TV(li)->vval.v_dict); + } else { + EMSG(_(e_dictreq)); + } + tv_list_append_number(rettv->vval.v_list, retval); + }); } /* @@ -9265,6 +9260,7 @@ static void f_sockconnect(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// struct storing information about current sort typedef struct { int item_compare_ic; + bool item_compare_lc; bool item_compare_numeric; bool item_compare_numbers; bool item_compare_float; @@ -9339,10 +9335,10 @@ static int item_compare(const void *s1, const void *s2, bool keep_zero) p2 = ""; } if (!sortinfo->item_compare_numeric) { - if (sortinfo->item_compare_ic) { - res = STRICMP(p1, p2); + if (sortinfo->item_compare_lc) { + res = strcoll(p1, p2); } else { - res = STRCMP(p1, p2); + res = sortinfo->item_compare_ic ? STRICMP(p1, p2): STRCMP(p1, p2); } } else { double n1, n2; @@ -9477,6 +9473,7 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort) } info.item_compare_ic = false; + info.item_compare_lc = false; info.item_compare_numeric = false; info.item_compare_numbers = false; info.item_compare_float = false; @@ -9521,6 +9518,9 @@ static void do_sort_uniq(typval_T *argvars, typval_T *rettv, bool sort) } else if (strcmp(info.item_compare_func, "i") == 0) { info.item_compare_func = NULL; info.item_compare_ic = true; + } else if (strcmp(info.item_compare_func, "l") == 0) { + info.item_compare_func = NULL; + info.item_compare_lc = true; } } } diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c index fe3d147040..61de83fc21 100644 --- a/src/nvim/eval/typval.c +++ b/src/nvim/eval/typval.c @@ -219,6 +219,7 @@ list_T *tv_list_alloc(const ptrdiff_t len) list->lv_used_next = gc_first_list; gc_first_list = list; list_log(list, NULL, (void *)(uintptr_t)len, "alloc"); + list->lua_table_ref = LUA_NOREF; return list; } @@ -302,7 +303,7 @@ void tv_list_free_list(list_T *const l) } list_log(l, NULL, NULL, "freelist"); - nlua_free_typval_list(l); + NLUA_CLEAR_REF(l->lua_table_ref); xfree(l); } @@ -1404,6 +1405,8 @@ dict_T *tv_dict_alloc(void) d->dv_copyID = 0; QUEUE_INIT(&d->watchers); + d->lua_table_ref = LUA_NOREF; + return d; } @@ -1454,7 +1457,7 @@ void tv_dict_free_dict(dict_T *const d) d->dv_used_next->dv_used_prev = d->dv_used_prev; } - nlua_free_typval_dict(d); + NLUA_CLEAR_REF(d->lua_table_ref); xfree(d); } @@ -2095,7 +2098,7 @@ void tv_dict_set_keys_readonly(dict_T *const dict) /// /// @return [allocated] pointer to the created list. list_T *tv_list_alloc_ret(typval_T *const ret_tv, const ptrdiff_t len) - FUNC_ATTR_NONNULL_ALL + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { list_T *const l = tv_list_alloc(len); tv_list_set_ret(ret_tv, l); @@ -2103,6 +2106,14 @@ list_T *tv_list_alloc_ret(typval_T *const ret_tv, const ptrdiff_t len) return l; } +dict_T *tv_dict_alloc_lock(VarLockStatus lock) + FUNC_ATTR_NONNULL_RET +{ + dict_T *const d = tv_dict_alloc(); + d->dv_lock = lock; + return d; +} + /// Allocate an empty dictionary for a return value /// /// Also sets reference count. @@ -2111,9 +2122,8 @@ list_T *tv_list_alloc_ret(typval_T *const ret_tv, const ptrdiff_t len) void tv_dict_alloc_ret(typval_T *const ret_tv) FUNC_ATTR_NONNULL_ALL { - dict_T *const d = tv_dict_alloc(); + dict_T *const d = tv_dict_alloc_lock(VAR_UNLOCKED); tv_dict_set_ret(ret_tv, d); - ret_tv->v_lock = VAR_UNLOCKED; } //{{{3 Clear diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c index 689d05e079..dc7027980e 100644 --- a/src/nvim/eval/userfunc.c +++ b/src/nvim/eval/userfunc.c @@ -537,7 +537,7 @@ static char_u *fname_trans_sid(const char_u *const name, if (current_sctx.sc_sid <= 0) { *error = ERROR_SCRIPT; } else { - snprintf((char *)fname_buf + 3, FLEN_FIXED + 1, "%" PRId64 "_", + snprintf((char *)fname_buf + i, FLEN_FIXED + 1 - i, "%" PRId64 "_", (int64_t)current_sctx.sc_sid); i = (int)STRLEN(fname_buf); } @@ -833,6 +833,8 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, bool islambda = false; char_u numbuf[NUMBUFLEN]; char_u *name; + typval_T *tv_to_free[MAX_FUNC_ARGS]; + int tv_to_free_len = 0; proftime_T wait_start; proftime_T call_start; int started_profiling = false; @@ -985,6 +987,11 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, v->di_tv = isdefault ? def_rettv : argvars[i]; v->di_tv.v_lock = VAR_FIXED; + if (isdefault) { + // Need to free this later, no matter where it's stored. + tv_to_free[tv_to_free_len++] = &v->di_tv; + } + if (addlocal) { // Named arguments can be accessed without the "a:" prefix in lambda // expressions. Add to the l: dict. @@ -1209,7 +1216,9 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, did_emsg |= save_did_emsg; depth--; - + for (int i = 0; i < tv_to_free_len; i++) { + tv_clear(tv_to_free[i]); + } cleanup_function_call(fc); if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0) { diff --git a/src/nvim/event/libuv_process.c b/src/nvim/event/libuv_process.c index 0b1ecb12e2..c02f730431 100644 --- a/src/nvim/event/libuv_process.c +++ b/src/nvim/event/libuv_process.c @@ -82,7 +82,7 @@ int libuv_process_spawn(LibuvProcess *uvproc) int status; if ((status = uv_spawn(&proc->loop->uv, &uvproc->uv, &uvproc->uvopts))) { - ELOG("uv_spawn failed: %s", uv_strerror(status)); + ELOG("uv_spawn(%s) failed: %s", uvproc->uvopts.file, uv_strerror(status)); if (uvproc->uvopts.env) { os_free_fullenv(uvproc->uvopts.env); } diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index d34282419a..6a0a08eee8 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -358,6 +358,7 @@ static int linelen(int *has_tab) static char_u *sortbuf1; static char_u *sortbuf2; +static int sort_lc; ///< sort using locale static int sort_ic; ///< ignore case static int sort_nr; ///< sort on number static int sort_rx; ///< sort on regex instead of skipping it @@ -381,6 +382,13 @@ typedef struct { } st_u; } sorti_T; +static int string_compare(const void *s1, const void *s2) FUNC_ATTR_NONNULL_ALL +{ + if (sort_lc) { + return strcoll((char *)s1, (char *)s2); + } + return sort_ic ? STRICMP(s1, s2) : STRCMP(s1, s2); +} static int sort_compare(const void *s1, const void *s2) { @@ -424,8 +432,7 @@ static int sort_compare(const void *s1, const void *s2) l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr + 1); sortbuf2[l2.st_u.line.end_col_nr - l2.st_u.line.start_col_nr] = NUL; - result = sort_ic ? STRICMP(sortbuf1, sortbuf2) - : STRCMP(sortbuf1, sortbuf2); + result = string_compare(sortbuf1, sortbuf2); } /* If two lines have the same value, preserve the original line order. */ @@ -466,7 +473,7 @@ void ex_sort(exarg_T *eap) regmatch.regprog = NULL; sorti_T *nrs = xmalloc(count * sizeof(sorti_T)); - sort_abort = sort_ic = sort_rx = sort_nr = sort_flt = 0; + sort_abort = sort_ic = sort_lc = sort_rx = sort_nr = sort_flt = 0; size_t format_found = 0; bool change_occurred = false; // Buffer contents changed. @@ -474,6 +481,8 @@ void ex_sort(exarg_T *eap) if (ascii_iswhite(*p)) { } else if (*p == 'i') { sort_ic = true; + } else if (*p == 'l') { + sort_lc = true; } else if (*p == 'r') { sort_rx = true; } else if (*p == 'n') { @@ -645,8 +654,7 @@ void ex_sort(exarg_T *eap) s = ml_get(get_lnum); size_t bytelen = STRLEN(s) + 1; // include EOL in bytelen old_count += bytelen; - if (!unique || i == 0 - || (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0) { + if (!unique || i == 0 || string_compare(s, sortbuf1) != 0) { // Copy the line into a buffer, it may become invalid in // ml_append(). And it's needed for "unique". STRCPY(sortbuf1, s); @@ -790,7 +798,8 @@ void ex_retab(exarg_T *eap) /* len is actual number of white characters used */ len = num_spaces + num_tabs; old_len = (long)STRLEN(ptr); - new_line = xmalloc(old_len - col + start_col + len + 1); + long new_len = old_len - col + start_col + len + 1; + new_line = xmalloc(new_len); if (start_col > 0) memmove(new_line, ptr, (size_t)start_col); @@ -803,6 +812,8 @@ void ex_retab(exarg_T *eap) if (ml_replace(lnum, new_line, false) == OK) { // "new_line" may have been copied new_line = curbuf->b_ml.ml_line_ptr; + extmark_splice_cols(curbuf, lnum - 1, 0, (colnr_T)old_len, + (colnr_T)new_len - 1, kExtmarkUndo); } if (first_line == 0) { first_line = lnum; @@ -965,12 +976,6 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest) mark_adjust_nofold(last_line - num_lines + 1, last_line, -(last_line - dest - extra), 0L, kExtmarkNOOP); - // extmarks are handled separately - extmark_move_region(curbuf, line1-1, 0, start_byte, - line2-line1+1, 0, extent_byte, - dest+line_off, 0, dest_byte+byte_off, - kExtmarkUndo); - changed_lines(last_line - num_lines + 1, 0, last_line + 1, -extra, false); // send update regarding the new lines that were added @@ -992,6 +997,11 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest) smsg(_("%" PRId64 " lines moved"), (int64_t)num_lines); } + extmark_move_region(curbuf, line1-1, 0, start_byte, + line2-line1+1, 0, extent_byte, + dest+line_off, 0, dest_byte+byte_off, + kExtmarkUndo); + /* * Leave the cursor on the last of the moved lines. */ @@ -2424,21 +2434,25 @@ int do_ecmd( * is returned by buflist_new(), nothing to do here. */ if (buf != curbuf) { - /* - * Be careful: The autocommands may delete any buffer and change - * the current buffer. - * - If the buffer we are going to edit is deleted, give up. - * - If the current buffer is deleted, prefer to load the new - * buffer when loading a buffer is required. This avoids - * loading another buffer which then must be closed again. - * - If we ended up in the new buffer already, need to skip a few - * things, set auto_buf. - */ + const int save_cmdwin_type = cmdwin_type; + + // BufLeave applies to the old buffer. + cmdwin_type = 0; + + // Be careful: The autocommands may delete any buffer and change + // the current buffer. + // - If the buffer we are going to edit is deleted, give up. + // - If the current buffer is deleted, prefer to load the new + // buffer when loading a buffer is required. This avoids + // loading another buffer which then must be closed again. + // - If we ended up in the new buffer already, need to skip a few + // things, set auto_buf. if (buf->b_fname != NULL) { new_name = vim_strsave(buf->b_fname); } set_bufref(&au_new_curbuf, buf); apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, false, curbuf); + cmdwin_type = save_cmdwin_type; if (!bufref_valid(&au_new_curbuf)) { // New buffer has been deleted. delbuf_msg(new_name); // Frees new_name. @@ -2452,6 +2466,7 @@ int do_ecmd( auto_buf = true; } else { win_T *the_curwin = curwin; + buf_T *was_curbuf = curbuf; // Set w_closing to avoid that autocommands close the window. // Set b_locked for the same reason. @@ -2465,9 +2480,10 @@ int do_ecmd( // Close the link to the current buffer. This will set // oldwin->w_buffer to NULL. u_sync(false); - close_buffer(oldwin, curbuf, - (flags & ECMD_HIDE) || curbuf->terminal ? 0 : DOBUF_UNLOAD, - false); + const bool did_decrement = close_buffer( + oldwin, curbuf, + (flags & ECMD_HIDE) || curbuf->terminal ? 0 : DOBUF_UNLOAD, + false); // Autocommands may have closed the window. if (win_valid(the_curwin)) { @@ -2487,6 +2503,14 @@ int do_ecmd( goto theend; } if (buf == curbuf) { // already in new buffer + // close_buffer() has decremented the window count, + // increment it again here and restore w_buffer. + if (did_decrement && buf_valid(was_curbuf)) { + was_curbuf->b_nwindows++; + } + if (win_valid_any_tab(oldwin) && oldwin->w_buffer == NULL) { + oldwin->w_buffer = was_curbuf; + } auto_buf = true; } else { // <VN> We could instead free the synblock diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua index 2965ea7496..d99383303b 100644 --- a/src/nvim/ex_cmds.lua +++ b/src/nvim/ex_cmds.lua @@ -928,6 +928,12 @@ module.cmds = { func='ex_edit', }, { + command='eval', + flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), + addr_type='ADDR_NONE', + func='ex_eval', + }, + { command='ex', flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR), addr_type='ADDR_NONE', diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index c4c18c4324..0a2802397d 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -120,6 +120,9 @@ struct source_cookie { /// batch mode debugging: don't save and restore typeahead. static bool debug_greedy = false; +static char *debug_oldval = NULL; // old and newval for debug expressions +static char *debug_newval = NULL; + /// Debug mode. Repeatedly get Ex commands, until told to continue normal /// execution. void do_debug(char_u *cmd) @@ -166,6 +169,16 @@ void do_debug(char_u *cmd) if (!debug_did_msg) { MSG(_("Entering Debug mode. Type \"cont\" to continue.")); } + if (debug_oldval != NULL) { + smsg(_("Oldval = \"%s\""), debug_oldval); + xfree(debug_oldval); + debug_oldval = NULL; + } + if (debug_newval != NULL) { + smsg(_("Newval = \"%s\""), debug_newval); + xfree(debug_newval); + debug_newval = NULL; + } if (sourcing_name != NULL) { msg(sourcing_name); } @@ -174,7 +187,6 @@ void do_debug(char_u *cmd) } else { smsg(_("cmd: %s"), cmd); } - // Repeat getting a command and executing it. for (;; ) { msg_scroll = true; @@ -514,11 +526,13 @@ bool dbg_check_skipped(exarg_T *eap) /// This is a grow-array of structs. struct debuggy { int dbg_nr; ///< breakpoint number - int dbg_type; ///< DBG_FUNC or DBG_FILE - char_u *dbg_name; ///< function or file name + int dbg_type; ///< DBG_FUNC or DBG_FILE or DBG_EXPR + char_u *dbg_name; ///< function, expression or file name regprog_T *dbg_prog; ///< regexp program linenr_T dbg_lnum; ///< line number in function or file int dbg_forceit; ///< ! used + typval_T *dbg_val; ///< last result of watchexpression + int dbg_level; ///< stored nested level for expr }; static garray_T dbg_breakp = { 0, 0, sizeof(struct debuggy), 4, NULL }; @@ -530,6 +544,7 @@ static int last_breakp = 0; // nr of last defined breakpoint static garray_T prof_ga = { 0, 0, sizeof(struct debuggy), 4, NULL }; #define DBG_FUNC 1 #define DBG_FILE 2 +#define DBG_EXPR 3 /// Parse the arguments of ":profile", ":breakadd" or ":breakdel" and put them @@ -562,6 +577,8 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) } bp->dbg_type = DBG_FILE; here = true; + } else if (gap != &prof_ga && STRNCMP(p, "expr", 4) == 0) { + bp->dbg_type = DBG_EXPR; } else { EMSG2(_(e_invarg2), p); return FAIL; @@ -590,6 +607,9 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) bp->dbg_name = vim_strsave(p); } else if (here) { bp->dbg_name = vim_strsave(curbuf->b_ffname); + } else if (bp->dbg_type == DBG_EXPR) { + bp->dbg_name = vim_strsave(p); + bp->dbg_val = eval_expr(bp->dbg_name); } else { // Expand the file name in the same way as do_source(). This means // doing it twice, so that $DIR/file gets expanded when $DIR is @@ -621,7 +641,6 @@ static int dbg_parsearg(char_u *arg, garray_T *gap) void ex_breakadd(exarg_T *eap) { struct debuggy *bp; - char_u *pat; garray_T *gap; gap = &dbg_breakp; @@ -633,22 +652,28 @@ void ex_breakadd(exarg_T *eap) bp = &DEBUGGY(gap, gap->ga_len); bp->dbg_forceit = eap->forceit; - pat = file_pat_to_reg_pat(bp->dbg_name, NULL, NULL, false); - if (pat != NULL) { - bp->dbg_prog = vim_regcomp(pat, RE_MAGIC + RE_STRING); - xfree(pat); - } - if (pat == NULL || bp->dbg_prog == NULL) { - xfree(bp->dbg_name); - } else { - if (bp->dbg_lnum == 0) { // default line number is 1 - bp->dbg_lnum = 1; + if (bp->dbg_type != DBG_EXPR) { + char_u *pat = file_pat_to_reg_pat(bp->dbg_name, NULL, NULL, false); + if (pat != NULL) { + bp->dbg_prog = vim_regcomp(pat, RE_MAGIC + RE_STRING); + xfree(pat); } - if (eap->cmdidx != CMD_profile) { - DEBUGGY(gap, gap->ga_len).dbg_nr = ++last_breakp; - debug_tick++; + if (pat == NULL || bp->dbg_prog == NULL) { + xfree(bp->dbg_name); + } else { + if (bp->dbg_lnum == 0) { // default line number is 1 + bp->dbg_lnum = 1; + } + if (eap->cmdidx != CMD_profile) { + DEBUGGY(gap, gap->ga_len).dbg_nr = ++last_breakp; + debug_tick++; + } + gap->ga_len++; } - gap->ga_len++; + } else { + // DBG_EXPR + DEBUGGY(gap, gap->ga_len++).dbg_nr = ++last_breakp; + debug_tick++; } } } @@ -691,7 +716,7 @@ void ex_breakdel(exarg_T *eap) todel = 0; del_all = true; } else { - // ":breakdel {func|file} [lnum] {name}" + // ":breakdel {func|file|expr} [lnum] {name}" if (dbg_parsearg(eap->arg, gap) == FAIL) { return; } @@ -716,6 +741,10 @@ void ex_breakdel(exarg_T *eap) } else { while (!GA_EMPTY(gap)) { xfree(DEBUGGY(gap, todel).dbg_name); + if (DEBUGGY(gap, todel).dbg_type == DBG_EXPR + && DEBUGGY(gap, todel).dbg_val != NULL) { + tv_free(DEBUGGY(gap, todel).dbg_val); + } vim_regfree(DEBUGGY(gap, todel).dbg_prog); gap->ga_len--; if (todel < gap->ga_len) { @@ -750,11 +779,15 @@ void ex_breaklist(exarg_T *eap) if (bp->dbg_type == DBG_FILE) { home_replace(NULL, bp->dbg_name, NameBuff, MAXPATHL, true); } - smsg(_("%3d %s %s line %" PRId64), - bp->dbg_nr, - bp->dbg_type == DBG_FUNC ? "func" : "file", - bp->dbg_type == DBG_FUNC ? bp->dbg_name : NameBuff, - (int64_t)bp->dbg_lnum); + if (bp->dbg_type != DBG_EXPR) { + smsg(_("%3d %s %s line %" PRId64), + bp->dbg_nr, + bp->dbg_type == DBG_FUNC ? "func" : "file", + bp->dbg_type == DBG_FUNC ? bp->dbg_name : NameBuff, + (int64_t)bp->dbg_lnum); + } else { + smsg(_("%3d expr %s"), bp->dbg_nr, bp->dbg_name); + } } } } @@ -814,6 +847,7 @@ debuggy_find( // an already found breakpoint. bp = &DEBUGGY(gap, i); if ((bp->dbg_type == DBG_FILE) == file + && bp->dbg_type != DBG_EXPR && (gap == &prof_ga || (bp->dbg_lnum > after && (lnum == 0 || bp->dbg_lnum < lnum)))) { // Save the value of got_int and reset it. We don't want a @@ -828,6 +862,46 @@ debuggy_find( } } got_int |= prev_got_int; + } else if (bp->dbg_type == DBG_EXPR) { + bool line = false; + + prev_got_int = got_int; + got_int = false; + + typval_T *tv = eval_expr(bp->dbg_name); + if (tv != NULL) { + if (bp->dbg_val == NULL) { + debug_oldval = typval_tostring(NULL); + bp->dbg_val = tv; + debug_newval = typval_tostring(bp->dbg_val); + line = true; + } else { + if (typval_compare(tv, bp->dbg_val, EXPR_IS, false) == OK + && tv->vval.v_number == false) { + line = true; + debug_oldval = typval_tostring(bp->dbg_val); + // Need to evaluate again, typval_compare() overwrites "tv". + typval_T *v = eval_expr(bp->dbg_name); + debug_newval = typval_tostring(v); + tv_free(bp->dbg_val); + bp->dbg_val = v; + } + tv_free(tv); + } + } else if (bp->dbg_val != NULL) { + debug_oldval = typval_tostring(bp->dbg_val); + debug_newval = typval_tostring(NULL); + tv_free(bp->dbg_val); + bp->dbg_val = NULL; + line = true; + } + + if (line) { + lnum = after > 0 ? after : 1; + break; + } + + got_int |= prev_got_int; } } if (name != fname) { @@ -2535,7 +2609,7 @@ void ex_source(exarg_T *eap) static void cmd_source(char_u *fname, exarg_T *eap) { - if (*fname == NUL) { + if (eap != NULL && *fname == NUL) { cmd_source_buffer(eap); } else if (eap != NULL && eap->forceit) { // ":source!": read Normal mode commands @@ -2575,7 +2649,8 @@ static char_u *get_buffer_line(int c, void *cookie, int indent, bool do_concat) return (char_u *)xstrdup((const char *)curr_line); } -static void cmd_source_buffer(exarg_T *eap) +static void cmd_source_buffer(const exarg_T *eap) + FUNC_ATTR_NONNULL_ALL { GetBufferLineCookie cookie = { .curr_lnum = eap->line1, @@ -2644,16 +2719,10 @@ static char_u *get_str_line(int c, void *cookie, int indent, bool do_concat) while (!(p->buf[i] == '\n' || p->buf[i] == '\0')) { i++; } - char buf[2046]; - char *dst; - dst = xstpncpy(buf, (char *)p->buf + p->offset, i - p->offset); - if ((uint32_t)(dst - buf) != i - p->offset) { - smsg(_(":source error parsing command %s"), p->buf); - return NULL; - } - buf[i - p->offset] = '\0'; + size_t line_length = i - p->offset; + char_u *buf = xmemdupz(p->buf + p->offset, line_length); p->offset = i + 1; - return (char_u *)xstrdup(buf); + return buf; } static int source_using_linegetter(void *cookie, @@ -3552,6 +3621,14 @@ void set_lang_var(void) loc = get_locale_val(LC_TIME); # endif set_vim_var_string(VV_LC_TIME, loc, -1); + +# ifdef HAVE_GET_LOCALE_VAL + loc = get_locale_val(LC_COLLATE); +# else + // setlocale() not supported: use the default value + loc = "C"; +# endif + set_vim_var_string(VV_COLLATE, loc, -1); } #ifdef HAVE_WORKING_LIBINTL @@ -3592,6 +3669,10 @@ void ex_language(exarg_T *eap) what = LC_TIME; name = skipwhite(p); whatstr = "time "; + } else if (STRNICMP(eap->arg, "collate", p - eap->arg) == 0) { + what = LC_COLLATE; + name = skipwhite(p); + whatstr = "collate "; } } @@ -3636,7 +3717,7 @@ void ex_language(exarg_T *eap) // Reset $LC_ALL, otherwise it would overrule everything. os_setenv("LC_ALL", "", 1); - if (what != LC_TIME) { + if (what != LC_TIME && what != LC_COLLATE) { // Tell gettext() what to translate to. It apparently doesn't // use the currently effective locale. if (what == LC_ALL) { @@ -3651,7 +3732,7 @@ void ex_language(exarg_T *eap) } } - // Set v:lang, v:lc_time and v:ctype to the final result. + // Set v:lang, v:lc_time, v:collate and v:ctype to the final result. set_lang_var(); maketitle(); } @@ -3736,12 +3817,15 @@ char_u *get_lang_arg(expand_T *xp, int idx) if (idx == 2) { return (char_u *)"time"; } + if (idx == 3) { + return (char_u *)"collate"; + } init_locales(); if (locales == NULL) { return NULL; } - return locales[idx - 3]; + return locales[idx - 4]; } /// Function given to ExpandGeneric() to obtain the available locales. diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 3aaf171b2c..c93f9fe6f2 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -212,7 +212,7 @@ void do_exmode(int improved) while (exmode_active) { /* Check for a ":normal" command and no more characters left. */ if (ex_normal_busy > 0 && typebuf.tb_len == 0) { - exmode_active = FALSE; + exmode_active = 0; break; } msg_scroll = true; @@ -1772,7 +1772,7 @@ static char_u * do_one_cmd(char_u **cmdlinep, // count, it's a buffer name. /// if ((ea.argt & EX_COUNT) && ascii_isdigit(*ea.arg) - && (!(ea.argt & EX_BUFNAME) || *(p = skipdigits(ea.arg)) == NUL + && (!(ea.argt & EX_BUFNAME) || *(p = skipdigits(ea.arg + 1)) == NUL || ascii_iswhite(*p))) { n = getdigits_long(&ea.arg, false, -1); ea.arg = skipwhite(ea.arg); @@ -1857,6 +1857,7 @@ static char_u * do_one_cmd(char_u **cmdlinep, case CMD_echoerr: case CMD_echomsg: case CMD_echon: + case CMD_eval: case CMD_execute: case CMD_filter: case CMD_help: @@ -2789,15 +2790,18 @@ static struct cmdmod { */ int modifier_len(char_u *cmd) { - int i, j; char_u *p = cmd; - if (ascii_isdigit(*cmd)) - p = skipwhite(skipdigits(cmd)); - for (i = 0; i < (int)ARRAY_SIZE(cmdmods); ++i) { - for (j = 0; p[j] != NUL; ++j) - if (p[j] != cmdmods[i].name[j]) + if (ascii_isdigit(*cmd)) { + p = skipwhite(skipdigits(cmd + 1)); + } + for (int i = 0; i < (int)ARRAY_SIZE(cmdmods); i++) { + int j; + for (j = 0; p[j] != NUL; j++) { + if (p[j] != cmdmods[i].name[j]) { break; + } + } if (j >= cmdmods[i].minlen && !ASCII_ISALPHA(p[j]) && (p == cmd || cmdmods[i].has_count)) { @@ -3641,7 +3645,8 @@ const char * set_one_cmd_context( } else { if (strncmp(arg, "messages", p - arg) == 0 || strncmp(arg, "ctype", p - arg) == 0 - || strncmp(arg, "time", p - arg) == 0) { + || strncmp(arg, "time", p - arg) == 0 + || strncmp(arg, "collate", p - arg) == 0) { xp->xp_context = EXPAND_LOCALES; xp->xp_pattern = skipwhite((const char_u *)p); } else { @@ -3928,7 +3933,7 @@ static linenr_T get_address(exarg_T *eap, } searchcmdlen = 0; flags = silent ? 0 : SEARCH_HIS | SEARCH_MSG; - if (!do_search(NULL, c, cmd, 1L, flags, NULL)) { + if (!do_search(NULL, c, c, cmd, 1L, flags, NULL)) { curwin->w_cursor = pos; cmd = NULL; goto error; @@ -6518,6 +6523,12 @@ ex_win_close( int need_hide; buf_T *buf = win->w_buffer; + // Never close the autocommand window. + if (win == aucmd_win) { + EMSG(_(e_autocmd_close)); + return; + } + need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1); if (need_hide && !buf_hide(buf) && !forceit) { if ((p_confirm || cmdmod.confirm) && p_write) { @@ -6587,9 +6598,6 @@ static void ex_tabonly(exarg_T *eap) // Repeat this up to a 1000 times, because autocommands may // mess up the lists. for (int done = 0; done < 1000; done++) { - FOR_ALL_TAB_WINDOWS(tp, wp) { - assert(wp != aucmd_win); - } FOR_ALL_TABS(tp) { if (tp->tp_topframe != topframe) { tabpage_close_other(tp, eap->forceit); @@ -7302,7 +7310,8 @@ do_exedit( */ if (exmode_active && (eap->cmdidx == CMD_visual || eap->cmdidx == CMD_view)) { - exmode_active = FALSE; + exmode_active = 0; + ex_pressedreturn = false; if (*eap->arg == NUL) { /* Special case: ":global/pat/visual\NLvi-commands" */ if (global_busy) { diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 0917c6dd02..5ca88002f1 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -788,6 +788,15 @@ void report_discard_pending(int pending, void *value) } } +// ":eval". +void ex_eval(exarg_T *eap) +{ + typval_T tv; + + if (eval0(eap->arg, &tv, &eap->nextcmd, !eap->skip) == OK) { + tv_clear(&tv); + } +} /* * ":if". diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 9977be56ca..75ed5dc0e5 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -275,8 +275,9 @@ static void init_incsearch_state(incsearch_state_T *s) // Return true when 'incsearch' highlighting is to be done. // Sets search_first_line and search_last_line to the address range. -static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s, - int *skiplen, int *patlen) +static bool do_incsearch_highlighting(int firstc, int *search_delim, + incsearch_state_T *s, int *skiplen, + int *patlen) FUNC_ATTR_NONNULL_ALL { char_u *cmd; @@ -303,6 +304,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s, search_last_line = MAXLNUM; if (firstc == '/' || firstc == '?') { + *search_delim = firstc; return true; } if (firstc != ':') { @@ -371,6 +373,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s, p = skipwhite(p); delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++; + *search_delim = delim; end = skip_regexp(p, delim, p_magic, NULL); use_last_pat = end == p && *end == delim; @@ -431,12 +434,14 @@ static void may_do_incsearch_highlighting(int firstc, long count, int skiplen, patlen; char_u next_char; char_u use_last_pat; + int search_delim; // Parsing range may already set the last search pattern. // NOTE: must call restore_last_search_pattern() before returning! save_last_search_pattern(); - if (!do_incsearch_highlighting(firstc, s, &skiplen, &patlen)) { + if (!do_incsearch_highlighting(firstc, &search_delim, s, &skiplen, + &patlen)) { restore_last_search_pattern(); finish_incsearch_highlighting(false, s, true); return; @@ -490,7 +495,7 @@ static void may_do_incsearch_highlighting(int firstc, long count, ccline.cmdbuff[skiplen + patlen] = NUL; memset(&sia, 0, sizeof(sia)); sia.sa_tm = &tm; - found = do_search(NULL, firstc == ':' ? '/' : firstc, + found = do_search(NULL, firstc == ':' ? '/' : firstc, search_delim, ccline.cmdbuff + skiplen, count, search_flags, &sia); ccline.cmdbuff[skiplen + patlen] = next_char; @@ -581,13 +586,15 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s) FUNC_ATTR_NONNULL_ALL { int skiplen, patlen; + int search_delim; // Parsing range may already set the last search pattern. // NOTE: must call restore_last_search_pattern() before returning! save_last_search_pattern(); // Add a character from under the cursor for 'incsearch' - if (!do_incsearch_highlighting(firstc, s, &skiplen, &patlen)) { + if (!do_incsearch_highlighting(firstc, &search_delim, s, &skiplen, + &patlen)) { restore_last_search_pattern(); return FAIL; } @@ -604,7 +611,7 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s) && !pat_has_uppercase(ccline.cmdbuff + skiplen)) { *c = mb_tolower(*c); } - if (*c == firstc + if (*c == search_delim || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) { // put a backslash before special characters @@ -775,11 +782,20 @@ static uint8_t *command_line_enter(int firstc, long count, int indent) redrawcmd(); } - // redraw the statusline for statuslines that display the current mode - // using the mode() function. + // Redraw the statusline in case it uses the current mode using the mode() + // function. if (!cmd_silent && msg_scrolled == 0) { - curwin->w_redr_status = true; - redraw_statuslines(); + bool found_one = false; + + FOR_ALL_WINDOWS_IN_TAB(wp, curtab) { + if (*p_stl != NUL || *wp->w_p_stl != NUL) { + wp->w_redr_status = true; + found_one = true; + } + } + if (found_one) { + redraw_statuslines(); + } } did_emsg = false; @@ -1465,13 +1481,14 @@ static int may_do_command_line_next_incsearch(int firstc, long count, bool next_match) FUNC_ATTR_NONNULL_ALL { - int skiplen, patlen; + int skiplen, patlen, search_delim; // Parsing range may already set the last search pattern. // NOTE: must call restore_last_search_pattern() before returning! save_last_search_pattern(); - if (!do_incsearch_highlighting(firstc, s, &skiplen, &patlen)) { + if (!do_incsearch_highlighting(firstc, &search_delim, s, &skiplen, + &patlen)) { restore_last_search_pattern(); return OK; } @@ -1489,7 +1506,7 @@ static int may_do_command_line_next_incsearch(int firstc, long count, char_u save; - if (firstc == ccline.cmdbuff[skiplen]) { + if (search_delim == ccline.cmdbuff[skiplen]) { pat = last_search_pattern(); skiplen = 0; patlen = (int)STRLEN(pat); @@ -1936,6 +1953,7 @@ static int command_line_handle_key(CommandLineState *s) case K_X2MOUSE: case K_X2DRAG: case K_X2RELEASE: + case K_MOUSEMOVE: return command_line_not_changed(s); @@ -3553,6 +3571,7 @@ static void save_cmdline(struct cmdline_info *ccp) * Restore ccline after it has been saved with save_cmdline(). */ static void restore_cmdline(struct cmdline_info *ccp) + FUNC_ATTR_NONNULL_ALL { ccline = *ccp; } @@ -3562,6 +3581,7 @@ static void restore_cmdline(struct cmdline_info *ccp) * passed to restore_cmdline_alloc() later. */ char_u *save_cmdline_alloc(void) + FUNC_ATTR_NONNULL_RET { struct cmdline_info *p = xmalloc(sizeof(struct cmdline_info)); save_cmdline(p); @@ -3572,6 +3592,7 @@ char_u *save_cmdline_alloc(void) * Restore the command line from the return value of save_cmdline_alloc(). */ void restore_cmdline_alloc(char_u *p) + FUNC_ATTR_NONNULL_ALL { restore_cmdline((struct cmdline_info *)p); xfree(p); @@ -4093,9 +4114,10 @@ ExpandOne ( } if (mode == WILD_CANCEL) { - ss = vim_strsave(orig_save); + ss = vim_strsave(orig_save ? orig_save : (char_u *)""); } else if (mode == WILD_APPLY) { - ss = vim_strsave(findex == -1 ? orig_save : xp->xp_files[findex]); + ss = vim_strsave(findex == -1 ? (orig_save ? orig_save : (char_u *)"") : + xp->xp_files[findex]); } /* free old names */ @@ -6616,11 +6638,13 @@ static int open_cmdwin(void) wp = curwin; set_bufref(&bufref, curbuf); win_goto(old_curwin); - win_close(wp, true); + if (win_valid(wp) && wp != curwin) { + win_close(wp, true); + } // win_close() may have already wiped the buffer when 'bh' is - // set to 'wipe'. - if (bufref_valid(&bufref)) { + // set to 'wipe', autocommands may have closed other windows + if (bufref_valid(&bufref) && bufref.br_buf != curbuf) { close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, false); } diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index 09453e100d..9e4e69e124 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -447,18 +447,25 @@ static int put_view( if (do_cursor) { // Restore the cursor line in the file and relatively in the // window. Don't use "G", it changes the jumplist. + if (wp->w_height_inner <= 0) { + if (fprintf(fd, "let s:l = %" PRIdLINENR "\n", wp->w_cursor.lnum) < 0) { + return FAIL; + } + } else if (fprintf(fd, + "let s:l = %" PRIdLINENR " - ((%" PRIdLINENR + " * winheight(0) + %" PRId64 ") / %" PRId64 ")\n", + wp->w_cursor.lnum, + wp->w_cursor.lnum - wp->w_topline, + (int64_t)(wp->w_height_inner / 2), + (int64_t)wp->w_height_inner) < 0) { + return FAIL; + } if (fprintf(fd, - "let s:l = %" PRId64 " - ((%" PRId64 - " * winheight(0) + %" PRId64 ") / %" PRId64 ")\n" "if s:l < 1 | let s:l = 1 | endif\n" "keepjumps exe s:l\n" "normal! zt\n" - "keepjumps %" PRId64 "\n", - (int64_t)wp->w_cursor.lnum, - (int64_t)(wp->w_cursor.lnum - wp->w_topline), - (int64_t)(wp->w_height_inner / 2), - (int64_t)wp->w_height_inner, - (int64_t)wp->w_cursor.lnum) < 0) { + "keepjumps %" PRIdLINENR "\n", + wp->w_cursor.lnum) < 0) { return FAIL; } // Restore the cursor column and left offset when not wrapping. @@ -690,18 +697,16 @@ static int makeopens(FILE *fd, char_u *dirnow) return FAIL; } - // - // Save current window layout. - // - PUTLINE_FAIL("set splitbelow splitright"); - if (ses_win_rec(fd, tab_topframe) == FAIL) { - return FAIL; - } - if (!p_sb && put_line(fd, "set nosplitbelow") == FAIL) { - return FAIL; - } - if (!p_spr && put_line(fd, "set nosplitright") == FAIL) { - return FAIL; + if (tab_topframe->fr_layout != FR_LEAF) { + // Save current window layout. + PUTLINE_FAIL("let s:save_splitbelow = &splitbelow"); + PUTLINE_FAIL("let s:save_splitright = &splitright"); + PUTLINE_FAIL("set splitbelow splitright"); + if (ses_win_rec(fd, tab_topframe) == FAIL) { + return FAIL; + } + PUTLINE_FAIL("let &splitbelow = s:save_splitbelow"); + PUTLINE_FAIL("let &splitright = s:save_splitright"); } // @@ -720,22 +725,26 @@ static int makeopens(FILE *fd, char_u *dirnow) } } - // Go to the first window. - PUTLINE_FAIL("wincmd t"); - - // If more than one window, see if sizes can be restored. - // First set 'winheight' and 'winwidth' to 1 to avoid the windows being - // resized when moving between windows. - // Do this before restoring the view, so that the topline and the - // cursor can be set. This is done again below. - // winminheight and winminwidth need to be set to avoid an error if the - // user has set winheight or winwidth. - if (fprintf(fd, - "set winminheight=0\n" - "set winheight=1\n" - "set winminwidth=0\n" - "set winwidth=1\n") < 0) { - return FAIL; + if (tab_firstwin->w_next != NULL) { + // Go to the first window. + PUTLINE_FAIL("wincmd t"); + + // If more than one window, see if sizes can be restored. + // First set 'winheight' and 'winwidth' to 1 to avoid the windows + // being resized when moving between windows. + // Do this before restoring the view, so that the topline and the + // cursor can be set. This is done again below. + // winminheight and winminwidth need to be set to avoid an error if + // the user has set winheight or winwidth. + PUTLINE_FAIL("let s:save_winminheight = &winminheight"); + PUTLINE_FAIL("let s:save_winminwidth = &winminwidth"); + if (fprintf(fd, + "set winminheight=0\n" + "set winheight=1\n" + "set winminwidth=0\n" + "set winwidth=1\n") < 0) { + return FAIL; + } } if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL) { return FAIL; @@ -817,18 +826,20 @@ static int makeopens(FILE *fd, char_u *dirnow) return FAIL; } - // Re-apply options. + // Re-apply 'winheight', 'winwidth' and 'shortmess'. if (fprintf(fd, "set winheight=%" PRId64 " winwidth=%" PRId64 - " winminheight=%" PRId64 " winminwidth=%" PRId64 " shortmess=%s\n", (int64_t)p_wh, (int64_t)p_wiw, - (int64_t)p_wmh, - (int64_t)p_wmw, p_shm) < 0) { return FAIL; } + if (tab_firstwin->w_next != NULL) { + // Restore 'winminheight' and 'winminwidth'. + PUTLINE_FAIL("let &winminheight = s:save_winminheight"); + PUTLINE_FAIL("let &winminwidth = s:save_winminwidth"); + } // // Lastly, execute the x.vim file if it exists. diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index cacbeddb32..2906a2196b 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -702,6 +702,7 @@ void extmark_move_region( int new_row, colnr_T new_col, bcount_t new_byte, ExtmarkOp undo) { + curbuf->deleted_bytes2 = 0; // TODO(bfredl): this is not synced to the buffer state inside the callback. // But unless we make the undo implementation smarter, this is not ensured // anyway. diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 714bbb5780..29c29a2884 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -4280,7 +4280,7 @@ char *modname(const char *fname, const char *ext, bool prepend_dot) if (fname == NULL || *fname == NUL) { retval = xmalloc(MAXPATHL + extlen + 3); // +3 for PATHSEP, "_" (Win), NUL if (os_dirname((char_u *)retval, MAXPATHL) == FAIL - || (fnamelen = strlen(retval)) == 0) { + || strlen(retval) == 0) { xfree(retval); return NULL; } @@ -4560,11 +4560,12 @@ int vim_rename(const char_u *from, const char_u *to) if (!os_path_exists(tempname)) { if (os_rename(from, tempname) == OK) { - if (os_rename(tempname, to) == OK) + if (os_rename(tempname, to) == OK) { return 0; - /* Strange, the second step failed. Try moving the - * file back and return failure. */ - os_rename(tempname, from); + } + // Strange, the second step failed. Try moving the + // file back and return failure. + (void)os_rename(tempname, from); return -1; } /* If it fails for one temp name it will most likely fail @@ -4947,11 +4948,11 @@ int buf_check_timestamp(buf_T *buf) (void)msg_end(); if (emsg_silent == 0) { ui_flush(); - /* give the user some time to think about it */ - os_delay(1000L, true); + // give the user some time to think about it + os_delay(1004L, true); - /* don't redraw and erase the message */ - redraw_cmdline = FALSE; + // don't redraw and erase the message + redraw_cmdline = false; } } already_warned = TRUE; diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 9afce6e9d5..5c2eed363e 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1322,7 +1322,7 @@ void openscript( do { update_topline_cursor(); // update cursor position and topline normal_cmd(&oa, false); // execute one command - vpeekc(); // check for end of file + (void)vpeekc(); // check for end of file } while (scriptin[oldcurscript] != NULL); State = save_State; @@ -1586,7 +1586,9 @@ int plain_vgetc(void) do { c = safe_vgetc(); - } while (c == K_IGNORE || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR); + } while (c == K_IGNORE + || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR + || c == K_MOUSEMOVE); return c; } @@ -3831,7 +3833,16 @@ bool check_abbr(int c, char_u *ptr, int col, int mincol) if (c >= ABBR_OFF) { c -= ABBR_OFF; } - j += utf_char2bytes(c, tb + j); + int newlen = utf_char2bytes(c, tb + j); + tb[j + newlen] = NUL; + // Need to escape K_SPECIAL. + char_u *escaped = vim_strsave_escape_csi(tb + j); + if (escaped != NULL) { + newlen = (int)STRLEN(escaped); + memmove(tb + j, escaped, (size_t)newlen); + j += newlen; + xfree(escaped); + } } tb[j] = NUL; // insert the last typed char diff --git a/src/nvim/globals.h b/src/nvim/globals.h index ffe0357bd8..0ce2b586e3 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -469,7 +469,7 @@ EXTERN buf_T *curbuf INIT(= NULL); // currently active buffer // Iterate through all the signs placed in a buffer #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \ - for (sign = buf->b_signlist; sign != NULL; sign = sign->next) // NOLINT + for (sign = buf->b_signlist; sign != NULL; sign = sign->se_next) // NOLINT // List of files being edited (global argument list). curwin->w_alist points @@ -987,6 +987,8 @@ EXTERN char_u e_dirnotf[] INIT(= N_( "E919: Directory not found in '%s': \"%s\"")); EXTERN char_u e_au_recursive[] INIT(= N_( "E952: Autocommand caused recursive behavior")); +EXTERN char_u e_autocmd_close[] INIT(= N_( + "E813: Cannot close autocmd window")); EXTERN char_u e_unsupportedoption[] INIT(= N_("E519: Option not supported")); EXTERN char_u e_fnametoolong[] INIT(= N_("E856: Filename too long")); EXTERN char_u e_float_as_string[] INIT(= N_("E806: using Float as a String")); diff --git a/src/nvim/grid_defs.h b/src/nvim/grid_defs.h index 3b34af46e4..724363674c 100644 --- a/src/nvim/grid_defs.h +++ b/src/nvim/grid_defs.h @@ -13,6 +13,15 @@ typedef char_u schar_T[(MAX_MCO+1) * 4 + 1]; typedef int sattr_T; +enum { + kZIndexDefaultGrid = 0, + kZIndexFloatDefault = 50, + kZIndexPopupMenu = 100, + kZIndexMessages = 200, + kZIndexCmdlinePopupMenu = 250, +}; + + /// ScreenGrid represents a resizable rectuangular grid displayed by UI clients. /// /// chars[] contains the UTF-8 text that is currently displayed on the grid. @@ -73,6 +82,9 @@ struct ScreenGrid { // whether the grid can be focused with mouse clicks. bool focusable; + // z-index: the order in the stack of grids. + int zindex; + // Below is state owned by the compositor. Should generally not be set/read // outside this module, except for specific compatibilty hacks @@ -96,7 +108,7 @@ struct ScreenGrid { }; #define SCREEN_GRID_INIT { 0, NULL, NULL, NULL, NULL, NULL, 0, 0, false, \ - false, 0, 0, NULL, false, true, \ + false, 0, 0, NULL, false, true, 0, \ 0, 0, 0, 0, 0, false } #endif // NVIM_GRID_DEFS_H diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c index f03382bea7..79e474fa2e 100644 --- a/src/nvim/highlight.c +++ b/src/nvim/highlight.c @@ -8,6 +8,7 @@ #include "nvim/highlight_defs.h" #include "nvim/map.h" #include "nvim/message.h" +#include "nvim/option.h" #include "nvim/popupmnu.h" #include "nvim/screen.h" #include "nvim/syntax.h" @@ -151,7 +152,7 @@ int hl_get_syn_attr(int ns_id, int idx, HlAttrs at_en) void ns_hl_def(NS ns_id, int hl_id, HlAttrs attrs, int link_id) { - DecorProvider *p = get_provider(ns_id, true); + DecorProvider *p = get_decor_provider(ns_id, true); if ((attrs.rgb_ae_attr & HL_DEFAULT) && map_has(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id))) { return; @@ -175,7 +176,7 @@ int ns_get_hl(NS ns_id, int hl_id, bool link, bool nodefault) ns_id = ns_hl_active; } - DecorProvider *p = get_provider(ns_id, true); + DecorProvider *p = get_decor_provider(ns_id, true); ColorItem it = map_get(ColorKey, ColorItem)(ns_hl, ColorKey(ns_id, hl_id)); // TODO(bfredl): map_ref true even this? bool valid_cache = it.version >= p->hl_valid; @@ -342,16 +343,24 @@ void update_window_hl(win_T *wp, bool invalid) wp->w_hl_attrs[hlf] = attr; } + wp->w_float_config.shadow = false; if (wp->w_floating && wp->w_float_config.border) { for (int i = 0; i < 8; i++) { int attr = wp->w_hl_attrs[HLF_BORDER]; if (wp->w_float_config.border_hl_ids[i]) { attr = hl_get_ui_attr(HLF_BORDER, wp->w_float_config.border_hl_ids[i], false); + HlAttrs a = syn_attr2entry(attr); + if (a.hl_blend) { + wp->w_float_config.shadow = true; + } } wp->w_float_config.border_attr[i] = attr; } } + + // shadow might cause blending + check_blending(wp); } /// Gets HL_UNDERLINE highlight. @@ -797,8 +806,11 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err) { HlAttrs hlattrs = HLATTRS_INIT; - int32_t fg = -1, bg = -1, sp = -1; + int32_t fg = -1, bg = -1, ctermfg = -1, ctermbg = -1, sp = -1; int16_t mask = 0; + int16_t cterm_mask = 0; + bool cterm_mask_provided = false; + for (size_t i = 0; i < dict.size; i++) { char *key = dict.items[i].key.data; Object val = dict.items[i].value; @@ -828,6 +840,25 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err) } } + // Handle cterm attrs + if (strequal(key, "cterm") && val.type == kObjectTypeDictionary) { + cterm_mask_provided = true; + Dictionary cterm_dict = val.data.dictionary; + for (size_t l = 0; l < cterm_dict.size; l++) { + char *cterm_dict_key = cterm_dict.items[l].key.data; + Object cterm_dict_val = cterm_dict.items[l].value; + for (int m = 0; flags[m].name; m++) { + if (strequal(flags[m].name, cterm_dict_key)) { + if (api_object_to_bool(cterm_dict_val, cterm_dict_key, false, + err)) { + cterm_mask |= flags[m].flag; + } + break; + } + } + } + } + struct { const char *name; const char *shortname; @@ -835,6 +866,8 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err) } colors[] = { { "foreground", "fg", &fg }, { "background", "bg", &bg }, + { "ctermfg", NULL, &ctermfg }, + { "ctermbg", NULL, &ctermbg }, { "special", "sp", &sp }, { NULL, NULL, NULL }, }; @@ -858,7 +891,6 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err) } } - if (flags[j].name || colors[k].name) { // handled above } else if (link_id && strequal(key, "link")) { @@ -879,13 +911,22 @@ HlAttrs dict2hlattrs(Dictionary dict, bool use_rgb, int *link_id, Error *err) } } + // apply gui mask as default for cterm mask + if (!cterm_mask_provided) { + cterm_mask = mask; + } if (use_rgb) { hlattrs.rgb_ae_attr = mask; hlattrs.rgb_bg_color = bg; hlattrs.rgb_fg_color = fg; hlattrs.rgb_sp_color = sp; + hlattrs.cterm_bg_color = + ctermbg == -1 ? cterm_normal_bg_color : ctermbg + 1; + hlattrs.cterm_fg_color = + ctermfg == -1 ? cterm_normal_fg_color : ctermfg + 1; + hlattrs.cterm_ae_attr = cterm_mask; } else { - hlattrs.cterm_ae_attr = mask; + hlattrs.cterm_ae_attr = cterm_mask; hlattrs.cterm_bg_color = bg == -1 ? cterm_normal_bg_color : bg + 1; hlattrs.cterm_fg_color = fg == -1 ? cterm_normal_fg_color : fg + 1; } diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index 517274a1d3..6dacace0a4 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -288,6 +288,7 @@ static const struct key_name_entry { { K_LEFTDRAG, "LeftDrag" }, { K_LEFTRELEASE, "LeftRelease" }, { K_LEFTRELEASE_NM, "LeftReleaseNM" }, + { K_MOUSEMOVE, "MouseMove" }, { K_MIDDLEMOUSE, "MiddleMouse" }, { K_MIDDLEDRAG, "MiddleDrag" }, { K_MIDDLERELEASE, "MiddleRelease" }, @@ -317,32 +318,32 @@ static const struct key_name_entry { }; static struct mousetable { - int pseudo_code; /* Code for pseudo mouse event */ - int button; /* Which mouse button is it? */ - int is_click; /* Is it a mouse button click event? */ - int is_drag; /* Is it a mouse drag event? */ + int pseudo_code; // Code for pseudo mouse event + int button; // Which mouse button is it? + bool is_click; // Is it a mouse button click event? + bool is_drag; // Is it a mouse drag event? } mouse_table[] = { - {(int)KE_LEFTMOUSE, MOUSE_LEFT, TRUE, FALSE}, - {(int)KE_LEFTDRAG, MOUSE_LEFT, FALSE, TRUE}, - {(int)KE_LEFTRELEASE, MOUSE_LEFT, FALSE, FALSE}, - {(int)KE_MIDDLEMOUSE, MOUSE_MIDDLE, TRUE, FALSE}, - {(int)KE_MIDDLEDRAG, MOUSE_MIDDLE, FALSE, TRUE}, - {(int)KE_MIDDLERELEASE, MOUSE_MIDDLE, FALSE, FALSE}, - {(int)KE_RIGHTMOUSE, MOUSE_RIGHT, TRUE, FALSE}, - {(int)KE_RIGHTDRAG, MOUSE_RIGHT, FALSE, TRUE}, - {(int)KE_RIGHTRELEASE, MOUSE_RIGHT, FALSE, FALSE}, - {(int)KE_X1MOUSE, MOUSE_X1, TRUE, FALSE}, - {(int)KE_X1DRAG, MOUSE_X1, FALSE, TRUE}, - {(int)KE_X1RELEASE, MOUSE_X1, FALSE, FALSE}, - {(int)KE_X2MOUSE, MOUSE_X2, TRUE, FALSE}, - {(int)KE_X2DRAG, MOUSE_X2, FALSE, TRUE}, - {(int)KE_X2RELEASE, MOUSE_X2, FALSE, FALSE}, - /* DRAG without CLICK */ - {(int)KE_IGNORE, MOUSE_RELEASE, FALSE, TRUE}, - /* RELEASE without CLICK */ - {(int)KE_IGNORE, MOUSE_RELEASE, FALSE, FALSE}, - {0, 0, 0, 0}, + { (int)KE_LEFTMOUSE, MOUSE_LEFT, true, false }, + { (int)KE_LEFTDRAG, MOUSE_LEFT, false, true }, + { (int)KE_LEFTRELEASE, MOUSE_LEFT, false, false }, + { (int)KE_MIDDLEMOUSE, MOUSE_MIDDLE, true, false }, + { (int)KE_MIDDLEDRAG, MOUSE_MIDDLE, false, true }, + { (int)KE_MIDDLERELEASE, MOUSE_MIDDLE, false, false }, + { (int)KE_RIGHTMOUSE, MOUSE_RIGHT, true, false }, + { (int)KE_RIGHTDRAG, MOUSE_RIGHT, false, true }, + { (int)KE_RIGHTRELEASE, MOUSE_RIGHT, false, false }, + { (int)KE_X1MOUSE, MOUSE_X1, true, false }, + { (int)KE_X1DRAG, MOUSE_X1, false, true }, + { (int)KE_X1RELEASE, MOUSE_X1, false, false }, + { (int)KE_X2MOUSE, MOUSE_X2, true, false }, + { (int)KE_X2DRAG, MOUSE_X2, false, true }, + { (int)KE_X2RELEASE, MOUSE_X2, false, false }, + // DRAG without CLICK + { (int)K_MOUSEMOVE, MOUSE_RELEASE, false, true }, + // RELEASE without CLICK + { (int)KE_IGNORE, MOUSE_RELEASE, false, false }, + { 0, 0, 0, 0 }, }; /// Return the modifier mask bit (#MOD_MASK_*) corresponding to mod name diff --git a/src/nvim/keymap.h b/src/nvim/keymap.h index ada9bc5780..d31196d412 100644 --- a/src/nvim/keymap.h +++ b/src/nvim/keymap.h @@ -242,7 +242,7 @@ enum key_extra { , KE_NOP = 97 // no-op: does nothing // , KE_FOCUSGAINED = 98 // focus gained // , KE_FOCUSLOST = 99 // focus lost - // , KE_MOUSEMOVE = 100 // mouse moved with no button down + , KE_MOUSEMOVE = 100 // mouse moved with no button down // , KE_CANCEL = 101 // return from vgetc , KE_EVENT = 102 // event , KE_COMMAND = 104 // <Cmd> special key @@ -411,6 +411,7 @@ enum key_extra { #define K_LEFTDRAG TERMCAP2KEY(KS_EXTRA, KE_LEFTDRAG) #define K_LEFTRELEASE TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE) #define K_LEFTRELEASE_NM TERMCAP2KEY(KS_EXTRA, KE_LEFTRELEASE_NM) +#define K_MOUSEMOVE TERMCAP2KEY(KS_EXTRA, KE_MOUSEMOVE) #define K_MIDDLEMOUSE TERMCAP2KEY(KS_EXTRA, KE_MIDDLEMOUSE) #define K_MIDDLEDRAG TERMCAP2KEY(KS_EXTRA, KE_MIDDLEDRAG) #define K_MIDDLERELEASE TERMCAP2KEY(KS_EXTRA, KE_MIDDLERELEASE) diff --git a/src/nvim/lua/converter.c b/src/nvim/lua/converter.c index 83b3729ad3..ce8c9b0d06 100644 --- a/src/nvim/lua/converter.c +++ b/src/nvim/lua/converter.c @@ -400,7 +400,6 @@ nlua_pop_typval_table_processing_end: case LUA_TFUNCTION: { LuaCFunctionState *state = xmalloc(sizeof(LuaCFunctionState)); state->lua_callable.func_ref = nlua_ref(lstate, -1); - state->lua_callable.table_ref = LUA_NOREF; char_u *name = register_cfunc( &nlua_CFunction_func_call, @@ -412,6 +411,7 @@ nlua_pop_typval_table_processing_end: break; } case LUA_TUSERDATA: { + // TODO(bfredl): check mt.__call and convert to function? nlua_pushref(lstate, nlua_nil_ref); bool is_nil = lua_rawequal(lstate, -2, -1); lua_pop(lstate, 1); diff --git a/src/nvim/lua/converter.h b/src/nvim/lua/converter.h index 8601a32418..43a7e06019 100644 --- a/src/nvim/lua/converter.h +++ b/src/nvim/lua/converter.h @@ -11,7 +11,6 @@ typedef struct { LuaRef func_ref; - LuaRef table_ref; } LuaCallable; typedef struct { diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index 03d178467b..0a52cc16cb 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -5,6 +5,7 @@ #include <lualib.h> #include <lauxlib.h> +#include "nvim/assert.h" #include "nvim/version.h" #include "nvim/misc1.h" #include "nvim/getchar.h" @@ -16,8 +17,10 @@ #include "nvim/api/vim.h" #include "nvim/msgpack_rpc/channel.h" #include "nvim/vim.h" +#include "nvim/extmark.h" #include "nvim/ex_getln.h" #include "nvim/ex_cmds2.h" +#include "nvim/map.h" #include "nvim/message.h" #include "nvim/memline.h" #include "nvim/buffer_defs.h" @@ -32,9 +35,7 @@ #include "nvim/event/time.h" #include "nvim/event/loop.h" -#ifdef WIN32 #include "nvim/os/os.h" -#endif #include "nvim/lua/converter.h" #include "nvim/lua/executor.h" @@ -63,6 +64,11 @@ typedef struct { } \ } +#if __has_feature(address_sanitizer) + PMap(handle_T) *nlua_ref_markers = NULL; +# define NLUA_TRACK_REFS +#endif + /// Convert lua error into a Vim error message /// /// @param lstate Lua interpreter state. @@ -465,6 +471,15 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL lua_pushcfunction(lstate, &nlua_wait); lua_setfield(lstate, -2, "wait"); + // _getvar + lua_pushcfunction(lstate, &nlua_getvar); + lua_setfield(lstate, -2, "_getvar"); + + // _setvar + lua_pushcfunction(lstate, &nlua_setvar); + lua_setfield(lstate, -2, "_setvar"); + + // vim.loop luv_set_loop(lstate, &main_loop.uv); luv_set_callback(lstate, nlua_luv_cfpcall); @@ -547,6 +562,13 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL static lua_State *nlua_init(void) FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT { +#ifdef NLUA_TRACK_REFS + const char *env = os_getenv("NVIM_LUA_NOTRACK"); + if (!env || !*env) { + nlua_ref_markers = pmap_new(handle_T)(); + } +#endif + lua_State *lstate = luaL_newstate(); if (lstate == NULL) { EMSG(_("E970: Failed to initialize lua interpreter")); @@ -554,9 +576,13 @@ static lua_State *nlua_init(void) } luaL_openlibs(lstate); nlua_state_init(lstate); + return lstate; } +// only to be used by nlua_enter and nlua_free_all_mem! +static lua_State *global_lstate = NULL; + /// Enter lua interpreter /// /// Calls nlua_init() if needed. Is responsible for pre-lua call initalization @@ -567,26 +593,39 @@ static lua_State *nlua_init(void) static lua_State *nlua_enter(void) FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT { - static lua_State *global_lstate = NULL; if (global_lstate == NULL) { global_lstate = nlua_init(); } lua_State *const lstate = global_lstate; - // Last used p_rtp value. Must not be dereferenced because value pointed to - // may already be freed. Used to check whether &runtimepath option value - // changed. - static const void *last_p_rtp = NULL; - if (last_p_rtp != (const void *)p_rtp) { - // stack: (empty) - lua_getglobal(lstate, "vim"); - // stack: vim - lua_pop(lstate, 1); - // stack: (empty) - last_p_rtp = (const void *)p_rtp; - } return lstate; } +void nlua_free_all_mem(void) +{ + if (!global_lstate) { + return; + } + lua_State *lstate = global_lstate; + + nlua_unref(lstate, nlua_nil_ref); + nlua_unref(lstate, nlua_empty_dict_ref); + +#ifdef NLUA_TRACK_REFS + if (nlua_refcount) { + fprintf(stderr, "%d lua references were leaked!", nlua_refcount); + } + + if (nlua_ref_markers) { + // in case there are leaked luarefs, leak the associated memory + // to get LeakSanitizer stacktraces on exit + pmap_free(handle_T)(nlua_ref_markers); + } +#endif + + nlua_refcount = 0; + lua_close(lstate); +} + static void nlua_print_event(void **argv) { char *str = argv[0]; @@ -840,6 +879,109 @@ check_err: return request ? 1 : 0; } +static dict_T *nlua_get_var_scope(lua_State *lstate) { + const char *scope = luaL_checkstring(lstate, 1); + handle_T handle = (handle_T)luaL_checkinteger(lstate, 2); + dict_T *dict = NULL; + Error err = ERROR_INIT; + if (strequal(scope, "g")) { + dict = &globvardict; + } else if (strequal(scope, "v")) { + dict = &vimvardict; + } else if (strequal(scope, "b")) { + buf_T *buf = find_buffer_by_handle(handle, &err); + if (buf) { + dict = buf->b_vars; + } + } else if (strequal(scope, "w")) { + win_T *win = find_window_by_handle(handle, &err); + if (win) { + dict = win->w_vars; + } + } else if (strequal(scope, "t")) { + tabpage_T *tabpage = find_tab_by_handle(handle, &err); + if (tabpage) { + dict = tabpage->tp_vars; + } + } else { + luaL_error(lstate, "invalid scope", err.msg); + return NULL; + } + + if (ERROR_SET(&err)) { + luaL_error(lstate, "FAIL: %s", err.msg); + return NULL; + } + return dict; +} + + +static int nlua_getvar(lua_State *lstate) +{ + // non-local return if not found + dict_T *dict = nlua_get_var_scope(lstate); + size_t len; + const char *name = luaL_checklstring(lstate, 3, &len); + + dictitem_T *di = tv_dict_find(dict, name, (ptrdiff_t)len); + if (di == NULL) { + return 0; // nil + } + nlua_push_typval(lstate, &di->di_tv, false); + return 1; +} + +static int nlua_setvar(lua_State *lstate) +{ + // non-local return if not found + dict_T *dict = nlua_get_var_scope(lstate); + String key; + key.data = (char *)luaL_checklstring(lstate, 3, &key.size); + + bool del = (lua_gettop(lstate) < 4) || lua_isnil(lstate, 4); + + Error err = ERROR_INIT; + dictitem_T *di = dict_check_writable(dict, key, del, &err); + if (ERROR_SET(&err)) { + return 0; + } + + if (del) { + // Delete the key + if (di == NULL) { + // Doesn't exist, nothing to do + return 0; + } else { + // Delete the entry + tv_dict_item_remove(dict, di); + } + } else { + // Update the key + typval_T tv; + + // Convert the lua value to a vimscript type in the temporary variable + lua_pushvalue(lstate, 4); + if (!nlua_pop_typval(lstate, &tv)) { + return luaL_error(lstate, "Couldn't convert lua value"); + } + + if (di == NULL) { + // Need to create an entry + di = tv_dict_item_alloc_len(key.data, key.size); + tv_dict_add(dict, di); + } else { + // Clear the old value + tv_clear(&di->di_tv); + } + + // Update the value + tv_copy(&tv, &di->di_tv); + // Clear the temporary variable + tv_clear(&tv); + } + return 0; +} + static int nlua_nil_tostring(lua_State *lstate) { lua_pushstring(lstate, "vim.NIL"); @@ -866,17 +1008,35 @@ static int nlua_getenv(lua_State *lstate) } #endif + /// add the value to the registry LuaRef nlua_ref(lua_State *lstate, int index) { lua_pushvalue(lstate, index); - return luaL_ref(lstate, LUA_REGISTRYINDEX); + LuaRef ref = luaL_ref(lstate, LUA_REGISTRYINDEX); + if (ref > 0) { + nlua_refcount++; +#ifdef NLUA_TRACK_REFS + if (nlua_ref_markers) { + // dummy allocation to make LeakSanitizer track our luarefs + pmap_put(handle_T)(nlua_ref_markers, ref, xmalloc(3)); + } +#endif + } + return ref; } /// remove the value from the registry void nlua_unref(lua_State *lstate, LuaRef ref) { if (ref > 0) { + nlua_refcount--; +#ifdef NLUA_TRACK_REFS + // NB: don't remove entry from map to track double-unref + if (nlua_ref_markers) { + xfree(pmap_get(handle_T)(nlua_ref_markers, ref)); + } +#endif luaL_unref(lstate, LUA_REGISTRYINDEX, ref); } } @@ -893,19 +1053,11 @@ void nlua_pushref(lua_State *lstate, LuaRef ref) lua_rawgeti(lstate, LUA_REGISTRYINDEX, ref); } + /// Gets a new reference to an object stored at original_ref /// /// NOTE: It does not copy the value, it creates a new ref to the lua object. /// Leaves the stack unchanged. -LuaRef nlua_newref(lua_State *lstate, LuaRef original_ref) -{ - nlua_pushref(lstate, original_ref); - LuaRef new_ref = nlua_ref(lstate, -1); - lua_pop(lstate, 1); - - return new_ref; -} - LuaRef api_new_luaref(LuaRef original_ref) { if (original_ref == LUA_NOREF) { @@ -913,7 +1065,10 @@ LuaRef api_new_luaref(LuaRef original_ref) } lua_State *const lstate = nlua_enter(); - return nlua_newref(lstate, original_ref); + nlua_pushref(lstate, original_ref); + LuaRef new_ref = nlua_ref(lstate, -1); + lua_pop(lstate, 1); + return new_ref; } @@ -1023,25 +1178,13 @@ int typval_exec_lua_callable( typval_T *rettv ) { - int offset = 0; LuaRef cb = lua_cb.func_ref; - if (cb == LUA_NOREF) { - // This shouldn't happen. - luaL_error(lstate, "Invalid function passed to VimL"); - return ERROR_OTHER; - } - nlua_pushref(lstate, cb); - if (lua_cb.table_ref != LUA_NOREF) { - offset += 1; - nlua_pushref(lstate, lua_cb.table_ref); - } - PUSH_ALL_TYPVALS(lstate, argvars, argcount, false); - if (lua_pcall(lstate, argcount + offset, 1, 0)) { + if (lua_pcall(lstate, argcount, 1, 0)) { nlua_print(lstate); return ERROR_OTHER; } @@ -1213,13 +1356,16 @@ void ex_luado(exarg_T *const eap) break; } lua_pushvalue(lstate, -1); - lua_pushstring(lstate, (const char *)ml_get_buf(curbuf, l, false)); + const char *old_line = (const char *)ml_get_buf(curbuf, l, false); + lua_pushstring(lstate, old_line); lua_pushnumber(lstate, (lua_Number)l); if (lua_pcall(lstate, 2, 1, 0)) { nlua_error(lstate, _("E5111: Error calling lua: %.*s")); break; } if (lua_isstring(lstate, -1)) { + size_t old_line_len = STRLEN(old_line); + size_t new_line_len; const char *const new_line = lua_tolstring(lstate, -1, &new_line_len); char *const new_line_transformed = xmemdupz(new_line, new_line_len); @@ -1229,7 +1375,7 @@ void ex_luado(exarg_T *const eap) } } ml_replace(l, (char_u *)new_line_transformed, false); - changed_bytes(l, 0); + inserted_bytes(l, 0, (int)old_line_len, (int)new_line_len); } lua_pop(lstate, 1); } @@ -1508,6 +1654,8 @@ static int regex_match_line(lua_State *lstate) return nret; } +// Required functions for lua c functions as VimL callbacks + int nlua_CFunction_func_call( int argcount, typval_T *argvars, @@ -1517,53 +1665,40 @@ int nlua_CFunction_func_call( lua_State *const lstate = nlua_enter(); LuaCFunctionState *funcstate = (LuaCFunctionState *)state; - return typval_exec_lua_callable( - lstate, - funcstate->lua_callable, - argcount, - argvars, - rettv); + return typval_exec_lua_callable(lstate, funcstate->lua_callable, + argcount, argvars, rettv); } -/// Required functions for lua c functions as VimL callbacks + void nlua_CFunction_func_free(void *state) { lua_State *const lstate = nlua_enter(); LuaCFunctionState *funcstate = (LuaCFunctionState *)state; nlua_unref(lstate, funcstate->lua_callable.func_ref); - nlua_unref(lstate, funcstate->lua_callable.table_ref); xfree(funcstate); } bool nlua_is_table_from_lua(typval_T *const arg) { - if (arg->v_type != VAR_DICT && arg->v_type != VAR_LIST) { - return false; - } - if (arg->v_type == VAR_DICT) { - return arg->vval.v_dict->lua_table_ref > 0 - && arg->vval.v_dict->lua_table_ref != LUA_NOREF; + return arg->vval.v_dict->lua_table_ref != LUA_NOREF; } else if (arg->v_type == VAR_LIST) { - return arg->vval.v_list->lua_table_ref > 0 - && arg->vval.v_list->lua_table_ref != LUA_NOREF; + return arg->vval.v_list->lua_table_ref != LUA_NOREF; + } else { + return false; } - - return false; } char_u *nlua_register_table_as_callable(typval_T *const arg) { - if (!nlua_is_table_from_lua(arg)) { - return NULL; - } - - LuaRef table_ref; + LuaRef table_ref = LUA_NOREF; if (arg->v_type == VAR_DICT) { table_ref = arg->vval.v_dict->lua_table_ref; } else if (arg->v_type == VAR_LIST) { table_ref = arg->vval.v_list->lua_table_ref; - } else { + } + + if (table_ref == LUA_NOREF) { return NULL; } @@ -1573,55 +1708,34 @@ char_u *nlua_register_table_as_callable(typval_T *const arg) int top = lua_gettop(lstate); #endif - nlua_pushref(lstate, table_ref); + nlua_pushref(lstate, table_ref); // [table] if (!lua_getmetatable(lstate, -1)) { + lua_pop(lstate, 1); + assert(top == lua_gettop(lstate)); return NULL; - } + } // [table, mt] - lua_getfield(lstate, -1, "__call"); + lua_getfield(lstate, -1, "__call"); // [table, mt, mt.__call] if (!lua_isfunction(lstate, -1)) { + lua_pop(lstate, 3); + assert(top == lua_gettop(lstate)); return NULL; } - - LuaRef new_table_ref = nlua_newref(lstate, table_ref); + lua_pop(lstate, 2); // [table] LuaCFunctionState *state = xmalloc(sizeof(LuaCFunctionState)); state->lua_callable.func_ref = nlua_ref(lstate, -1); - state->lua_callable.table_ref = new_table_ref; - char_u *name = register_cfunc( - &nlua_CFunction_func_call, - &nlua_CFunction_func_free, - state); + char_u *name = register_cfunc(&nlua_CFunction_func_call, + &nlua_CFunction_func_free, state); - lua_pop(lstate, 3); + lua_pop(lstate, 1); // [] assert(top == lua_gettop(lstate)); return name; } -/// Helper function to free a list_T -void nlua_free_typval_list(list_T *const l) -{ - if (l->lua_table_ref != LUA_NOREF && l->lua_table_ref > 0) { - lua_State *const lstate = nlua_enter(); - nlua_unref(lstate, l->lua_table_ref); - l->lua_table_ref = LUA_NOREF; - } -} - - -/// Helper function to free a dict_T -void nlua_free_typval_dict(dict_T *const d) -{ - if (d->lua_table_ref != LUA_NOREF && d->lua_table_ref > 0) { - lua_State *const lstate = nlua_enter(); - nlua_unref(lstate, d->lua_table_ref); - d->lua_table_ref = LUA_NOREF; - } -} - void nlua_execute_log_keystroke(int c) { char_u buf[NUMBUFLEN]; diff --git a/src/nvim/lua/executor.h b/src/nvim/lua/executor.h index 1d7a15d9aa..ea774ac2e3 100644 --- a/src/nvim/lua/executor.h +++ b/src/nvim/lua/executor.h @@ -16,6 +16,8 @@ void nlua_add_api_functions(lua_State *lstate) REAL_FATTR_NONNULL_ALL; EXTERN LuaRef nlua_nil_ref INIT(= LUA_NOREF); EXTERN LuaRef nlua_empty_dict_ref INIT(= LUA_NOREF); +EXTERN int nlua_refcount INIT(= 0); + #define set_api_error(s, err) \ do { \ Error *err_ = (err); \ diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index 188b2c1ef7..c186928ae2 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -222,13 +222,19 @@ int tslua_inspect_lang(lua_State *L) lua_setfield(L, -2, "symbols"); // [retval] size_t nfields = (size_t)ts_language_field_count(lang); - lua_createtable(L, nfields-1, 1); // [retval, fields] - for (size_t i = 0; i < nfields; i++) { + lua_createtable(L, nfields, 1); // [retval, fields] + // Field IDs go from 1 to nfields inclusive (extra index 0 maps to NULL) + for (size_t i = 1; i <= nfields; i++) { lua_pushstring(L, ts_language_field_name_for_id(lang, i)); lua_rawseti(L, -2, i); // [retval, fields] } lua_setfield(L, -2, "fields"); // [retval] + + uint32_t lang_version = ts_language_version(lang); + lua_pushinteger(L, lang_version); // [retval, version] + lua_setfield(L, -2, "_abi_version"); + return 1; } diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua index eb54ff28ee..bc0770da31 100644 --- a/src/nvim/lua/vim.lua +++ b/src/nvim/lua/vim.lua @@ -309,7 +309,9 @@ setmetatable(vim, { }) -- An easier alias for commands. -vim.cmd = vim.api.nvim_command +vim.cmd = function(command) + return vim.api.nvim_exec(command, false) +end -- These are the vim.env/v/g/o/bo/wo variable magic accessors. do @@ -339,32 +341,24 @@ do end return setmetatable({}, mt) end - local function pcall_ret(status, ...) - if status then return ... end - end - local function nil_wrap(fn) - return function(...) - return pcall_ret(pcall(fn, ...)) + local function make_dict_accessor(scope) + validate { + scope = {scope, 's'}; + } + local mt = {} + function mt:__newindex(k, v) + return vim._setvar(scope, 0, k, v) end + function mt:__index(k) + return vim._getvar(scope, 0, k) + end + return setmetatable({}, mt) end - - vim.b = make_meta_accessor( - nil_wrap(function(v) return a.nvim_buf_get_var(0, v) end), - function(v, k) return a.nvim_buf_set_var(0, v, k) end, - function(v) return a.nvim_buf_del_var(0, v) end - ) - vim.w = make_meta_accessor( - nil_wrap(function(v) return a.nvim_win_get_var(0, v) end), - function(v, k) return a.nvim_win_set_var(0, v, k) end, - function(v) return a.nvim_win_del_var(0, v) end - ) - vim.t = make_meta_accessor( - nil_wrap(function(v) return a.nvim_tabpage_get_var(0, v) end), - function(v, k) return a.nvim_tabpage_set_var(0, v, k) end, - function(v) return a.nvim_tabpage_del_var(0, v) end - ) - vim.g = make_meta_accessor(nil_wrap(a.nvim_get_var), a.nvim_set_var, a.nvim_del_var) - vim.v = make_meta_accessor(nil_wrap(a.nvim_get_vvar), a.nvim_set_vvar) + vim.g = make_dict_accessor('g') + vim.v = make_dict_accessor('v') + vim.b = make_dict_accessor('b') + vim.w = make_dict_accessor('w') + vim.t = make_dict_accessor('t') vim.o = make_meta_accessor(a.nvim_get_option, a.nvim_set_option) local function getenv(k) @@ -398,7 +392,10 @@ do wfw = true; winbl = true; winblend = true; winfixheight = true; winfixwidth = true; winhighlight = true; winhl = true; wrap = true; } + + --@private local function new_buf_opt_accessor(bufnr) + --@private local function get(k) if window_options[k] then return a.nvim_err_writeln(k.." is a window option, not a buffer option") @@ -408,23 +405,34 @@ do end return a.nvim_buf_get_option(bufnr or 0, k) end + + --@private local function set(k, v) if window_options[k] then return a.nvim_err_writeln(k.." is a window option, not a buffer option") end return a.nvim_buf_set_option(bufnr or 0, k, v) end + return make_meta_accessor(get, set) end vim.bo = new_buf_opt_accessor(nil) + + --@private local function new_win_opt_accessor(winnr) + + --@private local function get(k) if winnr == nil and type(k) == "number" then return new_win_opt_accessor(k) end return a.nvim_win_get_option(winnr or 0, k) end - local function set(k, v) return a.nvim_win_set_option(winnr or 0, k, v) end + + --@private + local function set(k, v) + return a.nvim_win_set_option(winnr or 0, k, v) + end return make_meta_accessor(get, set) end vim.wo = new_win_opt_accessor(nil) @@ -506,6 +514,8 @@ function vim.notify(msg, log_level, _opts) if log_level == vim.log.levels.ERROR then vim.api.nvim_err_writeln(msg) + elseif log_level == vim.log.levels.WARN then + vim.api.nvim_echo({{msg, 'WarningMsg'}}, true, {}) else vim.api.nvim_echo({{msg}}, true, {}) end diff --git a/src/nvim/macros.h b/src/nvim/macros.h index 303722b4a8..eb9357d027 100644 --- a/src/nvim/macros.h +++ b/src/nvim/macros.h @@ -238,5 +238,6 @@ # define PRAGMA_DIAG_POP #endif +#define EMPTY_POS(a) ((a).lnum == 0 && (a).col == 0 && (a).coladd == 0) #endif // NVIM_MACROS_H diff --git a/src/nvim/main.c b/src/nvim/main.c index 7064f2a068..56cd97f133 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -375,7 +375,7 @@ int main(int argc, char **argv) // Does ":filetype plugin indent on". filetype_maybe_enable(); // Sources syntax/syntax.vim, which calls `:filetype on`. - syn_maybe_on(); + syn_maybe_enable(); } // Read all the plugin files. diff --git a/src/nvim/memory.c b/src/nvim/memory.c index 9bc6b23ce3..7a8fc4da75 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -19,6 +19,8 @@ #include "nvim/ui.h" #include "nvim/sign.h" #include "nvim/api/vim.h" +#include "nvim/lua/executor.h" +#include "nvim/decoration.h" #ifdef UNIT_TESTING # define malloc(size) mem_malloc(size) @@ -695,6 +697,10 @@ void free_all_mem(void) list_free_log(); check_quickfix_busy(); + + decor_free_all_mem(); + + nlua_free_all_mem(); } #endif diff --git a/src/nvim/menu.c b/src/nvim/menu.c index ac3b7768e6..112f51fc64 100644 --- a/src/nvim/menu.c +++ b/src/nvim/menu.c @@ -1069,7 +1069,7 @@ char_u *get_menu_names(expand_T *xp, int idx) #define TBUFFER_LEN 256 static char_u tbuffer[TBUFFER_LEN]; /*hack*/ char_u *str; - static int should_advance = FALSE; + static bool should_advance = false; if (idx == 0) { /* first call: start at first item */ menu = expand_menu; @@ -1089,12 +1089,13 @@ char_u *get_menu_names(expand_T *xp, int idx) if (menu->modes & expand_modes) { if (menu->children != NULL) { - if (should_advance) - STRLCPY(tbuffer, menu->en_dname, TBUFFER_LEN - 1); - else { - STRLCPY(tbuffer, menu->dname, TBUFFER_LEN - 1); - if (menu->en_dname == NULL) - should_advance = TRUE; + if (should_advance) { + STRLCPY(tbuffer, menu->en_dname, TBUFFER_LEN); + } else { + STRLCPY(tbuffer, menu->dname, TBUFFER_LEN); + if (menu->en_dname == NULL) { + should_advance = true; + } } /* hack on menu separators: use a 'magic' char for the separator * so that '.' in names gets escaped properly */ @@ -1105,8 +1106,9 @@ char_u *get_menu_names(expand_T *xp, int idx) str = menu->en_dname; else { str = menu->dname; - if (menu->en_dname == NULL) - should_advance = TRUE; + if (menu->en_dname == NULL) { + should_advance = true; + } } } } else diff --git a/src/nvim/message.c b/src/nvim/message.c index dea6696f55..ec5dabbbc0 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -131,7 +131,7 @@ static int msg_grid_scroll_discount = 0; static void ui_ext_msg_set_pos(int row, bool scrolled) { - char buf[MAX_MCO]; + char buf[MAX_MCO + 1]; size_t size = utf_char2bytes(curwin->w_p_fcs_chars.msgsep, (char_u *)buf); buf[size] = '\0'; ui_call_msg_set_pos(msg_grid.handle, row, scrolled, @@ -165,6 +165,7 @@ void msg_grid_validate(void) // TODO(bfredl): eventually should be set to "invalid". I e all callers // will use the grid including clear to EOS if necessary. grid_alloc(&msg_grid, Rows, Columns, false, true); + msg_grid.zindex = kZIndexMessages; xfree(msg_grid.dirty_col); msg_grid.dirty_col = xcalloc(Rows, sizeof(*msg_grid.dirty_col)); @@ -869,18 +870,18 @@ char_u *msg_trunc_attr(char_u *s, int force, int attr) */ char_u *msg_may_trunc(int force, char_u *s) { - int n; int room; room = (int)(Rows - cmdline_row - 1) * Columns + sc_col - 1; if ((force || (shortmess(SHM_TRUNC) && !exmode_active)) - && (n = (int)STRLEN(s) - room) > 0) { + && (int)STRLEN(s) - room > 0) { int size = vim_strsize(s); // There may be room anyway when there are multibyte chars. if (size <= room) { return s; } + int n; for (n = 0; size >= room; ) { size -= utf_ptr2cells(s + n); n += utfc_ptr2len(s + n); @@ -1193,7 +1194,8 @@ void wait_return(int redraw) || c == K_MIDDLEDRAG || c == K_MIDDLERELEASE || c == K_RIGHTDRAG || c == K_RIGHTRELEASE || c == K_MOUSELEFT || c == K_MOUSERIGHT - || c == K_MOUSEDOWN || c == K_MOUSEUP); + || c == K_MOUSEDOWN || c == K_MOUSEUP + || c == K_MOUSEMOVE); os_breakcheck(); /* * Avoid that the mouse-up event causes visual mode to start. @@ -2265,12 +2267,14 @@ void msg_scroll_up(bool may_throttle) /// per screen update. /// /// NB: The bookkeeping is quite messy, and rests on a bunch of poorly -/// documented assumtions. For instance that the message area always grows while -/// being throttled, messages are only being output on the last line etc. +/// documented assumptions. For instance that the message area always grows +/// while being throttled, messages are only being output on the last line +/// etc. /// -/// Probably message scrollback storage should reimplented as a file_buffer, and -/// message scrolling in TUI be reimplemented as a modal floating window. Then -/// we get throttling "for free" using standard redraw_later code paths. +/// Probably message scrollback storage should be reimplemented as a +/// file_buffer, and message scrolling in TUI be reimplemented as a modal +/// floating window. Then we get throttling "for free" using standard +/// redraw_later code paths. void msg_scroll_flush(void) { if (msg_grid.throttled) { diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 34c43da0f7..38d0a7dadf 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -602,6 +602,7 @@ int is_mouse_key(int c) || c == K_LEFTDRAG || c == K_LEFTRELEASE || c == K_LEFTRELEASE_NM + || c == K_MOUSEMOVE || c == K_MIDDLEMOUSE || c == K_MIDDLEDRAG || c == K_MIDDLERELEASE @@ -752,8 +753,12 @@ get_number ( skip_redraw = TRUE; /* skip redraw once */ do_redraw = FALSE; break; - } else if (c == CAR || c == NL || c == Ctrl_C || c == ESC) + } else if (c == Ctrl_C || c == ESC || c == 'q') { + n = 0; break; + } else if (c == CAR || c == NL) { + break; + } } no_mapping--; return n; @@ -770,11 +775,13 @@ int prompt_for_number(int *mouse_used) int save_cmdline_row; int save_State; - /* When using ":silent" assume that <CR> was entered. */ - if (mouse_used != NULL) - MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): ")); - else - MSG_PUTS(_("Type number and <Enter> (empty cancels): ")); + // When using ":silent" assume that <CR> was entered. + if (mouse_used != NULL) { + MSG_PUTS(_("Type number and <Enter> or click with the mouse " + "(q or empty cancels): ")); + } else { + MSG_PUTS(_("Type number and <Enter> (q or empty cancels): ")); + } /* Set the state such that text can be selected/copied/pasted and we still * get mouse events. */ diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c index fa9787a3ac..4c0339e5f4 100644 --- a/src/nvim/mouse.c +++ b/src/nvim/mouse.c @@ -748,7 +748,7 @@ int mouse_check_fold(void) } } - if (mouse_char == wp->w_p_fcs_chars.foldclosed) { + if (wp && mouse_char == wp->w_p_fcs_chars.foldclosed) { return MOUSE_FOLD_OPEN; } else if (mouse_char != ' ') { return MOUSE_FOLD_CLOSE; diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index a0b439ac45..a2d8859c68 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -219,7 +219,7 @@ static void receive_msgpack(Stream *stream, RBuffer *rbuf, size_t c, char buf[256]; snprintf(buf, sizeof(buf), "ch %" PRIu64 " was closed by the client", channel->id); - call_set_error(channel, buf, WARN_LOG_LEVEL); + call_set_error(channel, buf, INFO_LOG_LEVEL); goto end; } diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 3587b12277..13706fb14a 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -294,6 +294,7 @@ static const struct nv_cmd { { K_LEFTDRAG, nv_mouse, 0, 0 }, { K_LEFTRELEASE, nv_mouse, 0, 0 }, { K_LEFTRELEASE_NM, nv_mouse, 0, 0 }, + { K_MOUSEMOVE, nv_mouse, 0, 0 }, { K_MIDDLEMOUSE, nv_mouse, 0, 0 }, { K_MIDDLEDRAG, nv_mouse, 0, 0 }, { K_MIDDLERELEASE, nv_mouse, 0, 0 }, @@ -630,9 +631,9 @@ static void normal_redraw_mode_message(NormalState *s) ui_cursor_shape(); // show different cursor shape ui_flush(); if (msg_scroll || emsg_on_display) { - os_delay(1000L, true); // wait at least one second + os_delay(1003L, true); // wait at least one second } - os_delay(3000L, false); // wait up to three seconds + os_delay(3003L, false); // wait up to three seconds State = save_State; msg_scroll = false; @@ -879,8 +880,9 @@ static void normal_finish_command(NormalState *s) s->old_mapped_len = typebuf_maplen(); } - // If an operation is pending, handle it. But not for K_IGNORE. - if (s->ca.cmdchar != K_IGNORE) { + // If an operation is pending, handle it. But not for K_IGNORE or + // K_MOUSEMOVE. + if (s->ca.cmdchar != K_IGNORE && s->ca.cmdchar != K_MOUSEMOVE) { do_pending_operator(&s->ca, s->old_col, false); } @@ -1940,10 +1942,12 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) case OP_FORMAT: if (*curbuf->b_p_fex != NUL) { op_formatexpr(oap); // use expression - } else if (*p_fp != NUL || *curbuf->b_p_fp != NUL) { - op_colon(oap); // use external command } else { - op_format(oap, false); // use internal function + if (*p_fp != NUL || *curbuf->b_p_fp != NUL) { + op_colon(oap); // use external command + } else { + op_format(oap, false); // use internal function + } } break; @@ -2263,6 +2267,10 @@ do_mouse ( break; } + if (c == K_MOUSEMOVE) { + // Mouse moved without a button pressed. + return false; + } /* * Ignore drag and release events if we didn't get a click. @@ -3390,7 +3398,7 @@ bool add_to_showcmd(int c) static int ignore[] = { K_IGNORE, - K_LEFTMOUSE, K_LEFTDRAG, K_LEFTRELEASE, + K_LEFTMOUSE, K_LEFTDRAG, K_LEFTRELEASE, K_MOUSEMOVE, K_MIDDLEMOUSE, K_MIDDLEDRAG, K_MIDDLERELEASE, K_RIGHTMOUSE, K_RIGHTDRAG, K_RIGHTRELEASE, K_MOUSEDOWN, K_MOUSEUP, K_MOUSELEFT, K_MOUSERIGHT, @@ -3971,7 +3979,8 @@ static bool nv_screengo(oparg_T *oap, int dir, long dist) while (dist--) { if (dir == BACKWARD) { - if (curwin->w_curswant >= width1) { + if (curwin->w_curswant >= width1 + && !hasFolding(curwin->w_cursor.lnum, NULL, NULL)) { // Move back within the line. This can give a negative value // for w_curswant if width1 < width2 (with cpoptions+=n), // which will get clipped to column 0. @@ -4003,14 +4012,16 @@ static bool nv_screengo(oparg_T *oap, int dir, long dist) n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1; else n = width1; - if (curwin->w_curswant + width2 < (colnr_T)n) - /* move forward within line */ + if (curwin->w_curswant + width2 < (colnr_T)n + && !hasFolding(curwin->w_cursor.lnum, NULL, NULL)) { + // move forward within line curwin->w_curswant += width2; - else { - /* to next line */ - /* Move to the end of a closed fold. */ + } else { + // to next line + + // Move to the end of a closed fold. (void)hasFolding(curwin->w_cursor.lnum, NULL, - &curwin->w_cursor.lnum); + &curwin->w_cursor.lnum); if (curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count) { retval = false; break; @@ -5459,7 +5470,7 @@ static int normal_search( curwin->w_set_curswant = true; memset(&sia, 0, sizeof(sia)); - i = do_search(cap->oap, dir, pat, cap->count1, + i = do_search(cap->oap, dir, dir, pat, cap->count1, opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, &sia); if (wrapped != NULL) { *wrapped = sia.sa_wrapped; @@ -7033,6 +7044,7 @@ static void nv_g_cmd(cmdarg_T *cap) case K_LEFTMOUSE: case K_LEFTDRAG: case K_LEFTRELEASE: + case K_MOUSEMOVE: case K_RIGHTMOUSE: case K_RIGHTDRAG: case K_RIGHTRELEASE: diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 2d351f4dba..0ed116c17f 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1676,19 +1676,21 @@ int op_delete(oparg_T *oap) curbuf_splice_pending++; pos_T startpos = curwin->w_cursor; // start position for delete + bcount_t deleted_bytes = get_region_bytecount( + curbuf, startpos.lnum, oap->end.lnum, startpos.col, + oap->end.col) + oap->inclusive; truncate_line(true); // delete from cursor to end of line curpos = curwin->w_cursor; // remember curwin->w_cursor curwin->w_cursor.lnum++; + del_lines(oap->line_count - 2, false); - bcount_t deleted_bytes = (bcount_t)curbuf->deleted_bytes2 - startpos.col; // delete from start of line until op_end n = (oap->end.col + 1 - !oap->inclusive); curwin->w_cursor.col = 0; (void)del_bytes((colnr_T)n, !virtual_op, oap->op_type == OP_DELETE && !oap->is_VIsual); - deleted_bytes += n; curwin->w_cursor = curpos; // restore curwin->w_cursor (void)do_join(2, false, false, false, false); curbuf_splice_pending--; @@ -2807,7 +2809,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) size_t y_size; size_t oldlen; int y_width = 0; - colnr_T vcol; + colnr_T vcol = 0; int delcount; int incr = 0; struct block_def bd; @@ -3328,6 +3330,9 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) changed_cline_bef_curs(); curwin->w_cursor.col += (colnr_T)(totlen - 1); } + changed_bytes(lnum, col); + extmark_splice_cols(curbuf, (int)lnum-1, col, + 0, (int)totlen, kExtmarkUndo); } if (VIsual_active) { lnum++; @@ -3339,12 +3344,10 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags) } curbuf->b_op_end = curwin->w_cursor; - /* For "CTRL-O p" in Insert mode, put cursor after last char */ - if (totlen && (restart_edit != 0 || (flags & PUT_CURSEND))) - ++curwin->w_cursor.col; - changed_bytes(lnum, col); - extmark_splice_cols(curbuf, (int)lnum-1, col, - 0, (int)totlen, kExtmarkUndo); + // For "CTRL-O p" in Insert mode, put cursor after last char + if (totlen && (restart_edit != 0 || (flags & PUT_CURSEND))) { + curwin->w_cursor.col++; + } } else { // Insert at least one line. When y_type is kMTCharWise, break the first // line in two. @@ -4725,12 +4728,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) char_u *ptr; int c; int todel; - bool dohex; - bool dooct; - bool dobin; - bool doalp; int firstdigit; - bool subtract; bool negative = false; bool was_positive = true; bool visual = VIsual_active; @@ -4741,10 +4739,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) pos_T endpos; colnr_T save_coladd = 0; - dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL); // "heX" - dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL); // "Octal" - dobin = (vim_strchr(curbuf->b_p_nf, 'b') != NULL); // "Bin" - doalp = (vim_strchr(curbuf->b_p_nf, 'p') != NULL); // "alPha" + const bool do_hex = vim_strchr(curbuf->b_p_nf, 'x') != NULL; // "heX" + const bool do_oct = vim_strchr(curbuf->b_p_nf, 'o') != NULL; // "Octal" + const bool do_bin = vim_strchr(curbuf->b_p_nf, 'b') != NULL; // "Bin" + const bool do_alpha = vim_strchr(curbuf->b_p_nf, 'p') != NULL; // "alPha" + // "Unsigned" + const bool do_unsigned = vim_strchr(curbuf->b_p_nf, 'u') != NULL; if (virtual_active()) { save_coladd = pos->coladd; @@ -4761,21 +4761,21 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) // First check if we are on a hexadecimal number, after the "0x". if (!VIsual_active) { - if (dobin) { + if (do_bin) { while (col > 0 && ascii_isbdigit(ptr[col])) { col--; col -= utf_head_off(ptr, ptr + col); } } - if (dohex) { + if (do_hex) { while (col > 0 && ascii_isxdigit(ptr[col])) { col--; col -= utf_head_off(ptr, ptr + col); } } - if (dobin - && dohex + if (do_bin + && do_hex && !((col > 0 && (ptr[col] == 'X' || ptr[col] == 'x') && ptr[col - 1] == '0' @@ -4791,13 +4791,13 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) } } - if ((dohex + if ((do_hex && col > 0 && (ptr[col] == 'X' || ptr[col] == 'x') && ptr[col - 1] == '0' && !utf_head_off(ptr, ptr + col - 1) && ascii_isxdigit(ptr[col + 1])) - || (dobin + || (do_bin && col > 0 && (ptr[col] == 'B' || ptr[col] == 'b') && ptr[col - 1] == '0' @@ -4812,13 +4812,13 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) while (ptr[col] != NUL && !ascii_isdigit(ptr[col]) - && !(doalp && ASCII_ISALPHA(ptr[col]))) { + && !(do_alpha && ASCII_ISALPHA(ptr[col]))) { col++; } while (col > 0 && ascii_isdigit(ptr[col - 1]) - && !(doalp && ASCII_ISALPHA(ptr[col]))) { + && !(do_alpha && ASCII_ISALPHA(ptr[col]))) { col--; } } @@ -4826,7 +4826,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) if (visual) { while (ptr[col] != NUL && length > 0 && !ascii_isdigit(ptr[col]) - && !(doalp && ASCII_ISALPHA(ptr[col]))) { + && !(do_alpha && ASCII_ISALPHA(ptr[col]))) { int mb_len = utfc_ptr2len(ptr + col); col += mb_len; @@ -4838,7 +4838,8 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) } if (col > pos->col && ptr[col - 1] == '-' - && !utf_head_off(ptr, ptr + col - 1)) { + && !utf_head_off(ptr, ptr + col - 1) + && !do_unsigned) { negative = true; was_positive = false; } @@ -4846,12 +4847,12 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) // If a number was found, and saving for undo works, replace the number. firstdigit = ptr[col]; - if (!ascii_isdigit(firstdigit) && !(doalp && ASCII_ISALPHA(firstdigit))) { + if (!ascii_isdigit(firstdigit) && !(do_alpha && ASCII_ISALPHA(firstdigit))) { beep_flush(); goto theend; } - if (doalp && ASCII_ISALPHA(firstdigit)) { + if (do_alpha && ASCII_ISALPHA(firstdigit)) { // decrement or increment alphabetic character if (op_type == OP_NR_SUB) { if (CharOrd(firstdigit) < Prenum1) { @@ -4883,7 +4884,9 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) curwin->w_cursor.col = col; } else { if (col > 0 && ptr[col - 1] == '-' - && !utf_head_off(ptr, ptr + col - 1) && !visual) { + && !utf_head_off(ptr, ptr + col - 1) + && !visual + && !do_unsigned) { // negative number col--; negative = true; @@ -4897,9 +4900,9 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) } vim_str2nr(ptr + col, &pre, &length, - 0 + (dobin ? STR2NR_BIN : 0) - + (dooct ? STR2NR_OCT : 0) - + (dohex ? STR2NR_HEX : 0), + 0 + (do_bin ? STR2NR_BIN : 0) + + (do_oct ? STR2NR_OCT : 0) + + (do_hex ? STR2NR_HEX : 0), NULL, &n, maxlen); // ignore leading '-' for hex, octal and bin numbers @@ -4910,7 +4913,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) } // add or subtract - subtract = false; + bool subtract = false; if (op_type == OP_NR_SUB) { subtract ^= true; } @@ -4942,6 +4945,17 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) } } + if (do_unsigned && negative) { + if (subtract) { + // sticking at zero. + n = (uvarnumber_T)0; + } else { + // sticking at 2^64 - 1. + n = (uvarnumber_T)(-1); + } + negative = false; + } + if (visual && !was_positive && !negative && col > 0) { // need to remove the '-' col--; @@ -5023,7 +5037,7 @@ int do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1) // total length of the number remains the same. // Don't do this when // the result may look like an octal number. - if (firstdigit == '0' && !(dooct && pre == 0)) { + if (firstdigit == '0' && !(do_oct && pre == 0)) { while (length-- > 0) { *ptr++ = '0'; } @@ -6285,3 +6299,33 @@ bool op_reg_set_previous(const char name) y_previous = &y_regs[i]; return true; } + +/// Get the byte count of buffer region. End-exclusive. +/// +/// @return number of bytes +bcount_t get_region_bytecount(buf_T *buf, linenr_T start_lnum, + linenr_T end_lnum, colnr_T start_col, + colnr_T end_col) +{ + linenr_T max_lnum = buf->b_ml.ml_line_count; + if (start_lnum > max_lnum) { + return 0; + } + if (start_lnum == end_lnum) { + return end_col - start_col; + } + const char *first = (const char *)ml_get_buf(buf, start_lnum, false); + bcount_t deleted_bytes = (bcount_t)STRLEN(first) - start_col + 1; + + for (linenr_T i = 1; i <= end_lnum-start_lnum-1; i++) { + if (start_lnum + i > max_lnum) { + return deleted_bytes; + } + deleted_bytes += (bcount_t)STRLEN( + ml_get_buf(buf, start_lnum + i, false)) + 1; + } + if (end_lnum > max_lnum) { + return deleted_bytes; + } + return deleted_bytes + end_col; +} diff --git a/src/nvim/ops.h b/src/nvim/ops.h index a8867e02ea..77d6b4435f 100644 --- a/src/nvim/ops.h +++ b/src/nvim/ops.h @@ -6,6 +6,7 @@ #include "nvim/macros.h" #include "nvim/ascii.h" #include "nvim/types.h" +#include "nvim/extmark.h" #include "nvim/eval/typval.h" #include "nvim/os/time.h" #include "nvim/normal.h" // for MotionType and oparg_T diff --git a/src/nvim/option.c b/src/nvim/option.c index 612ecca96a..ad481af7fa 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -292,7 +292,8 @@ typedef struct vimoption { static char *(p_ambw_values[]) = { "single", "double", NULL }; static char *(p_bg_values[]) = { "light", "dark", NULL }; -static char *(p_nf_values[]) = { "bin", "octal", "hex", "alpha", NULL }; +static char *(p_nf_values[]) = { "bin", "octal", "hex", "alpha", + "unsigned", NULL }; static char *(p_ff_values[]) = { FF_UNIX, FF_DOS, FF_MAC, NULL }; static char *(p_wak_values[]) = { "yes", "menu", "no", NULL }; static char *(p_mousem_values[]) = { "extend", "popup", "popup_setpos", @@ -854,15 +855,18 @@ void set_init_3(void) p_srr = (char_u *)">&"; options[idx_srr].def_val[VI_DEFAULT] = p_srr; } - } else if ( fnamecmp(p, "sh") == 0 - || fnamecmp(p, "ksh") == 0 - || fnamecmp(p, "mksh") == 0 - || fnamecmp(p, "pdksh") == 0 - || fnamecmp(p, "zsh") == 0 - || fnamecmp(p, "zsh-beta") == 0 - || fnamecmp(p, "bash") == 0 - || fnamecmp(p, "fish") == 0 - ) { + } else if (fnamecmp(p, "sh") == 0 + || fnamecmp(p, "ksh") == 0 + || fnamecmp(p, "mksh") == 0 + || fnamecmp(p, "pdksh") == 0 + || fnamecmp(p, "zsh") == 0 + || fnamecmp(p, "zsh-beta") == 0 + || fnamecmp(p, "bash") == 0 + || fnamecmp(p, "fish") == 0 + || fnamecmp(p, "ash") == 0 + || fnamecmp(p, "dash") == 0 + ) { + // Always use POSIX shell style redirection if we reach this if (do_sp) { p_sp = (char_u *)"2>&1| tee"; options[idx_sp].def_val[VI_DEFAULT] = p_sp; @@ -3437,6 +3441,12 @@ skip: return NULL; // no error } +void check_blending(win_T *wp) +{ + wp->w_grid_alloc.blending = + wp->w_p_winbl > 0 || (wp->w_floating && wp->w_float_config.shadow); +} + /// Handle setting 'listchars' or 'fillchars'. /// Assume monocell characters @@ -3631,9 +3641,11 @@ char_u *check_stl_option(char_u *s) return illegal_char(errbuf, sizeof(errbuf), *s); } if (*s == '{') { + int reevaluate = (*s == '%'); s++; - while (*s != '}' && *s) + while ((*s != '}' || (reevaluate && s[-1] != '%')) && *s) { s++; + } if (*s != '}') { return (char_u *)N_("E540: Unclosed expression sequence"); } @@ -4380,7 +4392,7 @@ static char *set_num_option(int opt_idx, char_u *varp, long value, // 'floatblend' curwin->w_p_winbl = MAX(MIN(curwin->w_p_winbl, 100), 0); curwin->w_hl_needs_update = true; - curwin->w_grid_alloc.blending = curwin->w_p_winbl > 0; + check_blending(curwin); } @@ -5895,6 +5907,7 @@ void didset_window_options(win_T *wp) set_chars_option(wp, &wp->w_p_fcs, true); set_chars_option(wp, &wp->w_p_lcs, true); parse_winhl_opt(wp); // sets w_hl_needs_update also for w_p_winbl + check_blending(wp); wp->w_grid_alloc.blending = wp->w_p_winbl > 0; } @@ -7576,9 +7589,19 @@ int csh_like_shell(void) /// buffer signs and on user configuration. int win_signcol_count(win_T *wp) { + return win_signcol_configured(wp, NULL); +} + +/// Return the number of requested sign columns, based on user / configuration. +int win_signcol_configured(win_T *wp, int *is_fixed) +{ int minimum = 0, maximum = 1, needed_signcols; const char *scl = (const char *)wp->w_p_scl; + if (is_fixed) { + *is_fixed = 1; + } + // Note: It checks "no" or "number" in 'signcolumn' option if (*scl == 'n' && (*(scl + 1) == 'o' || (*(scl + 1) == 'u' @@ -7596,7 +7619,11 @@ int win_signcol_count(win_T *wp) return 1; } - // auto or auto:<NUM> + if (is_fixed) { + // auto or auto:<NUM> + *is_fixed = 0; + } + if (!strncmp(scl, "auto:", 5)) { // Variable depending on a configuration maximum = scl[5] - '0'; @@ -7607,7 +7634,9 @@ int win_signcol_count(win_T *wp) } } - return MAX(minimum, MIN(maximum, needed_signcols)); + int ret = MAX(minimum, MIN(maximum, needed_signcols)); + assert(ret <= SIGN_SHOW_MAX); + return ret; } /// Get window or buffer local options diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index 16749ba86b..62df28c55e 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -559,6 +559,7 @@ EXTERN int p_ri; // 'revins' EXTERN int p_ru; // 'ruler' EXTERN char_u *p_ruf; // 'rulerformat' EXTERN char_u *p_pp; // 'packpath' +EXTERN char_u *p_qftf; // 'quickfixtextfunc' EXTERN char_u *p_rtp; // 'runtimepath' EXTERN long p_scbk; // 'scrollback' EXTERN long p_sj; // 'scrolljump' diff --git a/src/nvim/options.lua b/src/nvim/options.lua index d12b31bcaf..86dec74f56 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -2074,6 +2074,14 @@ return { defaults={if_true={vi=0}} }, { + full_name='quickfixtextfunc', abbreviation='qftf', + short_desc=N_("customize the quickfix window"), + type='string', scope={'global'}, + vi_def=true, + varname='p_qftf', + defaults={if_true={vi=""}} + }, + { full_name='quoteescape', abbreviation='qe', short_desc=N_("escape characters used in a string"), type='string', scope={'buffer'}, diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index a3bef3389c..d0fa74a77f 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -471,8 +471,6 @@ FILE *os_fopen(const char *path, const char *flags) abort(); } } - // Per open(2) manpage. - assert((iflags|O_RDONLY) || (iflags|O_WRONLY) || (iflags|O_RDWR)); // Per fopen(3) manpage: default to 0666, it will be umask-adjusted. int fd = os_open(path, iflags, 0666); if (fd < 0) { diff --git a/src/nvim/os/pty_process_unix.c b/src/nvim/os/pty_process_unix.c index d794969ab5..36d6dbe2db 100644 --- a/src/nvim/os/pty_process_unix.c +++ b/src/nvim/os/pty_process_unix.c @@ -175,7 +175,7 @@ static void init_child(PtyProcess *ptyproc) Process *proc = (Process *)ptyproc; if (proc->cwd && os_chdir(proc->cwd) != 0) { - ELOG("chdir failed: %s", strerror(errno)); + ELOG("chdir(%s) failed: %s", proc->cwd, strerror(errno)); return; } @@ -184,7 +184,7 @@ static void init_child(PtyProcess *ptyproc) assert(proc->env); environ = tv_dict_to_env(proc->env); execvp(prog, proc->argv); - ELOG("execvp failed: %s: %s", strerror(errno), prog); + ELOG("execvp(%s) failed: %s", prog, strerror(errno)); _exit(122); // 122 is EXEC_FAILED in the Vim source. } diff --git a/src/nvim/os/pty_process_unix.h b/src/nvim/os/pty_process_unix.h index 8c822eafad..765490b92b 100644 --- a/src/nvim/os/pty_process_unix.h +++ b/src/nvim/os/pty_process_unix.h @@ -7,7 +7,6 @@ typedef struct pty_process { Process process; - char *term_name; uint16_t width, height; struct winsize winsize; int tty_fd; diff --git a/src/nvim/os/pty_process_win.c b/src/nvim/os/pty_process_win.c index 94444e4d23..2bf73d08e6 100644 --- a/src/nvim/os/pty_process_win.c +++ b/src/nvim/os/pty_process_win.c @@ -203,11 +203,13 @@ int pty_process_spawn(PtyProcess *ptyproc) cleanup: if (status) { // In the case of an error of MultiByteToWideChar or CreateProcessW. - ELOG("pty_process_spawn: %s: error code: %d", emsg, status); + ELOG("pty_process_spawn(%s): %s: error code: %d", + proc->argv[0], emsg, status); status = os_translate_sys_error(status); } else if (err != NULL) { status = (int)winpty_error_code(err); - ELOG("pty_process_spawn: %s: error code: %d", emsg, status); + ELOG("pty_process_spawn(%s): %s: error code: %d", + proc->argv[0], emsg, status); status = translate_winpty_error(status); } winpty_error_free(err); diff --git a/src/nvim/os/pty_process_win.h b/src/nvim/os/pty_process_win.h index f8ec79a3d6..3f6cc58e3e 100644 --- a/src/nvim/os/pty_process_win.h +++ b/src/nvim/os/pty_process_win.h @@ -15,7 +15,6 @@ typedef enum { typedef struct pty_process { Process process; - char *term_name; uint16_t width, height; union { winpty_t *winpty; diff --git a/src/nvim/os/time.c b/src/nvim/os/time.c index e7e0dc4013..9ea74716aa 100644 --- a/src/nvim/os/time.c +++ b/src/nvim/os/time.c @@ -62,6 +62,7 @@ uint64_t os_now(void) /// @param ignoreinput If true, only SIGINT (CTRL-C) can interrupt. void os_delay(uint64_t ms, bool ignoreinput) { + DLOG("%" PRIu64 " ms", ms); if (ignoreinput) { if (ms > INT_MAX) { ms = INT_MAX; diff --git a/src/nvim/path.c b/src/nvim/path.c index 3e1713fbdd..fe50be5ea1 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -65,7 +65,7 @@ FileComparison path_full_compare(char_u *const s1, char_u *const s2, if (expandenv) { expand_env(s1, exp1, MAXPATHL); } else { - xstrlcpy((char *)exp1, (const char *)s1, MAXPATHL - 1); + xstrlcpy((char *)exp1, (const char *)s1, MAXPATHL); } bool id_ok_1 = os_fileid((char *)exp1, &file_id_1); bool id_ok_2 = os_fileid((char *)s2, &file_id_2); diff --git a/src/nvim/po/CMakeLists.txt b/src/nvim/po/CMakeLists.txt index 3a70264dd1..28f5723046 100644 --- a/src/nvim/po/CMakeLists.txt +++ b/src/nvim/po/CMakeLists.txt @@ -26,6 +26,7 @@ if(NOT LANGUAGES) ru sk sv + tr uk vi zh_CN.UTF-8 diff --git a/src/nvim/po/af.po b/src/nvim/po/af.po index db44f50a46..a76dd8eeea 100644 --- a/src/nvim/po/af.po +++ b/src/nvim/po/af.po @@ -4129,8 +4129,6 @@ msgstr "E537: 'commentstring' moet leeg wees of %s bevat" msgid "E540: Unclosed expression sequence" msgstr "E540: Onvoltooide uitdrukkingreeks" -msgid "E541: too many items" -msgstr "E541: te veel items" msgid "E542: unbalanced groups" msgstr "E542: ongebalanseerde groepe" diff --git a/src/nvim/po/da.po b/src/nvim/po/da.po index 7a75425019..23d60087f2 100644 --- a/src/nvim/po/da.po +++ b/src/nvim/po/da.po @@ -2799,9 +2799,6 @@ msgstr "ukendt vimOption" msgid "keyboard interrupt" msgstr "tastaturafbryd" -msgid "vim error" -msgstr "fejl ved vim" - msgid "cannot create buffer/window command: object is being deleted" msgstr "kan ikke oprette buffer-/vindue-kommando: objekt slettes" @@ -3123,8 +3120,8 @@ msgstr "-W <scriptud>\tSkriv alle indtastede kommandoer til filen <scriptud>" msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\tRediger krypterede filer" -msgid "-display <display>\tConnect vim to this particular X-server" -msgstr "-display <display>\tForbind vim til denne X-server" +msgid "-display <display>\tConnect Vim to this particular X-server" +msgstr "-display <display>\tForbind Vim til denne X-server" msgid "-X\t\t\tDo not connect to X server" msgstr "-X\t\t\tOpret ikke forbindelse til X-server" @@ -3203,11 +3200,11 @@ msgstr "" "\n" "Argumenter som genkendes af gvim (Athena-version):\n" -msgid "-display <display>\tRun vim on <display>" -msgstr "-display <display>\tKør vim på <display>" +msgid "-display <display>\tRun Vim on <display>" +msgstr "-display <display>\tKør Vim på <display>" -msgid "-iconic\t\tStart vim iconified" -msgstr "-iconic\t\tStart vim som ikon" +msgid "-iconic\t\tStart Vim iconified" +msgstr "-iconic\t\tStart Vim som ikon" msgid "-background <color>\tUse <color> for the background (also: -bg)" msgstr "-background <farve>\tBrug <farve> til baggrunden (også: -bg)" @@ -3253,8 +3250,8 @@ msgstr "" "\n" "Argumenter genkendt af gvim (GTK+-version):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" -msgstr "-display <display>\tKør vim på <display> (også: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <display>\tKør Vim på <display> (også: --display)" msgid "--role <role>\tSet a unique role to identify the main window" msgstr "--role <rolle>\tSæt en unik rolle til at identificere hovedvinduet" @@ -4332,8 +4329,6 @@ msgstr "E538: Ingen understøttelse af mus" msgid "E540: Unclosed expression sequence" msgstr "E540: Ulukket udtryk-sekvens" -msgid "E541: too many items" -msgstr "E541: for mange punkter" msgid "E542: unbalanced groups" msgstr "E542: ubalancerede grupper" @@ -6338,8 +6333,8 @@ msgstr "E799: Ugyldigt ID: %ld (skal være større end eller lig med 1)" msgid "E801: ID already taken: %ld" msgstr "E801: ID allerede taget: %ld" -msgid "List or number required" -msgstr "Liste eller nummer kræves" +msgid "E290: List or number required" +msgstr "E290: Liste eller nummer kræves" #, c-format msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)" @@ -6876,7 +6871,7 @@ msgid "list index out of range" msgstr "listeindeks udenfor område" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "intern fejl: kunne ikke hente vim-listepunkt %d" msgid "slice step cannot be zero" @@ -6887,7 +6882,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "forsøg på at tildele sekvens som er større end %d til udvidet slice" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "intern fejl: intet vim-listepunkt %d" msgid "internal error: not enough list items" @@ -6998,19 +6993,19 @@ msgstr "kunne ikke køre koden" msgid "E858: Eval did not return a valid python object" msgstr "E858: Eval returnerede ikke et gyldigt python-objekt" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: Kunne ikke konvertere returnerede python-objekt til vim-værdi" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "kan ikke konvertere %s til vim-ordbog" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "kan ikke konvertere %s til vim-liste" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "kan ikke konvertere %s til vim-struktur" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po index 5480e6a4d8..9b374e91ae 100644 --- a/src/nvim/po/eo.po +++ b/src/nvim/po/eo.po @@ -151,9 +151,6 @@ msgstr "[Modifita]" msgid "[Not edited]" msgstr "[Ne redaktita]" -msgid "[New file]" -msgstr "[Nova dosiero]" - msgid "[Read errors]" msgstr "[Eraroj de legado]" @@ -229,12 +226,16 @@ msgstr " linio=%ld id=%d nomo=%s" msgid "E902: Cannot connect to port" msgstr "E902: Ne eblas konekti al pordo" +msgid "E898: socket() in channel_connect()" +msgstr "E898: socket() en channel_connect()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: getaddrinfo() en channel_open(): %s" + msgid "E901: gethostbyname() in channel_open()" msgstr "E901: gethostbyname() en channel_open()" -msgid "E898: socket() in channel_open()" -msgstr "E898: gethostbyname() en channel_open()" - msgid "E903: received command with non-string argument" msgstr "E903: ricevis komandon kun argumento, kiu ne estas ĉeno" @@ -475,24 +476,12 @@ msgstr "kongruo %d" msgid "E18: Unexpected characters in :let" msgstr "E18: Neatenditaj signoj en \":let\"" -#, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: Nedifinita variablo: %s" - msgid "E111: Missing ']'" msgstr "E111: Mankas ']'" msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: Uzo de [:] ne eblas kun Vortaro" -#, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: Nevalida datumtipo de variablo de %s=" - -#, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: Nevalida nomo de variablo: %s" - msgid "E806: using Float as a String" msgstr "E806: uzo de Glitpunktnombro kiel Ĉeno" @@ -502,8 +491,8 @@ msgstr "E687: Malpli da celoj ol Listeroj" msgid "E688: More targets than List items" msgstr "E688: Pli da celoj ol Listeroj" -msgid "Double ; in list of variables" -msgstr "Duobla ; en listo de variabloj" +msgid "E452: Double ; in list of variables" +msgstr "E452: Du ; en listo de variabloj" #, c-format msgid "E738: Can't list variables for %s" @@ -691,9 +680,6 @@ msgstr "argumento de filter()" msgid "E686: Argument of %s must be a List" msgstr "E686: Argumento de %s devas esti Listo" -msgid "E928: String required" -msgstr "E928: Ĉeno bezonata" - msgid "E808: Number or Float required" msgstr "E808: Nombro aŭ Glitpunktnombro bezonata" @@ -751,9 +737,6 @@ msgstr "E726: Paŝo estas nul" msgid "E727: Start past end" msgstr "E727: Komenco preter fino" -msgid "<empty>" -msgstr "<malplena>" - msgid "E240: No connection to the X server" msgstr "E240: Neniu konekto al X-servilo" @@ -782,10 +765,6 @@ msgstr "argumento de reverse()" msgid "E258: Unable to send to client" msgstr "E258: Ne eblas sendi al kliento" -#, c-format -msgid "E927: Invalid action: '%s'" -msgstr "E927: Nevalida ago: '%s'" - msgid "sort() argument" msgstr "argumento de sort()" @@ -805,9 +784,6 @@ msgstr "(Nevalida)" msgid "E935: invalid submatch number: %d" msgstr "E935: nevalida indekso de \"submatch\": %d" -msgid "E677: Error writing temp file" -msgstr "E677: Eraro dum skribo de provizora dosiero" - msgid "E921: Invalid callback argument" msgstr "E921: Nevalida argumento de reagfunctio" @@ -1180,18 +1156,6 @@ msgid "E666: compiler not supported: %s" msgstr "E666: kompililo nesubtenata: %s" #, c-format -msgid "Searching for \"%s\" in \"%s\"" -msgstr "Serĉado de \"%s\" en \"%s\"" - -#, c-format -msgid "Searching for \"%s\"" -msgstr "Serĉado de \"%s\"" - -#, c-format -msgid "not found in '%s': \"%s\"" -msgstr "ne trovita en '%s: \"%s\"" - -#, c-format msgid "W20: Required python version 2.x not supported, ignoring file: %s" msgstr "W20: Pitono versio 2.x bezonata sed nesubtenata, ignoro de dosiero: %s" @@ -1199,61 +1163,6 @@ msgstr "W20: Pitono versio 2.x bezonata sed nesubtenata, ignoro de dosiero: %s" msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: pitono versio 3.x bezonata sed nesubtenata, ignoro de dosiero: %s" -msgid "Source Vim script" -msgstr "Ruli Vim-skripton" - -#, c-format -msgid "Cannot source a directory: \"%s\"" -msgstr "Ne eblas ruli dosierujon: \"%s\"" - -#, c-format -msgid "could not source \"%s\"" -msgstr "ne eblis ruli \"%s\"" - -#, c-format -msgid "line %ld: could not source \"%s\"" -msgstr "linio %ld: ne eblis ruli \"%s\"" - -#, c-format -msgid "sourcing \"%s\"" -msgstr "rulas \"%s\"" - -#, c-format -msgid "line %ld: sourcing \"%s\"" -msgstr "linio %ld: rulas \"%s\"" - -#, c-format -msgid "finished sourcing %s" -msgstr "finis ruli %s" - -#, c-format -msgid "continuing in %s" -msgstr "daŭrigas en %s" - -msgid "modeline" -msgstr "reĝimlinio" - -msgid "--cmd argument" -msgstr "--cmd argumento" - -msgid "-c argument" -msgstr "-c argumento" - -msgid "environment variable" -msgstr "medivariablo" - -msgid "error handler" -msgstr "erartraktilo" - -msgid "W15: Warning: Wrong line separator, ^M may be missing" -msgstr "W15: Averto: Neĝusta disigilo de linio, ^M eble mankas" - -msgid "E167: :scriptencoding used outside of a sourced file" -msgstr "E167: \":scriptencoding\" uzita ekster rulita dosiero" - -msgid "E168: :finish used outside of a sourced file" -msgstr "E168: \":finish\" uzita ekster rulita dosiero" - #, c-format msgid "Current %slanguage: \"%s\"" msgstr "Aktuala %slingvo: \"%s\"" @@ -1268,6 +1177,10 @@ msgstr "Eniras reĝimon Ex. Tajpu \"visual\" por iri al reĝimo Normala." msgid "E501: At end-of-file" msgstr "E501: Ĉe fino-de-dosiero" +#, c-format +msgid "Executing: %s" +msgstr "Plenumado de %s" + msgid "E169: Command too recursive" msgstr "E169: Komando tro rekursia" @@ -1595,21 +1508,9 @@ msgstr "E733: Uzo de \":endwhile\" kun \":for\"" msgid "E601: :try nesting too deep" msgstr "E601: \":try\" ingita tro profunde" -msgid "E603: :catch without :try" -msgstr "E603: \":catch\" sen \":try\"" - msgid "E604: :catch after :finally" msgstr "E604: \":catch\" malantaŭ \":finally\"" -msgid "E606: :finally without :try" -msgstr "E606: \":finally\" sen \":try\"" - -msgid "E607: multiple :finally" -msgstr "E607: pluraj \":finally\"" - -msgid "E602: :endtry without :try" -msgstr "E602: \":endtry\" sen \":try\"" - msgid "E193: :endfunction not inside a function" msgstr "E193: \":endfunction\" ekster funkcio" @@ -1714,12 +1615,6 @@ msgstr "[CR mankas]" msgid "[long lines split]" msgstr "[divido de longaj linioj]" -msgid "[NOT converted]" -msgstr "[NE konvertita]" - -msgid "[converted]" -msgstr "[konvertita]" - #, c-format msgid "[CONVERSION ERROR in line %ld]" msgstr "[ERARO DE KONVERTO en linio %ld]" @@ -1885,10 +1780,10 @@ msgstr[0] "%ld linio, " msgstr[1] "%ld linioj, " #, c-format -msgid "%lld character" -msgid_plural "%lld characters" -msgstr[0] "%lld signo" -msgstr[1] "%lld signoj" +msgid "%lld byte" +msgid_plural "%lld bytes" +msgstr[0] "%lld bajto" +msgstr[1] "%lld bajtoj" msgid "[noeol]" msgstr "[sen EOL]" @@ -1896,12 +1791,6 @@ msgstr "[sen EOL]" msgid "[Incomplete last line]" msgstr "[Nekompleta lasta linio]" -msgid "WARNING: The file has been changed since reading it!!!" -msgstr "AVERTO: La dosiero estas ŝanĝita de post kiam ĝi estis legita!!!" - -msgid "Do you really want to write to it" -msgstr "Ĉu vi vere volas skribi al ĝi" - #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: Eraro dum skribo de \"%s\"" @@ -1986,7 +1875,7 @@ msgstr "W19: Forviŝo de augroup kiu estas ankoraŭ uzata" #, c-format msgid "E215: Illegal character after *: %s" -msgstr "E215: Nevalida signo malantaŭ *: %s" +msgstr "E215: Nevalida signo post *: %s" #, c-format msgid "E216: No such event: %s" @@ -2097,10 +1986,6 @@ msgstr "E231: 'guifontwide' nevalida" msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: Valoro de 'imactivatekey' estas nevalida" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Ne eblas disponigi koloron %s" - msgid "No match at cursor, finding next" msgstr "Neniu kongruo ĉe kursorpozicio, trovas sekvan" @@ -2354,9 +2239,6 @@ msgstr "Stilo:" msgid "Size:" msgstr "Grando:" -msgid "E256: Hangul automata ERROR" -msgstr "E256: ERARO en aŭtomato de korea alfabeto" - msgid "E550: Missing colon" msgstr "E550: Mankas dupunkto" @@ -2774,9 +2656,6 @@ msgstr "nekonata vimOption" msgid "keyboard interrupt" msgstr "klavara interrompo" -msgid "vim error" -msgstr "eraro de Vim" - msgid "cannot create buffer/window command: object is being deleted" msgstr "ne eblas krei komandon de bufro/fenestro: objekto estas forviŝiĝanta" @@ -2843,10 +2722,10 @@ msgid "Too many edit arguments" msgstr "Tro da argumentoj de redakto" msgid "Argument missing after" -msgstr "Argumento mankas malantaŭ" +msgstr "Argumento mankas post" msgid "Garbage after option argument" -msgstr "Forĵetindaĵo malantaŭ argumento de opcio" +msgstr "Forĵetindaĵo post argumento de opcio" msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments" msgstr "Tro da argumentoj \"+komando\", \"-c komando\" aŭ \"--cmd komando\"" @@ -2951,7 +2830,7 @@ msgstr "" "Argumentoj:\n" msgid "--\t\t\tOnly file names after this" -msgstr "--\t\t\tNur dosiernomoj malantaŭ tio" +msgstr "--\t\t\tNur dosiernomoj post tio" msgid "--literal\t\tDon't expand wildcards" msgstr "--literal\t\tNe malvolvi ĵokerojn" @@ -3101,7 +2980,7 @@ msgstr "" msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\tRedakti ĉifradan dosieron" -msgid "-display <display>\tConnect vim to this particular X-server" +msgid "-display <display>\tConnect Vim to this particular X-server" msgstr "-display <ekrano>\tKonekti Vim al tiu X-servilo" msgid "-X\t\t\tDo not connect to X server" @@ -3180,11 +3059,11 @@ msgstr "" "\n" "Argumentoj agnoskitaj de gvim (versio Athena):\n" -msgid "-display <display>\tRun vim on <display>" -msgstr "-display <ekrano>\tLanĉi vim sur <ekrano>" +msgid "-display <display>\tRun Vim on <display>" +msgstr "-display <ekrano>\tLanĉi Vim sur <ekrano>" -msgid "-iconic\t\tStart vim iconified" -msgstr "-iconic\t\tLanĉi vim piktograme" +msgid "-iconic\t\tStart Vim iconified" +msgstr "-iconic\t\tLanĉi Vim piktograme" msgid "-background <color>\tUse <color> for the background (also: -bg)" msgstr "-background <koloro>\tUzi <koloro>-n por la fona koloro (ankaŭ: -bg)" @@ -3232,7 +3111,7 @@ msgstr "" "\n" "Argumentoj agnoskitaj de gvim (versio GTK+):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" msgstr "-display <ekrano>\tLanĉi Vim sur tiu <ekrano> (ankaŭ: --display)" msgid "--role <role>\tSet a unique role to identify the main window" @@ -3663,8 +3542,8 @@ msgid "E315: ml_get: invalid lnum: %ld" msgstr "E315: ml_get: nevalida lnum: %ld" #, c-format -msgid "E316: ml_get: cannot find line %ld" -msgstr "E316: ml_get: ne eblas trovi linion %ld" +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get: ne eblas trovi linion %ld en bufro %d %s" msgid "E317: pointer block id wrong 3" msgstr "E317: nevalida referenco de bloko id 3" @@ -3909,18 +3788,6 @@ msgstr "" "&Forlasi Ĉion\n" "&Rezigni" -msgid "Select Directory dialog" -msgstr "Dialogujo de dosiera elekto" - -msgid "Save File dialog" -msgstr "Dialogujo de dosiera konservo" - -msgid "Open File dialog" -msgstr "Dialogujo de dosiera malfermo" - -msgid "E338: Sorry, no file browser in console mode" -msgstr "E338: Bedaŭrinde ne estas dosierfoliumilo en konzola reĝimo" - msgid "E766: Insufficient arguments for printf()" msgstr "E766: Ne sufiĉaj argumentoj por printf()" @@ -3958,6 +3825,12 @@ msgstr " (Interrompita)" msgid "Beep!" msgstr "Bip!" +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "antaŭ %ld sekundo" +msgstr[1] "antaŭ %ld sekundoj" + msgid "ERROR: " msgstr "ERARO: " @@ -4057,13 +3930,6 @@ msgstr "E505: %s estas nurlegebla (aldonu ! por transpasi)" msgid "E349: No identifier under cursor" msgstr "E349: Neniu identigilo sub la kursoro" -msgid "E774: 'operatorfunc' is empty" -msgstr "E774: 'operatorfunc' estas malplena" - -# DP: ĉu Eval devas esti tradukita? -msgid "E775: Eval feature not available" -msgstr "E775: Eval eblo ne disponeblas" - msgid "Warning: terminal cannot highlight" msgstr "Averto: terminalo ne povas emfazi" @@ -4109,9 +3975,6 @@ msgid_plural "%ld lines indented " msgstr[0] "%ld linio krommarĝenita " msgstr[1] "%ld linioj krommarĝenitaj " -msgid "E748: No previously used register" -msgstr "E748: Neniu reĝistro antaŭe uzata" - msgid "cannot yank; delete anyway" msgstr "ne eblas kopii; tamen forviŝi" @@ -4121,30 +3984,6 @@ msgid_plural "%ld lines changed" msgstr[0] "%ld linio ŝanĝita" msgstr[1] "%ld linioj ŝanĝitaj" -#, c-format -msgid "freeing %ld lines" -msgstr "malokupas %ld liniojn" - -#, c-format -msgid " into \"%c" -msgstr " en \"%c" - -#, c-format -msgid "block of %ld line yanked%s" -msgid_plural "block of %ld lines yanked%s" -msgstr[0] "bloko de %ld linio kopiita%s" -msgstr[1] "bloko de %ld linioj kopiitaj%s" - -#, c-format -msgid "%ld line yanked%s" -msgid_plural "%ld lines yanked%s" -msgstr[0] "%ld linio kopiita%s" -msgstr[1] "%ld linioj kopiitaj%s" - -#, c-format -msgid "E353: Nothing in register %s" -msgstr "E353: Nenio en reĝistro %s" - msgid "" "\n" "--- Registers ---" @@ -4166,12 +4005,6 @@ msgstr "" msgid "E574: Unknown register type %d" msgstr "E574: Nekonata tipo de reĝistro %d" -msgid "" -"E883: search pattern and expression register may not contain two or more " -"lines" -msgstr "" -"E883: serĉa ŝablono kaj esprima reĝistro ne povas enhavi du aŭ pliajn liniojn" - #, c-format msgid "%ld Cols; " msgstr "%ld Kolumnoj; " @@ -4221,11 +4054,14 @@ msgid "E846: Key code not set" msgstr "E846: Klavkodo ne agordita" msgid "E521: Number required after =" -msgstr "E521: Nombro bezonata malantaŭ =" +msgstr "E521: Nombro bezonata post =" msgid "E522: Not found in termcap" msgstr "E522: Netrovita en termcap" +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: 24-bitaj koloroj ne estas subtenataj en tiu sistemo" + #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: Nevalida signo <%s>" @@ -4263,7 +4099,7 @@ msgstr "E525: Ĉeno de nula longo" #, c-format msgid "E526: Missing number after <%s>" -msgstr "E526: Mankas nombro malantaŭ <%s>" +msgstr "E526: Mankas nombro post <%s>" msgid "E527: Missing comma" msgstr "E527: Mankas komo" @@ -4271,8 +4107,8 @@ msgstr "E527: Mankas komo" msgid "E528: Must specify a ' value" msgstr "E528: Devas specifi ' valoron" -msgid "E595: contains unprintable or wide character" -msgstr "E595: enhavas nepreseblan aŭ plurĉellarĝan signon" +msgid "E595: 'showbreak' contains unprintable or wide character" +msgstr "E595: 'showbreak' enhavas nepreseblan aŭ plurĉellarĝan signon" msgid "E596: Invalid font(s)" msgstr "E596: Nevalida(j) tiparo(j)" @@ -4291,7 +4127,7 @@ msgstr "E534: Nevalida larĝa tiparo" #, c-format msgid "E535: Illegal character after <%c>" -msgstr "E535: Nevalida signo malantaŭ <%c>" +msgstr "E535: Nevalida signo post <%c>" msgid "E536: comma required" msgstr "E536: komo bezonata" @@ -4303,71 +4139,6 @@ msgstr "E537: 'commentstring' devas esti malplena aŭ enhavi %s" msgid "E538: No mouse support" msgstr "E538: Neniu muso subtenata" -msgid "E540: Unclosed expression sequence" -msgstr "E540: '}' mankas" - -msgid "E541: too many items" -msgstr "E541: tro da elementoj" - -msgid "E542: unbalanced groups" -msgstr "E542: misekvilibraj grupoj" - -msgid "E946: Cannot make a terminal with running job modifiable" -msgstr "E946: Ne eblas igi modifebla terminalon kun aktiva tasko" - -msgid "E590: A preview window already exists" -msgstr "E590: Antaŭvida fenestro jam ekzistas" - -msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" -msgstr "W17: La araba bezonas UTF-8, tajpu \":set encoding=utf-8\"" - -#, c-format -msgid "E593: Need at least %d lines" -msgstr "E593: Bezonas almenaŭ %d liniojn" - -#, c-format -msgid "E594: Need at least %d columns" -msgstr "E594: Bezonas almenaŭ %d kolumnojn" - -#, c-format -msgid "E355: Unknown option: %s" -msgstr "E355: Nekonata opcio: %s" - -#, c-format -msgid "E521: Number required: &%s = '%s'" -msgstr "E521: Nombro bezonata: &%s = '%s'" - -msgid "" -"\n" -"--- Terminal codes ---" -msgstr "" -"\n" -"--- Kodoj de terminalo ---" - -msgid "" -"\n" -"--- Global option values ---" -msgstr "" -"\n" -"--- Mallokaj opcioj ---" - -msgid "" -"\n" -"--- Local option values ---" -msgstr "" -"\n" -"--- Valoroj de lokaj opcioj ---" - -msgid "" -"\n" -"--- Options ---" -msgstr "" -"\n" -"--- Opcioj ---" - -msgid "E356: get_varp ERROR" -msgstr "E356: ERARO get_varp" - #, c-format msgid "E357: 'langmap': Matching character missing for %s" msgstr "E357: 'langmap': Kongrua signo mankas por %s" @@ -4387,7 +4158,7 @@ msgstr "Bezonas version 2.04 de Amigados aŭ pli novan\n" #, c-format msgid "Need %s version %ld\n" -msgstr "Bezonas %s-on versio %ld\n" +msgstr "Bezonas %s-on de versio %ld\n" msgid "Cannot open NIL:\n" msgstr "Ne eblas malfermi NIL:\n" @@ -4690,7 +4461,7 @@ msgstr "E369: nevalida ano en %s%%[]" #, c-format msgid "E769: Missing ] after %s[" -msgstr "E769: Mankas ] malantaŭ %s[" +msgstr "E769: Mankas ] post %s[" msgid "E944: Reverse range in character class" msgstr "E944: Inversa amplekso en klaso de signoj" @@ -4719,7 +4490,7 @@ msgstr "E67: \\z1 kaj aliaj estas nepermeseblaj tie" #, c-format msgid "E69: Missing ] after %s%%[" -msgstr "E69: Mankas ] malantaŭ %s%%[" +msgstr "E69: Mankas ] post %s%%[" #, c-format msgid "E70: Empty %s%%[]" @@ -4728,25 +4499,48 @@ msgstr "E70: Malplena %s%%[]" msgid "E956: Cannot use pattern recursively" msgstr "E956: Ne eblas uzi ŝablonon rekursie" +#, c-format +msgid "E554: Syntax error in %s{...}" +msgstr "E554: Sintaksa eraro en %s{...}" + +#, c-format +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (NFA-regulesprimo) ne eblas ripeti %s" + +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: \\%#= povas nur esti sekvita de 0, 1, aŭ 2. La aŭtomata motoro de " +"regulesprimo estos uzata " + +msgid "Switching to backtracking RE engine for pattern: " +msgstr "Ŝanĝas al malavanca motoro de regulesprimo por ŝablono: " + msgid "E65: Illegal back reference" msgstr "E65: Nevalida retro-referenco" -msgid "E339: Pattern too long" -msgstr "E339: Ŝablono tro longa" +msgid "E63: invalid use of \\_" +msgstr "E63: nevalida uzo de \\_" -msgid "E50: Too many \\z(" -msgstr "E50: Tro da \\z(" +#, c-format +msgid "E64: %s%c follows nothing" +msgstr "E64: %s%c sekvas nenion" + +msgid "E68: Invalid character after \\z" +msgstr "E68: Nevalida signo post \\z" #, c-format -msgid "E51: Too many %s(" -msgstr "E51: Tro da %s(" +msgid "E678: Invalid character after %s%%[dxouU]" +msgstr "E678: Nevalida signo post %s%%[dxouU]" -msgid "E52: Unmatched \\z(" -msgstr "E52: Neekvilibra \\z(" +#, c-format +msgid "E71: Invalid character after %s%%" +msgstr "E71: Nevalida signo post %s%%" #, c-format msgid "E59: invalid character after %s@" -msgstr "E59: nevalida signo malantaŭ %s@" +msgstr "E59: nevalida signo post %s@" #, c-format msgid "E60: Too many complex %s{...}s" @@ -4760,45 +4554,22 @@ msgstr "E61: Ingita %s*" msgid "E62: Nested %s%c" msgstr "E62: Ingita %s%c" -msgid "E63: invalid use of \\_" -msgstr "E63: nevalida uzo de \\_" - -#, c-format -msgid "E64: %s%c follows nothing" -msgstr "E64: %s%c sekvas nenion" - -msgid "E68: Invalid character after \\z" -msgstr "E68: Nevalida signo malantaŭ \\z" +msgid "E50: Too many \\z(" +msgstr "E50: Tro da \\z(" #, c-format -msgid "E678: Invalid character after %s%%[dxouU]" -msgstr "E678: Nevalida signo malantaŭ %s%%[dxouU]" +msgid "E51: Too many %s(" +msgstr "E51: Tro da %s(" -#, c-format -msgid "E71: Invalid character after %s%%" -msgstr "E71: Nevalida signo malantaŭ %s%%" +msgid "E52: Unmatched \\z(" +msgstr "E52: Neekvilibra \\z(" -#, c-format -msgid "E554: Syntax error in %s{...}" -msgstr "E554: Sintaksa eraro en %s{...}" +msgid "E339: Pattern too long" +msgstr "E339: Ŝablono tro longa" msgid "External submatches:\n" msgstr "Eksteraj subkongruoj:\n" -#, c-format -msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (NFA-regulesprimo) ne eblas ripeti %s" - -msgid "" -"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " -"used " -msgstr "" -"E864: \\%#= povas nur esti sekvita de 0, 1, aŭ 2. La aŭtomata motoro de " -"regulesprimo estos uzata " - -msgid "Switching to backtracking RE engine for pattern: " -msgstr "Ŝanĝas al malavanca motoro de regulesprimo por ŝablono: " - msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) Trovis finon de regulesprimo tro frue" @@ -4863,6 +4634,13 @@ msgstr "E876: (NFA-regulesprimo) ne sufiĉa spaco por enmemorigi la tutan NFA " msgid "E878: (NFA) Could not allocate memory for branch traversal!" msgstr "E878: (NFA) Ne povis asigni memoron por traigi branĉojn!" +msgid "" +"\n" +"Type Name Content" +msgstr "" +"\n" +"Tipo Nomo Enhavo" + msgid " VREPLACE" msgstr " V-ANSTATAŬIGO" @@ -4914,6 +4692,16 @@ msgstr " APARTIGITA BLOKO" msgid "recording" msgstr "registrado" +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion uzita ekster rulita dosiero" + +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: Ne eblas uzi :scriptversion post :vim9script" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: scriptversion ne subtenata: %d" + #, c-format msgid "E383: Invalid search string: %s" msgstr "E383: Nevalida serĉenda ĉeno: %s" @@ -4927,7 +4715,7 @@ msgid "E385: search hit BOTTOM without match for: %s" msgstr "E385: serĉo atingis SUBON sen trovi: %s" msgid "E386: Expected '?' or '/' after ';'" -msgstr "E386: Atendis '?' aŭ '/' malantaŭ ';'" +msgstr "E386: Atendis '?' aŭ '/' post ';'" msgid " (includes previously listed match)" msgstr " (enhavas antaŭe listigitajn kongruojn)" @@ -5001,21 +4789,6 @@ msgstr "E797: Aŭtokomando SpellFileMissing forviŝis bufron" msgid "Warning: region %s not supported" msgstr "Averto: regiono %s ne subtenata" -msgid "Sorry, no suggestions" -msgstr "Bedaŭrinde ne estas sugestoj" - -#, c-format -msgid "Sorry, only %ld suggestions" -msgstr "Bedaŭrinde estas nur %ld sugestoj" - -#, c-format -msgid "Change \"%.*s\" to:" -msgstr "Anstataŭigi \"%.*s\" per:" - -#, c-format -msgid " < \"%.*s\"" -msgstr " < \"%.*s\"" - msgid "E752: No previous spell replacement" msgstr "E752: Neniu antaŭa literuma anstataŭigo" @@ -5346,6 +5119,21 @@ msgstr "E763: Signoj de vorto malsamas tra literumaj dosieroj" msgid "E783: duplicate char in MAP entry" msgstr "E783: ripetita signo en rikordo MAP" +msgid "Sorry, no suggestions" +msgstr "Bedaŭrinde ne estas sugestoj" + +#, c-format +msgid "Sorry, only %ld suggestions" +msgstr "Bedaŭrinde estas nur %ld sugestoj" + +#, c-format +msgid "Change \"%.*s\" to:" +msgstr "Anstataŭigi \"%.*s\" per:" + +#, c-format +msgid " < \"%.*s\"" +msgstr " < \"%.*s\"" + msgid "No Syntax items defined for this buffer" msgstr "Neniu sintaksa elemento difinita por tiu bufro" @@ -5462,7 +5250,7 @@ msgstr "E789: Mankas ']': %s" #, c-format msgid "E890: trailing char after ']': %s]%s" -msgstr "E890: vosta signo malantaŭ ']': %s]%s" +msgstr "E890: vosta signo post ']': %s]%s" #, c-format msgid "E398: Missing '=': %s" @@ -5484,7 +5272,7 @@ msgstr "E401: Disigilo de ŝablono netrovita: %s" #, c-format msgid "E402: Garbage after pattern: %s" -msgstr "E402: Forĵetindaĵo malantaŭ ŝablono: %s" +msgstr "E402: Forĵetindaĵo post ŝablono: %s" msgid "E403: syntax sync: line continuations pattern specified twice" msgstr "E403: sintaksa sinkronigo: ŝablono de linia daŭrigo specifita dufoje" @@ -5562,6 +5350,9 @@ msgstr "E419: Nekonata malfona koloro" msgid "E420: BG color unknown" msgstr "E420: Nekonata fona koloro" +msgid "E453: UL color unknown" +msgstr "E453: Nekonata koloro de UL" + #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: Kolora nomo aŭ nombro nerekonita: %s" @@ -5645,9 +5436,6 @@ msgstr "Serĉado de dosiero de etikedoj %s" msgid "E430: Tag file path truncated for %s\n" msgstr "E430: Vojo de etikeda dosiero trunkita por %s\n" -msgid "Ignoring long line in tags file" -msgstr "Ignoro de longa linio en etikeda dosiero" - #, c-format msgid "E431: Format error in tags file \"%s\"" msgstr "E431: Eraro de formato en etikeda dosiero \"%s\"" @@ -5663,6 +5451,9 @@ msgstr "E432: Etikeda dosiero ne estas ordigita: %s" msgid "E433: No tags file" msgstr "E433: Neniu etikeda dosiero" +msgid "Ignoring long line in tags file" +msgstr "Ignoro de longa linio en etikeda dosiero" + msgid "E434: Can't find tag pattern" msgstr "E434: Ne eblas trovi ŝablonon de etikedo" @@ -5851,12 +5642,6 @@ msgstr "Nenio por malfari" msgid "number changes when saved" msgstr "numero ŝanĝoj tempo konservita" -#, c-format -msgid "%ld second ago" -msgid_plural "%ld seconds ago" -msgstr[0] "antaŭ %ld sekundo" -msgstr[1] "antaŭ %ld sekundoj" - msgid "E790: undojoin is not allowed after undo" msgstr "E790: undojoin estas nepermesebla post malfaro" @@ -5919,16 +5704,8 @@ msgid "E699: Too many arguments" msgstr "E699: Tro da argumentoj" #, c-format -msgid "E117: Unknown function: %s" -msgstr "E117: Nekonata funkcio: %s" - -#, c-format -msgid "E933: Function was deleted: %s" -msgstr "E933: funkcio estis forviŝita: %s" - -#, c-format -msgid "E119: Not enough arguments for function: %s" -msgstr "E119: Ne sufiĉe da argumentoj por funkcio: %s" +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: Ne eblas uzi funkcion kiel metodo: %s" #, c-format msgid "E120: Using <SID> not in a script context: %s" @@ -5949,6 +5726,9 @@ msgstr "E128: Nomo de funkcio devas eki per majusklo aŭ per \"s:\": %s" msgid "E884: Function name cannot contain a colon: %s" msgstr "E884: Nomo de funkcio ne povas enhavi dupunkton: %s" +msgid "E454: function list was modified" +msgstr "E454: listo de funkcioj ŝanĝiĝis" + #, c-format msgid "E123: Undefined function: %s" msgstr "E123: Nedifinita funkcio: %s" @@ -5961,15 +5741,29 @@ msgid "E862: Cannot use g: here" msgstr "E862: Ne eblas uzi g: ĉi tie" #, c-format +msgid "E1056: expected a type: %s" +msgstr "E1056: atendis tipon: %s" + +#, c-format msgid "E932: Closure function should not be at top level: %s" msgstr "E932: Fermo-funkcio devus esti je la plej alta nivelo: %s" +msgid "E1057: Missing :enddef" +msgstr "E1057: Mankas :enddef" + msgid "E126: Missing :endfunction" msgstr "E126: Mankas \":endfunction\"" #, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: Teksto trovita post :enddef: %s" + +#, c-format msgid "W22: Text found after :endfunction: %s" -msgstr "W22: Teksto trovita malantaŭ :endfunction: %s" +msgstr "W22: Teksto trovita post :endfunction: %s" + +msgid "E1058: function nesting too deep" +msgstr "E1058: ingado de funkcio tro profunda" #, c-format msgid "E707: Function name conflicts with variable: %s" @@ -5987,6 +5781,10 @@ msgstr "E746: Nomo de funkcio ne kongruas kun dosiernomo de skripto: %s" msgid "E131: Cannot delete function %s: It is in use" msgstr "E131: Ne eblas forviŝi funkcion %s: Estas nuntempe uzata" +#, c-format +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Ne eblas forviŝi funkcion de Vim9-skripto: %s" + msgid "E133: :return not inside a function" msgstr "E133: \":return\" ekster funkcio" @@ -6140,6 +5938,9 @@ msgstr "kun grafika interfaco X11-neXtaw." msgid "with X11-Athena GUI." msgstr "kun grafika interfaco X11-Athena." +msgid "with Haiku GUI." +msgstr "kun grafika interfaco Haiku." + msgid "with Photon GUI." msgstr "kun grafika interfaco Photon." @@ -6452,9 +6253,6 @@ msgstr "E685: Interna eraro: %s" msgid "Interrupted" msgstr "Interrompita" -msgid "E14: Invalid address" -msgstr "E14: Nevalida adreso" - msgid "E474: Invalid argument" msgstr "E474: Nevalida argumento" @@ -6476,6 +6274,9 @@ msgstr "E476: Nevalida komando" msgid "E17: \"%s\" is a directory" msgstr "E17: \"%s\" estas dosierujo" +msgid "E756: Spell checking is not possible" +msgstr "E756: malpermesata literumilo" + #, c-format msgid "E364: Library call failed for \"%s()\"" msgstr "E364: Alvoko al biblioteko malsukcesis por \"%s()\"" @@ -6618,6 +6419,9 @@ msgstr "E44: Difekta programo de regulesprimo" msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: La opcio 'readonly' estas ŝaltita '(aldonu ! por transpasi)" +msgid "E995: Cannot modify existing variable" +msgstr "E995: Ne eblas ŝanĝi ekzistantan variablon" + #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: Ne eblas ŝanĝi nurlegeblan variablon \"%s\"" @@ -6641,6 +6445,14 @@ msgid "E118: Too many arguments for function: %s" msgstr "E118: Tro da argumentoj por funkcio: %s" #, c-format +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: Ne sufiĉe da argumentoj por funkcio: %s" + +#, c-format +msgid "E933: Function was deleted: %s" +msgstr "E933: funkcio estis forviŝita: %s" + +#, c-format msgid "E716: Key not present in Dictionary: %s" msgstr "E716: Ŝlosilo malekzistas en Vortaro: %s" @@ -6854,7 +6666,7 @@ msgid "list index out of range" msgstr "indekso de listo ekster limoj" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "interna eraro: obteno de vim-a listero %d malsukcesis" msgid "slice step cannot be zero" @@ -6865,7 +6677,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "provis valorizi sekvencon kun pli ol %d eroj en etendita sekco" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "interna eraro: neniu vim-a listero %d" msgid "internal error: not enough list items" @@ -6974,19 +6786,19 @@ msgstr "malsukcesis ruli la kodon" msgid "E858: Eval did not return a valid python object" msgstr "E858: Eval ne revenis kun valida python-objekto" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: Konverto de revena python-objekto al vim-valoro malsukcesis" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "ne povis konverti %s al vim-vortaro" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "ne povis konverti %s al vim-listo" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "ne povis konverti %s al vim-strukturo" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/fi.po b/src/nvim/po/fi.po index 5986a57488..77d5f7f826 100644 --- a/src/nvim/po/fi.po +++ b/src/nvim/po/fi.po @@ -4198,8 +4198,6 @@ msgstr "E537: commentstringin pitää olla tyhjä tai sisältää %s" msgid "E540: Unclosed expression sequence" msgstr "E540: Sulkematon lausekesarja" -msgid "E541: too many items" -msgstr "E541: liikaa kohteita" msgid "E542: unbalanced groups" msgstr "E542: epätasapainoisia ryhmiä" diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po index 5f1ca2fec5..6df7741f1a 100644 --- a/src/nvim/po/fr.po +++ b/src/nvim/po/fr.po @@ -1,4 +1,3 @@ - # French Translation for Vim # # Do ":help uganda" in Vim to read copying and usage conditions. @@ -62,8 +61,9 @@ msgstr "" msgid "E931: Buffer cannot be registered" msgstr "E931: Le tampon ne peut pas tre enregistr" -msgid "E937: Attempt to delete a buffer that is in use" -msgstr "E937: Tentative de suppression d'un tampon en cours d'utilisation" +#, c-format +msgid "E937: Attempt to delete a buffer that is in use: %s" +msgstr "E937: Tentative de suppression d'un tampon en cours d'utilisation : %s" msgid "E515: No buffers were unloaded" msgstr "E515: Aucun tampon n'a t dcharg" @@ -159,9 +159,6 @@ msgstr "[Modifi]" msgid "[Not edited]" msgstr "[Non dit]" -msgid "[New file]" -msgstr "[Nouveau fichier]" - msgid "[Read errors]" msgstr "[Erreurs de lecture]" @@ -214,13 +211,6 @@ msgstr "Bas" msgid "Top" msgstr "Haut" -msgid "" -"\n" -"# Buffer list:\n" -msgstr "" -"\n" -"# Liste des tampons :\n" - msgid "E382: Cannot write, 'buftype' option is set" msgstr "E382: criture impossible, l'option 'buftype' est active" @@ -248,12 +238,16 @@ msgstr " ligne=%ld id=%d nom=%s" msgid "E902: Cannot connect to port" msgstr "E902: Impossible de se connecter au port" +msgid "E898: socket() in channel_connect()" +msgstr "E898: socket() dans channel_connect()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: getaddrinfo() dans channel_open(): %s" + msgid "E901: gethostbyname() in channel_open()" msgstr "E901: gethostbyname() dans channel_open()" -msgid "E898: socket() in channel_open()" -msgstr "E898: socket() dans channel_open()" - msgid "E903: received command with non-string argument" msgstr "E903: commande reue avec un argument qui n'est pas une chane" @@ -267,6 +261,9 @@ msgstr "E904: le troisime argument de \"call\" doit tre une liste" msgid "E905: received unknown command: %s" msgstr "E905: commande inconnue reue : %s" +msgid "E906: not an open channel" +msgstr "E906: pas un canal ouvert" + #, c-format msgid "E630: %s(): write while not connected" msgstr "E630: %s() : criture sans tre connect" @@ -284,9 +281,6 @@ msgstr "" "E912: Impossible d'utiliser ch_evalexpr()/ch_sendexpr() avec un canal brut " "ou nl" -msgid "E906: not an open channel" -msgstr "E906: pas un canal ouvert" - msgid "E920: _io file requires _name to be set" msgstr "E920: fichier _io ncessite _name" @@ -297,6 +291,18 @@ msgstr "E915: tampon in_io ncessite in_buf ou in_name " msgid "E918: buffer must be loaded: %s" msgstr "E918: le tampon doit tre charg : %s" +# DB - TODO : Pas compris le message ni comment le dclencher malgr une visite +# dans le code. +msgid "tagname" +msgstr "nom du marqueur" + +# DB - TODO : Idem prcdent. +msgid " kind file\n" +msgstr " type de fichier\n" + +msgid "'history' option is zero" +msgstr "l'option 'history' vaut zro" + msgid "E821: File is encrypted with unknown method" msgstr "E821: Le fichier est chiffr avec une mthode inconnue" @@ -316,21 +322,54 @@ msgstr "Les cls ne correspondent pas !" msgid "[crypted]" msgstr "[chiffr]" +# AB - La version franaise de la premire phrase ne me satisfait pas. +# DB - Suggestion. +msgid "Entering Debug mode. Type \"cont\" to continue." +msgstr "Mode dbogage activ. Tapez \"cont\" pour continuer." + #, c-format -msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: Il manque ':' dans le Dictionnaire %s" +msgid "Oldval = \"%s\"" +msgstr "Ancienneval = \"%s\"" #, c-format -msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Cl duplique dans le Dictionnaire : %s" +msgid "Newval = \"%s\"" +msgstr "Nouvelleval = \"%s\"" #, c-format -msgid "E722: Missing comma in Dictionary: %s" -msgstr "E722: Il manque une virgule dans le Dictionnaire : %s" +msgid "line %ld: %s" +msgstr "ligne %ld : %s" #, c-format -msgid "E723: Missing end of Dictionary '}': %s" -msgstr "E723: Il manque '}' la fin du Dictionnaire : %s" +msgid "cmd: %s" +msgstr "cmde : %s" + +msgid "frame is zero" +msgstr "le cadre de pile est zro" + +#, c-format +msgid "frame at highest level: %d" +msgstr "cadre de pile au niveau le plus haut : %d" + +#, c-format +msgid "Breakpoint in \"%s%s\" line %ld" +msgstr "Point d'arrt dans %s%s ligne %ld" + +#, c-format +msgid "E161: Breakpoint not found: %s" +msgstr "E161: Le point d'arrt %s est introuvable" + +msgid "No breakpoints defined" +msgstr "Aucun point d'arrt n'est dfini" + +# AB - Le deuxime %s est remplac par "func" ou "file" sans que l'on puisse +# traduire ces mots. +#, c-format +msgid "%3d %s %s line %ld" +msgstr "%3d %s %s ligne %ld" + +#, c-format +msgid "%3d expr %s" +msgstr "%3d expr %s" msgid "extend() argument" msgstr "argument de extend()" @@ -399,157 +438,15 @@ msgstr "E105: :loadkeymap ne peut tre utilis que dans un script Vim" msgid "E791: Empty keymap entry" msgstr "E791: Entre du descripteur de clavier (keymap) vide" -# AB - Remplacer "compltion" par "compltement" ? Voir l'thymologie -# d'"accrtion". -msgid " Keyword completion (^N^P)" -msgstr " Compltement de mot-cl (^N^P)" - -# DB - todo : Faut-il une majuscule "mode" ? -msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" -msgstr " mode ^X (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" - -msgid " Whole line completion (^L^N^P)" -msgstr " Compltement de ligne entire (^L^N^P)" - -msgid " File name completion (^F^N^P)" -msgstr " Compltement de nom de fichier (^F^N^P)" - -msgid " Tag completion (^]^N^P)" -msgstr " Compltement de marqueur (^]^N^P)" - -# AB - J'ai d avoir une bonne raison de faire une version franaise aussi -# diffrente de la version anglaise. Il me faut la retrouver. -# DB - TODO -msgid " Path pattern completion (^N^P)" -msgstr " Compltement global de mot-cl (^N^P)" - -msgid " Definition completion (^D^N^P)" -msgstr " Compltement de dfinition (^D^N^P)" - -# AB - Trouver une meilleure formulation que "selon le". -# DB : proposition : "avec" -msgid " Dictionary completion (^K^N^P)" -msgstr " Compltement avec le dictionnaire (^K^N^P)" - -# AB - Trouver une meilleure formulation que "selon le". -msgid " Thesaurus completion (^T^N^P)" -msgstr " Compltement avec le thsaurus (^T^N^P)" - -# AB - La version franaise est meilleure que la version anglaise. -# DB : Suggestion. -msgid " Command-line completion (^V^N^P)" -msgstr " Compltement de ligne de commande (^V^N^P)" - -msgid " User defined completion (^U^N^P)" -msgstr " Compltement dfini par l'utilisateur (^U^N^P)" - -# DB : On doit pouvoir trouver nettement mieux que a. -msgid " Omni completion (^O^N^P)" -msgstr " Compltement selon le type de fichier (Omni) (^O^N^P)" - -msgid " Spelling suggestion (s^N^P)" -msgstr " Suggestion d'orthographe (s^N^P)" - -msgid " Keyword Local completion (^N^P)" -msgstr " Compltement local de mot-cl (^N/^P)" - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -# Il faut viter de le faire trop long. Je pense que la version franaise -# est suffisamment comprhensible dans le contexte dans lequel elle est -# affiche. -msgid "Hit end of paragraph" -msgstr "Fin du paragraphe" - -msgid "E839: Completion function changed window" -msgstr "E839: La fonction de compltement a chang la fentre" - -msgid "E840: Completion function deleted text" -msgstr "E840: La fonction de compltement a effac du texte" - -msgid "'dictionary' option is empty" -msgstr "L'option 'dictionary' est vide" - -msgid "'thesaurus' option is empty" -msgstr "L'option 'thesaurus' est vide" - -#, c-format -msgid "Scanning dictionary: %s" -msgstr "Examen du dictionnaire : %s" - -msgid " (insert) Scroll (^E/^Y)" -msgstr " (insertion) Dfilement (^E/^Y)" - -msgid " (replace) Scroll (^E/^Y)" -msgstr " (remplacement) Dfilement (^E/^Y)" - -#, c-format -msgid "Scanning: %s" -msgstr "Examen : %s" - -msgid "Scanning tags." -msgstr "Examen des marqueurs." - -msgid "match in file" -msgstr "correspondance dans le fichier" - -# AB - Cette chane de caractres est ajoute en dbut de ligne lorsqu'une -# opration de compltion est rpte (typiquement avec CTRL-X CTRL-N). -# Que ce soit en anglais ou en franais, il y a un problme de majuscules. -# Bien qu'insatisfaisante, cette traduction semble optimale. -msgid " Adding" -msgstr " Ajout" - -msgid "-- Searching..." -msgstr "-- Recherche en cours..." - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -# AB - Faut-il utiliser "origine" ou "originel" au lieu d'"original" ? -# DB : Suggestion. -msgid "Back at original" -msgstr "Retour au point de dpart" - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -msgid "Word from other line" -msgstr "Mot d'une autre ligne" - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -msgid "The only match" -msgstr "La seule correspondance" - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -# AB - Faut-il remplacer "sur" par "de" ? -# DB : Pour moi, non. -#, c-format -msgid "match %d of %d" -msgstr "Correspondance %d sur %d" - -# AB - Ce texte s'ajoute la fin d'un des messages de compltion ci-dessus. -# DB - todo : la VO n'a pas de majuscule. -#, c-format -msgid "match %d" -msgstr "Correspondance %d" - msgid "E18: Unexpected characters in :let" msgstr "E18: Caractres inattendus avant '='" -#, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: Variable non dfinie : %s" - msgid "E111: Missing ']'" msgstr "E111: ']' manquant" msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: Utilisation de [:] impossible avec un Dictionnaire" -#, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: Type de variable erron avec %s=" - -#, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: Nom de variable invalide : %s" - msgid "E806: using Float as a String" msgstr "E806: Utilisation d'un Flottant comme une Chane" @@ -605,15 +502,9 @@ msgstr "E109: Il manque ':' aprs '?'" msgid "E804: Cannot use '%' with Float" msgstr "E804: Impossible d'utiliser '%' avec un Flottant" -msgid "E110: Missing ')'" -msgstr "E110: ')' manquant" - msgid "E695: Cannot index a Funcref" msgstr "E695: Impossible d'indexer une Funcref" -msgid "E909: Cannot index a special variable" -msgstr "E909: Impossible d'indexer une variable spciale" - # AB - La version franaise est meilleure que la version anglaise. #, c-format msgid "E112: Option name missing: %s" @@ -719,15 +610,6 @@ msgstr "E742: Impossible de modifier la valeur de %s" msgid "E698: variable nested too deep for making a copy" msgstr "E698: variable trop imbrique pour en faire une copie" -# AB - La version franaise est capitalise pour tre en accord avec les autres -# commentaires enregistrs dans le fichier viminfo. -msgid "" -"\n" -"# global variables:\n" -msgstr "" -"\n" -"# Variables globales:\n" - # DB - Plus prcis ("la dernire fois") ? msgid "" "\n" @@ -751,40 +633,19 @@ msgstr "E736: Opration invalide avec les Dictionnaires" msgid "E694: Invalid operation for Funcrefs" msgstr "E694: Opration invalide avec les Funcrefs" -msgid "map() argument" -msgstr "argument de map()" - -msgid "filter() argument" -msgstr "argument de filter()" - #, c-format msgid "E686: Argument of %s must be a List" msgstr "E686: L'argument de %s doit tre une Liste" -msgid "E928: String required" -msgstr "E928: Chane requis" - msgid "E808: Number or Float required" msgstr "E808: Nombre ou Flottant requis" -msgid "add() argument" -msgstr "argument de add()" - -msgid "E785: complete() can only be used in Insert mode" -msgstr "E785: complete() n'est utilisable que dans le mode Insertion" - # AB - Texte par dfaut du bouton de la bote de dialogue affiche par la # fonction confirm(). msgid "&Ok" msgstr "&Ok" #, c-format -msgid "+-%s%3ld line: " -msgid_plural "+-%s%3ld lines: " -msgstr[0] "+-%s%3ld ligne : " -msgstr[1] "+-%s%3ld lignes : " - -#, c-format msgid "E700: Unknown function: %s" msgstr "E700: Fonction inconnue : %s" @@ -807,15 +668,9 @@ msgstr "" msgid "called inputrestore() more often than inputsave()" msgstr "inputrestore() a t appel plus de fois qu'inputsave()" -msgid "insert() argument" -msgstr "argument de insert()" - msgid "E786: Range not allowed" msgstr "E786: Les plages ne sont pas autorises" -msgid "E916: not a valid job" -msgstr "E916: tche invalide" - msgid "E701: Invalid type for len()" msgstr "E701: Type invalide avec len()" @@ -832,9 +687,6 @@ msgstr "E726: Le pas est nul" msgid "E727: Start past end" msgstr "E727: Dbut au-del de la fin" -msgid "<empty>" -msgstr "<vide>" - msgid "E240: No connection to the X server" msgstr "E240: Pas de connexion au serveur X" @@ -852,35 +704,10 @@ msgstr "E941: serveur dj dmarr" msgid "E942: +clientserver feature not available" msgstr "E942: La fonctionnalit +clientserver n'est pas disponible" -msgid "remove() argument" -msgstr "argument de remove()" - -msgid "E655: Too many symbolic links (cycle?)" -msgstr "E655: Trop de liens symboliques (cycle ?)" - -msgid "reverse() argument" -msgstr "argument de reverse()" - # AB - La version franaise est meilleure que la version anglaise. msgid "E258: Unable to send to client" msgstr "E258: La rponse n'a pas pu tre envoye au client" -#, c-format -msgid "E927: Invalid action: '%s'" -msgstr "E927: Action invalide : %s " - -msgid "sort() argument" -msgstr "argument de sort()" - -msgid "uniq() argument" -msgstr "argument de uniq()" - -msgid "E702: Sort compare function failed" -msgstr "E702: La fonction de comparaison de sort() a chou" - -msgid "E882: Uniq compare function failed" -msgstr "E882: La fonction de comparaison de uniq() a chou" - msgid "(Invalid)" msgstr "(Invalide)" @@ -888,9 +715,6 @@ msgstr "(Invalide)" msgid "E935: invalid submatch number: %d" msgstr "E935: numro de submatch invalide : %d" -msgid "E677: Error writing temp file" -msgstr "E677: Erreur lors de l'criture du fichier temporaire" - msgid "E921: Invalid callback argument" msgstr "E921: Argument de callback invalide" @@ -947,98 +771,6 @@ msgstr "" msgid "[No write since last change]\n" msgstr "[Attention : tout n'est pas enregistr]\n" -# AB - Le numro et le message d'erreur (%s ci-dessous) et le "numro" de ligne -# sont des chanes de caractres dont le contenu est la discrtion de -# l'appelant de la fonction viminfo_error(). -#, c-format -msgid "%sviminfo: %s in line: " -msgstr "%sviminfo : %s la ligne " - -# AB - La version franaise est meilleure que la version anglaise. -msgid "E136: viminfo: Too many errors, skipping rest of file" -msgstr "" -"E136: Il y a trop d'erreurs ; interruption de la lecture du fichier viminfo" - -# AB - Ce texte fait partie d'un message de dbogage. -# DB - ... dont les valeurs possibles sont les messages -# qui suivent. -#, c-format -msgid "Reading viminfo file \"%s\"%s%s%s" -msgstr "Lecture du fichier viminfo \"%s\"%s%s%s" - -# AB - Ce texte fait partie d'un message de dbogage. -# DB - Voir ci-dessus. -msgid " info" -msgstr " info" - -# AB - Ce texte fait partie d'un message de dbogage. -# DB - Voir ci-dessus. -msgid " marks" -msgstr " marques" - -msgid " oldfiles" -msgstr " vieux fichiers" - -# AB - Ce texte fait partie d'un message de dbogage. -# DB - Voir ci-dessus. -msgid " FAILED" -msgstr " CHEC" - -# AB - J'espre que la plupart des utilisateurs aura l'ide d'aller vrifier -# ses droits d'accs. -# AB - Le mot "viminfo" a t retir pour que le message ne dpasse pas 80 -# caractres dans le cas courant o %s = /home/12345678/.viminfo -#, c-format -msgid "E137: Viminfo file is not writable: %s" -msgstr "E137: L'criture dans le fichier %s est interdite" - -#, c-format -msgid "E929: Too many viminfo temp files, like %s!" -msgstr "E929: Trop de fichiers temporaires viminfo, comme %s!" - -# AB - Le point d'exclamation est superflu. -# AB - Le mot "viminfo" a t retir pour que le message ne dpasse pas 80 -# caractres dans le cas courant o %s = /home/12345678/.viminfo -#, c-format -msgid "E138: Can't write viminfo file %s!" -msgstr "E138: Impossible d'crire le fichier %s" - -# AB - Ce texte est un message de dbogage. -#, c-format -msgid "Writing viminfo file \"%s\"" -msgstr "criture du fichier viminfo \"%s\"" - -#, c-format -msgid "E886: Can't rename viminfo file to %s!" -msgstr "E886: Impossible de renommer viminfo en %s" - -#, c-format -msgid "# This viminfo file was generated by Vim %s.\n" -msgstr "# Ce fichier viminfo a t gnr par Vim %s.\n" - -# AB - Les deux versions, bien que diffrentes, se valent. -msgid "" -"# You may edit it if you're careful!\n" -"\n" -msgstr "" -"# Vous pouvez l'diter, mais soyez prudent.\n" -"\n" - -msgid "# Value of 'encoding' when this file was written\n" -msgstr "# 'encoding' dans lequel ce fichier a t crit\n" - -# AB - Ce texte est pass en argument la fonction viminfo_error(). -# AB - "illgal" est un terme trop fort mon got. -msgid "Illegal starting char" -msgstr "Caractre initial non valide" - -msgid "" -"\n" -"# Bar lines, copied verbatim:\n" -msgstr "" -"\n" -"# Lignes commenant par |, copies littralement :\n" - # AB - Ceci est un titre de bote de dialogue. Vrifier que la version # franaise est correcte pour les trois rfrences ; j'ai un doute quant # la troisime. @@ -1171,67 +903,7 @@ msgstr "Motif trouv dans toutes les lignes : %s" #, c-format msgid "Pattern not found: %s" -msgstr "Motif introuvable: %s" - -# AB - Ne pas traduire le dollar. -# AB - Ce message n'est volontairement pas traduit. En effet, il fait partie -# d'un groupe de trois messages dans viminfo, dont deux ne sont pas soumis -# internationalisation. J'attends que les deux autres messages soient -# traduisibles pour traduire celui-ci. -# DB - TODO : Qu'en est-il prsent ? -msgid "" -"\n" -"# Last Substitute String:\n" -"$" -msgstr "" -"\n" -"# Dernires chanes de substitution :\n" -"$" - -# This message should *so* be E42! -msgid "E478: Don't panic!" -msgstr "E478: Pas de panique !" - -#, c-format -msgid "E661: Sorry, no '%s' help for %s" -msgstr "E661: Dsol, aucune aide en langue '%s' pour %s" - -#, c-format -msgid "E149: Sorry, no help for %s" -msgstr "E149: Dsol, aucune aide pour %s" - -#, c-format -msgid "Sorry, help file \"%s\" not found" -msgstr "Dsol, le fichier d'aide \"%s\" est introuvable" - -#, c-format -msgid "E151: No match: %s" -msgstr "E151: Aucune correspondance : %s" - -#, c-format -msgid "E152: Cannot open %s for writing" -msgstr "E152: Impossible d'ouvrir %s en criture" - -#, c-format -msgid "E153: Unable to open %s for reading" -msgstr "E153: Impossible d'ouvrir %s en lecture" - -#, c-format -msgid "E670: Mix of help file encodings within a language: %s" -msgstr "E670: Encodages diffrents dans les fichiers d'aide en langue %s" - -# AB - L'tiquette la plus longue fait 27 caractres. Le nom de fichier le plus -# long fait 12 caractres. Il faudrait donc idalement faire une -# traduction de 40 caractres ou moins. Ce qui est loin d'tre le cas -# prsent. -# DB - Suggestion. -#, c-format -msgid "E154: Duplicate tag \"%s\" in file %s/%s" -msgstr "E154: Marqueur \"%s\" dupliqu dans le fichier %s/%s" - -#, c-format -msgid "E150: Not a directory: %s" -msgstr "E150: %s n'est pas un rpertoire" +msgstr "Motif introuvable : %s" # AB - Il faut respecter l'esprit plus que la lettre. #, c-format @@ -1290,58 +962,6 @@ msgstr "[Effac]" msgid "No old files" msgstr "Aucun vieux fichier" -# AB - La version franaise de la premire phrase ne me satisfait pas. -# DB - Suggestion. -msgid "Entering Debug mode. Type \"cont\" to continue." -msgstr "Mode dbogage activ. Tapez \"cont\" pour continuer." - -#, c-format -msgid "Oldval = \"%s\"" -msgstr "Ancienneval = \"%s\"" - -#, c-format -msgid "Newval = \"%s\"" -msgstr "Nouvelleval = \"%s\"" - -#, c-format -msgid "line %ld: %s" -msgstr "ligne %ld : %s" - -#, c-format -msgid "cmd: %s" -msgstr "cmde : %s" - -msgid "frame is zero" -msgstr "le cadre de pile est zro" - -#, c-format -msgid "frame at highest level: %d" -msgstr "cadre de pile au niveau le plus haut : %d" - -#, c-format -msgid "Breakpoint in \"%s%s\" line %ld" -msgstr "Point d'arrt dans %s%s ligne %ld" - -#, c-format -msgid "E161: Breakpoint not found: %s" -msgstr "E161: Le point d'arrt %s est introuvable" - -msgid "No breakpoints defined" -msgstr "Aucun point d'arrt n'est dfini" - -# AB - Le deuxime %s est remplac par "func" ou "file" sans que l'on puisse -# traduire ces mots. -#, c-format -msgid "%3d %s %s line %ld" -msgstr "%3d %s %s ligne %ld" - -#, c-format -msgid "%3d expr %s" -msgstr "%3d expr %s" - -msgid "E750: First use \":profile start {fname}\"" -msgstr "E750: Utilisez d'abord \":profile start {nomfichier}\"" - # AB - "changes to" est redondant et a t omis de la version franaise. #, c-format msgid "Save changes to \"%s\"?" @@ -1361,32 +981,11 @@ msgid "Warning: Entered other buffer unexpectedly (check autocommands)" msgstr "" "Alerte : Entre inattendue dans un autre tampon (vrifier autocommandes)" -msgid "E163: There is only one file to edit" -msgstr "E163: Il n'y a qu'un seul fichier diter" - -msgid "E164: Cannot go before first file" -msgstr "E164: Impossible d'aller avant le premier fichier" - -msgid "E165: Cannot go beyond last file" -msgstr "E165: Impossible d'aller au-del du dernier fichier" - #, c-format msgid "E666: compiler not supported: %s" msgstr "E666: Compilateur %s non support" #, c-format -msgid "Searching for \"%s\" in \"%s\"" -msgstr "Recherche de \"%s\" dans \"%s\"" - -#, c-format -msgid "Searching for \"%s\"" -msgstr "Recherche de \"%s\"" - -#, c-format -msgid "not found in '%s': \"%s\"" -msgstr "introuvable dans '%s' : \"%s\"" - -#, c-format msgid "W20: Required python version 2.x not supported, ignoring file: %s" msgstr "W20: Python version 2.x non support, fichier %s ignor" @@ -1394,78 +993,16 @@ msgstr "W20: Python version 2.x non support, fichier %s ignor" msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: Python 3.x non support, fichier %s ignor" -msgid "Source Vim script" -msgstr "Sourcer un script - Vim" - -#, c-format -msgid "Cannot source a directory: \"%s\"" -msgstr "Impossible de sourcer un rpertoire : \"%s\"" - -#, c-format -msgid "could not source \"%s\"" -msgstr "impossible de sourcer \"%s\"" - -#, c-format -msgid "line %ld: could not source \"%s\"" -msgstr "ligne %ld : impossible de sourcer \"%s\"" - -#, c-format -msgid "sourcing \"%s\"" -msgstr "sourcement \"%s\"" - -#, c-format -msgid "line %ld: sourcing \"%s\"" -msgstr "ligne %ld : sourcement de \"%s\"" - -#, c-format -msgid "finished sourcing %s" -msgstr "fin du sourcement de %s" - -# AB - Ce texte fait partie d'un message de dbogage. -#, c-format -msgid "continuing in %s" -msgstr "de retour dans %s" - -msgid "modeline" -msgstr "ligne de mode" - -msgid "--cmd argument" -msgstr "argument --cmd" - -msgid "-c argument" -msgstr "argument -c" - -msgid "environment variable" -msgstr "variable d'environnement" - -msgid "error handler" -msgstr "gestionnaire d'erreur" - -msgid "W15: Warning: Wrong line separator, ^M may be missing" -msgstr "W15: Alerte : Sparateur de ligne erron, ^M possiblement manquant" - -msgid "E167: :scriptencoding used outside of a sourced file" -msgstr "E167: :scriptencoding utilis en dehors d'un fichier sourc" - -msgid "E168: :finish used outside of a sourced file" -msgstr "E168: :finish utilis en dehors d'un fichier sourc" - -# DB - Le premier %s est, au choix : "time ", "ctype " ou "messages ", -# sans qu'il soit possible de les traduire. -#, c-format -msgid "Current %slanguage: \"%s\"" -msgstr "Langue courante pour %s : \"%s\"" - -#, c-format -msgid "E197: Cannot set language to \"%s\"" -msgstr "E197: Impossible de choisir la langue \"%s\"" - msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." msgstr "Mode Ex activ. Tapez \"visual\" pour passer en mode Normal." msgid "E501: At end-of-file" msgstr "E501: la fin du fichier" +#, c-format +msgid "Executing: %s" +msgstr "Excution de : %s" + msgid "E169: Command too recursive" msgstr "E169: Commande trop rcursive" @@ -1523,59 +1060,6 @@ msgstr "" "\n" " Nom Args Adresse Complet. Dfinition" -msgid "No user-defined commands found" -msgstr "Aucune commande dfinie par l'utilisateur trouve" - -msgid "E175: No attribute specified" -msgstr "E175: Pas d'attribut spcifi" - -msgid "E176: Invalid number of arguments" -msgstr "E176: Nombre d'arguments invalide" - -msgid "E177: Count cannot be specified twice" -msgstr "E177: Le quantificateur ne peut tre spcifi deux fois" - -msgid "E178: Invalid default value for count" -msgstr "E178: La valeur par dfaut du quantificateur est invalide" - -msgid "E179: argument required for -complete" -msgstr "E179: argument requis avec -complete" - -msgid "E179: argument required for -addr" -msgstr "E179: argument requis avec -addr" - -#, c-format -msgid "E181: Invalid attribute: %s" -msgstr "E181: Attribut invalide : %s" - -msgid "E182: Invalid command name" -msgstr "E182: Nom de commande invalide" - -msgid "E183: User defined commands must start with an uppercase letter" -msgstr "E183: Les commandes utilisateur doivent commencer par une majuscule" - -msgid "E841: Reserved name, cannot be used for user defined command" -msgstr "" -"E841: Nom rserv, ne peux pas tre utilis pour une commande utilisateur" - -#, c-format -msgid "E184: No such user-defined command: %s" -msgstr "E184: Aucune commande %s dfinie par l'utilisateur" - -#, c-format -msgid "E180: Invalid address type value: %s" -msgstr "E180: Valeur de type d'adresse invalide : %s" - -#, c-format -msgid "E180: Invalid complete value: %s" -msgstr "E180: Valeur invalide pour \"-complete=\" : %s" - -msgid "E468: Completion argument only allowed for custom completion" -msgstr "E468: Seul le compltement personnalis accepte un argument" - -msgid "E467: Custom completion requires a function argument" -msgstr "E467: Le compltement personnalis ncessite une fonction en argument" - msgid "unknown" msgstr "inconnu" @@ -1640,15 +1124,6 @@ msgstr "E930: Impossible d'utiliser :redir dans execute()" msgid "Save Redirection" msgstr "Enregistrer la redirection" -msgid "Save View" -msgstr "Enregistrer la vue - Vim" - -msgid "Save Session" -msgstr "Enregistrer la session - Vim" - -msgid "Save Setup" -msgstr "Enregistrer les rglages - Vim" - #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: Impossible de crer le rpertoire \"%s\"" @@ -1695,9 +1170,6 @@ msgstr "E499: Nom de fichier vide pour '%' ou '#', ne marche qu'avec \":p:h\"" msgid "E500: Evaluates to an empty string" msgstr "E500: valu en une chane vide" -msgid "E195: Cannot open viminfo file for reading" -msgstr "E195: Impossible d'ouvrir le viminfo en lecture" - # AB - Si les parenthses posent problme, il faudra remettre les guillemets # ci-dessus. msgid "Untitled" @@ -1757,15 +1229,6 @@ msgstr "Interruption" msgid "E579: :if nesting too deep" msgstr "E579: Imbrication de :if trop importante" -msgid "E580: :endif without :if" -msgstr "E580: :endif sans :if" - -msgid "E581: :else without :if" -msgstr "E581: :else sans :if" - -msgid "E582: :elseif without :if" -msgstr "E582: :elseif sans :if" - msgid "E583: multiple :else" msgstr "E583: Il ne peut y avoir qu'un seul :else" @@ -1775,35 +1238,23 @@ msgstr "E584: :elseif aprs :else" msgid "E585: :while/:for nesting too deep" msgstr "E585: Imbrication de :while ou :for trop importante" -msgid "E586: :continue without :while or :for" -msgstr "E586: :continue sans :while ou :for" - -msgid "E587: :break without :while or :for" -msgstr "E587: :break sans :while ou :for" - msgid "E732: Using :endfor with :while" msgstr "E732: Utilisation de :endfor avec :while" msgid "E733: Using :endwhile with :for" msgstr "E733: Utilisation de :endwhile avec :for" +msgid "E579: block nesting too deep" +msgstr "E579: Imbrication de bloc trop importante" + msgid "E601: :try nesting too deep" msgstr "E601: Imbrication de :try trop importante" -msgid "E603: :catch without :try" -msgstr "E603: :catch sans :try" - msgid "E604: :catch after :finally" msgstr "E604: :catch aprs :finally" -msgid "E606: :finally without :try" -msgstr "E606: :finally sans :try" - -msgid "E607: multiple :finally" -msgstr "E607: Il ne peut y avoir qu'un seul :finally" - -msgid "E602: :endtry without :try" -msgstr "E602: :endtry sans :try" +msgid "E193: :enddef not inside a function" +msgstr "E193: :enddef en dehors d'une fonction" msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction en dehors d'une fonction" @@ -1815,46 +1266,6 @@ msgid "E811: Not allowed to change buffer information now" msgstr "" "E811: Changement des informations du tampon n'est pas permise maintenant" -# DB - TODO : Pas compris le message ni comment le dclencher malgr une visite -# dans le code. -msgid "tagname" -msgstr "nom du marqueur" - -# DB - TODO : Idem prcdent. -msgid " kind file\n" -msgstr " type de fichier\n" - -msgid "'history' option is zero" -msgstr "l'option 'history' vaut zro" - -# DB - Messages et les suivants : fichier .viminfo. -# Pas de majuscule ncessaire pour les messages d'aprs. -#, c-format -msgid "" -"\n" -"# %s History (newest to oldest):\n" -msgstr "" -"\n" -"# Historique %s (chronologie dcroissante) :\n" - -msgid "Command Line" -msgstr "ligne de commande" - -msgid "Search String" -msgstr "chane de recherche" - -msgid "Expression" -msgstr "expression" - -msgid "Input Line" -msgstr "ligne de saisie" - -msgid "Debug Line" -msgstr "Ligne de dbogage" - -msgid "E198: cmd_pchar beyond the command length" -msgstr "E198: cmd_pchar au-del de la longueur de la commande" - msgid "E199: Active window or buffer deleted" msgstr "E199: Fentre ou tampon actif effac" @@ -1864,18 +1275,12 @@ msgstr "E812: Des autocommandes ont chang le tampon ou le nom du tampon" msgid "Illegal file name" msgstr "Nom de fichier invalide" -msgid "is a directory" -msgstr "est un rpertoire" - msgid "is not a file" msgstr "n'est pas un fichier" msgid "is a device (disabled with 'opendevice' option)" msgstr "est un priphrique (dsactiv par l'option 'opendevice')" -msgid "[New File]" -msgstr "[Nouveau fichier]" - msgid "[New DIRECTORY]" msgstr "[Nouveau RPERTOIRE]" @@ -1917,12 +1322,6 @@ msgstr "[CR manquant]" msgid "[long lines split]" msgstr "[lignes longues coupes]" -msgid "[NOT converted]" -msgstr "[NON converti]" - -msgid "[converted]" -msgstr "[converti]" - #, c-format msgid "[CONVERSION ERROR in line %ld]" msgstr "[ERREUR DE CONVERSION la ligne %ld]" @@ -1944,130 +1343,6 @@ msgstr "La conversion avec 'charconvert' a chou" msgid "can't read output of 'charconvert'" msgstr "Impossible de lire la sortie de 'charconvert'" -msgid "E676: No matching autocommands for acwrite buffer" -msgstr "E676: Pas d'autocommande correspondante pour le tampon acwrite" - -msgid "E203: Autocommands deleted or unloaded buffer to be written" -msgstr "E203: Des autocommandes ont effac ou dcharg le tampon crire" - -msgid "E204: Autocommand changed number of lines in unexpected way" -msgstr "" -"E204: L'autocommande a modifi le nombre de lignes de manire inattendue" - -msgid "NetBeans disallows writes of unmodified buffers" -msgstr "NetBeans interdit l'criture des tampons non modifis" - -msgid "Partial writes disallowed for NetBeans buffers" -msgstr "Netbeans interdit l'criture partielle de ses tampons" - -msgid "is not a file or writable device" -msgstr "n'est pas un fichier ou un priphrique inscriptible" - -msgid "writing to device disabled with 'opendevice' option" -msgstr "criture vers un priphrique dsactiv par l'option 'opendevice'" - -msgid "is read-only (add ! to override)" -msgstr "est en lecture seule (ajoutez ! pour passer outre)" - -msgid "E506: Can't write to backup file (add ! to override)" -msgstr "E506: Impossible d'crire la copie de secours (! pour passer outre)" - -msgid "E507: Close error for backup file (add ! to override)" -msgstr "E507: Erreur de fermeture de la copie de secours (! pour passer outre)" - -msgid "E508: Can't read file for backup (add ! to override)" -msgstr "" -"E508: Impossible de lire le fichier pour la copie de secours (ajoutez ! pour " -"passer outre)" - -msgid "E509: Cannot create backup file (add ! to override)" -msgstr "" -"E509: Impossible de crer la copie de secours (ajoutez ! pour passer outre)" - -msgid "E510: Can't make backup file (add ! to override)" -msgstr "" -"E510: Impossible de gnrer la copie de secours (ajoutez ! pour passer outre)" - -msgid "E214: Can't find temp file for writing" -msgstr "E214: Impossible de gnrer un fichier temporaire pour y crire" - -msgid "E213: Cannot convert (add ! to write without conversion)" -msgstr "E213: Impossible de convertir (ajoutez ! pour crire sans convertir)" - -msgid "E166: Can't open linked file for writing" -msgstr "E166: Impossible d'ouvrir le lien pour y crire" - -msgid "E212: Can't open file for writing" -msgstr "E212: Impossible d'ouvrir le fichier pour y crire" - -msgid "E949: File changed while writing" -msgstr "E949: Fichier modifi aprs criture" - -msgid "E512: Close failed" -msgstr "E512: Erreur de fermeture de fichier" - -msgid "E513: write error, conversion failed (make 'fenc' empty to override)" -msgstr "" -"E513: Erreur d'criture, chec de conversion (videz 'fenc' pour passer outre)" - -#, c-format -msgid "" -"E513: write error, conversion failed in line %ld (make 'fenc' empty to " -"override)" -msgstr "" -"E513: Erreur d'criture, chec de conversion la ligne %ld (videz 'fenc' " -"pour passer outre)" - -msgid "E514: write error (file system full?)" -msgstr "E514: erreur d'criture (systme de fichiers plein ?)" - -msgid " CONVERSION ERROR" -msgstr " ERREUR DE CONVERSION" - -#, c-format -msgid " in line %ld;" -msgstr " la ligne %ld" - -msgid "[Device]" -msgstr "[Priph.]" - -msgid "[New]" -msgstr "[Nouveau]" - -msgid " [a]" -msgstr " [a]" - -msgid " appended" -msgstr " ajout(s)" - -msgid " [w]" -msgstr " [e]" - -msgid " written" -msgstr " crit(s)" - -msgid "E205: Patchmode: can't save original file" -msgstr "E205: Patchmode : impossible d'enregistrer le fichier original" - -msgid "E206: patchmode: can't touch empty original file" -msgstr "E206: patchmode : impossible de crer le fichier original vide" - -msgid "E207: Can't delete backup file" -msgstr "E207: Impossible d'effacer la copie de secours" - -msgid "" -"\n" -"WARNING: Original file may be lost or damaged\n" -msgstr "" -"\n" -"ALERTE: Le fichier original est peut-tre perdu ou endommag\n" - -# DB - todo : un peu long... -msgid "don't quit the editor until the file is successfully written!" -msgstr "" -"ne quittez pas l'diteur tant que le fichier n'est pas correctement " -"enregistr !" - msgid "[dos]" msgstr "[dos]" @@ -2093,10 +1368,10 @@ msgstr[0] "%ld ligne, " msgstr[1] "%ld lignes, " #, c-format -msgid "%lld character" -msgid_plural "%lld characters" -msgstr[0] "%lld caractre" -msgstr[1] "%lld caractres" +msgid "%lld byte" +msgid_plural "%lld bytes" +msgstr[0] "%lld octet" +msgstr[1] "%lld octets" msgid "[noeol]" msgstr "[noeol]" @@ -2104,12 +1379,6 @@ msgstr "[noeol]" msgid "[Incomplete last line]" msgstr "[Dernire ligne incomplte]" -msgid "WARNING: The file has been changed since reading it!!!" -msgstr "ALERTE : Le fichier a t modifi depuis que Vim l'a lu !" - -msgid "Do you really want to write to it" -msgstr "Voulez-vous vraiment crire dedans" - #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: Erreur lors de l'criture dans \"%s\"" @@ -2246,6 +1515,50 @@ msgstr "E219: { manquant." msgid "E220: Missing }." msgstr "E220: } manquant." +# DB : Les trois messages qui suivent sont des titres de botes +# de dialogue par dfaut. +msgid "Select Directory dialog" +msgstr "Slecteur de rpertoire" + +msgid "Save File dialog" +msgstr "Enregistrer un fichier" + +msgid "Open File dialog" +msgstr "Ouvrir un fichier" + +msgid "E338: Sorry, no file browser in console mode" +msgstr "E338: Dsol, pas de slecteur de fichiers en mode console" + +msgid "no matches" +msgstr "aucune correspondance" + +msgid "E854: path too long for completion" +msgstr "E854: chemin trop long pour compltement" + +#, c-format +msgid "" +"E343: Invalid path: '**[number]' must be at the end of the path or be " +"followed by '%s'." +msgstr "" +"E343: Chemin invalide : '**[nombre]' doit tre la fin du chemin ou tre " +"suivi de '%s'." + +#, c-format +msgid "E344: Can't find directory \"%s\" in cdpath" +msgstr "E344: Rpertoire \"%s\" introuvable dans 'cdpath'" + +#, c-format +msgid "E345: Can't find file \"%s\" in path" +msgstr "E345: Fichier \"%s\" introuvable dans 'path'" + +#, c-format +msgid "E346: No more directory \"%s\" found in cdpath" +msgstr "E346: Plus de rpertoire \"%s\" dans 'cdpath'" + +#, c-format +msgid "E347: No more file \"%s\" found in path" +msgstr "E347: Plus de fichier \"%s\" dans 'path'" + msgid "E490: No fold found" msgstr "E490: Aucun repli trouv" @@ -2267,31 +1580,6 @@ msgstr "E222: Ajout au tampon de lecture" msgid "E223: recursive mapping" msgstr "E223: mappage rcursif" -#, c-format -msgid "E224: global abbreviation already exists for %s" -msgstr "E224: une abrviation globale existe dj pour %s" - -#, c-format -msgid "E225: global mapping already exists for %s" -msgstr "E225: un mappage global existe dj pour %s" - -#, c-format -msgid "E226: abbreviation already exists for %s" -msgstr "E226: une abrviation existe dj pour %s" - -#, c-format -msgid "E227: mapping already exists for %s" -msgstr "E227: un mappage existe dj pour %s" - -msgid "No abbreviation found" -msgstr "Aucune abrviation trouve" - -msgid "No mapping found" -msgstr "Aucun mappage trouv" - -msgid "E228: makemap: Illegal mode" -msgstr "E228: makemap : mode invalide" - msgid "E851: Failed to create a new process for the GUI" msgstr "" "E851: chec lors de la cration d'un nouveau processus pour l'interface " @@ -2318,10 +1606,6 @@ msgstr "E231: 'guifontwide' est invalide" msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: Valeur de 'imactivatekey' invalide" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Impossible d'allouer la couleur %s" - msgid "No match at cursor, finding next" msgstr "Aucune correspondance sous le curseur, recherche de la suivante" @@ -2356,15 +1640,15 @@ msgstr "Vim" msgid "E232: Cannot create BalloonEval with both message and callback" msgstr "E232: Impossible de crer un BalloonEval avec message ET callback" -msgid "_Cancel" -msgstr "_Annuler" - msgid "_Save" msgstr "_Enregistrer" msgid "_Open" msgstr "_Ouvrir" +msgid "_Cancel" +msgstr "_Annuler" + msgid "_OK" msgstr "_Ok" @@ -2508,6 +1792,11 @@ msgstr "E671: Titre de fentre \"%s\" introuvable" msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." msgstr "E243: Argument non support : \"-%s\" ; Utilisez la version OLE." +msgid "E988: GUI cannot be used. Cannot execute gvim.exe." +msgstr "" +"E988: L'interface graphique ne peut pas tre utilise. Impossible d'excuter " +"gvim.exe." + msgid "E672: Unable to open window inside MDI application" msgstr "E672: Impossible d'ouvrir une fentre dans une application MDI" @@ -2586,9 +1875,6 @@ msgstr "Style :" msgid "Size:" msgstr "Taille :" -msgid "E256: Hangul automata ERROR" -msgstr "E256: ERREUR dans l'automate Hangul" - msgid "E550: Missing colon" msgstr "E550: ':' manquant" @@ -2686,6 +1972,74 @@ msgstr "E365: L'impression du fichier PostScript a chou" msgid "Print job sent." msgstr "Tche d'impression envoye." +msgid "E679: recursive loop loading syncolor.vim" +msgstr "E679: boucle rcursive lors du chargement de syncolor.vim" + +#, c-format +msgid "E411: highlight group not found: %s" +msgstr "E411: groupe de surbrillance introuvable : %s" + +#, c-format +msgid "E412: Not enough arguments: \":highlight link %s\"" +msgstr "E412: Trop peu d'arguments : \":highlight link %s\"" + +#, c-format +msgid "E413: Too many arguments: \":highlight link %s\"" +msgstr "E413: Trop d'arguments : \":highlight link %s\"" + +msgid "E414: group has settings, highlight link ignored" +msgstr "E414: le groupe a dj des attributs, lien de surbrillance ignor" + +#, c-format +msgid "E415: unexpected equal sign: %s" +msgstr "E415: signe gal inattendu : %s" + +#, c-format +msgid "E416: missing equal sign: %s" +msgstr "E416: '=' manquant : %s" + +#, c-format +msgid "E417: missing argument: %s" +msgstr "E417: argument manquant : %s" + +#, c-format +msgid "E418: Illegal value: %s" +msgstr "E418: Valeur invalide : %s" + +msgid "E419: FG color unknown" +msgstr "E419: Couleur de premier plan inconnue" + +msgid "E420: BG color unknown" +msgstr "E420: Couleur d'arrire-plan inconnue" + +msgid "E453: UL color unknown" +msgstr "E453: Couleur d'UL inconnue" + +#, c-format +msgid "E421: Color name or number not recognized: %s" +msgstr "E421: Nom ou numro de couleur non reconnu : %s" + +#, c-format +msgid "E422: terminal code too long: %s" +msgstr "E422: le code de terminal est trop long : %s" + +#, c-format +msgid "E423: Illegal argument: %s" +msgstr "E423: Argument invalide : %s" + +msgid "E424: Too many different highlighting attributes in use" +msgstr "" +"E424: Trop d'attributs de surbrillance diffrents en cours d'utilisation" + +msgid "E669: Unprintable character in group name" +msgstr "E669: Caractre non imprimable dans un nom de groupe" + +msgid "W18: Invalid character in group name" +msgstr "W18: Caractre invalide dans un nom de groupe" + +msgid "E849: Too many highlight and syntax groups" +msgstr "E849: Trop de groupes de surbrillance et de syntaxe" + msgid "Add a new database" msgstr "Ajouter une base de donnes" @@ -3013,9 +2367,6 @@ msgstr "vimOption inconnue" msgid "keyboard interrupt" msgstr "interruption clavier" -msgid "vim error" -msgstr "erreur Vim" - msgid "cannot create buffer/window command: object is being deleted" msgstr "" "Impossible de crer commande de tampon/fentre : objet en cours d'effacement" @@ -3062,10 +2413,24 @@ msgid "E251: VIM instance registry property is badly formed. Deleted!" msgstr "E251: Entre registre de l'instance de Vim mal formate. Suppression !" #, c-format +msgid "%ld lines to indent... " +msgstr "%ld lignes indenter... " + +#, c-format +msgid "%ld line indented " +msgid_plural "%ld lines indented " +msgstr[0] "%ld ligne indente " +msgstr[1] "%ld lignes indentes " + +#, c-format msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: Cl duplique dans le document JSON : \"%s\"" #, c-format +msgid "E899: Argument of %s must be a List or Blob" +msgstr "E899: L'argument de %s doit tre une Liste ou un Blob" + +#, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: Il manque une virgule dans la Liste %s" @@ -3279,15 +2644,12 @@ msgstr "-A\t\tDmarrer en mode arabe" msgid "-H\t\t\tStart in Hebrew mode" msgstr "-H\t\tDmarrer en mode hbreu" -msgid "-F\t\t\tStart in Farsi mode" -msgstr "-F\t\tDmarrer en mode farsi" - msgid "-T <terminal>\tSet terminal type to <terminal>" msgstr "-T <term>\tRgler le type du terminal sur <terminal>" msgid "--not-a-term\t\tSkip warning for input/output not being a terminal" msgstr "" -"--no-a-term\t\tAucun avertissement si l'entre/sortie n'est pas un terminal" +"--not-a-term\t\tAucun avertissement si l'entre/sortie n'est pas un terminal" msgid "--ttyfail\t\tExit if input or output is not a terminal" msgstr "--ttyfail\t\tQuitte si l'entre ou la sortie ne sont pas un terminal" @@ -3338,7 +2700,7 @@ msgstr "-W <dest>\tcrire toutes les commandes tapes dans le fichier <dest>" msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\tditer des fichiers chiffrs" -msgid "-display <display>\tConnect vim to this particular X-server" +msgid "-display <display>\tConnect Vim to this particular X-server" msgstr "-display <display>\tConnecter Vim au serveur X spcifi" msgid "-X\t\t\tDo not connect to X server" @@ -3421,10 +2783,10 @@ msgstr "" "\n" "Arguments reconnus par gvim (version Athena) :\n" -msgid "-display <display>\tRun vim on <display>" +msgid "-display <display>\tRun Vim on <display>" msgstr "-display <cran>\tLancer Vim sur ce <display>" -msgid "-iconic\t\tStart vim iconified" +msgid "-iconic\t\tStart Vim iconified" msgstr "-iconic\t\tIconifier Vim au dmarrage" msgid "-background <color>\tUse <color> for the background (also: -bg)" @@ -3474,7 +2836,7 @@ msgstr "" "\n" "Arguments reconnus par gvim (version GTK+) :\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" msgstr "" "-display <display>\tLancer Vim sur ce <display>\t(galement : --display)" @@ -3493,24 +2855,41 @@ msgstr "-P <titre parent>\tOuvrir Vim dans une application parente" msgid "--windowid <HWND>\tOpen Vim inside another win32 widget" msgstr "--windowid <HWND>\tOuvrir Vim dans un autre widget win32" -msgid "No display" -msgstr "Aucun display" +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: une abrviation globale existe dj pour %s" -msgid ": Send failed.\n" -msgstr " : L'envoi a chou.\n" +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: un mappage global existe dj pour %s" -msgid ": Send failed. Trying to execute locally\n" -msgstr " : L'envoi a chou. Tentative d'excution locale\n" +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: une abrviation existe dj pour %s" #, c-format -msgid "%d of %d edited" -msgstr "%d dits sur %d" +msgid "E227: mapping already exists for %s" +msgstr "E227: un mappage existe dj pour %s" + +msgid "No abbreviation found" +msgstr "Aucune abrviation trouve" + +msgid "No mapping found" +msgstr "Aucun mappage trouv" + +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap : mode invalide" -msgid "No display: Send expression failed.\n" -msgstr "Aucun display : L'envoi de l'expression a chou.\n" +msgid "E460: entries missing in mapset() dict argument" +msgstr "E460: entres manquantes dans l'argument dict de mapset()" -msgid ": Send expression failed.\n" -msgstr " : L'envoi de l'expression a chou.\n" +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap' : Aucun caractre correspondant pour %s" + +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap' : Caractres surnumraires aprs point-virgule : %s" msgid "No marks set" msgstr "Aucune marque positionne" @@ -3540,54 +2919,12 @@ msgstr "" "\n" "modif ligne col fichier/texte" -msgid "" -"\n" -"# File marks:\n" -msgstr "" -"\n" -"# Marques dans le fichier :\n" - -msgid "" -"\n" -"# Jumplist (newest first):\n" -msgstr "" -"\n" -"# Liste de sauts (le plus rcent en premier) :\n" - -msgid "" -"\n" -"# History of marks within files (newest to oldest):\n" -msgstr "" -"\n" -"# Historique des marques dans les fichiers (les plus rcentes en premier) :\n" - -msgid "Missing '>'" -msgstr "'>' manquant" +msgid "E290: List or number required" +msgstr "E290: Liste ou nombre requis" msgid "E543: Not a valid codepage" msgstr "E543: Page de codes non valide" -msgid "E284: Cannot set IC values" -msgstr "E284: Impossible de rgler les valeurs IC" - -msgid "E285: Failed to create input context" -msgstr "E285: chec de la cration du contexte de saisie" - -msgid "E286: Failed to open input method" -msgstr "E286: chec de l'ouverture de la mthode de saisie" - -msgid "E287: Warning: Could not set destroy callback to IM" -msgstr "" -"E287: Alerte : Impossible d'inscrire le callback de destruction dans la MS" - -msgid "E288: input method doesn't support any style" -msgstr "E288: la mthode de saisie ne supporte aucun style" - -msgid "E289: input method doesn't support my preedit type" -msgstr "" -"E289: le type de prdition de Vim n'est pas support par la mthode de " -"saisie" - msgid "E293: block was not locked" msgstr "E293: le bloc n'tait pas verrouill" @@ -3794,12 +3131,17 @@ msgstr "" msgid "" "\n" -"You may want to delete the .swp file now.\n" -"\n" +"You may want to delete the .swp file now." msgstr "" "\n" -"Il est conseill d'effacer maintenant le fichier .swp.\n" +"Il est conseill d'effacer maintenant le fichier .swp." + +msgid "" "\n" +"Note: process STILL RUNNING: " +msgstr "" +"\n" +"Note : processus EN COURS D'EXECUTION : " msgid "Using crypt key from swap file for the text file.\n" msgstr "" @@ -3913,8 +3255,8 @@ msgid "E315: ml_get: invalid lnum: %ld" msgstr "E315: ml_get : numro de ligne invalide : %ld" #, c-format -msgid "E316: ml_get: cannot find line %ld" -msgstr "E316: ml_get : ligne %ld introuvable" +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get : impossible de trouver la ligne %ld dans le tampon %d %s" msgid "E317: pointer block id wrong 3" msgstr "E317: mauvais id de pointeur de bloc 3" @@ -4010,6 +3352,9 @@ msgstr "" "\"\n" " pour viter ce message.\n" +msgid "Found a swap file that is not useful, deleting it" +msgstr "Effacement de fichier d'change inutile" + msgid "Swap file \"" msgstr "Le fichier d'change \"" @@ -4105,6 +3450,10 @@ msgid "E337: Menu not found - check menu names" msgstr "E337: Menu introuvable - vrifiez les noms des menus" #, c-format +msgid "Error detected while compiling %s:" +msgstr "Erreur dtecte lors de la compilation %s" + +#, c-format msgid "Error detected while processing %s:" msgstr "Erreur dtecte en traitant %s :" @@ -4160,20 +3509,6 @@ msgstr "" "Tout aban&donner\n" "&Annuler" -# DB : Les trois messages qui suivent sont des titres de botes -# de dialogue par dfaut. -msgid "Select Directory dialog" -msgstr "Slecteur de rpertoire" - -msgid "Save File dialog" -msgstr "Enregistrer un fichier" - -msgid "Open File dialog" -msgstr "Ouvrir un fichier" - -msgid "E338: Sorry, no file browser in console mode" -msgstr "E338: Dsol, pas de slecteur de fichiers en mode console" - msgid "E766: Insufficient arguments for printf()" msgstr "E766: Pas assez d'arguments pour printf()" @@ -4183,14 +3518,12 @@ msgstr "E807: printf() attend un argument de type Flottant" msgid "E767: Too many arguments to printf()" msgstr "E767: Trop d'arguments pour printf()" -msgid "W10: Warning: Changing a readonly file" -msgstr "W10: Alerte : Modification d'un fichier en lecture seule" - -msgid "Type number and <Enter> or click with mouse (empty cancels): " -msgstr "Tapez un nombre et <Entre> ou cliquez avec la souris (rien annule) :" +msgid "Type number and <Enter> or click with the mouse (q or empty cancels): " +msgstr "" +"Tapez un nombre et <Entre> ou cliquez avec la souris (q ou rien annule) :" -msgid "Type number and <Enter> (empty cancels): " -msgstr "Tapez un nombre et <Entre> (rien annule) :" +msgid "Type number and <Enter> (q or empty cancels): " +msgstr "Tapez un nombre et <Entre> (q ou rien annule) :" #, c-format msgid "%ld more line" @@ -4210,6 +3543,12 @@ msgstr " (Interrompu)" msgid "Beep!" msgstr "Bip !" +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "il y a %ld seconde" +msgstr[1] "il y a %ld secondes" + msgid "ERROR: " msgstr "ERREUR : " @@ -4229,12 +3568,8 @@ msgstr "" "[appels] total re/malloc() %lu, total free() %lu\n" "\n" -msgid "E340: Line is becoming too long" -msgstr "E340: La ligne devient trop longue" - -#, c-format -msgid "E341: Internal error: lalloc(%ld, )" -msgstr "E341: Erreur interne : lalloc(%ld, )" +msgid "E341: Internal error: lalloc(0, )" +msgstr "E341: Erreur interne : lalloc(0, )" #, c-format msgid "E342: Out of memory! (allocating %lu bytes)" @@ -4259,33 +3594,6 @@ msgstr "E548: chiffre attendu" msgid "E549: Illegal percentage" msgstr "E549: Pourcentage non autoris" -msgid "E854: path too long for completion" -msgstr "E854: chemin trop long pour compltement" - -#, c-format -msgid "" -"E343: Invalid path: '**[number]' must be at the end of the path or be " -"followed by '%s'." -msgstr "" -"E343: Chemin invalide : '**[nombre]' doit tre la fin du chemin ou tre " -"suivi de '%s'." - -#, c-format -msgid "E344: Can't find directory \"%s\" in cdpath" -msgstr "E344: Rpertoire \"%s\" introuvable dans 'cdpath'" - -#, c-format -msgid "E345: Can't find file \"%s\" in path" -msgstr "E345: Fichier \"%s\" introuvable dans 'path'" - -#, c-format -msgid "E346: No more directory \"%s\" found in cdpath" -msgstr "E346: Plus de rpertoire \"%s\" dans 'cdpath'" - -#, c-format -msgid "E347: No more file \"%s\" found in path" -msgstr "E347: Plus de fichier \"%s\" dans 'path'" - #, c-format msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" msgstr "" @@ -4309,12 +3617,6 @@ msgstr "E505: %s est en lecture seule (ajoutez ! pour passer outre)" msgid "E349: No identifier under cursor" msgstr "E349: Aucun identifiant sous le curseur" -msgid "E774: 'operatorfunc' is empty" -msgstr "E774: 'operatorfunc' est vide" - -msgid "E775: Eval feature not available" -msgstr "E775: La fonctionnalit d'valuation n'est pas disponible" - # DB : Il est ici question du mode Visuel. msgid "Warning: terminal cannot highlight" msgstr "Alerte : le terminal ne peut pas surligner" @@ -4323,7 +3625,7 @@ msgid "E348: No string under cursor" msgstr "E348: Aucune chane sous le curseur" msgid "E352: Cannot erase folds with current 'foldmethod'" -msgstr "E352: Impossible d'effacer des replis avec la 'foldmethod'e actuelle" +msgstr "E352: Impossible d'effacer des replis avec la 'foldmethod' actuelle" msgid "E664: changelist is empty" msgstr "E664: La liste des modifications (changelist) est vide" @@ -4339,6 +3641,9 @@ msgstr "" "Tapez :qa! puis <Entre> pour abandonner tous les changements et quitter " "Vim" +msgid "Type :qa and press <Enter> to exit Vim" +msgstr "Tapez :qa puis <Entre> pour quitter Vim" + #, c-format msgid "%ld line %sed %d time" msgid_plural "%ld line %sed %d times" @@ -4351,19 +3656,6 @@ msgid_plural "%ld lines %sed %d times" msgstr[0] "%ld lignes %ses %d fois" msgstr[1] "%ld lignes %ses %d fois" -#, c-format -msgid "%ld lines to indent... " -msgstr "%ld lignes indenter... " - -#, c-format -msgid "%ld line indented " -msgid_plural "%ld lines indented " -msgstr[0] "%ld ligne indente " -msgstr[1] "%ld lignes indentes " - -msgid "E748: No previously used register" -msgstr "E748: Aucun registre n'a t prcdemment utilis" - # DB - Question O/N. msgid "cannot yank; delete anyway" msgstr "impossible de raliser une copie ; effacer tout de mme" @@ -4375,56 +3667,10 @@ msgstr[0] "%ld ligne modifie" msgstr[1] "%ld lignes modifies" #, c-format -msgid "freeing %ld lines" -msgstr "libration de %ld lignes" - -#, c-format -msgid " into \"%c" -msgstr " dans \"%c" - -#, c-format -msgid "block of %ld line yanked%s" -msgid_plural "block of %ld lines yanked%s" -msgstr[0] "bloc de %ld ligne copi%s" -msgstr[1] "bloc de %ld lignes copi%s" - -#, c-format -msgid "%ld line yanked%s" -msgid_plural "%ld lines yanked%s" -msgstr[0] "%ld ligne copie%s" -msgstr[1] "%ld lignes copies%s" - -#, c-format -msgid "E353: Nothing in register %s" -msgstr "E353: Le registre %s est vide" - -msgid "" -"\n" -"--- Registers ---" -msgstr "" -"\n" -"--- Registres ---" - -msgid "Illegal register name" -msgstr "Nom de registre invalide" - -msgid "" -"\n" -"# Registers:\n" -msgstr "" -"\n" -"# Registres :\n" - -#, c-format -msgid "E574: Unknown register type %d" -msgstr "E574: Type de registre %d inconnu" - -msgid "" -"E883: search pattern and expression register may not contain two or more " -"lines" -msgstr "" -"E883: le motif de recherche et le registre d'expression ne peuvent pas " -"contenir deux lignes ou plus" +msgid "%d line changed" +msgid_plural "%d lines changed" +msgstr[0] "%d ligne modifie" +msgstr[1] "%d lignes modifies" #, c-format msgid "%ld Cols; " @@ -4461,8 +3707,11 @@ msgstr "" msgid "(+%lld for BOM)" msgstr "(+%lld pour le BOM)" -msgid "Thanks for flying Vim" -msgstr "Merci d'avoir choisi Vim" +msgid "E774: 'operatorfunc' is empty" +msgstr "E774: 'operatorfunc' est vide" + +msgid "E775: Eval feature not available" +msgstr "E775: La fonctionnalit d'valuation n'est pas disponible" msgid "E518: Unknown option" msgstr "E518: Option inconnue" @@ -4473,6 +3722,10 @@ msgstr "E519: Option non supporte" msgid "E520: Not allowed in a modeline" msgstr "E520: Non autoris dans une ligne de mode" +msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" +msgstr "" +"E992: Non autoris dans une ligne de mode avec 'modelineexpr' dslectionne" + msgid "E846: Key code not set" msgstr "E846: Le code de touche n'est pas configur" @@ -4482,6 +3735,66 @@ msgstr "E521: Nombre requis aprs =" msgid "E522: Not found in termcap" msgstr "E522: Introuvable dans termcap" +msgid "E946: Cannot make a terminal with running job modifiable" +msgstr "" +"E946: terminal avec tche en cours d'excution ne peut pas tre modifiable" + +msgid "E590: A preview window already exists" +msgstr "E590: Il existe dj une fentre de prvisualisation" + +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "W17: L'arabe ncessite l'UTF-8, tapez ':set encoding=utf-8'" + +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: Couleurs en 24-bits non supportes sur cet environnement." + +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: Au moins %d lignes sont ncessaires" + +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: Au moins %d colonnes sont ncessaires" + +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: Option inconnue : %s" + +#, c-format +msgid "E521: Number required: &%s = '%s'" +msgstr "E521: Nombre requis : &%s = '%s'" + +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- Codes de terminal ---" + +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- Valeur des options globales ---" + +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- Valeur des options locales ---" + +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- Options ---" + +msgid "E356: get_varp ERROR" +msgstr "E356: ERREUR get_varp" + #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: Caractre <%s> invalide" @@ -4490,6 +3803,15 @@ msgstr "E539: Caractre <%s> invalide" msgid "For option %s" msgstr "Pour l'option %s" +# DB - Le code est sans ambigut sur le caractre manquant. +# dfaut d'une traduction valable, au moins comprend-on +# ce qui se passe. +msgid "E540: Unclosed expression sequence" +msgstr "E540: '}' manquant" + +msgid "E542: unbalanced groups" +msgstr "E542: parenthses non quilibres" + msgid "E529: Cannot set 'term' to empty string" msgstr "E529: 'term' ne doit pas tre une chane vide" @@ -4531,8 +3853,9 @@ msgstr "E527: Virgule manquante" msgid "E528: Must specify a ' value" msgstr "E528: Une valeur ' doit tre spcifie" -msgid "E595: contains unprintable or wide character" -msgstr "E595: contient des caractres largeur double non-imprimables" +msgid "E595: 'showbreak' contains unprintable or wide character" +msgstr "" +"E595: 'showbreak' contient des caractres largeur double ou non imprimables" msgid "E596: Invalid font(s)" msgstr "E596: Police(s) invalide(s)" @@ -4560,89 +3883,6 @@ msgstr "E536: virgule requise" msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' doit tre vide ou contenir %s" -msgid "E538: No mouse support" -msgstr "E538: La souris n'est pas supporte" - -# DB - Le code est sans ambigut sur le caractre manquant. -# dfaut d'une traduction valable, au moins comprend-on -# ce qui se passe. -msgid "E540: Unclosed expression sequence" -msgstr "E540: '}' manquant" - -msgid "E541: too many items" -msgstr "E541: trop d'lments" - -msgid "E542: unbalanced groups" -msgstr "E542: parenthses non quilibres" - -msgid "E946: Cannot make a terminal with running job modifiable" -msgstr "" -"E946: terminal avec tche en cours d'excution ne peut pas tre modifiable" - -msgid "E590: A preview window already exists" -msgstr "E590: Il existe dj une fentre de prvisualisation" - -msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" -msgstr "W17: L'arabe ncessite l'UTF-8, tapez ':set encoding=utf-8'" - -msgid "E954: 24-bit colors are not supported on this environment" -msgstr "E954: Couleurs en 24-bits non-supportes sur cet environnement." - -#, c-format -msgid "E593: Need at least %d lines" -msgstr "E593: Au moins %d lignes sont ncessaires" - -#, c-format -msgid "E594: Need at least %d columns" -msgstr "E594: Au moins %d colonnes sont ncessaires" - -#, c-format -msgid "E355: Unknown option: %s" -msgstr "E355: Option inconnue : %s" - -#, c-format -msgid "E521: Number required: &%s = '%s'" -msgstr "E521: Nombre requis : &%s = '%s'" - -msgid "" -"\n" -"--- Terminal codes ---" -msgstr "" -"\n" -"--- Codes de terminal ---" - -msgid "" -"\n" -"--- Global option values ---" -msgstr "" -"\n" -"--- Valeur des options globales ---" - -msgid "" -"\n" -"--- Local option values ---" -msgstr "" -"\n" -"--- Valeur des options locales ---" - -msgid "" -"\n" -"--- Options ---" -msgstr "" -"\n" -"--- Options ---" - -msgid "E356: get_varp ERROR" -msgstr "E356: ERREUR get_varp" - -#, c-format -msgid "E357: 'langmap': Matching character missing for %s" -msgstr "E357: 'langmap' : Aucun caractre correspondant pour %s" - -#, c-format -msgid "E358: 'langmap': Extra characters after semicolon: %s" -msgstr "E358: 'langmap' : Caractres surnumraires aprs point-virgule : %s" - msgid "cannot open " msgstr "impossible d'ouvrir " @@ -4736,6 +3976,10 @@ msgstr "" "\n" "Vim : Rception d'une erreur X\n" +#, c-format +msgid "restoring display %s" +msgstr "restauration du display %s" + msgid "Testing the X display failed" msgstr "Le test du display X a chou" @@ -4833,15 +4077,6 @@ msgstr "XSMP : SmcOpenConnection a chou : %s" msgid "At line" msgstr " la ligne" -msgid "Could not load vim32.dll!" -msgstr "Impossible de charger vim32.dll !" - -msgid "VIM Error" -msgstr "Erreur VIM" - -msgid "Could not fix up function pointers to the DLL!" -msgstr "Impossible d'initialiser les pointeurs de fonction vers la DLL !" - # DB - Les vnements en question sont ceux des messages qui suivent. #, c-format msgid "Vim: Caught %s event\n" @@ -4875,10 +4110,38 @@ msgstr "Alerte Vim" msgid "shell returned %d" msgstr "le shell a retourn %d" +msgid "E278: Cannot put a terminal buffer in a popup window" +msgstr "" +"E278: Impossible de mettre un tampon de terminal dans une fentre " +"contextuelle" + +#, c-format +msgid "E997: Tabpage not found: %d" +msgstr "E997: Onglet introuvable : %d" + +#, c-format +msgid "E993: window %d is not a popup window" +msgstr "E993: la fentre %d n'est pas une fentre contextuelle" + +msgid "E994: Not allowed in a popup window" +msgstr "E994: Opration interdite dans une fentre contextuelle" + +msgid "E863: Not allowed for a terminal in a popup window" +msgstr "" +"E863: Opration interdite pour un terminal dans une fentre contextuelle" + +msgid "E750: First use \":profile start {fname}\"" +msgstr "E750: Utilisez d'abord \":profile start {nomfichier}\"" + +msgid "E553: No more items" +msgstr "E553: Plus d'lments" + +msgid "E925: Current quickfix list was changed" +msgstr "E925: La liste quickfix courante a chang" + msgid "E926: Current location list was changed" msgstr "E926: La liste d'emplacements courante a chang" -#, c-format msgid "E372: Too many %%%c in format string" msgstr "E372: Trop de %%%c dans la chane de format" @@ -4907,15 +4170,9 @@ msgstr "E378: 'errorformat' ne contient aucun motif" msgid "E379: Missing or empty directory name" msgstr "E379: Nom de rpertoire vide ou absent" -msgid "E553: No more items" -msgstr "E553: Plus d'lments" - msgid "E924: Current window was closed" msgstr "E924: La fentre courante doit tre ferme" -msgid "E925: Current quickfix was changed" -msgstr "E925: Le quickfix courant a chang" - #, c-format msgid "(%d of %d)%s%s: " msgstr "(%d sur %d)%s%s : " @@ -4946,6 +4203,9 @@ msgstr "E683: Nom de fichier manquant ou motif invalide" msgid "Cannot open file \"%s\"" msgstr "Impossible d'ouvrir le fichier \"%s\"" +msgid "cannot have both a list and a \"what\" argument" +msgstr "impossible d'avoir une liste et un argument \"what\" en mme temps" + msgid "E681: Buffer is not loaded" msgstr "E681: le tampon n'est pas charg" @@ -4995,37 +4255,30 @@ msgstr "E70: %s%%[] vide" msgid "E956: Cannot use pattern recursively" msgstr "E956: Impossible d'utiliser le motif rcursivement" -msgid "E65: Illegal back reference" -msgstr "E65: post-rfrence invalide" - -msgid "E339: Pattern too long" -msgstr "E339: Motif trop long" - -msgid "E50: Too many \\z(" -msgstr "E50: Trop de \\z(" - #, c-format -msgid "E51: Too many %s(" -msgstr "E51: Trop de %s(" - -msgid "E52: Unmatched \\z(" -msgstr "E52: Pas de correspondance pour \\z(" +msgid "E654: missing delimiter after search pattern: %s" +msgstr "E654: il manque un dlimiteur aprs le motif de recherche : %s" #, c-format -msgid "E59: invalid character after %s@" -msgstr "E59: caractre invalide aprs %s@" +msgid "E554: Syntax error in %s{...}" +msgstr "E554: Erreur de syntaxe dans %s{...}" #, c-format -msgid "E60: Too many complex %s{...}s" -msgstr "E60: Trop de %s{...}s complexes" +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (regexp NFA) %s ne peut pas tre rpt" -#, c-format -msgid "E61: Nested %s*" -msgstr "E61: %s* imbriqus" +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: \\%#= peut tre suivi uniquement de 0, 1 ou 2. Le moteur automatique " +"sera utilis " -#, c-format -msgid "E62: Nested %s%c" -msgstr "E62: %s%c imbriqus" +msgid "Switching to backtracking RE engine for pattern: " +msgstr "Moteur RE avec backtracking utilis pour le motif : " + +msgid "E65: Illegal back reference" +msgstr "E65: post-rfrence invalide" msgid "E63: invalid use of \\_" msgstr "E63: utilisation invalide de \\_" @@ -5046,25 +4299,36 @@ msgid "E71: Invalid character after %s%%" msgstr "E71: Caractre invalide aprs %s%%" #, c-format -msgid "E554: Syntax error in %s{...}" -msgstr "E554: Erreur de syntaxe dans %s{...}" +msgid "E59: invalid character after %s@" +msgstr "E59: caractre invalide aprs %s@" -msgid "External submatches:\n" -msgstr "Sous-correspondances externes :\n" +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: Trop de %s{...}s complexes" #, c-format -msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (regexp NFA) %s ne peut pas tre rpt" +msgid "E61: Nested %s*" +msgstr "E61: %s* imbriqus" -msgid "" -"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " -"used " -msgstr "" -"E864: \\%#= peut tre suivi uniquement de 0, 1 ou 2. Le moteur automatique " -"sera utilis " +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62: %s%c imbriqus" -msgid "Switching to backtracking RE engine for pattern: " -msgstr "Moteur RE avec backtracking utilis pour le motif : " +msgid "E50: Too many \\z(" +msgstr "E50: Trop de \\z(" + +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: Trop de %s(" + +msgid "E52: Unmatched \\z(" +msgstr "E52: Pas de correspondance pour \\z(" + +msgid "E339: Pattern too long" +msgstr "E339: Motif trop long" + +msgid "External submatches:\n" +msgstr "Sous-correspondances externes :\n" msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) Fin de regexp rencontre prmaturment" @@ -5074,16 +4338,16 @@ msgid "E866: (NFA regexp) Misplaced %c" msgstr "E866: (regexp NFA) %c au mauvais endroit" #, c-format -msgid "E877: (NFA regexp) Invalid character class: %ld" -msgstr "E877: (regexp NFA) Classe de caractre invalide : %ld" +msgid "E877: (NFA regexp) Invalid character class: %d" +msgstr "E877: (regexp NFA) Classe de caractre invalide : %d" + +msgid "E951: \\% value too large" +msgstr "E951: valeur \\% trop grande" #, c-format msgid "E867: (NFA) Unknown operator '\\z%c'" msgstr "E867: (NFA) Oprateur inconnu '\\z%c'" -msgid "E951: \\% value too large" -msgstr "E951: valeur \\% trop grande" - #, c-format msgid "E867: (NFA) Unknown operator '\\%%%c'" msgstr "E867: (NFA) Oprateur inconnu '\\%%%c'" @@ -5132,6 +4396,47 @@ msgid "E878: (NFA) Could not allocate memory for branch traversal!" msgstr "" "E878: (NFA) Impossible d'allouer la mmoire pour parcourir les branches !" +msgid "E748: No previously used register" +msgstr "E748: Aucun registre n'a t prcdemment utilis" + +#, c-format +msgid "freeing %ld lines" +msgstr "libration de %ld lignes" + +#, c-format +msgid " into \"%c" +msgstr " dans \"%c" + +#, c-format +msgid "block of %ld line yanked%s" +msgid_plural "block of %ld lines yanked%s" +msgstr[0] "bloc de %ld ligne copi%s" +msgstr[1] "bloc de %ld lignes copi%s" + +#, c-format +msgid "%ld line yanked%s" +msgid_plural "%ld lines yanked%s" +msgstr[0] "%ld ligne copie%s" +msgstr[1] "%ld lignes copies%s" + +#, c-format +msgid "E353: Nothing in register %s" +msgstr "E353: Le registre %s est vide" + +msgid "" +"\n" +"Type Name Content" +msgstr "" +"\n" +"Type nom Contenu" + +msgid "" +"E883: search pattern and expression register may not contain two or more " +"lines" +msgstr "" +"E883: le motif de recherche et le registre d'expression ne peuvent pas " +"contenir deux lignes ou plus" + msgid " VREPLACE" msgstr " VREMPLACEMENT" @@ -5185,6 +4490,81 @@ msgid "recording" msgstr "Enregistrement" #, c-format +msgid "Searching for \"%s\" in \"%s\"" +msgstr "Recherche de \"%s\" dans \"%s\"" + +#, c-format +msgid "Searching for \"%s\"" +msgstr "Recherche de \"%s\"" + +#, c-format +msgid "not found in '%s': \"%s\"" +msgstr "introuvable dans '%s' : \"%s\"" + +msgid "Source Vim script" +msgstr "Sourcer un script - Vim" + +#, c-format +msgid "Cannot source a directory: \"%s\"" +msgstr "Impossible de sourcer un rpertoire : \"%s\"" + +#, c-format +msgid "could not source \"%s\"" +msgstr "impossible de sourcer \"%s\"" + +#, c-format +msgid "line %ld: could not source \"%s\"" +msgstr "ligne %ld : impossible de sourcer \"%s\"" + +#, c-format +msgid "sourcing \"%s\"" +msgstr "sourcement \"%s\"" + +#, c-format +msgid "line %ld: sourcing \"%s\"" +msgstr "ligne %ld : sourcement de \"%s\"" + +#, c-format +msgid "finished sourcing %s" +msgstr "fin du sourcement de %s" + +# AB - Ce texte fait partie d'un message de dbogage. +#, c-format +msgid "continuing in %s" +msgstr "de retour dans %s" + +msgid "modeline" +msgstr "ligne de mode" + +msgid "--cmd argument" +msgstr "argument --cmd" + +msgid "-c argument" +msgstr "argument -c" + +msgid "environment variable" +msgstr "variable d'environnement" + +msgid "error handler" +msgstr "gestionnaire d'erreur" + +msgid "W15: Warning: Wrong line separator, ^M may be missing" +msgstr "W15: Alerte : Sparateur de ligne erron, ^M possiblement manquant" + +msgid "E167: :scriptencoding used outside of a sourced file" +msgstr "E167: :scriptencoding utilis en dehors d'un fichier sourc" + +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion utilis en dehors d'un fichier sourc" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: scriptversion non support : %d" + +msgid "E168: :finish used outside of a sourced file" +msgstr "E168: :finish utilis en dehors d'un fichier sourc" + +#, c-format msgid "E383: Invalid search string: %s" msgstr "E383: Chane de recherche invalide : %s" @@ -5240,19 +4620,6 @@ msgstr "E388: Impossible de trouver la dfinition" msgid "E389: Couldn't find pattern" msgstr "E389: Impossible de trouver le motif" -msgid "Substitute " -msgstr "Substitue " - -#, c-format -msgid "" -"\n" -"# Last %sSearch Pattern:\n" -"~" -msgstr "" -"\n" -"# Dernier motif de recherche %s :\n" -"~" - msgid "E756: Spell checking is not enabled" msgstr "E756: La vrification orthographique n'est pas active" @@ -5271,22 +4638,6 @@ msgstr "E797: L'autocommande SpellFileMissing a effac le tampon" msgid "Warning: region %s not supported" msgstr "Alerte : rgion %s non supporte" -msgid "Sorry, no suggestions" -msgstr "Dsol, aucune suggestion" - -#, c-format -msgid "Sorry, only %ld suggestions" -msgstr "Dsol, seulement %ld suggestions" - -#, c-format -msgid "Change \"%.*s\" to:" -msgstr "Remplacer \"%.*s\" par :" - -# DB - todo : l'intrt de traduire ce message m'chappe. -#, c-format -msgid " < \"%.*s\"" -msgstr " < \"%.*s\"" - msgid "E752: No previous spell replacement" msgstr "E752: Pas de suggestion orthographique prcdente" @@ -5523,32 +4874,36 @@ msgid "Reading word file %s..." msgstr "Lecture de la liste de mots %s..." #, c-format -msgid "Duplicate /encoding= line ignored in %s line %d: %s" -msgstr "Ligne /encoding= en double ignore dans %s ligne %d : %s" +msgid "Conversion failure for word in %s line %ld: %s" +msgstr "chec de conversion du mot dans %s ligne %ld : %s" #, c-format -msgid "/encoding= line after word ignored in %s line %d: %s" -msgstr "Ligne /encoding= aprs des mots ignore dans %s ligne %d : %s" +msgid "Duplicate /encoding= line ignored in %s line %ld: %s" +msgstr "Ligne /encoding= en double ignore dans %s ligne %ld : %s" #, c-format -msgid "Duplicate /regions= line ignored in %s line %d: %s" -msgstr "Ligne /regions= en double ignore dans %s ligne %d : %s" +msgid "/encoding= line after word ignored in %s line %ld: %s" +msgstr "Ligne /encoding= aprs des mots ignore dans %s ligne %ld : %s" #, c-format -msgid "Too many regions in %s line %d: %s" -msgstr "Trop de rgions dans %s ligne %d : %s" +msgid "Duplicate /regions= line ignored in %s line %ld: %s" +msgstr "Ligne /regions= en double ignore dans %s ligne %ld : %s" #, c-format -msgid "/ line ignored in %s line %d: %s" -msgstr "Ligne / ignore dans %s ligne %d : %s" +msgid "Too many regions in %s line %ld: %s" +msgstr "Trop de rgions dans %s ligne %ld : %s" #, c-format -msgid "Invalid region nr in %s line %d: %s" -msgstr "Numro de rgion invalide dans %s ligne %d : %s" +msgid "/ line ignored in %s line %ld: %s" +msgstr "Ligne / ignore dans %s ligne %ld : %s" #, c-format -msgid "Unrecognized flags in %s line %d: %s" -msgstr "Drapeaux non reconnus dans %s ligne %d : %s" +msgid "Invalid region nr in %s line %ld: %s" +msgstr "Numro de rgion invalide dans %s ligne %ld : %s" + +#, c-format +msgid "Unrecognized flags in %s line %ld: %s" +msgstr "Drapeaux non reconnus dans %s ligne %ld : %s" #, c-format msgid "Ignored %d words with non-ASCII characters" @@ -5558,8 +4913,8 @@ msgid "E845: Insufficient memory, word list will be incomplete" msgstr "E845: mmoire insuffisante, liste de mots peut-tre incomplte" #, c-format -msgid "Compressed %d of %d nodes; %d (%d%%) remaining" -msgstr "%d noeuds compresss sur %d ; %d (%d%%) restants " +msgid "Compressed %s: %ld of %ld nodes; %ld (%ld%%) remaining" +msgstr "Compress %s : %ld/%ld noeuds ; %ld (%ld%%) restants" msgid "Reading back spell file..." msgstr "Relecture du fichier orthographique" @@ -5624,6 +4979,26 @@ msgstr "" msgid "E783: duplicate char in MAP entry" msgstr "E783: caractre dupliqu dans l'entre MAP" +msgid "Sorry, no suggestions" +msgstr "Dsol, aucune suggestion" + +#, c-format +msgid "Sorry, only %ld suggestions" +msgstr "Dsol, seulement %ld suggestions" + +#, c-format +msgid "Change \"%.*s\" to:" +msgstr "Remplacer \"%.*s\" par :" + +# DB - todo : l'intrt de traduire ce message m'chappe. +#, c-format +msgid " < \"%.*s\"" +msgstr " < \"%.*s\"" + +#, c-format +msgid "E390: Illegal argument: %s" +msgstr "E390: Argument invalide : %s" + msgid "No Syntax items defined for this buffer" msgstr "Aucun lment de syntaxe dfini pour ce tampon" @@ -5636,22 +5011,12 @@ msgstr "\"syntax conceal\" active" msgid "syntax conceal off" msgstr "\"syntax conceal\" dsactive" -#, c-format -msgid "E390: Illegal argument: %s" -msgstr "E390: Argument invalide : %s" - msgid "syntax case ignore" msgstr "syntaxe ignore la casse" msgid "syntax case match" msgstr "syntaxe respecte la casse" -msgid "syntax spell toplevel" -msgstr "contrle orthographique dans le texte sans groupe syntaxique" - -msgid "syntax spell notoplevel" -msgstr "pas de contrle orthographique dans le texte sans groupe syntaxique" - msgid "syntax spell default" msgstr "" "contrle orthographique dans le texte sans groupe syntaxique, sauf si @Spell/" @@ -5673,9 +5038,11 @@ msgstr "synchronisation sur les commentaires de type C" msgid "no syncing" msgstr "Aucune synchronisation" -# DB - Les deux messages qui suivent vont ensemble. +msgid "syncing starts at the first line" +msgstr "la synchronisation dbute la premire ligne" + msgid "syncing starts " -msgstr "La synchronisation dbute " +msgstr "la synchronisation dbute " msgid " lines before top line" msgstr " lignes avant la ligne du haut" @@ -5705,6 +5072,9 @@ msgstr "" msgid "E392: No such syntax cluster: %s" msgstr "E392: Aucune grappe de syntaxe %s" +msgid "from the first line" +msgstr " partir de la premire ligne" + msgid "minimal " msgstr "minimum " @@ -5744,7 +5114,7 @@ msgstr "E789: ']' manquant : %s" #, c-format msgid "E890: trailing char after ']': %s]%s" -msgstr "E890: Caractre surnumraire aprs ']': %s]%s" +msgstr "E890: Caractre surnumraire aprs ']' : %s]%s" #, c-format msgid "E398: Missing '=': %s" @@ -5805,76 +5175,17 @@ msgid "" msgstr "" " TOTAL NOMBRE MATCH PLUS LENT MOYEN NOM MOTIF" -msgid "E679: recursive loop loading syncolor.vim" -msgstr "E679: boucle rcursive lors du chargement de syncolor.vim" - -#, c-format -msgid "E411: highlight group not found: %s" -msgstr "E411: groupe de surbrillance introuvable : %s" - -#, c-format -msgid "E412: Not enough arguments: \":highlight link %s\"" -msgstr "E412: Trop peu d'arguments : \":highlight link %s\"" - -#, c-format -msgid "E413: Too many arguments: \":highlight link %s\"" -msgstr "E413: Trop d'arguments : \":highlight link %s\"" - -msgid "E414: group has settings, highlight link ignored" -msgstr "E414: le groupe a dj des attributs, lien de surbrillance ignor" - -#, c-format -msgid "E415: unexpected equal sign: %s" -msgstr "E415: signe gal inattendu : %s" - -#, c-format -msgid "E416: missing equal sign: %s" -msgstr "E416: '=' manquant : %s" - -#, c-format -msgid "E417: missing argument: %s" -msgstr "E417: argument manquant : %s" - -#, c-format -msgid "E418: Illegal value: %s" -msgstr "E418: Valeur invalide : %s" - -msgid "E419: FG color unknown" -msgstr "E419: Couleur de premier plan inconnue" - -msgid "E420: BG color unknown" -msgstr "E420: Couleur d'arrire-plan inconnue" - -#, c-format -msgid "E421: Color name or number not recognized: %s" -msgstr "E421: Nom ou numro de couleur non reconnu : %s" - -#, c-format -msgid "E422: terminal code too long: %s" -msgstr "E422: le code de terminal est trop long : %s" - -#, c-format -msgid "E423: Illegal argument: %s" -msgstr "E423: Argument invalide : %s" - -msgid "E424: Too many different highlighting attributes in use" -msgstr "" -"E424: Trop d'attributs de surbrillance diffrents en cours d'utilisation" - -msgid "E669: Unprintable character in group name" -msgstr "E669: Caractre non-imprimable dans un nom de groupe" - -msgid "W18: Invalid character in group name" -msgstr "W18: Caractre invalide dans un nom de groupe" - -msgid "E849: Too many highlight and syntax groups" -msgstr "E849: Trop de groupes de surbrillance et de syntaxe" - msgid "E555: at bottom of tag stack" -msgstr "E555: En bas de la pile de marqueurs" +msgstr "E555: En bas de la pile des marqueurs" msgid "E556: at top of tag stack" -msgstr "E556: Au sommet de la pile de marqueurs" +msgstr "E556: Au sommet de la pile des marqueurs" + +msgid "E986: cannot modify the tag stack within tagfunc" +msgstr "E986: impossible de modifier la pile des marqueurs dans tagfunc" + +msgid "E987: invalid return value from tagfunc" +msgstr "E987: tagfunc a retourn une valeur de retour invalide" msgid "E425: Cannot go before first matching tag" msgstr "E425: Impossible d'aller avant le premier marqueur correspondant" @@ -5883,12 +5194,6 @@ msgstr "E425: Impossible d'aller avant le premier marqueur correspondant" msgid "E426: tag not found: %s" msgstr "E426: Marqueur introuvable : %s" -msgid " # pri kind tag" -msgstr " # pri type marqueur" - -msgid "file\n" -msgstr "fichier\n" - msgid "E427: There is only one matching tag" msgstr "E427: Il n'y a qu'un marqueur correspondant" @@ -5913,6 +5218,12 @@ msgstr " Utilisation d'un marqueur avec une casse diffrente !" msgid "E429: File \"%s\" does not exist" msgstr "E429: Le fichier \"%s\" n'existe pas" +msgid " # pri kind tag" +msgstr " # pri type marqueur" + +msgid "file\n" +msgstr "fichier\n" + msgid "" "\n" " # TO tag FROM line in file/text" @@ -5928,9 +5239,6 @@ msgstr "Examen du fichier de marqueurs %s" msgid "E430: Tag file path truncated for %s\n" msgstr "E430: Chemin de fichiers de marqueurs tronqu pour %s\n" -msgid "Ignoring long line in tags file" -msgstr "Ignore longue ligne dans le fichier de marqueurs" - #, c-format msgid "E431: Format error in tags file \"%s\"" msgstr "E431: Erreur de format dans le fichier de marqueurs \"%s\"" @@ -5946,6 +5254,9 @@ msgstr "E432: Le fichier de marqueurs %s n'est pas ordonn" msgid "E433: No tags file" msgstr "E433: Aucun fichier de marqueurs" +msgid "Ignoring long line in tags file" +msgstr "Ignore longue ligne dans le fichier de marqueurs" + msgid "E434: Can't find tag pattern" msgstr "E434: Le motif de marqueur est introuvable" @@ -5989,6 +5300,9 @@ msgstr "" msgid "Cannot open $VIMRUNTIME/rgb.txt" msgstr "Impossible d'ouvrir $VIMRUNTIME/rgb.txt" +msgid "E279: Sorry, ++shell is not supported on this system" +msgstr "E279: ++shell non support sur cet environnement" + #, c-format msgid "Kill job in \"%s\"?" msgstr "Terminer la tche d'excution dans \"%s\"?" @@ -6082,7 +5396,7 @@ msgstr "E823: Ce n'est pas un fichier d'annulations : %s" #, c-format msgid "E832: Non-encrypted file has encrypted undo file: %s" -msgstr "E832: Fichier non-chiffr a un fichier d'annulations chiffr : %s" +msgstr "E832: Fichier non chiffr a un fichier d'annulations chiffr : %s" #, c-format msgid "E826: Undo file decryption failed: %s" @@ -6153,12 +5467,6 @@ msgstr "Rien annuler" msgid "number changes when saved" msgstr "numro modif. instant enregistr" -#, c-format -msgid "%ld second ago" -msgid_plural "%ld seconds ago" -msgstr[0] "il y a %ld seconde" -msgstr[1] "il y a %ld secondes" - msgid "E790: undojoin is not allowed after undo" msgstr "E790: undojoin n'est pas autoris aprs une annulation" @@ -6168,6 +5476,17 @@ msgstr "E439: la liste d'annulation est corrompue" msgid "E440: undo line missing" msgstr "E440: ligne d'annulation manquante" +msgid "" +"\n" +" Name Args Address Complete Definition" +msgstr "" +"\n" +" Nom Args Adresse Complet Dfinition" + +#, c-format +msgid "E174: Command already exists: add ! to replace it: %s" +msgstr "E174: La commande existe dj : ajoutez ! pour la redfinir : %s" + #, c-format msgid "E122: Function %s already exists, add ! to replace it" msgstr "E122: La fonction %s existe dj (ajoutez ! pour la remplacer)" @@ -6190,6 +5509,11 @@ msgstr "E125: Argument invalide : %s" msgid "E853: Duplicate argument name: %s" msgstr "E853: Nom d'argument dupliqu : %s" +msgid "E989: Non-default argument follows default argument" +msgstr "" +"E989: Argument sans valeur par dfaut ne peut pas suivre un argument avec " +"valeur par dfaut" + #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: Trop d'arguments pour la fonction %s" @@ -6228,16 +5552,8 @@ msgid "E699: Too many arguments" msgstr "E699: Trop d'arguments" #, c-format -msgid "E117: Unknown function: %s" -msgstr "E117: Fonction inconnue : %s" - -#, c-format -msgid "E933: Function was deleted: %s" -msgstr "E933: La fonction a t efface: %s" - -#, c-format -msgid "E119: Not enough arguments for function: %s" -msgstr "E119: La fonction %s n'a pas reu assez d'arguments" +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: Impossible d'utiliser une fonction comme mthode : %s" #, c-format msgid "E120: Using <SID> not in a script context: %s" @@ -6261,6 +5577,9 @@ msgstr "" "E884: Le nom de la fonction ne peut pas contenir le caractre deux-points : " "%s" +msgid "E454: function list was modified" +msgstr "E454: la liste de fonctions a t modifie" + #, c-format msgid "E123: Undefined function: %s" msgstr "E123: Fonction non dfinie : %s" @@ -6284,8 +5603,12 @@ msgid "E126: Missing :endfunction" msgstr "E126: Il manque :endfunction" #, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: Texte trouv aprs :enddef : %s" + +#, c-format msgid "W22: Text found after :endfunction: %s" -msgstr "W22: Texte trouv aprs :endfunction: %s" +msgstr "W22: Texte trouv aprs :endfunction : %s" #, c-format msgid "E707: Function name conflicts with variable: %s" @@ -6312,15 +5635,25 @@ msgid "E133: :return not inside a function" msgstr "E133: :return en dehors d'une fonction" #, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: Parenthses manquantes : %s" - -#, c-format msgid "%s (%s, compiled %s)" msgstr "%s (%s, compil %s)" msgid "" "\n" +"MS-Windows 64-bit GUI/console version" +msgstr "" +"\n" +"Version interface graphique/console MS-Windows 64 bits" + +msgid "" +"\n" +"MS-Windows 32-bit GUI/console version" +msgstr "" +"\n" +"Version interface graphique/console MS-Windows 32 bits" + +msgid "" +"\n" "MS-Windows 64-bit GUI version" msgstr "" "\n" @@ -6454,18 +5787,15 @@ msgstr "avec interface graphique X11-neXtaw." msgid "with X11-Athena GUI." msgstr "avec interface graphique X11-Athena." +msgid "with Haiku GUI." +msgstr "avec interface graphique Haiku." + msgid "with Photon GUI." msgstr "avec interface graphique Photon." msgid "with GUI." msgstr "avec une interface graphique." -msgid "with Carbon GUI." -msgstr "avec interface graphique Carbon." - -msgid "with Cocoa GUI." -msgstr "avec interface graphique Cocoa." - msgid " Features included (+) or not (-):\n" msgstr " Fonctionnalits incluses (+) ou non (-) :\n" @@ -6476,16 +5806,16 @@ msgid " user vimrc file: \"" msgstr " fichier vimrc utilisateur : \"" msgid " 2nd user vimrc file: \"" -msgstr " 2me fichier vimrc utilisateur : \"" +msgstr " 2e fichier vimrc utilisateur : \"" msgid " 3rd user vimrc file: \"" -msgstr " 3me fichier vimrc utilisateur : \"" +msgstr " 3e fichier vimrc utilisateur : \"" msgid " user exrc file: \"" msgstr " fichier exrc utilisateur : \"" msgid " 2nd user exrc file: \"" -msgstr " 2me fichier exrc utilisateur : \"" +msgstr " 2e fichier exrc utilisateur : \"" msgid " system gvimrc file: \"" msgstr " fichier gvimrc systme : \"" @@ -6494,10 +5824,10 @@ msgid " user gvimrc file: \"" msgstr " fichier gvimrc utilisateur : \"" msgid "2nd user gvimrc file: \"" -msgstr "2me fichier gvimrc utilisateur : \"" +msgstr " 2e fichier gvimrc utilisateur : \"" msgid "3rd user gvimrc file: \"" -msgstr "3me fichier gvimrc utilisateur : \"" +msgstr " 3e fichier gvimrc utilisateur : \"" msgid " defaults file: \"" msgstr " fichier de valeurs par dfaut : \"" @@ -6598,6 +5928,87 @@ msgstr "tapez :help register<Entre> pour plus d'informations " msgid "menu Help->Sponsor/Register for information " msgstr "menu Aide->Sponsor/Enregistrement pour plus d'info" +# DB - Messages et les suivants : fichier .viminfo. +# Pas de majuscule ncessaire pour les messages d'aprs. +#, c-format +msgid "" +"\n" +"# %s History (newest to oldest):\n" +msgstr "" +"\n" +"# Historique %s (chronologie dcroissante) :\n" + +msgid "Command Line" +msgstr "ligne de commande" + +msgid "Search String" +msgstr "chane de recherche" + +msgid "Expression" +msgstr "expression" + +msgid "Input Line" +msgstr "ligne de saisie" + +msgid "Debug Line" +msgstr "Ligne de dbogage" + +# AB - Ne pas traduire le dollar. +# AB - Ce message n'est volontairement pas traduit. En effet, il fait partie +# d'un groupe de trois messages dans viminfo, dont deux ne sont pas soumis +# internationalisation. J'attends que les deux autres messages soient +# traduisibles pour traduire celui-ci. +# DB - TODO : Qu'en est-il prsent ? +msgid "" +"\n" +"# Last Substitute String:\n" +"$" +msgstr "" +"\n" +"# Dernires chanes de substitution :\n" +"$" + +msgid "Illegal register name" +msgstr "Nom de registre invalide" + +msgid "" +"\n" +"# Registers:\n" +msgstr "" +"\n" +"# Registres :\n" + +#, c-format +msgid "E574: Unknown register type %d" +msgstr "E574: Type de registre %d inconnu" + +msgid "" +"\n" +"# History of marks within files (newest to oldest):\n" +msgstr "" +"\n" +"# Historique des marques dans les fichiers (les plus rcentes en premier) :\n" + +msgid "" +"\n" +"# File marks:\n" +msgstr "" +"\n" +"# Marques dans le fichier :\n" + +msgid "" +"\n" +"# Jumplist (newest first):\n" +msgstr "" +"\n" +"# Liste de sauts (le plus rcent en premier) :\n" + +msgid "Missing '>'" +msgstr "'>' manquant" + +msgid "E195: Cannot open viminfo file for reading" +msgstr "E195: Impossible d'ouvrir le viminfo en lecture" + msgid "Already only one window" msgstr "Il n'y a dj plus qu'une fentre" @@ -6624,13 +6035,6 @@ msgstr "" msgid "E445: Other window contains changes" msgstr "E445: Les modifications de l'autre fentre n'ont pas t enregistres" -msgid "E446: No file name under cursor" -msgstr "E446: Aucun nom de fichier sous le curseur" - -#, c-format -msgid "E447: Can't find file \"%s\" in path" -msgstr "E447: Le fichier \"%s\" est introuvable dans 'path'" - #, c-format msgid "E799: Invalid ID: %ld (must be greater than or equal to 1)" msgstr "E799: ID invalide : %ld (doit tre plus grand ou gal 1)" @@ -6639,9 +6043,6 @@ msgstr "E799: ID invalide : %ld (doit tre plus grand ou gal 1)" msgid "E801: ID already taken: %ld" msgstr "E801: ID dj pris: %ld" -msgid "List or number required" -msgstr "Liste ou nombre requis" - #, c-format msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)" msgstr "E802: ID invalide : %ld (doit tre plus grand ou gal 1)" @@ -6691,7 +6092,356 @@ msgstr "Erreur de gvimext.dll" msgid "Path length too long!" msgstr "Le chemin est trop long !" -# msgstr "--Pas de lignes dans le tampon--" +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Variable non dfinie : %s" + +#, c-format +msgid "E121: Undefined variable: %c:%s" +msgstr "E121: Variable non dfinie : %c:%s" + +msgid "E476: Invalid command" +msgstr "E476: Commande invalide" + +#, c-format +msgid "E476: Invalid command: %s" +msgstr "E476: Commande invalide : %s" + +msgid "E710: List value has more items than targets" +msgstr "E710: La Liste a plus d'lments que la destination" + +msgid "E711: List value does not have enough items" +msgstr "E711: La Liste n'a pas assez d'lments" + +msgid "E719: Cannot slice a Dictionary" +msgstr "E719: Utilisation de [:] impossible avec un Dictionnaire" + +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "" +"E856: le second argument d'\"assert_fails()\" doit tre une chane ou une " +"liste avec une ou deux chanes" + +#, c-format +msgid "E1100: Missing :var: %s" +msgstr "E1100: Il manque :var: %s" + +#, c-format +msgid "E1001: Variable not found: %s" +msgstr "E1001: Variable introuvable: %s" + +#, c-format +msgid "E1002: Syntax error at %s" +msgstr "E1002: Erreur de syntaxe dans %s" + +msgid "E1003: Missing return value" +msgstr "E1003: Valeur de retour manquante" + +#, c-format +msgid "E1004: White space required before and after '%s'" +msgstr "E1004: Espace requise avant et aprs '%s'" + +msgid "E1005: Too many argument types" +msgstr "E1005: Trop de types d'arguments" + +#, c-format +msgid "E1006: %s is used as an argument" +msgstr "E1006: %s est utilis comme argument" + +msgid "E1007: Mandatory argument after optional argument" +msgstr "E1007: Argument obligatoire aprs un argument optionnel" + +msgid "E1008: Missing <type>" +msgstr "E1008: <type> manquant" + +msgid "E1009: Missing > after type" +msgstr "E1009: Il manque > aprs type" + +#, c-format +msgid "E1010: Type not recognized: %s" +msgstr "E1010: Type non reconnu : %s" + +#, c-format +msgid "E1011: Name too long: %s" +msgstr "E1011: Nom trop long : %s" + +#, c-format +msgid "E1012: Type mismatch; expected %s but got %s" +msgstr "E1012: Type inconsistant ; attendu %s mais reu %s" + +#, c-format +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" +msgstr "E1013: Argument %d : type inconsistant, attendu %s mais reu %s" + +#, c-format +msgid "E1014: Invalid key: %s" +msgstr "E1014: cl invalide : %s" + +#, c-format +msgid "E1015: Name expected: %s" +msgstr "E1015: Nom attendu : %s" + +#, c-format +msgid "E1016: Cannot declare a %s variable: %s" +msgstr "E1016: Impossible de dclarer variable %s : %s" + +#, c-format +msgid "E1016: Cannot declare an environment variable: %s" +msgstr "E1016: Impossible de dclarer une variable d'environnement : %s" + +#, c-format +msgid "E1017: Variable already declared: %s" +msgstr "E1017: Variable dj dclare : %s" + +#, c-format +msgid "E1018: Cannot assign to a constant: %s" +msgstr "E1018: Impossible d'assigner une constante : %s" + +msgid "E1019: Can only concatenate to string" +msgstr "E1019: Seules les chanes peuvent tre concatnes" + +#, c-format +msgid "E1020: Cannot use an operator on a new variable: %s" +msgstr "" +"E1020: Impossible d'utiliser un oprateur sur une nouvelle variable : %s" + +msgid "E1021: Const requires a value" +msgstr "E1021: Const ncessite une valeur" + +msgid "E1022: Type or initialization required" +msgstr "E1022: Type ou initialisation requis" + +#, c-format +msgid "E1023: Using a Number as a Bool: %d" +msgstr "E1023: Utilisation d'un Nombre comme un Boolen : %d" + +msgid "E1024: Using a Number as a String" +msgstr "E1024: Utilisation d'un Nombre comme une Chane" + +msgid "E1025: Using } outside of a block scope" +msgstr "E1025: Utilisation de } hors d'un bloc de porte" + +msgid "E1026: Missing }" +msgstr "E1026: } manquant" + +msgid "E1027: Missing return statement" +msgstr "E1027: commande 'return' manquante" + +msgid "E1028: Compiling :def function failed" +msgstr "E1028: Compilation de function :def a chou" + +#, c-format +msgid "E1029: Expected %s but got %s" +msgstr "E1029: %s attendu mais %s reu" + +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Utilisation d'une Chane comme Nombre : \"%s\"" + +msgid "E1031: Cannot use void value" +msgstr "E1031: Impossible d'utiliser une valeur 'void'" + +msgid "E1032: Missing :catch or :finally" +msgstr "E1032: :catch ou :finally manquant" + +#, c-format +msgid "E1034: Cannot use reserved name %s" +msgstr "E1034: Impossible d'utiliser le nom rserv %s" + +msgid "E1035: % requires number arguments" +msgstr "E1035: % ncessite des arguments numriques" + +#, c-format +msgid "E1036: %c requires number or float arguments" +msgstr "E1036: %c ncessite des arguments numriques ou flottants" + +#, c-format +msgid "E1037: Cannot use \"%s\" with %s" +msgstr "E1037: Impossible d'utiliser \"%s\" avec %s" + +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" ne peut tre utilis que dans un script" + +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" doit tre la premire commande dans un script" + +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: Impossible d'utiliser :scriptversion aprs :vim9script" + +#, c-format +msgid "E1041: Redefining script item %s" +msgstr "E1041: Redfinition de l'lment de script %s" + +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Export ne peut tre utilis que dans vim9script" + +msgid "E1043: Invalid command after :export" +msgstr "E1043: Commande invalide aprs :export" + +msgid "E1044: Export with invalid argument" +msgstr "E1044: Export avec argument invalide" + +msgid "E1045: Missing \"as\" after *" +msgstr "E1045: \"as\" manquant aprs *" + +msgid "E1046: Missing comma in import" +msgstr "E1046: virgule manquante dans import" + +msgid "E1047: Syntax error in import" +msgstr "E1047: Erreur de syntaxe dans import" + +#, c-format +msgid "E1048: Item not found in script: %s" +msgstr "E1048: lment non trouv dans le script : %s" + +#, c-format +msgid "E1049: Item not exported in script: %s" +msgstr "E1049: lment non export dans le script : %s" + +#, c-format +msgid "E1052: Cannot declare an option: %s" +msgstr "E1052: Impossible de dclarer un option : %s" + +#, c-format +msgid "E1053: Could not import \"%s\"" +msgstr "E1053: Impossible d'importer \"%s\"" + +#, c-format +msgid "E1054: Variable already declared in the script: %s" +msgstr "E1054: Variable dj dclare dans le script : %s" + +msgid "E1055: Missing name after ..." +msgstr "E1055: Nom manquant aprs ..." + +#, c-format +msgid "E1056: Expected a type: %s" +msgstr "E1056: Type attendu : %s" + +msgid "E1057: Missing :enddef" +msgstr "E1057: :enddef manquant" + +msgid "E1058: Function nesting too deep" +msgstr "E1058: Fonctions trop imbriques" + +#, c-format +msgid "E1059: No white space allowed before colon: %s" +msgstr "E1059: Espace interdite avant les deux-points : %s" + +#, c-format +msgid "E1060: Expected dot after name: %s" +msgstr "E1060: point attendu aprs le nom : %s" + +#, c-format +msgid "E1061: Cannot find function %s" +msgstr "E1061: Impossible de trouver la fonction : %s" + +msgid "E1062: Cannot index a Number" +msgstr "E1062: Impossible d'indexer un Nombre" + +msgid "E1063: Type mismatch for v: variable" +msgstr "E1063: Type inconsistant pour la variable v:" + +#, c-format +msgid "E1066: Cannot declare a register: %s" +msgstr "E1066: Impossible dclarer un registre : %s" + +#, c-format +msgid "E1067: Separator mismatch: %s" +msgstr "E1067: Sparateur inconsistant : %s" + +#, c-format +msgid "E1068: No white space allowed before '%s'" +msgstr "E1068: Espace interdite avant '%s'" + +#, c-format +msgid "E1069: White space required after '%s'" +msgstr "E1069: Espace interdite aprs '%s'" + +msgid "E1070: Missing \"from\"" +msgstr "E1070: \"from\" manquant" + +msgid "E1071: Invalid string after \"from\"" +msgstr "E1071: Chane invalide aprs \"from\"" + +#, c-format +msgid "E1072: Cannot compare %s with %s" +msgstr "E1072: Impossible de comparer %s avec %s" + +#, c-format +msgid "E1073: Name already defined: %s" +msgstr "E1073: Nom dj dfini : %s" + +msgid "E1074: No white space allowed after dot" +msgstr "E1074: Espace interdite aprs un point" + +#, c-format +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Impossible de supprimer la fonction %s du script vim9" + +msgid "E1086: Cannot use :function inside :def" +msgstr "E1086: Impossible d'utiliser :function dans :def" + +msgid "E1119: Cannot change list item" +msgstr "E1119: Impossible de changer un lment de liste" + +msgid "E1120: Cannot change dict" +msgstr "E1120: Impossible de changer un dictionnaire" + +msgid "E1121: Cannot change dict item" +msgstr "E1121: Impossible de changer un lment de dictionnaire" + +#, c-format +msgid "E1122: Variable is locked: %s" +msgstr "E1122: Variable verrouille : %s" + +#, c-format +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: Virgule manquante avant un argument : %s" + +msgid "E1127: Missing name after dot" +msgstr "E1127: Nom manquant aprs un point" + +msgid "E1128: } without {" +msgstr "E1128: } sans {" + +msgid "E1130: Cannot add to null list" +msgstr "E1130: Impossible d'ajouter une liste nulle" + +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Impossible d'ajouter un Blob nul" + +msgid "E1132: Missing function argument" +msgstr "E1132: Argument de fonction manquant" + +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Impossible d'tendre un dictionnaire nul" + +#, c-format +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Utilisation d'une Chane comme un Boolen : \"%s\"" + +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Utilisation d'un Boolen comme un Nombre" + +msgid "E1141: Indexable type required" +msgstr "E1141: Type indexable requis" + +msgid "E1142: Non-empty string required" +msgstr "E1142: Chane non vide requise" + +#, c-format +msgid "E1143: Empty expression: \"%s\"" +msgstr "E1143: Expression vide : \"%s\"" + +#, c-format +msgid "E1146: Command not recognized: %s" +msgstr "E1146: Commande non reconnue : %s" + +#, c-format +msgid "E1148: Cannot index a %s" +msgstr "E1148: Impossible d'indexer %s" + # DB - todo : ou encore : msgstr "--Aucune ligne dans le tampon--" msgid "--No lines in buffer--" msgstr "--Le tampon est vide--" @@ -6717,9 +6467,21 @@ msgstr "" msgid "E171: Missing :endif" msgstr "E171: :endif manquant" +msgid "E603: :catch without :try" +msgstr "E603: :catch sans :try" + +msgid "E606: :finally without :try" +msgstr "E606: :finally sans :try" + +msgid "E607: multiple :finally" +msgstr "E607: Il ne peut y avoir qu'un seul :finally" + msgid "E600: Missing :endtry" msgstr "E600: :endtry manquant" +msgid "E602: :endtry without :try" +msgstr "E602: :endtry sans :try" + msgid "E170: Missing :endwhile" msgstr "E170: :endwhile manquant" @@ -6760,9 +6522,6 @@ msgstr "E685: Erreur interne : %s" msgid "Interrupted" msgstr "Interrompu" -msgid "E14: Invalid address" -msgstr "E14: Adresse invalide" - msgid "E474: Invalid argument" msgstr "E474: Argument invalide" @@ -6771,6 +6530,10 @@ msgid "E475: Invalid argument: %s" msgstr "E475: Argument invalide : %s" #, c-format +msgid "E983: Duplicate argument: %s" +msgstr "E983: Argument dupliqu : %s" + +#, c-format msgid "E475: Invalid value for argument %s" msgstr "E475: Valeur d'argument invalide : %s" @@ -6785,13 +6548,13 @@ msgstr "E15: Expression invalide : %s" msgid "E16: Invalid range" msgstr "E16: Plage invalide" -msgid "E476: Invalid command" -msgstr "E476: Commande invalide" - #, c-format msgid "E17: \"%s\" is a directory" msgstr "E17: \"%s\" est un rpertoire" +msgid "E756: Spell checking is not possible" +msgstr "E756: La vrification orthographique n'est pas possible" + #, c-format msgid "E364: Library call failed for \"%s()\"" msgstr "E364: L'appel la bibliothque a chou pour \"%s()\"" @@ -6830,8 +6593,8 @@ msgstr "E25: L'interface graphique n'a pas t compile dans cette version" msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" msgstr "E26: Le support de l'hbreu n'a pas t compil dans cette version\n" -msgid "E27: Farsi cannot be used: Not enabled at compile time\n" -msgstr "E27: Le support du farsi n'a pas t compil dans cette version\n" +msgid "E27: Farsi support has been removed\n" +msgstr "E27: support du farsi a t supprim\n" msgid "E800: Arabic cannot be used: Not enabled at compile time\n" msgstr "E800: Le support de l'arabe n'a pas t compil dans cette version\n" @@ -6938,6 +6701,9 @@ msgstr "E44: L'automate de regexp est corrompu" msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: L'option 'readonly' est active (ajoutez ! pour passer outre)" +msgid "E995: Cannot modify existing variable" +msgstr "E995: Impossible de modifier une variable existante" + #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: La variable \"%s\" est en lecture seule" @@ -7015,6 +6781,10 @@ msgstr "E77: Trop de noms de fichiers" msgid "E488: Trailing characters" msgstr "E488: Caractres surnumraires" +#, c-format +msgid "E488: Trailing characters: %s" +msgstr "E488: Caractres surnumraires : %s" + msgid "E78: Unknown mark" msgstr "E78: Marque inconnue" @@ -7036,6 +6806,26 @@ msgstr "E939: Quantificateur positif requis" msgid "E81: Using <SID> not in a script context" msgstr "E81: <SID> utilis en dehors d'un script" +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: Parenthses manquantes : %s" + +#, c-format +msgid "E720: Missing colon in Dictionary: %s" +msgstr "E720: Il manque ':' dans le Dictionnaire %s" + +#, c-format +msgid "E721: Duplicate key in Dictionary: \"%s\"" +msgstr "E721: Cl duplique dans le Dictionnaire : %s" + +#, c-format +msgid "E722: Missing comma in Dictionary: %s" +msgstr "E722: Il manque une virgule dans le Dictionnaire : %s" + +#, c-format +msgid "E723: Missing end of Dictionary '}': %s" +msgstr "E723: Il manque '}' la fin du Dictionnaire : %s" + msgid "E449: Invalid expression received" msgstr "E449: Expression invalide reue" @@ -7188,7 +6978,7 @@ msgid "list index out of range" msgstr "index de liste hors limites" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "erreur interne : accs un lment %d de liste a chou" msgid "slice step cannot be zero" @@ -7201,7 +6991,7 @@ msgstr "" "dcoupage en tranche tendu " #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "erreur interne : pas d'lment %d de liste vim" msgid "internal error: not enough list items" @@ -7312,19 +7102,19 @@ msgstr "excution du code a chou" msgid "E858: Eval did not return a valid python object" msgstr "E858: Eval n'a pas retourn un objet python valide" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: Conversion d'objet python une valeur de vim a chou" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "impossible de convertir %s un dictionnaire vim" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "impossible de convertir %s une liste de vim" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "impossible de convertir %s une structure de vim" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/ga.po b/src/nvim/po/ga.po index bad01d592a..abbb9c6583 100644 --- a/src/nvim/po/ga.po +++ b/src/nvim/po/ga.po @@ -2806,9 +2806,6 @@ msgstr "vimOption anaithnid" msgid "keyboard interrupt" msgstr "idirbhriseadh marchlir" -msgid "vim error" -msgstr "earrid vim" - msgid "cannot create buffer/window command: object is being deleted" msgstr "n fidir ord maolin/fuinneoige a chruth: rad scriosadh" @@ -3132,8 +3129,8 @@ msgstr "-W <aschur>\tScrobh gach ord clscrofa sa chomhad <aschur>" msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\tCuir comhaid chriptithe in eagar" -msgid "-display <display>\tConnect vim to this particular X-server" -msgstr "-display <freastala>\tNasc vim leis an bhfreastala-X seo" +msgid "-display <display>\tConnect Vim to this particular X-server" +msgstr "-display <freastala>\tNasc Vim leis an bhfreastala-X seo" msgid "-X\t\t\tDo not connect to X server" msgstr "-X\t\t\tN naisc leis an bhfreastala X" @@ -3215,11 +3212,11 @@ msgstr "" "\n" "Argint ar eolas do gvim (leagan Athena):\n" -msgid "-display <display>\tRun vim on <display>" -msgstr "-display <scilen>\tRith vim ar <scilen>" +msgid "-display <display>\tRun Vim on <display>" +msgstr "-display <scilen>\tRith Vim ar <scilen>" -msgid "-iconic\t\tStart vim iconified" -msgstr "-iconic\t\tTosaigh vim sa mhd oslaghdaithe" +msgid "-iconic\t\tStart Vim iconified" +msgstr "-iconic\t\tTosaigh Vim sa mhd oslaghdaithe" msgid "-background <color>\tUse <color> for the background (also: -bg)" msgstr "-background <dath>\tBain sid as <dath> don chlra (-bg fosta)" @@ -3270,8 +3267,8 @@ msgstr "" "\n" "Argint ar eolas do gvim (leagan GTK+):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" -msgstr "-display <scilen>\tRith vim ar <scilen> (fosta: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <scilen>\tRith Vim ar <scilen> (fosta: --display)" msgid "--role <role>\tSet a unique role to identify the main window" msgstr "--role <rl>\tSocraigh rl sainiil chun an phromhfhuinneog a aithint" @@ -4375,8 +4372,6 @@ msgstr "E538: Gan tacaocht luiche" msgid "E540: Unclosed expression sequence" msgstr "E540: Seicheamh gan dnadh" -msgid "E541: too many items" -msgstr "E541: an iomarca mreanna" msgid "E542: unbalanced groups" msgstr "E542: grpa neamhchothromaithe" @@ -6408,8 +6403,8 @@ msgstr "E799: Aitheantas neamhbhail: %ld (n mr d a bheith >= 1)" msgid "E801: ID already taken: %ld" msgstr "E801: Aitheantas in sid cheana: %ld" -msgid "List or number required" -msgstr "T g le liosta n uimhir" +msgid "E290: List or number required" +msgstr "E290: T g le liosta n uimhir" #, c-format msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)" @@ -6952,7 +6947,7 @@ msgstr "innacs liosta as raon" #. No more suitable format specifications in python-2.3 #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "earrid inmhenach: nl aon fhil ar mhr %d sa liosta vim" msgid "slice step cannot be zero" @@ -6963,7 +6958,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "iarracht ar sheicheamh nos m n %d a shannadh do shlisne fadaithe" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "earrid inmhenach: nl aon mhr %d sa liosta vim" msgid "internal error: not enough list items" @@ -7072,19 +7067,19 @@ msgstr "norbh fhidir an cd a chur ar sil" msgid "E858: Eval did not return a valid python object" msgstr "E858: N bhfuarthas rad bail python ar ais Eval" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: Norbh fhidir luach vim a dhanamh as an rad python" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "n fidir foclir vim a dhanamh as %s" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "n fidir liosta vim a dhanamh as %s" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "n fidir struchtr vim a dhanamh as %s" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/ja.euc-jp.po b/src/nvim/po/ja.euc-jp.po index e2cf68f016..5dda7c59f5 100644 --- a/src/nvim/po/ja.euc-jp.po +++ b/src/nvim/po/ja.euc-jp.po @@ -1,4 +1,3 @@ - # Japanese translation for Vim # # Do ":help uganda" in Vim to read copying and usage conditions. @@ -58,8 +57,9 @@ msgstr "E83: ХåեǤʤΤǡ¾ΤѤޤ..." msgid "E931: Buffer cannot be registered" msgstr "E931: ХåեϿǤޤ" -msgid "E937: Attempt to delete a buffer that is in use" -msgstr "E937: ΥХåե褦Ȼߤޤ" +#, c-format +msgid "E937: Attempt to delete a buffer that is in use: %s" +msgstr "E937: ΥХåե褦Ȼߤޤ: %s" msgid "E515: No buffers were unloaded" msgstr "E515: 줿ХåեϤޤ" @@ -248,6 +248,9 @@ msgstr "E904: call 3ܤΰϥꥹȷǤʤФʤޤ" msgid "E905: received unknown command: %s" msgstr "E905: ̤ΤΥޥɤޤ: %s" +msgid "E906: not an open channel" +msgstr "E906: ƤʤͥǤ" + #, c-format msgid "E630: %s(): write while not connected" msgstr "E630: %s(): ³֤ǽߤޤ" @@ -264,9 +267,6 @@ msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" msgstr "" "E912: raw nl ⡼ɤΥͥ ch_evalexpr()/ch_sendexpr() ϻȤޤ" -msgid "E906: not an open channel" -msgstr "E906: ƤʤͥǤ" - msgid "E920: _io file requires _name to be set" msgstr "E920: _io ե _name ꤬ɬפǤ" @@ -476,24 +476,12 @@ msgstr "%d ܤγ" msgid "E18: Unexpected characters in :let" msgstr "E18: ͽʸ :let ˤޤ" -#, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: ̤ѿǤ: %s" - msgid "E111: Missing ']'" msgstr "E111: ']' Ĥޤ" msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: [:] Ȥ߹碌ƤϻȤޤ" -#, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: ۤʤäѿǤ %s=" - -#, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: ѿ̾Ǥ: %s" - msgid "E806: using Float as a String" msgstr "E806: ưʸȤưäƤޤ" @@ -548,6 +536,9 @@ msgstr "E804: '%' ưȤ߹碌ƤϻȤޤ" msgid "E110: Missing ')'" msgstr "E110: ')' Ĥޤ" +msgid "E260: Missing name after ->" +msgstr "E260: -> θ̾ޤ" + msgid "E695: Cannot index a Funcref" msgstr "E695: ؿȷϥǥåǤޤ" @@ -683,25 +674,13 @@ msgstr "E736: ˤ̵Ǥ" msgid "E694: Invalid operation for Funcrefs" msgstr "E694: ؿȷˤ̵Ǥ" -msgid "map() argument" -msgstr "map() ΰ" - -msgid "filter() argument" -msgstr "filter() ΰ" - #, c-format msgid "E686: Argument of %s must be a List" msgstr "E686: %s ΰϥꥹȷǤʤФʤޤ" -msgid "E928: String required" -msgstr "E928: ʸɬפǤ" - msgid "E808: Number or Float required" msgstr "E808: ͤưɬפǤ" -msgid "add() argument" -msgstr "add() ΰ" - msgid "E785: complete() can only be used in Insert mode" msgstr "E785: complete() ⡼ɤǤѤǤޤ" @@ -709,11 +688,6 @@ msgid "&Ok" msgstr "&Ok" #, c-format -msgid "+-%s%3ld line: " -msgid_plural "+-%s%3ld lines: " -msgstr[0] "+-%s%3ld : " - -#, c-format msgid "E700: Unknown function: %s" msgstr "E700: ̤ΤδؿǤ: %s" @@ -733,15 +707,9 @@ msgstr "" msgid "called inputrestore() more often than inputsave()" msgstr "inputrestore() inputsave() ¿ƤФޤ" -msgid "insert() argument" -msgstr "insert() ΰ" - msgid "E786: Range not allowed" msgstr "E786: ϰϻϵĤƤޤ" -msgid "E916: not a valid job" -msgstr "E916: ͭʥ֤ǤϤޤ" - msgid "E701: Invalid type for len()" msgstr "E701: len() ˤ̵ʷǤ" @@ -774,35 +742,13 @@ msgstr "E941: СϤǤ˳ϤƤޤ" msgid "E942: +clientserver feature not available" msgstr "E942: +clientserver ǽ̵ˤʤäƤޤ" -msgid "remove() argument" -msgstr "remove() ΰ" - # Added at 10-Mar-2004. msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: ܥå¿ޤ (۴ĤƤǽޤ)" -msgid "reverse() argument" -msgstr "reverse() ΰ" - msgid "E258: Unable to send to client" msgstr "E258: 饤Ȥ뤳ȤǤޤ" -#, c-format -msgid "E927: Invalid action: '%s'" -msgstr "E927: ̵Ǥ: %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 ӴؿԤޤ" - msgid "(Invalid)" msgstr "(̵)" @@ -810,9 +756,6 @@ msgstr "(̵)" msgid "E935: invalid submatch number: %d" msgstr "E935: ̵ʥ֥ޥåֹ: %d" -msgid "E677: Error writing temp file" -msgstr "E677: ե˥顼ȯޤ" - msgid "E921: Invalid callback argument" msgstr "E921: ̵ʥХåǤ" @@ -860,73 +803,6 @@ msgstr "E135: *ե륿* autocommandϸߤΥХåեѹƤϤޤ" msgid "[No write since last change]\n" msgstr "[Ǹѹ¸Ƥޤ]\n" -#, c-format -msgid "%sviminfo: %s in line: " -msgstr "%sviminfo: %s : " - -msgid "E136: viminfo: Too many errors, skipping rest of file" -msgstr "E136: viminfo: 顼¿Τǡʹߤϥåפޤ" - -#, c-format -msgid "Reading viminfo file \"%s\"%s%s%s" -msgstr "viminfoե \"%s\"%s%s%s ɹ" - -msgid " info" -msgstr " " - -msgid " marks" -msgstr " ޡ" - -msgid " oldfiles" -msgstr " ե뷲" - -msgid " FAILED" -msgstr " " - -#, c-format -msgid "E137: Viminfo file is not writable: %s" -msgstr "E137: viminfoե뤬ߤǤޤ: %s" - -#, c-format -msgid "E929: Too many viminfo temp files, like %s!" -msgstr "E929: viminfoե뤬¿ޤ! : %s" - -#, c-format -msgid "E138: Can't write viminfo file %s!" -msgstr "E138: viminfoե %s ¸Ǥޤ!" - -#, c-format -msgid "Writing viminfo file \"%s\"" -msgstr "viminfoե \"%s\" " - -#, c-format -msgid "E886: Can't rename viminfo file to %s!" -msgstr "E886: viminfoե %s ̾ѹǤޤ!" - -#, c-format -msgid "# This viminfo file was generated by Vim %s.\n" -msgstr "# viminfo ե Vim %s ˤäޤ.\n" - -msgid "" -"# You may edit it if you're careful!\n" -"\n" -msgstr "" -"# ѹݤˤϽʬդƤ!\n" -"\n" - -msgid "# Value of 'encoding' when this file was written\n" -msgstr "# Υե뤬줿 'encoding' \n" - -msgid "Illegal starting char" -msgstr "ƬʸǤ" - -msgid "" -"\n" -"# Bar lines, copied verbatim:\n" -msgstr "" -"\n" -"# '|' ǻϤޤԤΡʸ̤Υԡ:\n" - msgid "Save As" msgstr "̾¸" @@ -942,7 +818,7 @@ msgstr "¸Υե \"%s\" ޤ?" #, c-format msgid "Swap file \"%s\" exists, overwrite anyway?" -msgstr "åץե \"%s\" ¸ߤޤ. ޤ?" +msgstr "åץե \"%s\" ¸ߤޤޤ?" #, c-format msgid "E768: Swap file exists: %s (:silent! overrides)" @@ -1032,15 +908,6 @@ msgstr "ѥƤιԤǸĤޤ: %s" msgid "Pattern not found: %s" msgstr "ѥϸĤޤǤ: %s" -msgid "" -"\n" -"# Last Substitute String:\n" -"$" -msgstr "" -"\n" -"# Ǹִ줿ʸ:\n" -"$" - msgid "E478: Don't panic!" msgstr "E478: ƤʤǤ" @@ -1207,18 +1074,6 @@ msgid "E666: compiler not supported: %s" msgstr "E666: ΥѥˤбƤޤ: %s" #, c-format -msgid "Searching for \"%s\" in \"%s\"" -msgstr "\"%s\" \"%s\" 鸡" - -#, c-format -msgid "Searching for \"%s\"" -msgstr "\"%s\" " - -#, c-format -msgid "not found in '%s': \"%s\"" -msgstr "'%s' ˤϤޤ: \"%s\"" - -#, c-format msgid "W20: Required python version 2.x not supported, ignoring file: %s" msgstr "W20: ᤵ줿python 2.xбƤޤե̵뤷ޤ: %s" @@ -1226,61 +1081,6 @@ msgstr "W20: ᤵ줿python 2.xбƤޤե̵뤷ޤ: %s" msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: ᤵ줿python 3.xбƤޤե̵뤷ޤ: %s" -msgid "Source Vim script" -msgstr "VimץȤμ" - -#, c-format -msgid "Cannot source a directory: \"%s\"" -msgstr "ǥ쥯ȥϼޤ: \"%s\"" - -#, c-format -msgid "could not source \"%s\"" -msgstr "\"%s\" ޤ" - -#, c-format -msgid "line %ld: could not source \"%s\"" -msgstr " %ld: \"%s\" ޤ" - -#, c-format -msgid "sourcing \"%s\"" -msgstr "\"%s\" " - -#, c-format -msgid "line %ld: sourcing \"%s\"" -msgstr " %ld: %s " - -#, c-format -msgid "finished sourcing %s" -msgstr "%s μλ" - -#, c-format -msgid "continuing in %s" -msgstr "%s μ¹Ԥ³Ǥ" - -msgid "modeline" -msgstr "⡼ɹ" - -msgid "--cmd argument" -msgstr "--cmd " - -msgid "-c argument" -msgstr "-c " - -msgid "environment variable" -msgstr "Ķѿ" - -msgid "error handler" -msgstr "顼ϥɥ" - -msgid "W15: Warning: Wrong line separator, ^M may be missing" -msgstr "W15: ٹ: ԶڤǤ. ^M ʤΤǤ礦" - -msgid "E167: :scriptencoding used outside of a sourced file" -msgstr "E167: :scriptencoding ץȰʳǻѤޤ" - -msgid "E168: :finish used outside of a sourced file" -msgstr "E168: :finish ץȰʳǻѤޤ" - #, c-format msgid "Current %slanguage: \"%s\"" msgstr "ߤ %s: \"%s\"" @@ -1471,15 +1271,6 @@ msgstr "E930: execute() Ǥ :redir ϻȤޤ" msgid "Save Redirection" msgstr "쥯Ȥ¸ޤ" -msgid "Save View" -msgstr "ӥ塼¸ޤ" - -msgid "Save Session" -msgstr "å¸ޤ" - -msgid "Save Setup" -msgstr "¸ޤ" - #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: ǥ쥯ȥǤޤ: %s" @@ -1527,9 +1318,6 @@ msgstr "" msgid "E500: Evaluates to an empty string" msgstr "E500: ʸȤɾޤ" -msgid "E195: Cannot open viminfo file for reading" -msgstr "E195: viminfoեɹѤȤƳޤ" - msgid "Untitled" msgstr "̵" @@ -1643,15 +1431,6 @@ msgstr "E788: ߤ¾ΥХåեԽ뤳Ȥϵޤ" msgid "E811: Not allowed to change buffer information now" msgstr "E811: ߤϥХåեѹ뤳Ȥϵޤ" -msgid "tagname" -msgstr "̾" - -msgid " kind file\n" -msgstr " ե\n" - -msgid "'history' option is zero" -msgstr "ץ 'history' Ǥ" - #, c-format msgid "" "\n" @@ -1922,12 +1701,6 @@ msgstr "[noeol]" msgid "[Incomplete last line]" msgstr "[ǽԤԴ]" -msgid "WARNING: The file has been changed since reading it!!!" -msgstr "ٹ: ɹ˥եѹޤ!!!" - -msgid "Do you really want to write to it" -msgstr "˾ޤ" - #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: \"%s\" Υ顼Ǥ" @@ -2079,31 +1852,6 @@ msgstr "E222: ɹХåեɲ" msgid "E223: recursive mapping" msgstr "E223: ƵŪޥåԥ" -#, c-format -msgid "E224: global abbreviation already exists for %s" -msgstr "E224: %s ȤХûϤϴ¸ߤޤ" - -#, c-format -msgid "E225: global mapping already exists for %s" -msgstr "E225: %s ȤХޥåԥϴ¸ߤޤ" - -#, c-format -msgid "E226: abbreviation already exists for %s" -msgstr "E226: %s ȤûϤϴ¸ߤޤ" - -#, c-format -msgid "E227: mapping already exists for %s" -msgstr "E227: %s Ȥޥåԥϴ¸ߤޤ" - -msgid "No abbreviation found" -msgstr "ûϤϸĤޤǤ" - -msgid "No mapping found" -msgstr "ޥåԥϸĤޤǤ" - -msgid "E228: makemap: Illegal mode" -msgstr "E228: makemap: ʥ⡼" - msgid "E851: Failed to create a new process for the GUI" msgstr "E851: GUIѤΥץεư˼Ԥޤ" @@ -2156,7 +1904,7 @@ msgid "Cancel" msgstr "" msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." -msgstr "С: ǤޤǤ." +msgstr "С: ǤޤǤ" msgid "Vim dialog" msgstr "Vim " @@ -2437,14 +2185,16 @@ msgid "E621: \"%s\" resource file has wrong version" msgstr "E621: ե \"%s\" ϥСۤʤޤ" msgid "E673: Incompatible multi-byte encoding and character set." -msgstr "E673: ߴ̵ޥХȥǥʸåȤǤ" +msgstr "E673: ߴ̵ޥХȥǥʸåȤǤ" msgid "E674: printmbcharset cannot be empty with multi-byte encoding." -msgstr "E674: ޥХȥǥǤ printmbcharset ˤǤޤ" +msgstr "" +"E674: ޥХȥǥǤ printmbcharset ˤǤޤ" msgid "E675: No default font specified for multi-byte printing." msgstr "" -"E675: ޥХʸ뤿ΥǥեȥեȤꤵƤޤ" +"E675: ޥХʸ뤿ΥǥեȥեȤꤵƤޤ" +"" msgid "E324: Can't open PostScript output file" msgstr "E324: PostScriptѤΥեޤ" @@ -2474,7 +2224,27 @@ msgid "E365: Failed to print PostScript file" msgstr "E365: PostScriptեΰ˼Ԥޤ" msgid "Print job sent." -msgstr "֤ޤ." +msgstr "֤ޤ" + +#, c-format +msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E799: ̵ ID: %d (1 ʾǤʤФʤޤ)" + +#, c-format +msgid "E801: ID already taken: %d" +msgstr "E801: ID ϤǤǤ: %d" + +#, c-format +msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E802: ̵ ID: %d (1 ʾǤʤФʤޤ)" + +#, c-format +msgid "E803: ID not found: %d" +msgstr "E803: ID Ϥޤ: %d" + +#, c-format +msgid "E798: ID is reserved for \":match\": %d" +msgstr "E798: ID \":match\" ΤͽƤޤ: %d" msgid "Add a new database" msgstr "ǡ١ɲ" @@ -2640,7 +2410,7 @@ msgid " # pid database name prepend path\n" msgstr " # pid ǡ١̾ prepend ѥ\n" msgid "Lua library cannot be loaded." -msgstr "Lua饤֥ɤǤޤ." +msgstr "Lua饤֥ɤǤޤ" msgid "cannot save undo information" msgstr "ɥ¸Ǥޤ" @@ -2648,14 +2418,14 @@ msgstr "ɥ¸Ǥޤ" msgid "" "E815: Sorry, this command is disabled, the MzScheme libraries could not be " "loaded." -msgstr "E815: Υޥɤ̵Ǥ. MzScheme 饤֥ɤǤޤ." +msgstr "E815: Υޥɤ̵ǤMzScheme 饤֥ɤǤޤ" msgid "" "E895: Sorry, this command is disabled, the MzScheme's racket/base module " "could not be loaded." msgstr "" -"E895: Υޥɤ̵Ǥʤ. MzScheme racket/base ⥸塼" -"뤬ɤǤޤǤ." +"E895: Υޥɤ̵ǤʤMzScheme racket/base ⥸塼" +"뤬ɤǤޤǤ" msgid "invalid expression" msgstr "̵ʼǤ" @@ -2729,14 +2499,14 @@ msgid "" "loaded." msgstr "" "E263: Υޥɤ̵Ǥʤ: Python饤֥ɤǤޤ" -"Ǥ." +"Ǥ" msgid "" "E887: Sorry, this command is disabled, the Python's site module could not be " "loaded." msgstr "" -"E887: Υޥɤ̵Ǥʤ. Python site ⥸塼" -"ǤޤǤ." +"E887: Υޥɤ̵ǤʤPython site ⥸塼" +"ǤޤǤ" # Added at 07-Feb-2004. msgid "E659: Cannot invoke Python recursively" @@ -2752,7 +2522,7 @@ msgid "" "E266: Sorry, this command is disabled, the Ruby library could not be loaded." msgstr "" "E266: Υޥɤ̵Ǥʤ: Ruby饤֥ɤǤޤ" -"Ǥ." +"Ǥ" msgid "E267: unexpected return" msgstr "E267: ͽ return Ǥ" @@ -2810,9 +2580,6 @@ msgstr "̤Τ vimOption Ǥ" msgid "keyboard interrupt" msgstr "ܡɳ" -msgid "vim error" -msgstr "vim 顼" - msgid "cannot create buffer/window command: object is being deleted" msgstr "" "Хåե/ɥޥɤǤޤ: ֥ȤõƤ" @@ -2838,7 +2605,7 @@ msgid "" "E571: Sorry, this command is disabled: the Tcl library could not be loaded." msgstr "" "E571: Υޥɤ̵Ǥʤ: Tcl饤֥ɤǤޤ" -"." +"" #, c-format msgid "E572: exit code %d" @@ -2865,6 +2632,10 @@ msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: JSON˽ʣޤ: \"%s\"" #, c-format +msgid "E899: Argument of %s must be a List or Blob" +msgstr "E899: %s ΰϥꥹȷޤBlobǤʤФʤޤ" + +#, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: ꥹȷ˥ޤޤ: %s" @@ -2901,7 +2672,7 @@ msgid "'-nb' cannot be used: not enabled at compile time\n" msgstr "'-nb' ԲǽǤ: ѥ̵ˤƤޤ\n" msgid "This Vim was not compiled with the diff feature." -msgstr "Vimˤdiffǽޤ(ѥ)." +msgstr "Vimˤdiffǽޤ(ѥ)" msgid "Attempt to open script file again: \"" msgstr "ץȥեƤӳȤޤ: \"" @@ -3129,7 +2900,7 @@ msgstr "-W <scriptout>\tϤޥɤե <scriptout> ¸" msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\tŹ沽줿եԽ" -msgid "-display <display>\tConnect vim to this particular X-server" +msgid "-display <display>\tConnect Vim to this particular X-server" msgstr "-display <display>\tvimꤷ X С³" msgid "-X\t\t\tDo not connect to X server" @@ -3204,10 +2975,10 @@ msgstr "" "\n" "gvimˤäƲᤵ(AthenaС):\n" -msgid "-display <display>\tRun vim on <display>" +msgid "-display <display>\tRun Vim on <display>" msgstr "-display <display>\t<display> vim¹Ԥ" -msgid "-iconic\t\tStart vim iconified" +msgid "-iconic\t\tStart Vim iconified" msgstr "-iconic\t\tǾ֤vimư" msgid "-background <color>\tUse <color> for the background (also: -bg)" @@ -3254,8 +3025,8 @@ msgstr "" "\n" "gvimˤäƲᤵ(GTK+С):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" -msgstr "-display <display>\t<display> vim¹Ԥ(Ʊ: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <display>\t<display> Vim¹Ԥ(Ʊ: --display)" msgid "--role <role>\tSet a unique role to identify the main window" msgstr "--role <role>\tᥤɥ̤դ(role)ꤹ" @@ -3279,7 +3050,7 @@ msgid ": Send failed.\n" msgstr ": ˼Ԥޤ.\n" msgid ": Send failed. Trying to execute locally\n" -msgstr ": ˼Ԥޤ. Ǥμ¹ԤߤƤޤ\n" +msgstr ": ˼ԤޤǤμ¹ԤߤƤޤ\n" #, c-format msgid "%d of %d edited" @@ -3291,6 +3062,39 @@ msgstr "ǥץ쥤ޤ: ˼Ԥޤ.\n" msgid ": Send expression failed.\n" msgstr ": ˼Ԥޤ.\n" +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: %s ȤХûϤϴ¸ߤޤ" + +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: %s ȤХޥåԥϴ¸ߤޤ" + +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: %s ȤûϤϴ¸ߤޤ" + +#, c-format +msgid "E227: mapping already exists for %s" +msgstr "E227: %s Ȥޥåԥϴ¸ߤޤ" + +msgid "No abbreviation found" +msgstr "ûϤϸĤޤǤ" + +msgid "No mapping found" +msgstr "ޥåԥϸĤޤǤ" + +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap: ʥ⡼" + +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap': %s бʸޤ" + +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap': ߥθ;ʬʸޤ: %s" + msgid "No marks set" msgstr "ޡꤵƤޤ" @@ -3426,7 +3230,7 @@ msgid "" "Maybe no changes were made or Vim did not update the swap file." msgstr "" "\n" -"餯ѹƤʤVimåץեƤޤ." +"餯ѹƤʤVimåץեƤޤ" msgid " cannot be used with this version of Vim.\n" msgstr " VimΤΥСǤϻѤǤޤ.\n" @@ -3449,7 +3253,7 @@ msgid "" "or the file has been damaged." msgstr "" ",\n" -"⤷ϥե뤬»Ƥޤ." +"⤷ϥե뤬»Ƥޤ" #, c-format msgid "" @@ -3487,7 +3291,7 @@ msgid "" "enter the new crypt key." msgstr "" "\n" -"Ź業ϤƤ." +"Ź業ϤƤ" msgid "" "\n" @@ -3501,7 +3305,7 @@ msgid "" "to use the same key for text file and swap file" msgstr "" "\n" -"åץեƱŹ業ȤenterƤ." +"åץեƱŹ業ȤenterƤ" #, c-format msgid "E309: Unable to read block 1 from %s" @@ -3547,7 +3351,7 @@ msgid "See \":help E312\" for more information." msgstr "ܺ٤ \":help E312\" ȤƤ" msgid "Recovery completed. You should check if everything is OK." -msgstr "ꥫХ꤬λޤ. ƤåƤ." +msgstr "ꥫХ꤬λޤƤåƤ" msgid "" "\n" @@ -3560,7 +3364,7 @@ msgid "and run diff with the original file to check for changes)" msgstr "ܥեȤ diff ¹ԤɤǤ礦)" msgid "Recovery completed. Buffer contents equals file contents." -msgstr "λ. ХåեƤϥեƱˤʤޤ." +msgstr "λХåեƤϥեƱˤʤޤ" msgid "" "\n" @@ -3589,6 +3393,9 @@ msgstr " ǥ쥯ȥ " msgid " -- none --\n" msgstr " -- ʤ --\n" +msgid "%a %b %d %H:%M:%S %Y" +msgstr "%Y/%m/%d (%a) %H:%M:%S" + msgid " owned by: " msgstr " ͭ: " @@ -3681,8 +3488,8 @@ msgid "E315: ml_get: invalid lnum: %ld" msgstr "E315: ml_get: ̵lnumǤ: %ld" #, c-format -msgid "E316: ml_get: cannot find line %ld" -msgstr "E316: ml_get: %ld Ĥޤ" +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get: %ld Хåե %d %s ˸Ĥޤ" msgid "E317: pointer block id wrong 3" msgstr "E317: ݥ֥åIDְäƤޤ 3" @@ -3750,10 +3557,10 @@ msgid "" " file when making changes. Quit, or continue with caution.\n" msgstr "" "\n" -"(1) ̤ΥץबƱեԽƤ뤫⤷ޤ.\n" +"(1) ̤ΥץबƱեԽƤ뤫⤷ޤ\n" " ξˤϡѹƤޤ1ĤΥեФưۤʤ2Ĥ\n" -" ǤƤޤΤǡʤ褦˵ĤƤ.\n" -" λ뤫դʤ³Ƥ.\n" +" ǤƤޤΤǡʤ褦˵ĤƤ\n" +" λ뤫դʤ³Ƥ\n" msgid "(2) An edit session for this file crashed.\n" msgstr "(2) ΥեԽåå夷.\n" @@ -3924,18 +3731,6 @@ msgstr "" "(&D)\n" "(&C)" -msgid "Select Directory dialog" -msgstr "ǥ쥯ȥ" - -msgid "Save File dialog" -msgstr "ե¸" - -msgid "Open File dialog" -msgstr "եɹ" - -msgid "E338: Sorry, no file browser in console mode" -msgstr "E338: ⡼ɤǤϥե֥饦Ȥޤʤ" - msgid "E766: Insufficient arguments for printf()" msgstr "E766: printf() ΰԽʬǤ" @@ -3945,9 +3740,6 @@ msgstr "E807: printf() ΰˤưԤƤޤ" msgid "E767: Too many arguments to printf()" msgstr "E767: printf() ΰ¿ޤ" -msgid "W10: Warning: Changing a readonly file" -msgstr "W10: ٹ: ɹѥեѹޤ" - msgid "Type number and <Enter> or click with mouse (empty cancels): " msgstr "" "ֹ<Enter>Ϥ뤫ޥǥåƤ (ǥ): " @@ -3975,6 +3767,11 @@ msgstr " (ޤޤ)" msgid "Beep!" msgstr "ӡ!" +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "%ld ÷вᤷƤޤ" + msgid "ERROR: " msgstr "顼: " @@ -3994,12 +3791,8 @@ msgstr "" "[ƽ] re/malloc() %lu, free() %lu\n" "\n" -msgid "E340: Line is becoming too long" -msgstr "E340: ԤĹʤޤ" - -#, c-format -msgid "E341: Internal error: lalloc(%ld, )" -msgstr "E341: 顼: lalloc(%ld,)" +msgid "E341: Internal error: lalloc(0, )" +msgstr "E341: 顼: lalloc(0, )" #, c-format msgid "E342: Out of memory! (allocating %lu bytes)" @@ -4073,12 +3866,6 @@ msgstr "E505: %s ɹѤǤ (ˤ ! ɲ)" msgid "E349: No identifier under cursor" msgstr "E349: ΰ֤ˤϼ̻Ҥޤ" -msgid "E774: 'operatorfunc' is empty" -msgstr "E774: 'operatorfunc' ץǤ" - -msgid "E775: Eval feature not available" -msgstr "E775: ɾǽ̵ˤʤäƤޤ" - msgid "Warning: terminal cannot highlight" msgstr "ٹ: ѤƤüϥϥ饤ȤǤޤ" @@ -4129,9 +3916,6 @@ msgstr "1 ԤǥȤޤ " msgid "%ld lines indented " msgstr "%ld ԤǥȤޤ " -msgid "E748: No previously used register" -msgstr "E748: ޤ쥸ѤƤޤ" - msgid "cannot yank; delete anyway" msgstr "Ǥޤ; Ȥˤõ" @@ -4143,14 +3927,6 @@ msgid "%ld lines changed" msgstr "%ld Ԥѹޤ" #, c-format -msgid "freeing %ld lines" -msgstr "%ld Ԥ" - -#, c-format -msgid " into \"%c" -msgstr " \"%c " - -#, c-format msgid "block of 1 line yanked%s" msgstr "1 ԤΥ֥å%sޤ" @@ -4166,10 +3942,6 @@ msgstr "%ld ԤΥ֥å%sޤ" msgid "%ld lines yanked%s" msgstr "%ld Ԥ%sޤ" -#, c-format -msgid "E353: Nothing in register %s" -msgstr "E353: 쥸 %s ˤϲ⤢ޤ" - msgid "" "\n" "--- Registers ---" @@ -4191,11 +3963,6 @@ msgstr "" msgid "E574: Unknown register type %d" msgstr "E574: ̤ΤΥ쥸 %d Ǥ" -msgid "" -"E883: search pattern and expression register may not contain two or more " -"lines" -msgstr "E883: ѥȼ쥸ˤ2ʾޤޤ" - #, c-format msgid "%ld Cols; " msgstr "%ld ; " @@ -4227,8 +3994,11 @@ msgstr "" msgid "(+%lld for BOM)" msgstr "(+%lld for BOM)" -msgid "Thanks for flying Vim" -msgstr "Vim ȤäƤƤ꤬Ȥ" +msgid "E774: 'operatorfunc' is empty" +msgstr "E774: 'operatorfunc' ץǤ" + +msgid "E775: Eval feature not available" +msgstr "E775: ɾǽ̵ˤʤäƤޤ" msgid "E518: Unknown option" msgstr "E518: ̤ΤΥץǤ" @@ -4239,6 +4009,9 @@ msgstr "E519: ץϥݡȤƤޤ" msgid "E520: Not allowed in a modeline" msgstr "E520: modeline ǤϵĤޤ" +msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" +msgstr "E992: 'modelineexpr' դλ modeline ǤϵĤޤ" + msgid "E846: Key code not set" msgstr "E846: ɤꤵƤޤ" @@ -4248,6 +4021,66 @@ msgstr "E521: = θˤϿɬפǤ" msgid "E522: Not found in termcap" msgstr "E522: termcap ˸Ĥޤ" +msgid "E946: Cannot make a terminal with running job modifiable" +msgstr "E946: ¹Υ֤üѹǽˤǤޤ" + +msgid "E590: A preview window already exists" +msgstr "E590: ץӥ塼ɥ¸ߤޤ" + +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "" +"W17: ӥʸˤUTF-8ɬפʤΤǡ':set encoding=utf-8' Ƥ" + +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: 24bitϤδĶǤϥݡȤƤޤ" + +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: %d ιԿɬפǤ" + +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: %d ΥɬפǤ" + +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: ̤ΤΥץǤ: %s" + +#, c-format +msgid "E521: Number required: &%s = '%s'" +msgstr "E521: ɬפǤ: &%s = '%s'" + +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- ü ---" + +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- Х륪ץ ---" + +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- 륪ץ ---" + +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- ץ ---" + +msgid "E356: get_varp ERROR" +msgstr "E356: get_varp 顼" + #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: ʸǤ <%s>" @@ -4256,6 +4089,13 @@ msgstr "E539: ʸǤ <%s>" msgid "For option %s" msgstr "ץ: %s" +msgid "E540: Unclosed expression sequence" +msgstr "E540: λƤޤ" + + +msgid "E542: unbalanced groups" +msgstr "E542: 롼פ礤ޤ" + msgid "E529: Cannot set 'term' to empty string" msgstr "E529: 'term' ˤ϶ʸǤޤ" @@ -4326,86 +4166,6 @@ msgstr "E536: ޤɬפǤ" msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' ϶Ǥ뤫 %s ޤɬפޤ" -msgid "E538: No mouse support" -msgstr "E538: ޥϥݡȤޤ" - -msgid "E540: Unclosed expression sequence" -msgstr "E540: λƤޤ" - -msgid "E541: too many items" -msgstr "E541: Ǥ¿ޤ" - -msgid "E542: unbalanced groups" -msgstr "E542: 롼פ礤ޤ" - -msgid "E946: Cannot make a terminal with running job modifiable" -msgstr "E946: ¹Υ֤üѹǽˤǤޤ" - -msgid "E590: A preview window already exists" -msgstr "E590: ץӥ塼ɥ¸ߤޤ" - -msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" -msgstr "" -"W17: ӥʸˤUTF-8ɬפʤΤǡ':set encoding=utf-8' Ƥ" - -msgid "E954: 24-bit colors are not supported on this environment" -msgstr "E954: 24bitϤδĶǤϥݡȤƤޤ" - -#, c-format -msgid "E593: Need at least %d lines" -msgstr "E593: %d ιԿɬפǤ" - -#, c-format -msgid "E594: Need at least %d columns" -msgstr "E594: %d ΥɬפǤ" - -#, c-format -msgid "E355: Unknown option: %s" -msgstr "E355: ̤ΤΥץǤ: %s" - -#, c-format -msgid "E521: Number required: &%s = '%s'" -msgstr "E521: ɬפǤ: &%s = '%s'" - -msgid "" -"\n" -"--- Terminal codes ---" -msgstr "" -"\n" -"--- ü ---" - -msgid "" -"\n" -"--- Global option values ---" -msgstr "" -"\n" -"--- Х륪ץ ---" - -msgid "" -"\n" -"--- Local option values ---" -msgstr "" -"\n" -"--- 륪ץ ---" - -msgid "" -"\n" -"--- Options ---" -msgstr "" -"\n" -"--- ץ ---" - -msgid "E356: get_varp ERROR" -msgstr "E356: get_varp 顼" - -#, c-format -msgid "E357: 'langmap': Matching character missing for %s" -msgstr "E357: 'langmap': %s бʸޤ" - -#, c-format -msgid "E358: 'langmap': Extra characters after semicolon: %s" -msgstr "E358: 'langmap': ߥθ;ʬʸޤ: %s" - msgid "cannot open " msgstr "ޤ " @@ -4448,7 +4208,7 @@ msgid " returned\n" msgstr " ޤ\n" msgid "ANCHOR_BUF_SIZE too small." -msgstr "ANCHOR_BUF_SIZE ޤ." +msgstr "ANCHOR_BUF_SIZE ޤ" msgid "I/O ERROR" msgstr "ϥ顼" @@ -4498,6 +4258,10 @@ msgstr "" "\n" "Vim: X Υ顼Фޤr\n" +#, c-format +msgid "restoring display %s" +msgstr "ǥץ쥤 %s Ƥޤ" + msgid "Testing the X display failed" msgstr "X display Υå˼Ԥޤ" @@ -4524,7 +4288,7 @@ msgstr "ƥƥ %s %s Ǥޤ" #, c-format msgid "Could not get security context %s for %s. Removing it!" -msgstr "ƥƥ %s %s Ǥޤ. ޤ!" +msgstr "ƥƥ %s %s Ǥޤޤ!" msgid "" "\n" @@ -4755,37 +4519,26 @@ 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: ѥĹޤ" - -msgid "E50: Too many \\z(" -msgstr "E50: \\z( ¿ޤ" - #, c-format -msgid "E51: Too many %s(" -msgstr "E51: %s( ¿ޤ" - -msgid "E52: Unmatched \\z(" -msgstr "E52: \\z( äƤޤ" +msgid "E554: Syntax error in %s{...}" +msgstr "E554: %s{...} ʸˡ顼ޤ" #, c-format -msgid "E59: invalid character after %s@" -msgstr "E59: %s@ θʸޤ" +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (NFA ɽ) ֤ޤ %s" -#, c-format -msgid "E60: Too many complex %s{...}s" -msgstr "E60: ʣ %s{...} ¿ޤ" +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: \\%#= ˤ 0, 1 ⤷ 2 Τߤ³ޤɽϼư" +"ޤ" -#, c-format -msgid "E61: Nested %s*" -msgstr "E61:%s* ҤˤʤäƤޤ" +msgid "Switching to backtracking RE engine for pattern: " +msgstr "Υѥ˥Хåȥå RE ŬѤޤ: " -#, c-format -msgid "E62: Nested %s%c" -msgstr "E62:%s%c ҤˤʤäƤޤ" +msgid "E65: Illegal back reference" +msgstr "E65: ʸȤǤ" msgid "E63: invalid use of \\_" msgstr "E63: \\_ ̵ʻˡǤ" @@ -4806,25 +4559,36 @@ msgid "E71: Invalid character after %s%%" msgstr "E71: %s%% θʸޤ" #, c-format -msgid "E554: Syntax error in %s{...}" -msgstr "E554: %s{...} ʸˡ顼ޤ" +msgid "E59: invalid character after %s@" +msgstr "E59: %s@ θʸޤ" -msgid "External submatches:\n" -msgstr "ʬ:\n" +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: ʣ %s{...} ¿ޤ" #, c-format -msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (NFA ɽ) ֤ޤ %s" +msgid "E61: Nested %s*" +msgstr "E61:%s* ҤˤʤäƤޤ" -msgid "" -"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " -"used " -msgstr "" -"E864: \\%#= ˤ 0, 1 ⤷ 2 Τߤ³ޤɽϼư" -"ޤ" +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62:%s%c ҤˤʤäƤޤ" -msgid "Switching to backtracking RE engine for pattern: " -msgstr "Υѥ˥Хåȥå RE ŬѤޤ: " +msgid "E50: Too many \\z(" +msgstr "E50: \\z( ¿ޤ" + +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: %s( ¿ޤ" + +msgid "E52: Unmatched \\z(" +msgstr "E52: \\z( äƤޤ" + +msgid "E339: Pattern too long" +msgstr "E339: ѥĹޤ" + +msgid "External submatches:\n" +msgstr "ʬ:\n" msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) Ԥɽνüãޤ" @@ -4891,6 +4655,23 @@ msgstr "E876: (NFA ɽ) NFAΤ¸ˤ϶ڡޤ" msgid "E878: (NFA) Could not allocate memory for branch traversal!" msgstr "E878: (NFA) ߲Υ֥˽ʬʥƤޤ!" +#, c-format +msgid "block of %ld line yanked%s" +msgid_plural "block of %ld lines yanked%s" +msgstr[0] "%ld ԤΥ֥å%sޤ" + +#, c-format +msgid "%ld line yanked%s" +msgid_plural "%ld lines yanked%s" +msgstr[0] "%ld Ԥ%sޤ" + +msgid "" +"\n" +"Type Name Content" +msgstr "" +"\n" +" ̾ " + msgid " VREPLACE" msgstr " ִ" @@ -4942,6 +4723,13 @@ msgstr " " msgid "recording" msgstr "Ͽ" +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion ץȰʳǻѤޤ" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: scriptversion ϥݡȤƤޤ: %d" + #, c-format msgid "E383: Invalid search string: %s" msgstr "E383: ̵ʸʸǤ: %s" @@ -5031,21 +4819,6 @@ msgstr "E797: autocommand SpellFileMissing Хåեޤ" msgid "Warning: region %s not supported" msgstr "ٹ9: %s ȤϰϤϥݡȤƤޤ" -msgid "Sorry, no suggestions" -msgstr "ǰǤϤޤ" - -#, c-format -msgid "Sorry, only %ld suggestions" -msgstr "ǰǤ %ld Ĥޤ" - -#, c-format -msgid "Change \"%.*s\" to:" -msgstr "\"%.*s\" Ѵ:" - -#, c-format -msgid " < \"%.*s\"" -msgstr " < \"%.*s\"" - msgid "E752: No previous spell replacement" msgstr "E752: ڥִޤ¹ԤƤޤ" @@ -5152,7 +4925,7 @@ msgstr "" #, c-format msgid "Wrong COMPOUNDRULES value in %s line %d: %s" -msgstr "COMPOUNDRULES ͤ˸꤬ޤ. ե %s %d : %s" +msgstr "COMPOUNDRULES ͤ˸꤬ޤե %s %d : %s" #, c-format msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s" @@ -5548,70 +5321,6 @@ msgid "" msgstr "" " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" -msgid "E679: recursive loop loading syncolor.vim" -msgstr "E679: syncolor.vim κƵƤӽФФޤ" - -#, c-format -msgid "E411: highlight group not found: %s" -msgstr "E411: ϥ饤ȥ롼פĤޤ: %s" - -#, c-format -msgid "E412: Not enough arguments: \":highlight link %s\"" -msgstr "E412: ʬǤϤʤ: \":highlight link %s\"" - -#, c-format -msgid "E413: Too many arguments: \":highlight link %s\"" -msgstr "E413: ¿ޤ: \":highlight link %s\"" - -msgid "E414: group has settings, highlight link ignored" -msgstr "E414: 롼פꤵƤΤǥϥ饤ȥ̵뤵ޤ" - -#, c-format -msgid "E415: unexpected equal sign: %s" -msgstr "E415: ͽǤ: %s" - -#, c-format -msgid "E416: missing equal sign: %s" -msgstr "E416: 椬ޤ: %s" - -#, c-format -msgid "E417: missing argument: %s" -msgstr "E417: ޤ: %s" - -#, c-format -msgid "E418: Illegal value: %s" -msgstr "E418: ͤǤ: %s" - -msgid "E419: FG color unknown" -msgstr "E419: ̤ΤʿǤ" - -msgid "E420: BG color unknown" -msgstr "E420: ̤ΤطʿǤ" - -#, c-format -msgid "E421: Color name or number not recognized: %s" -msgstr "E421: 顼ֹ̾ǧǤޤ: %s" - -#, c-format -msgid "E422: terminal code too long: %s" -msgstr "E422: üɤĹޤ: %s" - -#, c-format -msgid "E423: Illegal argument: %s" -msgstr "E423: ʰǤ: %s" - -msgid "E424: Too many different highlighting attributes in use" -msgstr "E424: ¿ΰۤʤϥ饤°ȤƤޤ" - -msgid "E669: Unprintable character in group name" -msgstr "E669: 롼̾˰Բǽʸޤ" - -msgid "W18: Invalid character in group name" -msgstr "W18: 롼̾ʸޤ" - -msgid "E849: Too many highlight and syntax groups" -msgstr "E849: ϥ饤Ȥȹʸ롼פ¿ޤ" - msgid "E555: at bottom of tag stack" msgstr "E555: åǤ" @@ -5699,7 +5408,7 @@ msgid "Duplicate field name: %s" msgstr "ʣե̾: %s" msgid "' not known. Available builtin terminals are:" -msgstr "' ̤ΤǤ. ԤȤ߹üϼΤȤǤ:" +msgstr "' ̤ΤǤԤȤ߹üϼΤȤǤ:" msgid "defaulting to '" msgstr "άͤΤ褦ꤷޤ '" @@ -5922,6 +5631,9 @@ msgstr "E125: ʰǤ: %s" msgid "E853: Duplicate argument name: %s" msgstr "E853: ̾ʣƤޤ: %s" +msgid "E989: Non-default argument follows default argument" +msgstr "E989: ǥեȰǥեȰθˤޤ" + #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: ؿΰ¿ޤ: %s" @@ -5957,6 +5669,10 @@ msgid "E117: Unknown function: %s" msgstr "E117: ̤ΤδؿǤ: %s" #, c-format +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: ؿåɤȤƻѤǤޤ: %s" + +#, c-format msgid "E933: Function was deleted: %s" msgstr "E933: ؿϺޤ: %s" @@ -6025,10 +5741,6 @@ msgid "E133: :return not inside a function" msgstr "E133: ؿ :return ޤ" #, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: å '(' ޤ: %s" - -#, c-format msgid "%s (%s, compiled %s)" msgstr "%s (%s, compiled %s)" @@ -6344,9 +6056,6 @@ msgstr "E799: ̵ ID: %ld (1 ʾǤʤФʤޤ)" msgid "E801: ID already taken: %ld" msgstr "E801: ID ϤǤǤ: %ld" -msgid "List or number required" -msgstr "ꥹȤͤɬפǤ" - #, c-format msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)" msgstr "E802: ̵ ID: %ld (1 ʾǤʤФʤޤ)" @@ -6447,9 +6156,6 @@ msgstr "E685: 顼Ǥ: %s" msgid "Interrupted" msgstr "ޤޤ" -msgid "E14: Invalid address" -msgstr "E14: ̵ʥɥ쥹Ǥ" - msgid "E474: Invalid argument" msgstr "E474: ̵ʰǤ" @@ -6624,6 +6330,9 @@ msgstr "E44: ɽץǤ" msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: 'readonly' ץꤵƤޤ (! ɲäǾ)" +msgid "E995: Cannot modify existing variable" +msgstr "E995: ¸ѿѹǤޤ" + #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: ɼѿ \"%s\" ˤͤǤޤ" @@ -6720,6 +6429,10 @@ msgstr "E939: ΥȤɬפǤ" msgid "E81: Using <SID> not in a script context" msgstr "E81: ץȰʳ<SID>Ȥޤ" +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: å '(' ޤ: %s" + msgid "E449: Invalid expression received" msgstr "E449: ̵ʼޤ" @@ -6863,7 +6576,7 @@ msgid "list index out of range" msgstr "ꥹϰϳΥǥåǤ" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "顼: vimΥꥹ %d μ˼Ԥޤ" msgid "slice step cannot be zero" @@ -6874,7 +6587,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "Ĺ %d γĥ饤ˡĹ饤Ƥ褦Ȥޤ" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "顼: vimΥꥹ %d Ϥޤ" msgid "internal error: not enough list items" @@ -6983,19 +6696,19 @@ msgstr "ɤμ¹Ԥ˼Ԥޤ" msgid "E858: Eval did not return a valid python object" msgstr "E858: ɾͭpython֥Ȥ֤ޤǤ" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: ֤줿python֥ȤvimͤѴǤޤǤ" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "%s vimμѴǤޤ" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "%s vimΥꥹȤѴǤޤ" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "%s vimι¤ΤѴǤޤ" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/ja.po b/src/nvim/po/ja.po index 85a45cd171..a169bd3589 100644 --- a/src/nvim/po/ja.po +++ b/src/nvim/po/ja.po @@ -1,4 +1,3 @@ - # Japanese translation for Vim # # Do ":help uganda" in Vim to read copying and usage conditions. @@ -58,8 +57,9 @@ msgstr "E83: バッファを作成できないので、他のを使用します. msgid "E931: Buffer cannot be registered" msgstr "E931: バッファを登録できません" -msgid "E937: Attempt to delete a buffer that is in use" -msgstr "E937: 使用中のバッファを削除しようと試みました" +#, c-format +msgid "E937: Attempt to delete a buffer that is in use: %s" +msgstr "E937: 使用中のバッファを削除しようと試みました: %s" msgid "E515: No buffers were unloaded" msgstr "E515: 解放されたバッファはありません" @@ -248,6 +248,9 @@ msgstr "E904: call の3番目の引数はリスト型でなければなりませ msgid "E905: received unknown command: %s" msgstr "E905: 未知のコマンドを受信しました: %s" +msgid "E906: not an open channel" +msgstr "E906: 開いていないチャネルです" + #, c-format msgid "E630: %s(): write while not connected" msgstr "E630: %s(): 非接続状態で書き込みました" @@ -264,9 +267,6 @@ msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" msgstr "" "E912: raw や nl モードのチャネルに ch_evalexpr()/ch_sendexpr() は使えません" -msgid "E906: not an open channel" -msgstr "E906: 開いていないチャネルです" - msgid "E920: _io file requires _name to be set" msgstr "E920: _io ファイルは _name の設定が必要です" @@ -476,24 +476,12 @@ msgstr "%d 番目の該当" msgid "E18: Unexpected characters in :let" msgstr "E18: 予期せぬ文字が :let にありました" -#, c-format -msgid "E121: Undefined variable: %s" -msgstr "E121: 未定義の変数です: %s" - msgid "E111: Missing ']'" msgstr "E111: ']' が見つかりません" msgid "E719: Cannot use [:] with a Dictionary" msgstr "E719: [:] を辞書型と組み合わせては使えません" -#, c-format -msgid "E734: Wrong variable type for %s=" -msgstr "E734: 異なった型の変数です %s=" - -#, c-format -msgid "E461: Illegal variable name: %s" -msgstr "E461: 不正な変数名です: %s" - msgid "E806: using Float as a String" msgstr "E806: 浮動小数点数を文字列として扱っています" @@ -548,6 +536,9 @@ msgstr "E804: '%' を浮動小数点数と組み合わせては使えません" msgid "E110: Missing ')'" msgstr "E110: ')' が見つかりません" +msgid "E260: Missing name after ->" +msgstr "E260: -> の後に名前がありません" + msgid "E695: Cannot index a Funcref" msgstr "E695: 関数参照型はインデックスできません" @@ -683,25 +674,13 @@ msgstr "E736: 辞書型には無効な操作です" msgid "E694: Invalid operation for Funcrefs" msgstr "E694: 関数参照型には無効な操作です" -msgid "map() argument" -msgstr "map() の引数" - -msgid "filter() argument" -msgstr "filter() の引数" - #, c-format msgid "E686: Argument of %s must be a List" msgstr "E686: %s の引数はリスト型でなければなりません" -msgid "E928: String required" -msgstr "E928: 文字列が必要です" - msgid "E808: Number or Float required" msgstr "E808: 数値か浮動小数点数が必要です" -msgid "add() argument" -msgstr "add() の引数" - msgid "E785: complete() can only be used in Insert mode" msgstr "E785: complete() は挿入モードでしか利用できません" @@ -709,11 +688,6 @@ msgid "&Ok" msgstr "&Ok" #, c-format -msgid "+-%s%3ld line: " -msgid_plural "+-%s%3ld lines: " -msgstr[0] "+-%s%3ld 行: " - -#, c-format msgid "E700: Unknown function: %s" msgstr "E700: 未知の関数です: %s" @@ -733,15 +707,9 @@ msgstr "" msgid "called inputrestore() more often than inputsave()" msgstr "inputrestore() が inputsave() よりも多く呼ばれました" -msgid "insert() argument" -msgstr "insert() の引数" - msgid "E786: Range not allowed" msgstr "E786: 範囲指定は許可されていません" -msgid "E916: not a valid job" -msgstr "E916: 有効なジョブではありません" - msgid "E701: Invalid type for len()" msgstr "E701: len() には無効な型です" @@ -774,35 +742,13 @@ msgstr "E941: サーバーはすでに開始しています" msgid "E942: +clientserver feature not available" msgstr "E942: +clientserver 機能が無効になっています" -msgid "remove() argument" -msgstr "remove() の引数" - # Added at 10-Mar-2004. msgid "E655: Too many symbolic links (cycle?)" msgstr "E655: シンボリックリンクが多過ぎます (循環している可能性があります)" -msgid "reverse() argument" -msgstr "reverse() の引数" - msgid "E258: Unable to send to client" msgstr "E258: クライアントへ送ることができません" -#, c-format -msgid "E927: Invalid action: '%s'" -msgstr "E927: 無効な操作です: %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 の比較関数が失敗しました" - msgid "(Invalid)" msgstr "(無効)" @@ -810,9 +756,6 @@ msgstr "(無効)" msgid "E935: invalid submatch number: %d" msgstr "E935: 無効なサブマッチ番号: %d" -msgid "E677: Error writing temp file" -msgstr "E677: 一時ファイル書込中にエラーが発生しました" - msgid "E921: Invalid callback argument" msgstr "E921: 無効なコールバック引数です" @@ -860,73 +803,6 @@ msgstr "E135: *フィルタ* autocommandは現在のバッファを変更して msgid "[No write since last change]\n" msgstr "[最後の変更が保存されていません]\n" -#, c-format -msgid "%sviminfo: %s in line: " -msgstr "%sviminfo: %s 行目: " - -msgid "E136: viminfo: Too many errors, skipping rest of file" -msgstr "E136: viminfo: エラーが多過ぎるので、以降はスキップします" - -#, c-format -msgid "Reading viminfo file \"%s\"%s%s%s" -msgstr "viminfoファイル \"%s\"%s%s%s を読込み中" - -msgid " info" -msgstr " 情報" - -msgid " marks" -msgstr " マーク" - -msgid " oldfiles" -msgstr " 旧ファイル群" - -msgid " FAILED" -msgstr " 失敗" - -#, c-format -msgid "E137: Viminfo file is not writable: %s" -msgstr "E137: viminfoファイルが書込みできません: %s" - -#, c-format -msgid "E929: Too many viminfo temp files, like %s!" -msgstr "E929: 一時viminfoファイルが多過ぎます! 例: %s" - -#, c-format -msgid "E138: Can't write viminfo file %s!" -msgstr "E138: viminfoファイル %s を保存できません!" - -#, c-format -msgid "Writing viminfo file \"%s\"" -msgstr "viminfoファイル \"%s\" を書込み中" - -#, c-format -msgid "E886: Can't rename viminfo file to %s!" -msgstr "E886: viminfoファイルを %s へ名前変更できません!" - -#, c-format -msgid "# This viminfo file was generated by Vim %s.\n" -msgstr "# この viminfo ファイルは Vim %s によって生成されました.\n" - -msgid "" -"# You may edit it if you're careful!\n" -"\n" -msgstr "" -"# 変更する際には十分注意してください!\n" -"\n" - -msgid "# Value of 'encoding' when this file was written\n" -msgstr "# このファイルが書かれた時の 'encoding' の値\n" - -msgid "Illegal starting char" -msgstr "不正な先頭文字です" - -msgid "" -"\n" -"# Bar lines, copied verbatim:\n" -msgstr "" -"\n" -"# '|' で始まる行の、文字通りのコピー:\n" - msgid "Save As" msgstr "別名で保存" @@ -942,7 +818,7 @@ msgstr "既存のファイル \"%s\" を上書きしますか?" #, c-format msgid "Swap file \"%s\" exists, overwrite anyway?" -msgstr "スワップファイル \"%s\" が存在します. 上書きを強制しますか?" +msgstr "スワップファイル \"%s\" が存在します。上書きを強制しますか?" #, c-format msgid "E768: Swap file exists: %s (:silent! overrides)" @@ -1032,15 +908,6 @@ msgstr "パターンが全ての行で見つかりました: %s" msgid "Pattern not found: %s" msgstr "パターンは見つかりませんでした: %s" -msgid "" -"\n" -"# Last Substitute String:\n" -"$" -msgstr "" -"\n" -"# 最後に置換された文字列:\n" -"$" - msgid "E478: Don't panic!" msgstr "E478: 慌てないでください" @@ -1207,18 +1074,6 @@ msgid "E666: compiler not supported: %s" msgstr "E666: そのコンパイラには対応していません: %s" #, c-format -msgid "Searching for \"%s\" in \"%s\"" -msgstr "\"%s\" を \"%s\" から検索中" - -#, c-format -msgid "Searching for \"%s\"" -msgstr "\"%s\" を検索中" - -#, c-format -msgid "not found in '%s': \"%s\"" -msgstr "'%s' の中にはありません: \"%s\"" - -#, c-format msgid "W20: Required python version 2.x not supported, ignoring file: %s" msgstr "W20: 要求されたpython 2.xは対応していません、ファイルを無視します: %s" @@ -1226,61 +1081,6 @@ msgstr "W20: 要求されたpython 2.xは対応していません、ファイル msgid "W21: Required python version 3.x not supported, ignoring file: %s" msgstr "W21: 要求されたpython 3.xは対応していません、ファイルを無視します: %s" -msgid "Source Vim script" -msgstr "Vimスクリプトの取込み" - -#, c-format -msgid "Cannot source a directory: \"%s\"" -msgstr "ディレクトリは取込めません: \"%s\"" - -#, c-format -msgid "could not source \"%s\"" -msgstr "\"%s\" を取込めません" - -#, c-format -msgid "line %ld: could not source \"%s\"" -msgstr "行 %ld: \"%s\" を取込めません" - -#, c-format -msgid "sourcing \"%s\"" -msgstr "\"%s\" を取込中" - -#, c-format -msgid "line %ld: sourcing \"%s\"" -msgstr "行 %ld: %s を取込中" - -#, c-format -msgid "finished sourcing %s" -msgstr "%s の取込を完了" - -#, c-format -msgid "continuing in %s" -msgstr "%s の実行を継続中です" - -msgid "modeline" -msgstr "モード行" - -msgid "--cmd argument" -msgstr "--cmd 引数" - -msgid "-c argument" -msgstr "-c 引数" - -msgid "environment variable" -msgstr "環境変数" - -msgid "error handler" -msgstr "エラーハンドラ" - -msgid "W15: Warning: Wrong line separator, ^M may be missing" -msgstr "W15: 警告: 行区切が不正です. ^M がないのでしょう" - -msgid "E167: :scriptencoding used outside of a sourced file" -msgstr "E167: :scriptencoding が取込スクリプト以外で使用されました" - -msgid "E168: :finish used outside of a sourced file" -msgstr "E168: :finish が取込スクリプト以外で使用されました" - #, c-format msgid "Current %slanguage: \"%s\"" msgstr "現在の %s言語: \"%s\"" @@ -1471,15 +1271,6 @@ msgstr "E930: execute() の中では :redir は使えません" msgid "Save Redirection" msgstr "リダイレクトを保存します" -msgid "Save View" -msgstr "ビューを保存します" - -msgid "Save Session" -msgstr "セッション情報を保存します" - -msgid "Save Setup" -msgstr "設定を保存します" - #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: ディレクトリを作成できません: %s" @@ -1527,9 +1318,6 @@ msgstr "" msgid "E500: Evaluates to an empty string" msgstr "E500: 空文字列として評価されました" -msgid "E195: Cannot open viminfo file for reading" -msgstr "E195: viminfoファイルを読込用として開けません" - msgid "Untitled" msgstr "無題" @@ -1643,15 +1431,6 @@ msgstr "E788: 現在は他のバッファを編集することは許されませ msgid "E811: Not allowed to change buffer information now" msgstr "E811: 現在はバッファ情報を変更することは許されません" -msgid "tagname" -msgstr "タグ名" - -msgid " kind file\n" -msgstr " ファイル種類\n" - -msgid "'history' option is zero" -msgstr "オプション 'history' がゼロです" - #, c-format msgid "" "\n" @@ -1922,12 +1701,6 @@ msgstr "[noeol]" msgid "[Incomplete last line]" msgstr "[最終行が不完全]" -msgid "WARNING: The file has been changed since reading it!!!" -msgstr "警告: 読込んだ後にファイルに変更がありました!!!" - -msgid "Do you really want to write to it" -msgstr "本当に上書きしますか" - #, c-format msgid "E208: Error writing to \"%s\"" msgstr "E208: \"%s\" を書込み中のエラーです" @@ -2079,31 +1852,6 @@ msgstr "E222: 読込バッファへ追加" msgid "E223: recursive mapping" msgstr "E223: 再帰的マッピング" -#, c-format -msgid "E224: global abbreviation already exists for %s" -msgstr "E224: %s というグローバル短縮入力は既に存在します" - -#, c-format -msgid "E225: global mapping already exists for %s" -msgstr "E225: %s というグローバルマッピングは既に存在します" - -#, c-format -msgid "E226: abbreviation already exists for %s" -msgstr "E226: %s という短縮入力は既に存在します" - -#, c-format -msgid "E227: mapping already exists for %s" -msgstr "E227: %s というマッピングは既に存在します" - -msgid "No abbreviation found" -msgstr "短縮入力は見つかりませんでした" - -msgid "No mapping found" -msgstr "マッピングは見つかりませんでした" - -msgid "E228: makemap: Illegal mode" -msgstr "E228: makemap: 不正なモード" - msgid "E851: Failed to create a new process for the GUI" msgstr "E851: GUI用のプロセスの起動に失敗しました" @@ -2156,7 +1904,7 @@ msgid "Cancel" msgstr "キャンセル" msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." -msgstr "スクロールバー: 画像を取得できませんでした." +msgstr "スクロールバー: 画像を取得できませんでした。" msgid "Vim dialog" msgstr "Vim ダイアログ" @@ -2437,14 +2185,16 @@ msgid "E621: \"%s\" resource file has wrong version" msgstr "E621: リソースファイル \"%s\" はバージョンが異なります" msgid "E673: Incompatible multi-byte encoding and character set." -msgstr "E673: 互換性の無いマルチバイトエンコーディングと文字セットです" +msgstr "E673: 互換性の無いマルチバイトエンコーディングと文字セットです。" msgid "E674: printmbcharset cannot be empty with multi-byte encoding." -msgstr "E674: マルチバイトエンコーディングでは printmbcharset を空にできません" +msgstr "" +"E674: マルチバイトエンコーディングでは printmbcharset を空にできません。" msgid "E675: No default font specified for multi-byte printing." msgstr "" -"E675: マルチバイト文字を印刷するためのデフォルトフォントが指定されていません" +"E675: マルチバイト文字を印刷するためのデフォルトフォントが指定されていませ" +"ん。" msgid "E324: Can't open PostScript output file" msgstr "E324: PostScript出力用のファイルを開けません" @@ -2474,7 +2224,27 @@ msgid "E365: Failed to print PostScript file" msgstr "E365: PostScriptファイルの印刷に失敗しました" msgid "Print job sent." -msgstr "印刷ジョブを送信しました." +msgstr "印刷ジョブを送信しました。" + +#, c-format +msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E799: 無効な ID: %d (1 以上でなければなりません)" + +#, c-format +msgid "E801: ID already taken: %d" +msgstr "E801: ID はすでに利用中です: %d" + +#, c-format +msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E802: 無効な ID: %d (1 以上でなければなりません)" + +#, c-format +msgid "E803: ID not found: %d" +msgstr "E803: ID はありません: %d" + +#, c-format +msgid "E798: ID is reserved for \":match\": %d" +msgstr "E798: ID は \":match\" のために予約されています: %d" msgid "Add a new database" msgstr "新データベースを追加" @@ -2640,7 +2410,7 @@ msgid " # pid database name prepend path\n" msgstr " # pid データベース名 prepend パス\n" msgid "Lua library cannot be loaded." -msgstr "Luaライブラリをロードできません." +msgstr "Luaライブラリをロードできません。" msgid "cannot save undo information" msgstr "アンドゥ情報が保存できません" @@ -2648,14 +2418,14 @@ msgstr "アンドゥ情報が保存できません" msgid "" "E815: Sorry, this command is disabled, the MzScheme libraries could not be " "loaded." -msgstr "E815: このコマンドは無効です. MzScheme ライブラリをロードできません." +msgstr "E815: このコマンドは無効です。MzScheme ライブラリをロードできません。" msgid "" "E895: Sorry, this command is disabled, the MzScheme's racket/base module " "could not be loaded." msgstr "" -"E895: このコマンドは無効です、ごめんなさい. MzScheme の racket/base モジュー" -"ルがロードできませんでした." +"E895: このコマンドは無効です、ごめんなさい。MzScheme の racket/base モジュー" +"ルがロードできませんでした。" msgid "invalid expression" msgstr "無効な式です" @@ -2729,14 +2499,14 @@ msgid "" "loaded." msgstr "" "E263: このコマンドは無効です、ごめんなさい: Pythonライブラリをロードできませ" -"んでした." +"んでした。" msgid "" "E887: Sorry, this command is disabled, the Python's site module could not be " "loaded." msgstr "" -"E887: このコマンドは無効です、ごめんなさい. Python の site モジュールをロード" -"できませんでした." +"E887: このコマンドは無効です、ごめんなさい。Python の site モジュールをロード" +"できませんでした。" # Added at 07-Feb-2004. msgid "E659: Cannot invoke Python recursively" @@ -2752,7 +2522,7 @@ msgid "" "E266: Sorry, this command is disabled, the Ruby library could not be loaded." msgstr "" "E266: このコマンドは無効です、ごめんなさい: Rubyライブラリをロードできません" -"でした." +"でした。" msgid "E267: unexpected return" msgstr "E267: 予期せぬ return です" @@ -2810,9 +2580,6 @@ msgstr "未知の vimOption です" msgid "keyboard interrupt" msgstr "キーボード割込み" -msgid "vim error" -msgstr "vim エラー" - msgid "cannot create buffer/window command: object is being deleted" msgstr "" "バッファ/ウィンドウ作成コマンドを作成できません: オブジェクトが消去されていま" @@ -2838,7 +2605,7 @@ msgid "" "E571: Sorry, this command is disabled: the Tcl library could not be loaded." msgstr "" "E571: このコマンドは無効です、ごめんなさい: Tclライブラリをロードできませんで" -"した." +"した。" #, c-format msgid "E572: exit code %d" @@ -2865,6 +2632,10 @@ msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: JSONに重複キーがあります: \"%s\"" #, c-format +msgid "E899: Argument of %s must be a List or Blob" +msgstr "E899: %s の引数はリスト型またはBlob型でなければなりません" + +#, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: リスト型にカンマがありません: %s" @@ -2901,7 +2672,7 @@ msgid "'-nb' cannot be used: not enabled at compile time\n" msgstr "'-nb' 使用不可能です: コンパイル時に無効にされています\n" msgid "This Vim was not compiled with the diff feature." -msgstr "このVimにはdiff機能がありません(コンパイル時設定)." +msgstr "このVimにはdiff機能がありません(コンパイル時設定)。" msgid "Attempt to open script file again: \"" msgstr "スクリプトファイルを再び開こうとしました: \"" @@ -3129,7 +2900,7 @@ msgstr "-W <scriptout>\t入力した全コマンドをファイル <scriptout> msgid "-x\t\t\tEdit encrypted files" msgstr "-x\t\t\t暗号化されたファイルを編集する" -msgid "-display <display>\tConnect vim to this particular X-server" +msgid "-display <display>\tConnect Vim to this particular X-server" msgstr "-display <display>\tvimを指定した X サーバーに接続する" msgid "-X\t\t\tDo not connect to X server" @@ -3204,10 +2975,10 @@ msgstr "" "\n" "gvimによって解釈される引数(Athenaバージョン):\n" -msgid "-display <display>\tRun vim on <display>" +msgid "-display <display>\tRun Vim on <display>" msgstr "-display <display>\t<display> でvimを実行する" -msgid "-iconic\t\tStart vim iconified" +msgid "-iconic\t\tStart Vim iconified" msgstr "-iconic\t\t最小化した状態でvimを起動する" msgid "-background <color>\tUse <color> for the background (also: -bg)" @@ -3254,8 +3025,8 @@ msgstr "" "\n" "gvimによって解釈される引数(GTK+バージョン):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" -msgstr "-display <display>\t<display> でvimを実行する(同義: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <display>\t<display> でVimを実行する(同義: --display)" msgid "--role <role>\tSet a unique role to identify the main window" msgstr "--role <role>\tメインウィンドウを識別する一意な役割(role)を設定する" @@ -3279,7 +3050,7 @@ msgid ": Send failed.\n" msgstr ": 送信に失敗しました.\n" msgid ": Send failed. Trying to execute locally\n" -msgstr ": 送信に失敗しました. ローカルでの実行を試みています\n" +msgstr ": 送信に失敗しました。ローカルでの実行を試みています\n" #, c-format msgid "%d of %d edited" @@ -3291,6 +3062,39 @@ msgstr "ディスプレイがありません: 式の送信に失敗しました. msgid ": Send expression failed.\n" msgstr ": 式の送信に失敗しました.\n" +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: %s というグローバル短縮入力は既に存在します" + +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: %s というグローバルマッピングは既に存在します" + +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: %s という短縮入力は既に存在します" + +#, c-format +msgid "E227: mapping already exists for %s" +msgstr "E227: %s というマッピングは既に存在します" + +msgid "No abbreviation found" +msgstr "短縮入力は見つかりませんでした" + +msgid "No mapping found" +msgstr "マッピングは見つかりませんでした" + +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap: 不正なモード" + +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap': %s に対応する文字がありません" + +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap': セミコロンの後に余分な文字があります: %s" + msgid "No marks set" msgstr "マークが設定されていません" @@ -3426,7 +3230,7 @@ msgid "" "Maybe no changes were made or Vim did not update the swap file." msgstr "" "\n" -"恐らく変更がされていないかVimがスワップファイルを更新していません." +"恐らく変更がされていないかVimがスワップファイルを更新していません。" msgid " cannot be used with this version of Vim.\n" msgstr " Vimのこのバージョンでは使用できません.\n" @@ -3449,7 +3253,7 @@ msgid "" "or the file has been damaged." msgstr "" ",\n" -"もしくはファイルが損傷しています." +"もしくはファイルが損傷しています。" #, c-format msgid "" @@ -3487,7 +3291,7 @@ msgid "" "enter the new crypt key." msgstr "" "\n" -"新しい暗号キーを入力してください." +"新しい暗号キーを入力してください。" msgid "" "\n" @@ -3501,7 +3305,7 @@ msgid "" "to use the same key for text file and swap file" msgstr "" "\n" -"スワップファイルに同じ暗号キーを使うためにenterだけを押してください." +"スワップファイルに同じ暗号キーを使うためにenterだけを押してください。" #, c-format msgid "E309: Unable to read block 1 from %s" @@ -3547,7 +3351,7 @@ msgid "See \":help E312\" for more information." msgstr "詳細は \":help E312\" を参照してください" msgid "Recovery completed. You should check if everything is OK." -msgstr "リカバリが終了しました. 全てが正しいかチェックしてください." +msgstr "リカバリが終了しました。全てが正しいかチェックしてください。" msgid "" "\n" @@ -3560,7 +3364,7 @@ msgid "and run diff with the original file to check for changes)" msgstr "原本ファイルとの diff を実行すると良いでしょう)" msgid "Recovery completed. Buffer contents equals file contents." -msgstr "復元完了. バッファの内容はファイルと同じになりました." +msgstr "復元完了。バッファの内容はファイルと同じになりました。" msgid "" "\n" @@ -3589,6 +3393,9 @@ msgstr " ディレクトリ " msgid " -- none --\n" msgstr " -- なし --\n" +msgid "%a %b %d %H:%M:%S %Y" +msgstr "%Y/%m/%d (%a) %H:%M:%S" + msgid " owned by: " msgstr " 所有者: " @@ -3681,8 +3488,8 @@ msgid "E315: ml_get: invalid lnum: %ld" msgstr "E315: ml_get: 無効なlnumです: %ld" #, c-format -msgid "E316: ml_get: cannot find line %ld" -msgstr "E316: ml_get: 行 %ld を見つけられません" +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get: 行 %ld をバッファ %d %s 内に見つけられません" msgid "E317: pointer block id wrong 3" msgstr "E317: ポインタブロックのIDが間違っています 3" @@ -3750,10 +3557,10 @@ msgid "" " file when making changes. Quit, or continue with caution.\n" msgstr "" "\n" -"(1) 別のプログラムが同じファイルを編集しているかもしれません.\n" +"(1) 別のプログラムが同じファイルを編集しているかもしれません。\n" " この場合には、変更をしてしまうと1つのファイルに対して異なる2つの\n" -" インスタンスができてしまうので、そうしないように気をつけてください.\n" -" 終了するか、注意しながら続けてください.\n" +" インスタンスができてしまうので、そうしないように気をつけてください。\n" +" 終了するか、注意しながら続けてください。\n" msgid "(2) An edit session for this file crashed.\n" msgstr "(2) このファイルの編集セッションがクラッシュした.\n" @@ -3924,18 +3731,6 @@ msgstr "" "全て放棄(&D)\n" "キャンセル(&C)" -msgid "Select Directory dialog" -msgstr "ディレクトリ選択ダイアログ" - -msgid "Save File dialog" -msgstr "ファイル保存ダイアログ" - -msgid "Open File dialog" -msgstr "ファイル読込ダイアログ" - -msgid "E338: Sorry, no file browser in console mode" -msgstr "E338: コンソールモードではファイルブラウザを使えません、ごめんなさい" - msgid "E766: Insufficient arguments for printf()" msgstr "E766: printf() の引数が不十分です" @@ -3945,9 +3740,6 @@ msgstr "E807: printf() の引数には浮動小数点数が期待されていま msgid "E767: Too many arguments to printf()" msgstr "E767: printf() の引数が多過ぎます" -msgid "W10: Warning: Changing a readonly file" -msgstr "W10: 警告: 読込専用ファイルを変更します" - msgid "Type number and <Enter> or click with mouse (empty cancels): " msgstr "" "番号と<Enter>を入力するかマウスでクリックしてください (空でキャンセル): " @@ -3975,6 +3767,11 @@ msgstr " (割込まれました)" msgid "Beep!" msgstr "ビーッ!" +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "%ld 秒経過しています" + msgid "ERROR: " msgstr "エラー: " @@ -3994,12 +3791,8 @@ msgstr "" "[呼出] 総 re/malloc() 回数 %lu, 総 free() 回数 %lu\n" "\n" -msgid "E340: Line is becoming too long" -msgstr "E340: 行が長くなり過ぎました" - -#, c-format -msgid "E341: Internal error: lalloc(%ld, )" -msgstr "E341: 内部エラー: lalloc(%ld,)" +msgid "E341: Internal error: lalloc(0, )" +msgstr "E341: 内部エラー: lalloc(0, )" #, c-format msgid "E342: Out of memory! (allocating %lu bytes)" @@ -4073,12 +3866,6 @@ msgstr "E505: %s は読込専用です (強制書込には ! を追加)" msgid "E349: No identifier under cursor" msgstr "E349: カーソルの位置には識別子がありません" -msgid "E774: 'operatorfunc' is empty" -msgstr "E774: 'operatorfunc' オプションが空です" - -msgid "E775: Eval feature not available" -msgstr "E775: 式評価機能が無効になっています" - msgid "Warning: terminal cannot highlight" msgstr "警告: 使用している端末はハイライトできません" @@ -4129,9 +3916,6 @@ msgstr "1 行をインデントしました " msgid "%ld lines indented " msgstr "%ld 行をインデントしました " -msgid "E748: No previously used register" -msgstr "E748: まだレジスタを使用していません" - msgid "cannot yank; delete anyway" msgstr "ヤンクできません; とにかく消去" @@ -4143,14 +3927,6 @@ msgid "%ld lines changed" msgstr "%ld 行が変更されました" #, c-format -msgid "freeing %ld lines" -msgstr "%ld 行を解放中" - -#, c-format -msgid " into \"%c" -msgstr " \"%c に" - -#, c-format msgid "block of 1 line yanked%s" msgstr "1 行のブロックが%sヤンクされました" @@ -4166,10 +3942,6 @@ msgstr "%ld 行のブロックが%sヤンクされました" msgid "%ld lines yanked%s" msgstr "%ld 行が%sヤンクされました" -#, c-format -msgid "E353: Nothing in register %s" -msgstr "E353: レジスタ %s には何もありません" - msgid "" "\n" "--- Registers ---" @@ -4191,11 +3963,6 @@ msgstr "" msgid "E574: Unknown register type %d" msgstr "E574: 未知のレジスタ型 %d です" -msgid "" -"E883: search pattern and expression register may not contain two or more " -"lines" -msgstr "E883: 検索パターンと式レジスタには2行以上を含められません" - #, c-format msgid "%ld Cols; " msgstr "%ld 列; " @@ -4227,8 +3994,11 @@ msgstr "" msgid "(+%lld for BOM)" msgstr "(+%lld for BOM)" -msgid "Thanks for flying Vim" -msgstr "Vim を使ってくれてありがとう" +msgid "E774: 'operatorfunc' is empty" +msgstr "E774: 'operatorfunc' オプションが空です" + +msgid "E775: Eval feature not available" +msgstr "E775: 式評価機能が無効になっています" msgid "E518: Unknown option" msgstr "E518: 未知のオプションです" @@ -4239,6 +4009,9 @@ msgstr "E519: オプションはサポートされていません" msgid "E520: Not allowed in a modeline" msgstr "E520: modeline では許可されません" +msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" +msgstr "E992: 'modelineexpr' がオフの時 modeline では許可されません" + msgid "E846: Key code not set" msgstr "E846: キーコードが設定されていません" @@ -4248,6 +4021,66 @@ msgstr "E521: = の後には数字が必要です" msgid "E522: Not found in termcap" msgstr "E522: termcap 内に見つかりません" +msgid "E946: Cannot make a terminal with running job modifiable" +msgstr "E946: 実行中のジョブがある端末は変更可能にできません" + +msgid "E590: A preview window already exists" +msgstr "E590: プレビューウィンドウが既に存在します" + +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "" +"W17: アラビア文字にはUTF-8が必要なので、':set encoding=utf-8' してください" + +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: 24bit色はこの環境ではサポートされていません" + +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: 最低 %d の行数が必要です" + +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: 最低 %d のカラム幅が必要です" + +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: 未知のオプションです: %s" + +#, c-format +msgid "E521: Number required: &%s = '%s'" +msgstr "E521: 数字が必要です: &%s = '%s'" + +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- 端末コード ---" + +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- グローバルオプション値 ---" + +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- ローカルオプション値 ---" + +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- オプション ---" + +msgid "E356: get_varp ERROR" +msgstr "E356: get_varp エラー" + #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: 不正な文字です <%s>" @@ -4256,6 +4089,13 @@ msgstr "E539: 不正な文字です <%s>" msgid "For option %s" msgstr "オプション: %s" +msgid "E540: Unclosed expression sequence" +msgstr "E540: 式が終了していません" + + +msgid "E542: unbalanced groups" +msgstr "E542: グループが釣合いません" + msgid "E529: Cannot set 'term' to empty string" msgstr "E529: 'term' には空文字列を設定できません" @@ -4326,86 +4166,6 @@ msgstr "E536: カンマが必要です" msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' は空であるか %s を含む必要があります" -msgid "E538: No mouse support" -msgstr "E538: マウスはサポートされません" - -msgid "E540: Unclosed expression sequence" -msgstr "E540: 式が終了していません" - -msgid "E541: too many items" -msgstr "E541: 要素が多過ぎます" - -msgid "E542: unbalanced groups" -msgstr "E542: グループが釣合いません" - -msgid "E946: Cannot make a terminal with running job modifiable" -msgstr "E946: 実行中のジョブがある端末は変更可能にできません" - -msgid "E590: A preview window already exists" -msgstr "E590: プレビューウィンドウが既に存在します" - -msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" -msgstr "" -"W17: アラビア文字にはUTF-8が必要なので、':set encoding=utf-8' してください" - -msgid "E954: 24-bit colors are not supported on this environment" -msgstr "E954: 24bit色はこの環境ではサポートされていません" - -#, c-format -msgid "E593: Need at least %d lines" -msgstr "E593: 最低 %d の行数が必要です" - -#, c-format -msgid "E594: Need at least %d columns" -msgstr "E594: 最低 %d のカラム幅が必要です" - -#, c-format -msgid "E355: Unknown option: %s" -msgstr "E355: 未知のオプションです: %s" - -#, c-format -msgid "E521: Number required: &%s = '%s'" -msgstr "E521: 数字が必要です: &%s = '%s'" - -msgid "" -"\n" -"--- Terminal codes ---" -msgstr "" -"\n" -"--- 端末コード ---" - -msgid "" -"\n" -"--- Global option values ---" -msgstr "" -"\n" -"--- グローバルオプション値 ---" - -msgid "" -"\n" -"--- Local option values ---" -msgstr "" -"\n" -"--- ローカルオプション値 ---" - -msgid "" -"\n" -"--- Options ---" -msgstr "" -"\n" -"--- オプション ---" - -msgid "E356: get_varp ERROR" -msgstr "E356: get_varp エラー" - -#, c-format -msgid "E357: 'langmap': Matching character missing for %s" -msgstr "E357: 'langmap': %s に対応する文字がありません" - -#, c-format -msgid "E358: 'langmap': Extra characters after semicolon: %s" -msgstr "E358: 'langmap': セミコロンの後に余分な文字があります: %s" - msgid "cannot open " msgstr "開けません " @@ -4448,7 +4208,7 @@ msgid " returned\n" msgstr " 戻りました\n" msgid "ANCHOR_BUF_SIZE too small." -msgstr "ANCHOR_BUF_SIZE が小さ過ぎます." +msgstr "ANCHOR_BUF_SIZE が小さ過ぎます。" msgid "I/O ERROR" msgstr "入出力エラー" @@ -4498,6 +4258,10 @@ msgstr "" "\n" "Vim: X のエラーを検出しましたr\n" +#, c-format +msgid "restoring display %s" +msgstr "ディスプレイ %s を復元しています" + msgid "Testing the X display failed" msgstr "X display のチェックに失敗しました" @@ -4524,7 +4288,7 @@ msgstr "セキュリティコンテキスト %s を %s に設定できません" #, c-format msgid "Could not get security context %s for %s. Removing it!" -msgstr "セキュリティコンテキスト %s を %s から取得できません. 削除します!" +msgstr "セキュリティコンテキスト %s を %s から取得できません。削除します!" msgid "" "\n" @@ -4755,37 +4519,26 @@ 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: パターンが長過ぎます" - -msgid "E50: Too many \\z(" -msgstr "E50: \\z( が多過ぎます" - #, c-format -msgid "E51: Too many %s(" -msgstr "E51: %s( が多過ぎます" - -msgid "E52: Unmatched \\z(" -msgstr "E52: \\z( が釣り合っていません" +msgid "E554: Syntax error in %s{...}" +msgstr "E554: %s{...} 内に文法エラーがあります" #, c-format -msgid "E59: invalid character after %s@" -msgstr "E59: %s@ の後に不正な文字がありました" +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (NFA 正規表現) 繰り返せません %s" -#, c-format -msgid "E60: Too many complex %s{...}s" -msgstr "E60: 複雑な %s{...} が多過ぎます" +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: \\%#= には 0, 1 もしくは 2 のみが続けられます。正規表現エンジンは自動選" +"択されます。" -#, c-format -msgid "E61: Nested %s*" -msgstr "E61:%s* が入れ子になっています" +msgid "Switching to backtracking RE engine for pattern: " +msgstr "次のパターンにバックトラッキング RE エンジンを適用します: " -#, c-format -msgid "E62: Nested %s%c" -msgstr "E62:%s%c が入れ子になっています" +msgid "E65: Illegal back reference" +msgstr "E65: 不正な後方参照です" msgid "E63: invalid use of \\_" msgstr "E63: \\_ の無効な使用方法です" @@ -4806,25 +4559,36 @@ msgid "E71: Invalid character after %s%%" msgstr "E71: %s%% の後に不正な文字がありました" #, c-format -msgid "E554: Syntax error in %s{...}" -msgstr "E554: %s{...} 内に文法エラーがあります" +msgid "E59: invalid character after %s@" +msgstr "E59: %s@ の後に不正な文字がありました" -msgid "External submatches:\n" -msgstr "外部の部分該当:\n" +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: 複雑な %s{...} が多過ぎます" #, c-format -msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (NFA 正規表現) 繰り返せません %s" +msgid "E61: Nested %s*" +msgstr "E61:%s* が入れ子になっています" -msgid "" -"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " -"used " -msgstr "" -"E864: \\%#= には 0, 1 もしくは 2 のみが続けられます。正規表現エンジンは自動選" -"択されます。" +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62:%s%c が入れ子になっています" -msgid "Switching to backtracking RE engine for pattern: " -msgstr "次のパターンにバックトラッキング RE エンジンを適用します: " +msgid "E50: Too many \\z(" +msgstr "E50: \\z( が多過ぎます" + +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: %s( が多過ぎます" + +msgid "E52: Unmatched \\z(" +msgstr "E52: \\z( が釣り合っていません" + +msgid "E339: Pattern too long" +msgstr "E339: パターンが長過ぎます" + +msgid "External submatches:\n" +msgstr "外部の部分該当:\n" msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: (NFA) 期待より早く正規表現の終端に到達しました" @@ -4891,6 +4655,23 @@ msgstr "E876: (NFA 正規表現) NFA全体を保存するには空きスペー msgid "E878: (NFA) Could not allocate memory for branch traversal!" msgstr "E878: (NFA) 現在横断中のブランチに十分なメモリを割り当てられません!" +#, c-format +msgid "block of %ld line yanked%s" +msgid_plural "block of %ld lines yanked%s" +msgstr[0] "%ld 行のブロックが%sヤンクされました" + +#, c-format +msgid "%ld line yanked%s" +msgid_plural "%ld lines yanked%s" +msgstr[0] "%ld 行が%sヤンクされました" + +msgid "" +"\n" +"Type Name Content" +msgstr "" +"\n" +"型式 名前 内容" + msgid " VREPLACE" msgstr " 仮想置換" @@ -4942,6 +4723,13 @@ msgstr " 矩形選択" msgid "recording" msgstr "記録中" +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion が取込スクリプト以外で使用されました" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: scriptversion はサポートされていません: %d" + #, c-format msgid "E383: Invalid search string: %s" msgstr "E383: 無効な検索文字列です: %s" @@ -5031,21 +4819,6 @@ msgstr "E797: autocommand の SpellFileMissing がバッファを削除しまし msgid "Warning: region %s not supported" msgstr "警告9: %s という範囲はサポートされていません" -msgid "Sorry, no suggestions" -msgstr "残念ですが、修正候補はありません" - -#, c-format -msgid "Sorry, only %ld suggestions" -msgstr "残念ですが、修正候補は %ld 個しかありません" - -#, c-format -msgid "Change \"%.*s\" to:" -msgstr "\"%.*s\" を次へ変換:" - -#, c-format -msgid " < \"%.*s\"" -msgstr " < \"%.*s\"" - msgid "E752: No previous spell replacement" msgstr "E752: スペル置換がまだ実行されていません" @@ -5152,7 +4925,7 @@ msgstr "" #, c-format msgid "Wrong COMPOUNDRULES value in %s line %d: %s" -msgstr "COMPOUNDRULES の値に誤りがあります. ファイル %s の %d 行目: %s" +msgstr "COMPOUNDRULES の値に誤りがあります。ファイル %s の %d 行目: %s" #, c-format msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s" @@ -5548,70 +5321,6 @@ msgid "" msgstr "" " TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" -msgid "E679: recursive loop loading syncolor.vim" -msgstr "E679: syncolor.vim の再帰呼び出しを検出しました" - -#, c-format -msgid "E411: highlight group not found: %s" -msgstr "E411: ハイライトグループが見つかりません: %s" - -#, c-format -msgid "E412: Not enough arguments: \":highlight link %s\"" -msgstr "E412: 引数が充分ではない: \":highlight link %s\"" - -#, c-format -msgid "E413: Too many arguments: \":highlight link %s\"" -msgstr "E413: 引数が多過ぎます: \":highlight link %s\"" - -msgid "E414: group has settings, highlight link ignored" -msgstr "E414: グループが設定されているのでハイライトリンクは無視されます" - -#, c-format -msgid "E415: unexpected equal sign: %s" -msgstr "E415: 予期せぬ等号です: %s" - -#, c-format -msgid "E416: missing equal sign: %s" -msgstr "E416: 等号がありません: %s" - -#, c-format -msgid "E417: missing argument: %s" -msgstr "E417: 引数がありません: %s" - -#, c-format -msgid "E418: Illegal value: %s" -msgstr "E418: 不正な値です: %s" - -msgid "E419: FG color unknown" -msgstr "E419: 未知の前景色です" - -msgid "E420: BG color unknown" -msgstr "E420: 未知の背景色です" - -#, c-format -msgid "E421: Color name or number not recognized: %s" -msgstr "E421: カラー名や番号を認識できません: %s" - -#, c-format -msgid "E422: terminal code too long: %s" -msgstr "E422: 終端コードが長過ぎます: %s" - -#, c-format -msgid "E423: Illegal argument: %s" -msgstr "E423: 不正な引数です: %s" - -msgid "E424: Too many different highlighting attributes in use" -msgstr "E424: 多くの異なるハイライト属性が使われ過ぎています" - -msgid "E669: Unprintable character in group name" -msgstr "E669: グループ名に印刷不可能な文字があります" - -msgid "W18: Invalid character in group name" -msgstr "W18: グループ名に不正な文字があります" - -msgid "E849: Too many highlight and syntax groups" -msgstr "E849: ハイライトと構文グループが多過ぎます" - msgid "E555: at bottom of tag stack" msgstr "E555: タグスタックの末尾です" @@ -5699,7 +5408,7 @@ msgid "Duplicate field name: %s" msgstr "重複したフィールド名: %s" msgid "' not known. Available builtin terminals are:" -msgstr "' は未知です. 現行の組み込み端末は次のとおりです:" +msgstr "' は未知です。現行の組み込み端末は次のとおりです:" msgid "defaulting to '" msgstr "省略値を次のように設定します '" @@ -5922,6 +5631,9 @@ msgstr "E125: 不正な引数です: %s" msgid "E853: Duplicate argument name: %s" msgstr "E853: 引数名が重複しています: %s" +msgid "E989: Non-default argument follows default argument" +msgstr "E989: 非デフォルト引数がデフォルト引数の後にあります" + #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: 関数の引数が多過ぎます: %s" @@ -5957,6 +5669,10 @@ msgid "E117: Unknown function: %s" msgstr "E117: 未知の関数です: %s" #, c-format +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: 関数をメソッドとして使用できません: %s" + +#, c-format msgid "E933: Function was deleted: %s" msgstr "E933: 関数は削除されました: %s" @@ -6025,10 +5741,6 @@ msgid "E133: :return not inside a function" msgstr "E133: 関数外に :return がありました" #, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: カッコ '(' がありません: %s" - -#, c-format msgid "%s (%s, compiled %s)" msgstr "%s (%s, compiled %s)" @@ -6344,9 +6056,6 @@ msgstr "E799: 無効な ID: %ld (1 以上でなければなりません)" msgid "E801: ID already taken: %ld" msgstr "E801: ID はすでに利用中です: %ld" -msgid "List or number required" -msgstr "リストか数値が必要です" - #, c-format msgid "E802: Invalid ID: %ld (must be greater than or equal to 1)" msgstr "E802: 無効な ID: %ld (1 以上でなければなりません)" @@ -6447,9 +6156,6 @@ msgstr "E685: 内部エラーです: %s" msgid "Interrupted" msgstr "割込まれました" -msgid "E14: Invalid address" -msgstr "E14: 無効なアドレスです" - msgid "E474: Invalid argument" msgstr "E474: 無効な引数です" @@ -6624,6 +6330,9 @@ msgstr "E44: 不正な正規表現プログラムです" msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: 'readonly' オプションが設定されています (! を追加で上書き)" +msgid "E995: Cannot modify existing variable" +msgstr "E995: 既存の変数を変更できません" + #, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: 読取専用変数 \"%s\" には値を設定できません" @@ -6720,6 +6429,10 @@ msgstr "E939: 正のカウントが必要です" msgid "E81: Using <SID> not in a script context" msgstr "E81: スクリプト以外で<SID>が使われました" +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: カッコ '(' がありません: %s" + msgid "E449: Invalid expression received" msgstr "E449: 無効な式を受け取りました" @@ -6863,7 +6576,7 @@ msgid "list index out of range" msgstr "リスト範囲外のインデックスです" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "内部エラー: vimのリスト要素 %d の取得に失敗しました" msgid "slice step cannot be zero" @@ -6874,7 +6587,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "長さ %d の拡張スライスに、より長いスライスを割り当てようとしました" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "内部エラー: vimのリスト要素 %d はありません" msgid "internal error: not enough list items" @@ -6983,19 +6696,19 @@ msgstr "コードの実行に失敗しました" msgid "E858: Eval did not return a valid python object" msgstr "E858: 式評価は有効なpythonオブジェクトを返しませんでした" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: 返されたpythonオブジェクトをvimの値に変換できませんでした" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "%s vimの辞書型に変換できません" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "%s をvimのリストに変換できません" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "%s をvimの構造体に変換できません" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/sr.po b/src/nvim/po/sr.po index a93a2ec584..1450ab5164 100644 --- a/src/nvim/po/sr.po +++ b/src/nvim/po/sr.po @@ -10,15 +10,92 @@ msgid "" msgstr "" "Project-Id-Version: Vim(Serbian)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-15 11:55+0400\n" -"PO-Revision-Date: 2018-05-15 10:50+0400\n" +"POT-Creation-Date: 2021-02-14 01:49+0400\n" +"PO-Revision-Date: 2021-02-14 01:54+0400\n" "Last-Translator: Ivan Pešić <ivan.pesic@gmail.com>\n" "Language-Team: Serbian\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "E163: There is only one file to edit" +msgstr "E163: Постоји само један фајл за уређивање" + +msgid "E164: Cannot go before first file" +msgstr "E164: Не може да се иде испред првог фајла" + +msgid "E165: Cannot go beyond last file" +msgstr "E165: Не може да се иде иза последњег фајла" + +msgid "E610: No argument to delete" +msgstr "E610: Нема аргумента за брисање" + +msgid "E249: window layout changed unexpectedly" +msgstr "E249: распоред прозора се неочекивано променио" + +msgid "--Deleted--" +msgstr "--Обрисано--" + +#, c-format +msgid "auto-removing autocommand: %s <buffer=%d>" +msgstr "ауто-уклањајућа аутокоманда: %s <бафер=%d>" + +#, c-format +msgid "E367: No such group: \"%s\"" +msgstr "E367: Нема такве групе: \"%s\"" + +msgid "E936: Cannot delete the current group" +msgstr "E936: Текућа група не може да се обрише" + +msgid "W19: Deleting augroup that is still in use" +msgstr "W19: Брисање augroup која је још у употреби" + +#, c-format +msgid "E215: Illegal character after *: %s" +msgstr "E215: Недозвољени карактер након *: %s" + +#, c-format +msgid "E216: No such event: %s" +msgstr "E216: Нема таквог догађаја: %s" + +#, c-format +msgid "E216: No such group or event: %s" +msgstr "E216: Нема такве групе или догађаја: %s" + +msgid "" +"\n" +"--- Autocommands ---" +msgstr "" +"\n" +"--- Аутокоманде ---" + +#, c-format +msgid "E680: <buffer=%d>: invalid buffer number " +msgstr "E680: <бафер=%d>: неисправан број бафера " + +msgid "E217: Can't execute autocommands for ALL events" +msgstr "E217: Аутокоманде за СВЕ догађаје не могу да се изврше" + +msgid "No matching autocommands" +msgstr "Нема подударајућих аутокоманди" + +msgid "E218: autocommand nesting too deep" +msgstr "E218: Угњеждавање аутокоманде је сувише дубоко" + +#, c-format +msgid "%s Autocommands for \"%s\"" +msgstr "%s Аутокоманде за \"%s\"" + +#, c-format +msgid "Executing %s" +msgstr "Извршавање %s" + +#, c-format +msgid "autocommand %s" +msgstr "аутокоманда %s" msgid "E831: bf_key_init() called with empty password" msgstr "E831: bf_key_init() је позвана са празном лозинком" @@ -53,8 +130,9 @@ msgstr "E83: Не може да се резервише меморија за б msgid "E931: Buffer cannot be registered" msgstr "E931: Бафер не може да се региструје" -msgid "E937: Attempt to delete a buffer that is in use" -msgstr "E937: Покушај брисања бафера који је у употреби" +#, c-format +msgid "E937: Attempt to delete a buffer that is in use: %s" +msgstr "E937: Покушај брисања бафера који је у употреби: %s" msgid "E515: No buffers were unloaded" msgstr "E515: Ниједан бафер није уклоњен из меморије" @@ -65,26 +143,26 @@ msgstr "E516: Ниједан бафер није обрисан" msgid "E517: No buffers were wiped out" msgstr "E517: Ниједан бафер није очишћен" -msgid "1 buffer unloaded" -msgstr "1 бафер је уклоњен из меморије" - #, c-format -msgid "%d buffers unloaded" -msgstr "%d бафера је уклоњено из меморије" - -msgid "1 buffer deleted" -msgstr "1 бафер је обрисан" +msgid "%d buffer unloaded" +msgid_plural "%d buffers unloaded" +msgstr[0] "%d бафер је уклоњен из меморије" +msgstr[1] "%d бафера је уклоњено из меморије" +msgstr[2] "%d бафера је уклоњено из меморије" #, c-format -msgid "%d buffers deleted" -msgstr "%d бафера је обрисано" - -msgid "1 buffer wiped out" -msgstr "1 бафер је очишћен" +msgid "%d buffer deleted" +msgid_plural "%d buffers deleted" +msgstr[0] "%d бафер је обрисан" +msgstr[1] "%d бафера је обрисано" +msgstr[2] "%d бафера је обрисано" #, c-format -msgid "%d buffers wiped out" -msgstr "%d бафера је очишћено" +msgid "%d buffer wiped out" +msgid_plural "%d buffers wiped out" +msgstr[0] "%d бафер је очишћен" +msgstr[1] "%d бафера је очишћено" +msgstr[2] "%d бафера је очишћено" msgid "E90: Cannot unload last buffer" msgstr "E90: Последњи бафер не може да се уклони из меморије" @@ -102,10 +180,9 @@ msgid "E88: Cannot go before first buffer" msgstr "E88: Не може да се иде испред првог бафера" #, c-format -msgid "E89: No write since last change for buffer %ld (add ! to override)" +msgid "E89: No write since last change for buffer %d (add ! to override)" msgstr "" -"E89: Од последње измене није било уписа за бафер %ld (додајте ! да " -"премостите)" +"E89: Од последње измене није било уписа за бафер %d (додајте ! да премостите)" msgid "E948: Job still running (add ! to end the job)" msgstr "E948: Задатак се још извршава (додајте ! да зауставите задатак)" @@ -161,12 +238,11 @@ msgid "[readonly]" msgstr "[само за читање]" #, c-format -msgid "1 line --%d%%--" -msgstr "1 линија --%d%%--" - -#, c-format -msgid "%ld lines --%d%%--" -msgstr "%ld линија --%d%%--" +msgid "%ld line --%d%%--" +msgid_plural "%ld lines --%d%%--" +msgstr[0] "%ld линија --%d%%--" +msgstr[1] "%ld линијe --%d%%--" +msgstr[2] "%ld линија --%d%%--" #, c-format msgid "line %ld of %ld --%d%%-- col " @@ -193,45 +269,174 @@ msgstr "Дно" msgid "Top" msgstr "Врх" -msgid "" -"\n" -"# Buffer list:\n" -msgstr "" -"\n" -"# Листа бафера:\n" - msgid "E382: Cannot write, 'buftype' option is set" msgstr "E382: Упис није могућ, постављена је 'buftype' опција" +msgid "[Prompt]" +msgstr "[Одзив]" + +msgid "[Popup]" +msgstr "[Балон]" + msgid "[Scratch]" msgstr "[Празно]" +msgid "WARNING: The file has been changed since reading it!!!" +msgstr "УПОЗОРЕЊЕ: Овај фајл је промењен од кад је прочитан!!!" + +msgid "Do you really want to write to it" +msgstr "Да ли заиста желите да пишете у њега" + +msgid "[New]" +msgstr "[Ново]" + +msgid "[New File]" +msgstr "[Нов фајл]" + +msgid "E676: No matching autocommands for acwrite buffer" +msgstr "E676: Нема одговарајућих аутокоманди за acwrite бафер" + +msgid "E203: Autocommands deleted or unloaded buffer to be written" +msgstr "" +"E203: Аутокоманде су обрисале или уклониле из меморије бафер који требало да " +"буде уписан" + +msgid "E204: Autocommand changed number of lines in unexpected way" +msgstr "E204: Аутокоманде су на неочекиван начин промениле број линија" + +msgid "NetBeans disallows writes of unmodified buffers" +msgstr "NetBeans не дозвољава упис неизмењених бафера" + +msgid "Partial writes disallowed for NetBeans buffers" +msgstr "Парцијални уписи нису дозвољени за NetBeans бафере" + +msgid "is a directory" +msgstr "је директоријум" + +msgid "is not a file or writable device" +msgstr "није фајл или уређај на који може да се уписује" + +msgid "writing to device disabled with 'opendevice' option" +msgstr "упис на уређај је онемогућен опцијом 'opendevice'" + +msgid "is read-only (add ! to override)" +msgstr "је само за читање (додајте ! за премошћавање)" + +msgid "E506: Can't write to backup file (add ! to override)" +msgstr "E506: Не може да се упише у резервни фајл (додајте ! за премошћавање)" + +msgid "E507: Close error for backup file (add ! to override)" +msgstr "" +"E507: Грешка код затварања за резервни фајл (додајте ! за премошћавање)" + +msgid "E508: Can't read file for backup (add ! to override)" +msgstr "E508: Резервни фајл не може да се прочита (додајте ! за премошћавање)" + +msgid "E509: Cannot create backup file (add ! to override)" +msgstr "E509: Резервни фајл не може да се креира (додајте ! за премошћавање)" + +msgid "E510: Can't make backup file (add ! to override)" +msgstr "E510: Резервни фајл не може да се направи (додајте ! за премошћавање)" + +msgid "E214: Can't find temp file for writing" +msgstr "E214: Привремени фајл за упис не може да се пронађе" + +msgid "E213: Cannot convert (add ! to write without conversion)" +msgstr "E213: Конверзија није могућа (додајте ! за упис без конверзије)" + +msgid "E166: Can't open linked file for writing" +msgstr "E166: Повезани фајл не може да се отвори за упис" + +msgid "E212: Can't open file for writing" +msgstr "E212: фајл не може да се отвори за упис" + +msgid "E949: File changed while writing" +msgstr "E949: фајл је промењен током уписа" + +msgid "E512: Close failed" +msgstr "E512: Затварање није успело" + +msgid "E513: write error, conversion failed (make 'fenc' empty to override)" +msgstr "" +"E513: грешка при упису, конверзија није успела (оставите 'fenc' празно да " +"премостите)" + +#, c-format +msgid "" +"E513: write error, conversion failed in line %ld (make 'fenc' empty to " +"override)" +msgstr "" +"E513: грешка при упису, конверзија није успела у линији %ld (оставите 'fenc' " +"празно да премостите)" + +msgid "E514: write error (file system full?)" +msgstr "E514: грешка при упису (систем фајлова је пун?)" + +msgid " CONVERSION ERROR" +msgstr " ГРЕШКА КОНВЕРЗИЈЕ" + +#, c-format +msgid " in line %ld;" +msgstr " у линији %ld;" + +msgid "[NOT converted]" +msgstr "[НИЈЕ конвертовано]" + +msgid "[converted]" +msgstr "[конвертовано]" + +msgid "[Device]" +msgstr "[Уређај]" + +msgid " [a]" +msgstr " [н]" + +msgid " appended" +msgstr " настављено" + +msgid " [w]" +msgstr " [у]" + +msgid " written" +msgstr " уписано" + +msgid "E205: Patchmode: can't save original file" +msgstr "E205: Patch режим: оригинални фајл не може да се сачува" + +msgid "E206: patchmode: can't touch empty original file" +msgstr "E206: Patch режим: не може да се креира празан оригинални фајл" + +msgid "E207: Can't delete backup file" +msgstr "E207: Резервни фајл не може да се обрише" + msgid "" "\n" -"--- Signs ---" +"WARNING: Original file may be lost or damaged\n" msgstr "" "\n" -"--- Знаци ---" +"УПОЗОРЕЊЕ: Оригинални фајл је можда изгубљен или оштећен\n" -#, c-format -msgid "Signs for %s:" -msgstr "Знаци за %s:" +msgid "don't quit the editor until the file is successfully written!" +msgstr "не напуштајте едитор док се фајл успешно не упише!" -#, c-format -msgid " line=%ld id=%d name=%s" -msgstr " линија=%ld ид=%d име=%s" +msgid "W10: Warning: Changing a readonly file" +msgstr "W10: Упозорење: Мења се фајл који може само да се чита" msgid "E902: Cannot connect to port" msgstr "E902: Повезивање на порт није могуће" +msgid "E898: socket() in channel_connect()" +msgstr "E898: socket() у channel_connect()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: getaddrinfo() у channel_open(): %s" + msgid "E901: gethostbyname() in channel_open()" msgstr "E901: gethostbyname() у channel_open()" -msgid "E898: socket() in channel_open()" -msgstr "E898: socket() у channel_open()" - msgid "E903: received command with non-string argument" -msgstr "E903: примњена команда са аргуменом који није стринг" +msgstr "E903: примљена команда са аргументом који није стринг" msgid "E904: last argument for expr/call must be a number" msgstr "E904: последњи аргумент за expr/call мора бити број" @@ -243,6 +448,9 @@ msgstr "E904: трећи аргумент за call мора бити листа msgid "E905: received unknown command: %s" msgstr "E905: примљена непозната команда: %s" +msgid "E906: not an open channel" +msgstr "E906: није отворен канал" + #, c-format msgid "E630: %s(): write while not connected" msgstr "E630: %s(): упис док није успостављена веза" @@ -290,21 +498,50 @@ msgstr "Кључеви нису исти!" msgid "[crypted]" msgstr "[шифровано]" +msgid "Entering Debug mode. Type \"cont\" to continue." +msgstr "Улазак у Debug режим. Откуцајте \"cont\" за наставак." + #, c-format -msgid "E720: Missing colon in Dictionary: %s" -msgstr "E720: Недостаје тачка-зарез у Речнику: %s" +msgid "Oldval = \"%s\"" +msgstr "Старавред = \"%s\"" #, c-format -msgid "E721: Duplicate key in Dictionary: \"%s\"" -msgstr "E721: Дупликат кључа у Речнику: \"%s\"" +msgid "Newval = \"%s\"" +msgstr "Новавред = \"%s\"" #, c-format -msgid "E722: Missing comma in Dictionary: %s" -msgstr "E722: Недостаје зарез у Речнику: %s" +msgid "line %ld: %s" +msgstr "линија %ld: %s" + +#, c-format +msgid "cmd: %s" +msgstr "ком: %s" + +msgid "frame is zero" +msgstr "оквир је нула" #, c-format -msgid "E723: Missing end of Dictionary '}': %s" -msgstr "E723: Недостаје крај Речника '}': %s" +msgid "frame at highest level: %d" +msgstr "оквир је на највишем нивоу: %d" + +#, c-format +msgid "Breakpoint in \"%s%s\" line %ld" +msgstr "Прекидна тачка у \"%s%s\" линија %ld" + +#, c-format +msgid "E161: Breakpoint not found: %s" +msgstr "E161: Прекидна тачка није пронађена: %s" + +msgid "No breakpoints defined" +msgstr "Није дефинисана ниједна прекидна тачка" + +#, c-format +msgid "%3d %s %s line %ld" +msgstr "%3d %s %s линија %ld" + +#, c-format +msgid "%3d expr %s" +msgstr "%3d израз %s" msgid "extend() argument" msgstr "extend() аргумент" @@ -589,6 +826,9 @@ msgstr "E910: Користи се Job као Number" msgid "E913: Using a Channel as a Number" msgstr "E913: Користи се Channel као Number" +msgid "E974: Using a Blob as a Number" +msgstr "E974: Користи се Blob као Number" + msgid "E891: Using a Funcref as a Float" msgstr "E891: Користи се Funcref као Float" @@ -610,6 +850,9 @@ msgstr "E911: Користи се Job као Float" msgid "E914: Using a Channel as a Float" msgstr "E914: Користи се Channel као Float" +msgid "E975: Using a Blob as a Float" +msgstr "E975: Користи се Blob као Float" + msgid "E729: using Funcref as a String" msgstr "E729: користи се Funcref као String" @@ -619,48 +862,27 @@ msgstr "E730: користи се List као String" msgid "E731: using Dictionary as a String" msgstr "E731: користи се Dictionary као String" +msgid "E976: using Blob as a String" +msgstr "E976: коришћење Blob као String" + msgid "E908: using an invalid value as a String" msgstr "E908: користи се недозвољена вредност као String" -#, c-format -msgid "E795: Cannot delete variable %s" -msgstr "E795: Променљива %s не може да се обрише" - -#, c-format -msgid "E704: Funcref variable name must start with a capital: %s" -msgstr "E704: Име Funcref мора да почне великим словом: %s" - -#, c-format -msgid "E705: Variable name conflicts with existing function: %s" -msgstr "E705: Име променљиве је у конфликту са постојећом функцијом: %s" - -#, c-format -msgid "E741: Value is locked: %s" -msgstr "E741: Вредност је закључана: %s" - -msgid "Unknown" -msgstr "Непознато" - -#, c-format -msgid "E742: Cannot change value of %s" -msgstr "E742: Вредност %s не може да се промени" - msgid "E698: variable nested too deep for making a copy" msgstr "E698: променљива је предубоко угњеждена да би се направила копија" msgid "" "\n" -"# global variables:\n" -msgstr "" -"\n" -"# глобалне променљиве:\n" - -msgid "" -"\n" "\tLast set from " msgstr "" "\n" -"\tПоследњи сет од " +"\tПоследње постављено из " + +msgid " line " +msgstr " линија " + +msgid "E977: Can only compare Blob with Blob" +msgstr "E977: Blob може да се пореди само са Blob" msgid "E691: Can only compare List with List" msgstr "E691: List може да се пореди само са List" @@ -728,31 +950,18 @@ msgstr "" msgid "called inputrestore() more often than inputsave()" msgstr "inputrestore() је позвана више пута него inputsave()" -msgid "insert() argument" -msgstr "insert() аргумент" - msgid "E786: Range not allowed" msgstr "E786: Опсег није дозвољен" -msgid "E916: not a valid job" -msgstr "E916: није валидан job" - msgid "E701: Invalid type for len()" msgstr "E701: Неисправан тип за len()" -#, c-format -msgid "E798: ID is reserved for \":match\": %ld" -msgstr "E798: ИД је резервисан за \":match\": %ld" - msgid "E726: Stride is zero" msgstr "E726: Корак је нула" msgid "E727: Start past end" msgstr "E727: Почетак иза краја" -msgid "<empty>" -msgstr "<празно>" - msgid "E240: No connection to the X server" msgstr "E240: Нема везе са X сервером" @@ -1026,15 +1235,6 @@ msgstr "Шаблон је пронаћен у свакој линији: %s" msgid "Pattern not found: %s" msgstr "Шаблон није пронађен: %s" -msgid "" -"\n" -"# Last Substitute String:\n" -"$" -msgstr "" -"\n" -"# Последњи Стринг за замену:\n" -"$" - msgid "E478: Don't panic!" msgstr "E478: Не паничите!" @@ -1409,7 +1609,7 @@ msgid "E185: Cannot find color scheme '%s'" msgstr "E185: Шема боја '%s' не може да се пронађе" msgid "Greetings, Vim user!" -msgstr "Поздрав, корисниче Vim-a" +msgstr "Поздрав, корисниче програма Vim!" msgid "E784: Cannot close last tab page" msgstr "E784: Последња картица не може да се затвори" @@ -1436,7 +1636,7 @@ msgstr "" "премошћавање)" msgid "E186: No previous directory" -msgstr "E186: Нема претгодног директоријума" +msgstr "E186: Нема претходног директоријума" msgid "E187: Unknown" msgstr "E187: Непознато" @@ -1460,15 +1660,6 @@ msgstr "E930: :redir не може да се користи унутар execute msgid "Save Redirection" msgstr "Сачувај Редирекцију" -msgid "Save View" -msgstr "Сачувај Поглед" - -msgid "Save Session" -msgstr "Сачувај Сесију" - -msgid "Save Setup" -msgstr "Сачувај Подешавање" - #, c-format msgid "E739: Cannot create directory: %s" msgstr "E739: Директоријум не може да се креира: %s" @@ -1574,15 +1765,6 @@ msgstr "Прекид" msgid "E579: :if nesting too deep" msgstr "E579: :if угњеждавање је сувише дубоко" -msgid "E580: :endif without :if" -msgstr "E580: :endif без :if" - -msgid "E581: :else without :if" -msgstr "E581: :else без :if" - -msgid "E582: :elseif without :if" -msgstr "E582: :elseif без :if" - msgid "E583: multiple :else" msgstr "E583: вишеструко :else" @@ -1592,35 +1774,23 @@ msgstr "E584: :elseif након :else" msgid "E585: :while/:for nesting too deep" msgstr "E585: :while/:for угњеждавање је сувише дубоко" -msgid "E586: :continue without :while or :for" -msgstr "E586: :continue без :while или :for" - -msgid "E587: :break without :while or :for" -msgstr "E587: :break без :while или :for" - msgid "E732: Using :endfor with :while" msgstr "E732: Коришћење :endfor са :while" msgid "E733: Using :endwhile with :for" msgstr "E733: Коришћење :endwhile са :for" +msgid "E579: block nesting too deep" +msgstr "E579: угњеждавање блокова је сувише дубоко" + msgid "E601: :try nesting too deep" msgstr "E601: :try угњеждавање је сувише дубоко" -msgid "E603: :catch without :try" -msgstr "E603: :catch без :try" - msgid "E604: :catch after :finally" msgstr "E604: :catch након :finally" -msgid "E606: :finally without :try" -msgstr "E606: :finally без :try" - -msgid "E607: multiple :finally" -msgstr "E607: вишеструко :finally" - -msgid "E602: :endtry without :try" -msgstr "E602: :endtry без :try" +msgid "E193: :enddef not inside a function" +msgstr "E193: :enddef није унутар функције" msgid "E193: :endfunction not inside a function" msgstr "E193: :endfunction није унутар функције" @@ -1991,72 +2161,69 @@ msgstr "E462: Припрема за поновно учитавање \"%s\" н msgid "E321: Could not reload \"%s\"" msgstr "E321: \"%s\" не може поново да се учита" -msgid "--Deleted--" -msgstr "--Обрисано--" +msgid "E219: Missing {." +msgstr "E219: Недостаје {." -#, c-format -msgid "auto-removing autocommand: %s <buffer=%d>" -msgstr "ауто-уклањајућа аутокоманда: %s <бафер=%d>" +msgid "E220: Missing }." +msgstr "E220: Недостаје }." -#, c-format -msgid "E367: No such group: \"%s\"" -msgstr "E367: Нема такве групе: \"%s\"" +msgid "<empty>" +msgstr "<празно>" -msgid "E936: Cannot delete the current group" -msgstr "E936: Текућа група не може да се обрише" +msgid "E655: Too many symbolic links (cycle?)" +msgstr "E655: Превише симболичких веза (циклус?)" -msgid "W19: Deleting augroup that is still in use" -msgstr "W19: Брисање augroup која је још у употреби" +msgid "writefile() first argument must be a List or a Blob" +msgstr "Први аргумент writefile() мора бити Листа или Блоб" -#, c-format -msgid "E215: Illegal character after *: %s" -msgstr "E215: Недозвољени карактер након *: %s" +msgid "Select Directory dialog" +msgstr "Дијалог избора директоријума" -#, c-format -msgid "E216: No such event: %s" -msgstr "E216: Нема таквог догађаја: %s" +msgid "Save File dialog" +msgstr "Дијалог чувања фајла" -#, c-format -msgid "E216: No such group or event: %s" -msgstr "E216: Нема такве групе или догађаја: %s" +msgid "Open File dialog" +msgstr "Дијалог отварања фајла" -msgid "" -"\n" -"--- Autocommands ---" -msgstr "" -"\n" -"--- Аутокоманде ---" +msgid "E338: Sorry, no file browser in console mode" +msgstr "E338: Жао нам је, нема претраживача фајлова у конзолном режиму" -#, c-format -msgid "E680: <buffer=%d>: invalid buffer number " -msgstr "E680: <бафер=%d>: неисправан број бафера " +msgid "no matches" +msgstr "нема подударања" -msgid "E217: Can't execute autocommands for ALL events" -msgstr "E217: Аутокоманде за СВЕ догађаје не могу да се изврше" +msgid "E854: path too long for completion" +msgstr "E854: путања је сувише дугачка да би се довршила" -msgid "No matching autocommands" -msgstr "Нема подударајућих аутокоманди" +#, c-format +msgid "" +"E343: Invalid path: '**[number]' must be at the end of the path or be " +"followed by '%s'." +msgstr "" +"E343: Неисправна путања: '**[број]' мора бити на крају путање или да иза " +"њега следи '%s'." -msgid "E218: autocommand nesting too deep" -msgstr "E218: Угњеждавање аутокоманде је сувише дубоко" +#, c-format +msgid "E344: Can't find directory \"%s\" in cdpath" +msgstr "E344: Директоријум \"%s\" не може да се пронађе у cdpath" #, c-format -msgid "%s Autocommands for \"%s\"" -msgstr "%s Аутокоманде за \"%s\"" +msgid "E345: Can't find file \"%s\" in path" +msgstr "E345: Фајл \"%s\" не може да се пронађе у path" #, c-format -msgid "Executing %s" -msgstr "Извршавање %s" +msgid "E346: No more directory \"%s\" found in cdpath" +msgstr "E346: Директоријум \"%s\" више не може да се пронађе у cdpath" #, c-format -msgid "autocommand %s" -msgstr "аутокоманда %s" +msgid "E347: No more file \"%s\" found in path" +msgstr "E347: Фајл \"%s\" више не може да се пронађе у path" -msgid "E219: Missing {." -msgstr "E219: Недостаје {." +msgid "E446: No file name under cursor" +msgstr "E446: Под курсором се не налази име фајла" -msgid "E220: Missing }." -msgstr "E220: Недостаје }." +#, c-format +msgid "E447: Can't find file \"%s\" in path" +msgstr "E447: Фајл \"%s\" не може да се пронађе у путањи" msgid "E490: No fold found" msgstr "E490: Није пронађено ниједно склапање" @@ -2126,10 +2293,6 @@ msgstr "E231: 'guifontwide' неисправан" msgid "E599: Value of 'imactivatekey' is invalid" msgstr "E599: Вредност 'imactivatekey' није исправна" -#, c-format -msgid "E254: Cannot allocate color %s" -msgstr "E254: Боја %s не може да се алоцира" - msgid "No match at cursor, finding next" msgstr "Нема подударања на месту курсора, тражи се даље" @@ -2165,15 +2328,15 @@ msgid "E232: Cannot create BalloonEval with both message and callback" msgstr "" "E232: Не може да се креира BalloonEval и са поруком и са повратним позивом" -msgid "_Cancel" -msgstr "_Откажи" - msgid "_Save" msgstr "_Сачувај" msgid "_Open" msgstr "_Отвори" +msgid "_Cancel" +msgstr "_Откажи" + msgid "_OK" msgstr "_OK" @@ -2288,11 +2451,11 @@ msgstr "О&позови" msgid "Open tab..." msgstr "Отвори картицу" -msgid "Find string (use '\\\\' to find a '\\')" -msgstr "Пронађи стринг (користите '\\\\' да пронађете '\\')" +msgid "Find string" +msgstr "Пронађи стринг" -msgid "Find & Replace (use '\\\\' to find a '\\')" -msgstr "Пронађи & Замени (користите '\\\\' да пронађете '\\')" +msgid "Find & Replace" +msgstr "Пронађи & Замени" msgid "Not Used" msgstr "Не користи се" @@ -2308,6 +2471,9 @@ msgstr "E671: Наслов прозора \"%s\" не може да се про msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." msgstr "E243: Аргумент није подржан: \"-%s\"; Користите OLE верзију." +msgid "E988: GUI cannot be used. Cannot execute gvim.exe." +msgstr "E988: ГКИ не може да се користи. Није могуће извршавање gvim.exe." + msgid "E672: Unable to open window inside MDI application" msgstr "E672: Није могуће отварање прозора унутар MDI апликације" @@ -2317,7 +2483,7 @@ msgstr "" #, c-format msgid "E250: Fonts for the following charsets are missing in fontset %s:" -msgstr "E250: Фонтови за следеће сетове карактера недостају у фонтсету %s:" +msgstr "E250: У фонтсету %s недостају фонтови за следеће скупове карактера:" #, c-format msgid "E252: Fontset name: %s" @@ -2325,7 +2491,7 @@ msgstr "E252: Име фонтсета: %s" #, c-format msgid "Font '%s' is not fixed-width" -msgstr "Фонт %s' није фиксне ширине" +msgstr "Фонт '%s' није фиксне ширине" #, c-format msgid "E253: Fontset name: %s" @@ -2336,20 +2502,39 @@ msgid "Font0: %s" msgstr "Фонт0: %s" #, c-format -msgid "Font1: %s" -msgstr "Фонт1: %s" +msgid "Font%d: %s" +msgstr "Фонт%d: %s" #, c-format -msgid "Font%ld width is not twice that of font0" -msgstr "Ширина фонт%ld није двострука од ширине фонт0" +msgid "Font%d width is not twice that of font0" +msgstr "Фонт%d није два пута шири од фонт0" #, c-format -msgid "Font0 width: %ld" -msgstr "Фонт0 ширина: %ld" +msgid "Font0 width: %d" +msgstr "Фонт0 ширина: %d" #, c-format -msgid "Font1 width: %ld" -msgstr "Фонт1 ширина: %ld" +msgid "Font%d width: %d" +msgstr "Фонт%d ширина: %d" + +msgid "E284: Cannot set IC values" +msgstr "E284: IC вредности не могу да се поставе" + +msgid "E285: Failed to create input context" +msgstr "E285: Креирање контекста уноса није успело" + +msgid "E286: Failed to open input method" +msgstr "E286: Отварање методе уноса није успело" + +msgid "E287: Warning: Could not set destroy callback to IM" +msgstr "" +"E287: Упозорење: Постављање повратне функције за уништење IM није успело" + +msgid "E288: input method doesn't support any style" +msgstr "E288: метод уноса не подржава ниједан стил" + +msgid "E289: input method doesn't support my preedit type" +msgstr "E289: метод уноса не подржава мој preedit тип" msgid "Invalid font specification" msgstr "Неисправна спецификација фонта" @@ -2381,9 +2566,6 @@ msgstr "Стил:" msgid "Size:" msgstr "Величина:" -msgid "E256: Hangul automata ERROR" -msgstr "E256: ГРЕШКА Hangul аутомата" - msgid "E550: Missing colon" msgstr "E550: Недостаје двотачка" @@ -2525,8 +2707,8 @@ msgid "Added cscope database %s" msgstr "cscope база података %s је додата" #, c-format -msgid "E262: error reading cscope connection %ld" -msgstr "E262: грешка код читања cscope везе %ld" +msgid "E262: error reading cscope connection %d" +msgstr "E262: грешка код читања cscope везе %d" msgid "E561: unknown cscope search type" msgstr "E561: непознат cscope тип претраге" @@ -2718,11 +2900,12 @@ msgstr "E370: Библиотека %s није могла да се учита" msgid "Sorry, this command is disabled: the Perl library could not be loaded." msgstr "" -"Жао нам је, ова команда је онемогућена: Perl библиотека није могла да " -"се учита." +"Жао нам је, ова команда је онемогућена: Perl библиотека није могла да се " +"учита." msgid "E299: Perl evaluation forbidden in sandbox without the Safe module" -msgstr "E299: Perl одређивање вредности у sandbox-у је забрањено без Safe модула" +msgstr "" +"E299: Perl одређивање вредности у sandbox-у је забрањено без Safe модула" msgid "E836: This Vim cannot execute :python after using :py3" msgstr "E836: Овај Vim не може да изврши :python након коришћења :py3" @@ -2812,9 +2995,6 @@ msgstr "непозната vimОпција" msgid "keyboard interrupt" msgstr "прекид тастатуре" -msgid "vim error" -msgstr "vim грешка" - msgid "cannot create buffer/window command: object is being deleted" msgstr "бафер/прозор команда не може да се креира: објекат се брише" @@ -2828,8 +3008,8 @@ msgid "" "E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim." "org" msgstr "" -"E280: TCL ФАТАЛНА ГРЕШКА: reflist је оштећена!? Молимо пријавите ово на " -"vim-dev@vim.org" +"E280: TCL ФАТАЛНА ГРЕШКА: reflist је оштећена!? Молимо пријавите ово на vim-" +"dev@vim.org" msgid "cannot register callback command: buffer/window reference not found" msgstr "" @@ -2863,10 +3043,128 @@ msgid "E251: VIM instance registry property is badly formed. Deleted!" msgstr "E251: registry својство VIM инстанце је лоше формирано. Обрисано!" #, c-format +msgid "%ld lines to indent... " +msgstr "%ld за увлачење... " + +#, c-format +msgid "%ld line indented " +msgid_plural "%ld lines indented " +msgstr[0] "%ld линија увучена " +msgstr[1] "%ld линије увучене " +msgstr[2] "%ld линија увучено " + +msgid " Keyword completion (^N^P)" +msgstr " Довршавање кључне речи (^N^P)" + +msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" +msgstr " ^X режим (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" + +msgid " Whole line completion (^L^N^P)" +msgstr " Довршавање целе линије (^L^N^P)" + +msgid " File name completion (^F^N^P)" +msgstr " Довршавање имена фајла (^F^N^P)" + +msgid " Tag completion (^]^N^P)" +msgstr " Довршавање ознаке (^]^N^P)" + +msgid " Path pattern completion (^N^P)" +msgstr " Довршавање шаблона путање (^N^P)" + +msgid " Definition completion (^D^N^P)" +msgstr " Довршавање дефиниције (^D^N^P)" + +msgid " Dictionary completion (^K^N^P)" +msgstr " Довршавање речника (^K^N^P)" + +msgid " Thesaurus completion (^T^N^P)" +msgstr " Довршавање речника синонима (^T^N^P)" + +msgid " Command-line completion (^V^N^P)" +msgstr " Довршавање командне линије (^V^N^P)" + +msgid " User defined completion (^U^N^P)" +msgstr " Кориснички дефинисано довршавање (^U^N^P)" + +msgid " Omni completion (^O^N^P)" +msgstr " Omni довршавање (^O^N^P)" + +msgid " Spelling suggestion (s^N^P)" +msgstr " Правописни предлог (s^N^P)" + +msgid " Keyword Local completion (^N^P)" +msgstr " Довршавање локалне кључне речи (^N^P)" + +msgid "Hit end of paragraph" +msgstr "Достигнут је крај пасуса" + +msgid "E839: Completion function changed window" +msgstr "E839: Функција довршавања је променила прозор" + +msgid "E840: Completion function deleted text" +msgstr "E840: Функција довршавања је обрисала текст" + +msgid "'dictionary' option is empty" +msgstr "Опција 'dictionary' је празна" + +msgid "'thesaurus' option is empty" +msgstr "Опција 'thesaurus' је празна" + +#, c-format +msgid "Scanning dictionary: %s" +msgstr "Скенирање речника: %s" + +msgid " (insert) Scroll (^E/^Y)" +msgstr " (уметање) Скроловање (^E/^Y)" + +msgid " (replace) Scroll (^E/^Y)" +msgstr " (замена) Скроловање (^E/^Y)" + +msgid "E785: complete() can only be used in Insert mode" +msgstr "E785: complete() може да се користи само у режиму Уметање" + +#, c-format +msgid "Scanning: %s" +msgstr "Скенирање: %s" + +msgid "Scanning tags." +msgstr "Скенирање ознака." + +msgid "match in file" +msgstr "подударање у фајлу" + +msgid " Adding" +msgstr " Додавање" + +msgid "-- Searching..." +msgstr "-- Претрага..." + +msgid "Back at original" +msgstr "Назад на оригинал" + +msgid "Word from other line" +msgstr "Реч из друге линије" + +msgid "The only match" +msgstr "Једино подударање" + +#, c-format +msgid "match %d of %d" +msgstr "подударање %d од %d" + +#, c-format +msgid "match %d" +msgstr "подударање %d" + +#, c-format msgid "E938: Duplicate key in JSON: \"%s\"" msgstr "E938: Дупли кључ у JSON: \"%s\"" #, c-format +msgid "E899: Argument of %s must be a List or Blob" +msgstr "E899: Аргумент за %s мора бити Листа или Blob" + +#, c-format msgid "E696: Missing comma in List: %s" msgstr "E696: У Листи недостаје зарез: %s" @@ -2874,6 +3172,36 @@ msgstr "E696: У Листи недостаје зарез: %s" msgid "E697: Missing end of List ']': %s" msgstr "E697: Недостаје крај Листе ']': %s" +msgid "sort() argument" +msgstr "sort() аргумент" + +msgid "uniq() argument" +msgstr "uniq() аргумент" + +msgid "E702: Sort compare function failed" +msgstr "E702: Sort функција поређења није успела" + +msgid "E882: Uniq compare function failed" +msgstr "E882: Uniq функција поређења није успела" + +msgid "map() argument" +msgstr "map() аргумент" + +msgid "filter() argument" +msgstr "filter() аргумент" + +msgid "add() argument" +msgstr "add() аргумент" + +msgid "insert() argument" +msgstr "insert() аргумент" + +msgid "remove() argument" +msgstr "remove() аргумент" + +msgid "reverse() argument" +msgstr "reverse() аргумент" + msgid "Unknown option argument" msgstr "Непознат аргумент опције" @@ -3076,9 +3404,6 @@ msgstr "-A\t\t\tПокрени у Арапском режиму" msgid "-H\t\t\tStart in Hebrew mode" msgstr "-H\t\t\tПокрени у Хебрејском режиму" -msgid "-F\t\t\tStart in Farsi mode" -msgstr "-F\t\t\tПокрени у Фарси режиму" - msgid "-T <terminal>\tSet terminal type to <terminal>" msgstr "-T <терминал>\tПостави тип терминала на <терминал>" @@ -3217,11 +3542,11 @@ msgstr "" "\n" "Аргументи које препознаје gvim (Athena верзија):\n" -msgid "-display <display>\tRun vim on <display>" -msgstr "-display <дисплеј>\tПокрени vim на <дисплеј>" +msgid "-display <display>\tRun Vim on <display>" +msgstr "-display <дисплеј>\tПокрени Vim на <дисплеј>" -msgid "-iconic\t\tStart vim iconified" -msgstr "-iconic\t\tПокрени vim као икону" +msgid "-iconic\t\tStart Vim iconified" +msgstr "-iconic\t\tПокрени Vim као икону" msgid "-background <color>\tUse <color> for the background (also: -bg)" msgstr "-background <боја>\tКористи <боја> за позадину (такође: -bg)" @@ -3269,8 +3594,8 @@ msgstr "" "\n" "Аргументи које препознаје gvim (GTK+ верзија):\n" -msgid "-display <display>\tRun vim on <display> (also: --display)" -msgstr "-display <дисплеј>\tПокрени vim на <дисплеј> (такође: --display)" +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <дисплеј>\tПокрени Vim на <дисплеј> (такође: --display)" msgid "--role <role>\tSet a unique role to identify the main window" msgstr "" @@ -3308,6 +3633,39 @@ msgstr "Нема приказа: Израз слања није успео.\n" msgid ": Send expression failed.\n" msgstr ": Израз слања није успео.\n" +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: глобална скраћеница за %s већ постоји" + +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: глобално мапирање за %s већ постоји" + +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: скраћеница за %s већ постоји" + +#, c-format +msgid "E227: mapping already exists for %s" +msgstr "E227: мапирање за %s већ постоји" + +msgid "No abbreviation found" +msgstr "Скраћеница није пронађена" + +msgid "No mapping found" +msgstr "Мапирање није пронађено" + +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap: Недозвољен режим" + +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap': Недостаје одговарајући карактер за %s" + +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap': Има још карактера након тачказареза: %s" + msgid "No marks set" msgstr "Нема постављених маркера" @@ -3320,21 +3678,21 @@ msgid "" "mark line col file/text" msgstr "" "\n" -"линија маркера кол датотека/текст" +"марк лин кол фајл/текст" msgid "" "\n" " jump line col file/text" msgstr "" "\n" -" линија скока кол датотека/текст" +" скок лин кол фајл/текст" msgid "" "\n" "change line col text" msgstr "" "\n" -"линија промене кол текст" +"измена лин кол текст" msgid "" "\n" @@ -3664,8 +4022,8 @@ msgstr "" "\n" " ИД процеса: " -msgid " (still running)" -msgstr " (још се извршава)" +msgid " (STILL RUNNING)" +msgstr " (ЈОШ СЕ ИЗВРШАВА)" msgid "" "\n" @@ -3701,8 +4059,8 @@ msgid "E315: ml_get: invalid lnum: %ld" msgstr "E315: ml_get: неисправан lnum: %ld" #, c-format -msgid "E316: ml_get: cannot find line %ld" -msgstr "E316: ml_get: линија %ld не може да се пронађе" +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get: линија %ld у баферу %d не може да се пронађе %s" msgid "E317: pointer block id wrong 3" msgstr "E317: ид показивача блока је погрешан 3" @@ -3842,9 +4200,6 @@ msgstr "E326: Пронађено је превише swap датотека" msgid "E327: Part of menu-item path is not sub-menu" msgstr "E327: Део путање ставке менија није подмени" -msgid "E328: Menu only exists in another mode" -msgstr "E328: Мени постоји само у другом режиму" - #, c-format msgid "E329: No menu \"%s\"" msgstr "E329: Нема менија \"%s\"" @@ -3964,7 +4319,7 @@ msgid "E767: Too many arguments to printf()" msgstr "E767: Сувише аргумената за printf()" msgid "W10: Warning: Changing a readonly file" -msgstr "W10: Упозорење: Мења се датотека која може само да се чита" +msgstr "W10: Упозорење: Мења се фајл који може само да се чита" msgid "Type number and <Enter> or click with mouse (empty cancels): " msgstr "Унесите број и <Enter> или кликните мишем (ништа за отказ): " @@ -4011,12 +4366,8 @@ msgstr "" "[позива] укупно re/malloc()-а %lu, укупно free()-ова %lu\n" "\n" -msgid "E340: Line is becoming too long" -msgstr "E340: Линија постаје предугачка" - -#, c-format -msgid "E341: Internal error: lalloc(%ld, )" -msgstr "E341: Интерна грешка: lalloc(%ld, )" +msgid "E341: Internal error: lalloc(0, )" +msgstr "E341: Интерна грешка: lalloc(0, )" #, c-format msgid "E342: Out of memory! (allocating %lu bytes)" @@ -4089,12 +4440,6 @@ msgstr "E505: %s је само за читање (додајте ! за прем msgid "E349: No identifier under cursor" msgstr "E349: Под курсором није идентификатор" -msgid "E774: 'operatorfunc' is empty" -msgstr "E774: 'operatorfunc' је празна" - -msgid "E775: Eval feature not available" -msgstr "E775: Eval могућност није доступна" - msgid "Warning: terminal cannot highlight" msgstr "Упозорење: терминал не може да истакне текст" @@ -4117,101 +4462,32 @@ msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim" msgstr "" "Откуцајте :qa! и притисните <Ентер> да одбаците све измене и напустите Vim" -#, c-format -msgid "1 line %sed 1 time" -msgstr "1 линија %sрана 1 пут" +msgid "Type :qa and press <Enter> to exit Vim" +msgstr "Откуцајте :qa и притисните <Ентер> да напустите Vim" #, c-format -msgid "1 line %sed %d times" -msgstr "1 линија %sрана %d пута" +msgid "%ld line %sed %d time" +msgid_plural "%ld line %sed %d times" +msgstr[0] "%ld линија %sрано %d пут" +msgstr[1] "%ld линије %sрано %d пут" +msgstr[2] "%ld линија %sрано %d пут" #, c-format -msgid "%ld lines %sed 1 time" -msgstr "%ld линија %sрано 1 пут" - -#, c-format -msgid "%ld lines %sed %d times" -msgstr "%ld линија %sрано %d пута" - -#, c-format -msgid "%ld lines to indent... " -msgstr "%ld за увлачење... " - -msgid "1 line indented " -msgstr "1 линија увучена " - -#, c-format -msgid "%ld lines indented " -msgstr "%ld инија увучено " - -msgid "E748: No previously used register" -msgstr "E748: Нема претходно коришћеног регистра" +msgid "%ld lines %sed %d time" +msgid_plural "%ld lines %sed %d times" +msgstr[0] "%ld линија %sрано %d пут" +msgstr[1] "%ld линија %sрано %d пута" +msgstr[2] "%ld линија %sрано %d пута" msgid "cannot yank; delete anyway" msgstr "не може да се тргне; ипак обрисати" -msgid "1 line changed" -msgstr "1 линија је промењена" - -#, c-format -msgid "%ld lines changed" -msgstr "%ld линија је промењено" - -#, c-format -msgid "freeing %ld lines" -msgstr "ослобађа се %ld линија" - -#, c-format -msgid " into \"%c" -msgstr " у \"%c" - -#, c-format -msgid "block of 1 line yanked%s" -msgstr "блок од 1 линије је тргнут%s" - -#, c-format -msgid "1 line yanked%s" -msgstr "1 линија је тргнута%s" - #, c-format -msgid "block of %ld lines yanked%s" -msgstr "блок од %ld линија је тргнут%s" - -#, c-format -msgid "%ld lines yanked%s" -msgstr "%ld линија је тргнуто%s" - -#, c-format -msgid "E353: Nothing in register %s" -msgstr "E353: Регистар %s је празан" - -msgid "" -"\n" -"--- Registers ---" -msgstr "" -"\n" -"--- Регистри ---" - -msgid "Illegal register name" -msgstr "Неважеће име регистра" - -msgid "" -"\n" -"# Registers:\n" -msgstr "" -"\n" -"# Регистри:\n" - -#, c-format -msgid "E574: Unknown register type %d" -msgstr "E574: Непознат тип регистра %d" - -msgid "" -"E883: search pattern and expression register may not contain two or more " -"lines" -msgstr "" -"E883: регистар за шаблон претраге и израз не може да садржи две или више " -"линија" +msgid "%ld line changed" +msgid_plural "%ld lines changed" +msgstr[0] "%ld линија је промењена" +msgstr[1] "%ld линије је промењено" +msgstr[2] "%ld линија је промењено" #, c-format msgid "%ld Cols; " @@ -4235,18 +4511,21 @@ msgstr "Кол %s од %s; Линија %ld од %ld; Реч %lld од %lld; Б #, c-format msgid "" -"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte %" -"lld of %lld" +"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte " +"%lld of %lld" msgstr "" -"Кол %s од %s; Линија %ld од %ld; Реч %lld од %lld; Знак %lld од %lld; Бајт %" -"lld од %lld" +"Кол %s од %s; Линија %ld од %ld; Реч %lld од %lld; Знак %lld од %lld; Бајт " +"%lld од %lld" #, c-format msgid "(+%lld for BOM)" msgstr "(+%lld за BOM)" -msgid "Thanks for flying Vim" -msgstr "Хвала што летите са Vim" +msgid "E774: 'operatorfunc' is empty" +msgstr "E774: 'operatorfunc' је празна" + +msgid "E775: Eval feature not available" +msgstr "E775: Eval могућност није доступна" msgid "E518: Unknown option" msgstr "E518: Непозната опција" @@ -4257,8 +4536,11 @@ msgstr "E519: Опција није подржана" msgid "E520: Not allowed in a modeline" msgstr "E520: Није довољено у режимској линији" +msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" +msgstr "E992: Није дозвољено у режимској линији када је 'modelineexpr' искључена" + msgid "E846: Key code not set" -msgstr "E846: Није постављрн код тастера" +msgstr "E846: Није постављeн код тастера" msgid "E521: Number required after =" msgstr "E521: Потребан је број након =" @@ -4266,6 +4548,66 @@ msgstr "E521: Потребан је број након =" msgid "E522: Not found in termcap" msgstr "E522: Није пронађено у termcap" +msgid "E946: Cannot make a terminal with running job modifiable" +msgstr "" +"E946: Терминал са задатком који се извршава не може да се учини измењивим" + +msgid "E590: A preview window already exists" +msgstr "E590: Прозор за преглед већ постоји" + +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "W17: Арапски захтева UTF-8, извршите ':set encoding=utf-8'" + +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: Ово окружење не подржава 24-битне боје" + +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: Потребно је најмање %d линија" + +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: Потребно је најмање %d колона" + +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: Непозната опција: %s" + +#, c-format +msgid "E521: Number required: &%s = '%s'" +msgstr "E521: Захтева се број: &%s = '%s'" + +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- Кодови терминала ---" + +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- Вредности глобалних опција ---" + +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- Вредности локалних опција ---" + +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- Опције ---" + +msgid "E356: get_varp ERROR" +msgstr "E356: get_varp ГРЕШКА" + #, c-format msgid "E539: Illegal character <%s>" msgstr "E539: Недозвољен карактер <%s>" @@ -4274,6 +4616,13 @@ msgstr "E539: Недозвољен карактер <%s>" msgid "For option %s" msgstr "За опцију %s" +msgid "E540: Unclosed expression sequence" +msgstr "E540: Низ израза није затворен" + + +msgid "E542: unbalanced groups" +msgstr "E542: неуравнотежене групе" + msgid "E529: Cannot set 'term' to empty string" msgstr "E529: 'term' не може да се постави на празан стринг" @@ -4344,86 +4693,6 @@ msgstr "E536: потребан зарез" msgid "E537: 'commentstring' must be empty or contain %s" msgstr "E537: 'commentstring' мора бити празно или да садржи %s" -msgid "E538: No mouse support" -msgstr "E538: Нема подршке за миша" - -msgid "E540: Unclosed expression sequence" -msgstr "E540: Низ израза није затворен" - -msgid "E541: too many items" -msgstr "E541: превише ставки" - -msgid "E542: unbalanced groups" -msgstr "E542: неуравнотежене групе" - -msgid "E946: Cannot make a terminal with running job modifiable" -msgstr "" -"E946: Терминал са задатком који се извршава не може да се учини измењивим" - -msgid "E590: A preview window already exists" -msgstr "E590: Прозор за преглед већ постоји" - -msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" -msgstr "W17: Арапски захтева UTF-8, извршите ':set encoding=utf-8'" - -msgid "E954: 24-bit colors are not supported on this environment" -msgstr "E954: Ово окружење не подржава 24-битне боје" - -#, c-format -msgid "E593: Need at least %d lines" -msgstr "E593: Потребно је најмање %d линија" - -#, c-format -msgid "E594: Need at least %d columns" -msgstr "E594: Потребно је најмање %d колона" - -#, c-format -msgid "E355: Unknown option: %s" -msgstr "E355: Непозната опција: %s" - -#, c-format -msgid "E521: Number required: &%s = '%s'" -msgstr "E521: Захтева се број: &%s = '%s'" - -msgid "" -"\n" -"--- Terminal codes ---" -msgstr "" -"\n" -"--- Кодови терминала ---" - -msgid "" -"\n" -"--- Global option values ---" -msgstr "" -"\n" -"--- Вредности глобалних опција ---" - -msgid "" -"\n" -"--- Local option values ---" -msgstr "" -"\n" -"--- Вредности локалних опција ---" - -msgid "" -"\n" -"--- Options ---" -msgstr "" -"\n" -"--- Опције ---" - -msgid "E356: get_varp ERROR" -msgstr "E356: get_varp ГРЕШКА" - -#, c-format -msgid "E357: 'langmap': Matching character missing for %s" -msgstr "E357: 'langmap': Недостаје одговарајући карактер за %s" - -#, c-format -msgid "E358: 'langmap': Extra characters after semicolon: %s" -msgstr "E358: 'langmap': Има још карактера након тачказареза: %s" - msgid "cannot open " msgstr "не може да се отвори " @@ -4516,6 +4785,10 @@ msgstr "" "\n" "Vim: Дошло је до X грешке\n" +#, c-format +msgid "restoring display %s" +msgstr "враћање екрана %s" + msgid "Testing the X display failed" msgstr "Тестирање X приказа није успело" @@ -4612,15 +4885,6 @@ msgstr "XSMP SmcOpenConnection није успело: %s" msgid "At line" msgstr "Код линије" -msgid "Could not load vim32.dll!" -msgstr "vim32.dll није могла да се учита!" - -msgid "VIM Error" -msgstr "VIM Грешка" - -msgid "Could not fix up function pointers to the DLL!" -msgstr "Показивачи на функције у DLL-у нису могли да се поправе!" - #, c-format msgid "Vim: Caught %s event\n" msgstr "Vim: Ухваћен је %s догађај\n" @@ -4653,6 +4917,26 @@ msgstr "Vim Упозорење" msgid "shell returned %d" msgstr "командно окружење је вратило %d" +msgid "E278: Cannot put a terminal buffer in a popup window" +msgstr "E278: Терминалски бафер не може да се стави у искачући прозор" + +#, c-format +msgid "E997: Tabpage not found: %d" +msgstr "E997: Картица није пронађена: %d" + +#, c-format +msgid "E993: window %d is not a popup window" +msgstr "E993: прозор %d није искачући прозор" + +msgid "E994: Not allowed in a popup window" +msgstr "E994: Није дозвољено у искачућем прозору" + +msgid "E750: First use \":profile start {fname}\"" +msgstr "E750: Најпре користите \":profile start {fname}\"" + +msgid "E553: No more items" +msgstr "E553: Нема више ставки" + msgid "E926: Current location list was changed" msgstr "E926: Текућа листа локација је промењена" @@ -4685,9 +4969,6 @@ 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: Текући прозор је затворен" @@ -4731,6 +5012,10 @@ msgid "E777: String or List expected" msgstr "E777: Очекује се String или List" #, c-format +msgid "E927: Invalid action: '%s'" +msgstr "E927: Неисправна акција: '%s'" + +#, c-format msgid "E369: invalid item in %s%%[]" msgstr "E369: неважећа ставка у %s%%[]" @@ -4770,37 +5055,29 @@ msgstr "E69: Недостаје ] након %s%%[" msgid "E70: Empty %s%%[]" msgstr "E70: Празан %s%%[]" -msgid "E65: Illegal back reference" -msgstr "E65: Неважећа повратна референца" - -msgid "E339: Pattern too long" -msgstr "E339: Шаблон је предугачак" - -msgid "E50: Too many \\z(" -msgstr "E50: Превише \\z(" +msgid "E956: Cannot use pattern recursively" +msgstr "E956: Шаблон не може да се користи рекурзивно" #, c-format -msgid "E51: Too many %s(" -msgstr "E51: Превише %s(" - -msgid "E52: Unmatched \\z(" -msgstr "E52: Неупарено \\z(" +msgid "E554: Syntax error in %s{...}" +msgstr "E554: Синтаксна грешка у %s{...}" #, c-format -msgid "E59: invalid character after %s@" -msgstr "E59: неважећи карактер након %s@" +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (NFA regexp) не може да се понови %s" -#, c-format -msgid "E60: Too many complex %s{...}s" -msgstr "E60: Превише комплексних %s{...}s" +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: Иза \\%#= може да следи једино 0, 1, или 2. Користиће се аутоматски " +"енџин " -#, c-format -msgid "E61: Nested %s*" -msgstr "E61: Угњеждено %s*" +msgid "Switching to backtracking RE engine for pattern: " +msgstr "Пребацивање на backtracking RE енџин за шаблон: " -#, c-format -msgid "E62: Nested %s%c" -msgstr "E62: Угњеждено %s%c" +msgid "E65: Illegal back reference" +msgstr "E65: Неважећа повратна референца" msgid "E63: invalid use of \\_" msgstr "E63: неисправна употреба \\_" @@ -4821,25 +5098,36 @@ msgid "E71: Invalid character after %s%%" msgstr "E71: Неважећи карактер након %s%%" #, c-format -msgid "E554: Syntax error in %s{...}" -msgstr "E554: Синтаксна грешка у %s{...}" +msgid "E59: invalid character after %s@" +msgstr "E59: неважећи карактер након %s@" -msgid "External submatches:\n" -msgstr "Спољна подпоклапања:\n" +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: Превише комплексних %s{...}s" #, c-format -msgid "E888: (NFA regexp) cannot repeat %s" -msgstr "E888: (NFA regexp) не може да се понови %s" +msgid "E61: Nested %s*" +msgstr "E61: Угњеждено %s*" -msgid "" -"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " -"used " -msgstr "" -"E864: Иза \\%#= може да следи једино 0, 1, или 2. Користиће се аутоматски " -"енџин " +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62: Угњеждено %s%c" -msgid "Switching to backtracking RE engine for pattern: " -msgstr "Пребацивање на backtracking RE енџин за шаблон: " +msgid "E50: Too many \\z(" +msgstr "E50: Превише \\z(" + +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: Превише %s(" + +msgid "E52: Unmatched \\z(" +msgstr "E52: Неупарено \\z(" + +msgid "E339: Pattern too long" +msgstr "E339: Шаблон је предугачак" + +msgid "External submatches:\n" +msgstr "Спољна подпоклапања:\n" msgid "E865: (NFA) Regexp end encountered prematurely" msgstr "E865: Крај (NFA) Regexp израза је достигнут прерано" @@ -4849,8 +5137,8 @@ msgid "E866: (NFA regexp) Misplaced %c" msgstr "E866: (NFA regexp) %c је на погрешном месту" #, c-format -msgid "E877: (NFA regexp) Invalid character class: %ld" -msgstr "E877: (NFA regexp) Неважећа карактер класа: %ld" +msgid "E877: (NFA regexp) Invalid character class: %d" +msgstr "E877: (NFA regexp) Неважећа карактер класа: %d" #, c-format msgid "E867: (NFA) Unknown operator '\\z%c'" @@ -4885,6 +5173,11 @@ msgstr "E879: (NFA regexp) Превише \\z(" msgid "E873: (NFA regexp) proper termination error" msgstr "E873: (NFA regexp) грешка правилне терминације" +msgid "Could not open temporary log file for writing, displaying on stderr... " +msgstr "" +"Привремени лог фајл није могао да се отвори за упис, приказује се на " +"stderr... " + msgid "E874: (NFA) Could not pop the stack!" msgstr "E874: (NFA) Скидање са стека није успело!" @@ -4967,6 +5260,80 @@ msgid "recording" msgstr "снимање" #, c-format +msgid "Searching for \"%s\" in \"%s\"" +msgstr "Тражи се \"%s\" у \"%s\"" + +#, c-format +msgid "Searching for \"%s\"" +msgstr "Тражи се\"%s\"" + +#, c-format +msgid "not found in '%s': \"%s\"" +msgstr "није пронађено у '%s': \"%s\"" + +msgid "Source Vim script" +msgstr "Изворна Vim скрипта" + +#, c-format +msgid "Cannot source a directory: \"%s\"" +msgstr "Директоријум не може да буде извор: \"%s\"" + +#, c-format +msgid "could not source \"%s\"" +msgstr "не може да се прибави \"%s\"" + +#, c-format +msgid "line %ld: could not source \"%s\"" +msgstr "линија %ld: не може да се прибави \"%s\"" + +#, c-format +msgid "sourcing \"%s\"" +msgstr "прибављање \"%s\"" + +#, c-format +msgid "line %ld: sourcing \"%s\"" +msgstr "линија %ld: прибављање \"%s\"" + +#, c-format +msgid "finished sourcing %s" +msgstr "завршено прибављање %s" + +#, c-format +msgid "continuing in %s" +msgstr "наставља се у %s" + +msgid "modeline" +msgstr "режимскe линијe (modeline)" + +msgid "--cmd argument" +msgstr "--cmd аргументa" + +msgid "-c argument" +msgstr "-c аргументa" + +msgid "environment variable" +msgstr "променљивe окружења" + +msgid "error handler" +msgstr "процедурe за обраду грешке" + +msgid "W15: Warning: Wrong line separator, ^M may be missing" +msgstr "W15: Упозорење: Погрешан сепаратор линије, можда недостаје ^M" + +msgid "E167: :scriptencoding used outside of a sourced file" +msgstr "E167: :scriptencoding се користи ван изворишног фајла" + +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion се користи ван изворишног фајла" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: scriptversion није подржана: %d" + +msgid "E168: :finish used outside of a sourced file" +msgstr "E168: :finish се користи ван изворишног фајла" + +#, c-format msgid "E383: Invalid search string: %s" msgstr "E383: Неисправан стринг за претрагу: %s" @@ -5022,18 +5389,74 @@ msgstr "E388: Дефиниција не може да се пронађе" msgid "E389: Couldn't find pattern" msgstr "E389: Шаблон за претрагу није пронађен" -msgid "Substitute " -msgstr "Замена " +msgid "Save View" +msgstr "Сачувај Поглед" + +msgid "Save Session" +msgstr "Сачувај Сесију" + +msgid "Save Setup" +msgstr "Сачувај Подешавање" + +msgid "[Deleted]" +msgstr "[Обрисано]" -#, c-format msgid "" "\n" -"# Last %sSearch Pattern:\n" -"~" +"--- Signs ---" msgstr "" "\n" -"# Последњи %sШаблон Претраге:\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 ид=%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: %d" +msgstr "E157: Неисправан ИД знака: %d" + +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 FOUND)" +msgstr " (НИЈЕ ПРОНАЂЕНО)" + +msgid " (not supported)" +msgstr " (није подржано)" msgid "E756: Spell checking is not enabled" msgstr "E756: Провера правописа није омогућена" @@ -5057,21 +5480,6 @@ msgstr "E797: SpellFileMissing аутокоманда је обрисала ба msgid "Warning: region %s not supported" msgstr "Упозорење: регион %s није подржан" -msgid "Sorry, no suggestions" -msgstr "Жао нам је, нема сугестија" - -#, c-format -msgid "Sorry, only %ld suggestions" -msgstr "Жао нам је, само %ld сугестија" - -#, c-format -msgid "Change \"%.*s\" to:" -msgstr "Променити \"%.*s\" у:" - -#, c-format -msgid " < \"%.*s\"" -msgstr " < \"%.*s\"" - msgid "E752: No previous spell replacement" msgstr "E752: Нема претходне правописне замене" @@ -5148,10 +5556,6 @@ msgid "Conversion in %s not supported: from %s to %s" msgstr "Конверзија у %s није подржана: из %s у %s" #, c-format -msgid "Conversion in %s not supported" -msgstr "Конверзија у %s није подржана" - -#, c-format msgid "Invalid value for FLAG in %s line %d: %s" msgstr "Неважећа вредност за FLAG у %s линија %d: %s" @@ -5210,8 +5614,8 @@ msgid "" "Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s " "line %d: %s" msgstr "" -"Наставак се такође користи за BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST у %s" -"линија %d: %s" +"Наставак се такође користи за BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/" +"NOSUGGEST у %sлинија %d: %s" #, c-format msgid "Expected Y or N in %s line %d: %s" @@ -5389,8 +5793,8 @@ msgid "Done!" msgstr "Завршено!" #, c-format -msgid "E765: 'spellfile' does not have %ld entries" -msgstr "E765: 'spellfile' не садржи %ld ставке" +msgid "E765: 'spellfile' does not have %d entries" +msgstr "E765: 'spellfile' не садржи %d ставке" #, c-format msgid "Word '%.*s' removed from %s" @@ -5437,6 +5841,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" @@ -5595,7 +6002,7 @@ msgstr "E414: група има поставке, highlight link се игнор #, c-format msgid "E415: unexpected equal sign: %s" -msgstr "E415: неочкиван знак једнакости: %s" +msgstr "E415: неочекиван знак једнакости: %s" #, c-format msgid "E416: missing equal sign: %s" @@ -5615,6 +6022,9 @@ msgstr "E419: Непозната FG боја" msgid "E420: BG color unknown" msgstr "E420: Непозната BG боја" +msgid "E453: UL color unknown" +msgstr "E453: Непозната UL боја" + #, c-format msgid "E421: Color name or number not recognized: %s" msgstr "E421: Име боје или број нису препознати: %s" @@ -5918,10 +6328,6 @@ msgstr "Ништа за опозив" msgid "number changes when saved" msgstr "број измене када сачувано" -#, c-format -msgid "%ld seconds ago" -msgstr "пре %ld секунди" - msgid "E790: undojoin is not allowed after undo" msgstr "E790: undojoin ије дозвољен након undo" @@ -5931,6 +6337,66 @@ msgstr "E439: листа опозива је искварена" msgid "E440: undo line missing" msgstr "E440: недостаје линија опозива" +msgid "" +"\n" +" Name Args Address Complete Definition" +msgstr "" +"\n" +" Име Аргу Адреса Довршење Дефиниција" + +msgid "No user-defined commands found" +msgstr "Нису пронађене кориснички дефинисане команде" + +#, c-format +msgid "E180: Invalid address type value: %s" +msgstr "E180: Неисправна вредност адресног типа: %s" + +#, c-format +msgid "E180: Invalid complete value: %s" +msgstr "E180: Неисправна вредност довршавања: %s" + +msgid "E468: Completion argument only allowed for custom completion" +msgstr "E468: Аргумент довршавања је дозвољен само за прилагођена довршавања" + +msgid "E467: Custom completion requires a function argument" +msgstr "E467: Прилагођено довршавање захтева аргумент функције" + +msgid "E175: No attribute specified" +msgstr "E175: Није наведен ни један атрибут" + +msgid "E176: Invalid number of arguments" +msgstr "E176: Неисправан број аргумената" + +msgid "E177: Count cannot be specified twice" +msgstr "E177: Бројач не може да се наведе два пута" + +msgid "E178: Invalid default value for count" +msgstr "E178: Неисправна подразумевана вредност за бројач" + +msgid "E179: argument required for -complete" +msgstr "E179: потребан је аргумент за -complete" + +msgid "E179: argument required for -addr" +msgstr "E179: потребан је аргумент за -addr" + +#, c-format +msgid "E174: Command already exists: add ! to replace it: %s" +msgstr "E174: Команда већ постоји: додајте ! да је замените: %s" + +msgid "E182: Invalid command name" +msgstr "E182: Неисправно име команде" + +msgid "E183: User defined commands must start with an uppercase letter" +msgstr "E183: Кориснички дефинисане команде морају да почну великим словом" + +msgid "E841: Reserved name, cannot be used for user defined command" +msgstr "" +"E841: Резервисано име, не може да се користи за кориснички дефинисану команду" + +#, c-format +msgid "E184: No such user-defined command: %s" +msgstr "E184: Не постоји таква кориснички дефинисана команда: %s" + #, c-format msgid "E122: Function %s already exists, add ! to replace it" msgstr "E122: Функција %s већ постоји, додајте ! да је замените" @@ -5953,6 +6419,13 @@ msgstr "E125: Неважећи аргумент: %s" msgid "E853: Duplicate argument name: %s" msgstr "E853: Име аргумента је дуплирано: %s" +msgid "E989: Non-default argument follows default argument" +msgstr "E989: Неподразумевани аргумент следи иза подразумеваног аргумента" + +#, c-format +msgid "E451: Expected }: %s" +msgstr "E451: Очекује се }: %s" + #, c-format msgid "E740: Too many arguments for function %s" msgstr "E740: Превише аргумената за функцију %s" @@ -5984,16 +6457,8 @@ 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" +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: Функција не може да се користи као метода: %s" #, c-format msgid "E120: Using <SID> not in a script context: %s" @@ -6014,6 +6479,9 @@ msgstr "E128: Име функције мора да почне великим с msgid "E884: Function name cannot contain a colon: %s" msgstr "E884: Име функције не може да садржи двотачку: %s" +msgid "E454: function list was modified" +msgstr "E454: листа функције је измењена" + #, c-format msgid "E123: Undefined function: %s" msgstr "E123: Недефинисана функција: %s" @@ -6023,7 +6491,7 @@ msgid "E124: Missing '(': %s" msgstr "E124: Недостаје '(': %s" msgid "E862: Cannot use g: here" -msgstr "E862: g: не може овде да се користи" +msgstr "E862: Овде не може да се користи g:" #, c-format msgid "E932: Closure function should not be at top level: %s" @@ -6033,6 +6501,10 @@ msgid "E126: Missing :endfunction" msgstr "E126: Недостаје :endfunction" #, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: Пронађен је текст након :enddef: %s" + +#, c-format msgid "W22: Text found after :endfunction: %s" msgstr "W22: Пронађен текст након :endfunction: %s" @@ -6056,8 +6528,22 @@ msgid "E133: :return not inside a function" msgstr "E133: :return није унутар функције" #, c-format -msgid "E107: Missing parentheses: %s" -msgstr "E107: Недостају заграде: %s" +msgid "%s (%s, compiled %s)" +msgstr "%s (%s, компајлирано %s)" + +msgid "" +"\n" +"MS-Windows 64-bit GUI/console version" +msgstr "" +"\n" +"MS-Windows 64-битна ГКИ/конзолна верзија" + +msgid "" +"\n" +"MS-Windows 32-bit GUI/console version" +msgstr "" +"\n" +"MS-Windows 32-битна ГКИ/конзолна верзија" msgid "" "\n" @@ -6116,14 +6602,14 @@ msgid "" "Included patches: " msgstr "" "\n" -"Укључене исправке: " +"Укључене закрпе: " msgid "" "\n" "Extra patches: " msgstr "" "\n" -"Екстра исправке: " +"Додатне закрпе: " msgid "Modified by " msgstr "Модификовао " @@ -6261,7 +6747,7 @@ msgid "Linking: " msgstr "Повезивање: " msgid " DEBUG BUILD" -msgstr " DEBUG ИЗДАЊЕ" +msgstr " ДИБАГ ИЗДАЊЕ" msgid "VIM - Vi IMproved" msgstr "VIM - Vi IMproved" @@ -6270,7 +6756,7 @@ msgid "version " msgstr "верзија " msgid "by Bram Moolenaar et al." -msgstr "написали Bram Moolenaar et al." +msgstr "написали Брам Моленар и др." msgid "Vim is open source and freely distributable" msgstr "Vim је отвореног кода и може слободно да се дистрибуира" @@ -6306,13 +6792,13 @@ msgid "Running modeless, typed text is inserted" msgstr "Безрежимски рад, умеће се откуцани текст" msgid "menu Edit->Global Settings->Toggle Insert Mode " -msgstr "мени Уређивање->Глобална подешавања->Преклапај режим Уметање " +msgstr "мени Уређивање->Општа подешавања->Режим Уметање (да/не) " msgid " for two modes " msgstr " за два режима " msgid "menu Edit->Global Settings->Toggle Vi Compatible" -msgstr "мени Уређивање->Глобална подешавања->Преклапај Vi Компатибилно" +msgstr "мени Уређивање->Општа подешавања->'Vi' сагласно (да/не)" msgid " for Vim defaults " msgstr " за Vim подразумевано " @@ -6477,9 +6963,6 @@ msgstr "E685: Интерна грешка: %s" msgid "Interrupted" msgstr "Прекинуто" -msgid "E14: Invalid address" -msgstr "E14: Неважећа адреса" - msgid "E474: Invalid argument" msgstr "E474: Неважећи аргумент" @@ -6488,12 +6971,16 @@ msgid "E475: Invalid argument: %s" msgstr "E475: Неважећи аргумент: %s" #, c-format +msgid "E983: Duplicate argument: %s" +msgstr "E983: Дуплирани аргумент: %s" + +#, c-format msgid "E475: Invalid value for argument %s" -msgstr "E475: Неважећa вредност за аргумент: %s" +msgstr "E475: Неважећа вредност за аргумент: %s" #, c-format msgid "E475: Invalid value for argument %s: %s" -msgstr "E475: Неважећa вредност за аргумент %s: %s" +msgstr "E475: Неважећа вредност за аргумент %s: %s" #, c-format msgid "E15: Invalid expression: %s" @@ -6548,8 +7035,8 @@ msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" msgstr "" "E26: хебрејски не може да се користи: Није омогућен у време компилације\n" -msgid "E27: Farsi cannot be used: Not enabled at compile time\n" -msgstr "E27: фарси не може да се користи: Није омогућен у време компилације\n" +msgid "E27: Farsi support has been removed\n" +msgstr "E27: Подршка за фарси је уклоњена\n" msgid "E800: Arabic cannot be used: Not enabled at compile time\n" msgstr "" @@ -6657,6 +7144,21 @@ msgid "E45: 'readonly' option is set (add ! to override)" msgstr "E45: Постављена је 'readonly' опција (додајте ! за премошћавање)" #, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Недефинисана променљива: %s" + +#, c-format +msgid "E734: Wrong variable type for %s=" +msgstr "E734: Погрешан тип променљиве за %s=" + +#, c-format +msgid "E461: Illegal variable name: %s" +msgstr "E461: Недозвољено име променљиве: %s" + +msgid "E995: Cannot modify existing variable" +msgstr "E995: Постојећа променљива не може да се измени" + +#, c-format msgid "E46: Cannot change read-only variable \"%s\"" msgstr "E46: Променљива само за читање \"%s\" не може да се измени" @@ -6664,6 +7166,9 @@ msgstr "E46: Променљива само за читање \"%s\" не мож msgid "E794: Cannot set variable in the sandbox: \"%s\"" msgstr "E794: Не може да се постави променљива у sandbox-у: \"%s\"" +msgid "E928: String required" +msgstr "E928: Захтева се String" + msgid "E713: Cannot use empty key for Dictionary" msgstr "E713: Не може да се користи празан кључ за Речник" @@ -6711,7 +7216,7 @@ msgid "E255: Couldn't read in sign data!" msgstr "E255: Подаци за знак нису могли да се прочитају!" msgid "E72: Close error on swap file" -msgstr "E72: Грешка код затвањара swap датотеке" +msgstr "E72: Грешка код затварања swap фајла" msgid "E73: tag stack empty" msgstr "E73: стек ознака је празан" @@ -6752,6 +7257,10 @@ msgstr "E939: Потребан је позитиван број" msgid "E81: Using <SID> not in a script context" msgstr "E81: <SID> се користи ван скрипт контекста" +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: Недостају заграде: %s" + msgid "E449: Invalid expression received" msgstr "E449: Примљен је неважећи израз" @@ -6792,11 +7301,22 @@ msgstr "E919: Није пронађен директоријум у '%s': \"%s\" msgid "E952: Autocommand caused recursive behavior" msgstr "E952: Аутокомандa je изазвала рекурзивно понашање" +msgid "E328: Menu only exists in another mode" +msgstr "E328: Мени постоји само у другом режиму" + + +msgid "E957: Invalid window number" +msgstr "E957: Неисправан број прозора" + +#, c-format +msgid "E686: Argument of %s must be a List" +msgstr "E686: Аргумент за %s мора бити Листа" + msgid "search hit TOP, continuing at BOTTOM" -msgstr "претрага је достигла ВРХ, наставља се на ДНУ" +msgstr "претрага је достигла ВРХ, наставља се од ДНА" msgid "search hit BOTTOM, continuing at TOP" -msgstr "претрага је достигла ДНО, наставља се на ВРХУ" +msgstr "претрага је достигла ДНО, наставља се од ВРХА" #, c-format msgid "Need encryption key for \"%s\"" @@ -6837,8 +7357,8 @@ msgstr "" #, c-format msgid "expected int() or something supporting coercing to int(), but got %s" msgstr "" -"очекивало се int() или нешто што подржава спајање са int(), али је добијено %" -"s" +"очекивало се int() или нешто што подржава спајање са int(), али је добијено " +"%s" msgid "value is too large to fit into C int type" msgstr "вредност је сувише велика да се смести у C int тип" @@ -6894,8 +7414,7 @@ msgstr "hashtab је промењен током итерације" #, c-format msgid "expected sequence element of size 2, but got sequence of size %d" msgstr "" -"очекивао се елемент секвенце величине 2, али је добијена секвенца " -"величине %d" +"очекивао се елемент секвенце величине 2, али је добијена секвенца величине %d" msgid "list constructor does not accept keyword arguments" msgstr "конструктор листе не прихвата кључне речи за аргументе" @@ -6904,7 +7423,7 @@ msgid "list index out of range" msgstr "индекс листе је ван опсега" #, c-format -msgid "internal error: failed to get vim list item %d" +msgid "internal error: failed to get Vim list item %d" msgstr "интерна грешка: ставка %d vim листе није могла да се добије" msgid "slice step cannot be zero" @@ -6915,7 +7434,7 @@ msgid "attempt to assign sequence of size greater than %d to extended slice" msgstr "покушај доделе секвенце величине веће од %d како би се продужио slice" #, c-format -msgid "internal error: no vim list item %d" +msgid "internal error: no Vim list item %d" msgstr "интерна грешка: нема ставке %d у vim листи" msgid "internal error: not enough list items" @@ -7025,19 +7544,19 @@ msgstr "кôд није могао да се покрене" msgid "E858: Eval did not return a valid python object" msgstr "E858: Eval није вратио важећи python објекат" -msgid "E859: Failed to convert returned python object to vim value" +msgid "E859: Failed to convert returned python object to a Vim value" msgstr "E859: Конверзија враћеног python објекта у vim вредност није успела" #, c-format -msgid "unable to convert %s to vim dictionary" +msgid "unable to convert %s to a Vim dictionary" msgstr "%s не може да се конвертује у vim речник" #, c-format -msgid "unable to convert %s to vim list" +msgid "unable to convert %s to a Vim list" msgstr "%s не може да се конвертује у vim листу" #, c-format -msgid "unable to convert %s to vim structure" +msgid "unable to convert %s to a Vim structure" msgstr "%s не може да се конвертује у vim структуру" msgid "internal error: NULL reference passed" diff --git a/src/nvim/po/tr.po b/src/nvim/po/tr.po new file mode 100644 index 0000000000..3db3cbfef0 --- /dev/null +++ b/src/nvim/po/tr.po @@ -0,0 +1,9370 @@ +# Turkish translations for Vim +# Vim Türkçe çevirileri +# Copyright (C) 2020 Emir SARI <bitigchi@me.com> +# This file is distributed under the same license as the Vim package. +# Emir SARI <bitigchi@me.com>, 2019-2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Vim Turkish Localization Project\n" +"Report-Msgid-Bugs-To: Emir SARI <bitigchi@me.com>\n" +"POT-Creation-Date: 2020-11-29 00:20+0300\n" +"PO-Revision-Date: 2020-11-29 20:00+0300\n" +"Last-Translator: Emir SARI <bitigchi@me.com>\n" +"Language-Team: Turkish <https://github.com/bitigchi/vim>\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "E163: There is only one file to edit" +msgstr "E163: Düzenlenecek yalnızca bir dosya var" + +msgid "E164: Cannot go before first file" +msgstr "E164: İlk dosyadan öncesine gidilemez" + +msgid "E165: Cannot go beyond last file" +msgstr "E165: Son dosyadan öteye gidilemez" + +msgid "E610: No argument to delete" +msgstr "E610: Silinecek bir değişken yok" + +msgid "E249: window layout changed unexpectedly" +msgstr "E249: Pencere yerleşimi beklenmedik bir biçimde değişti" + +msgid "--Deleted--" +msgstr "--Silindi--" + +#, c-format +msgid "auto-removing autocommand: %s <buffer=%d>" +msgstr "otokomut kendiliğinden kaldırılıyor: %s <buffer=%d>" + +#, c-format +msgid "E367: No such group: \"%s\"" +msgstr "E367: Böyle bir grup yok: \"%s\"" + +msgid "E936: Cannot delete the current group" +msgstr "E936: Geçerli grup silinemiyor" + +msgid "W19: Deleting augroup that is still in use" +msgstr "W19: Kullanımda olan otokomut grubu siliniyor" + +#, c-format +msgid "E215: Illegal character after *: %s" +msgstr "E215: * sonrası izin verilmeyen karakter: %s" + +#, c-format +msgid "E216: No such event: %s" +msgstr "E216: Böyle bir olay yok: %s" + +#, c-format +msgid "E216: No such group or event: %s" +msgstr "E216: Böyle bir grup veya olay yok: %s" + +msgid "" +"\n" +"--- Autocommands ---" +msgstr "" +"\n" +"--- Otokomutlar ---" + +#, c-format +msgid "E680: <buffer=%d>: invalid buffer number " +msgstr "E680: <buffer=%d>: Geçersiz arabellek numarası" + +msgid "E217: Can't execute autocommands for ALL events" +msgstr "E217: Otokomutlar TÜM olaylar için çalıştırılamıyor" + +msgid "No matching autocommands" +msgstr "Eşleşen otokomut yok" + +msgid "E218: autocommand nesting too deep" +msgstr "E218: Çok fazla iç içe geçmiş otokomut" + +#, c-format +msgid "%s Autocommands for \"%s\"" +msgstr "\"%s\" için %s otokomutlar" + +#, c-format +msgid "Executing %s" +msgstr "%s çalıştırılıyor" + +#, c-format +msgid "autocommand %s" +msgstr "%s otokomutu" + +msgid "E831: bf_key_init() called with empty password" +msgstr "E831: bf_key_init() boş bir şifre ile çağrıldı" + +msgid "E820: sizeof(uint32_t) != 4" +msgstr "E820: sizeof(uint32_t) != 4" + +msgid "E817: Blowfish big/little endian use wrong" +msgstr "E817: Blowfish yüksek/düşük son haneli kullanımı yanlış" + +msgid "E818: sha256 test failed" +msgstr "E818: sha256 testi başarısız oldu" + +msgid "E819: Blowfish test failed" +msgstr "E819: Blowfish testi başarısız oldu" + +msgid "[Location List]" +msgstr "[Konum Listesi]" + +msgid "[Quickfix List]" +msgstr "[Hızlı Düzelt Listesi]" + +msgid "E855: Autocommands caused command to abort" +msgstr "E855: Otokomutlar komutun durmasına neden oldu" + +msgid "E82: Cannot allocate any buffer, exiting..." +msgstr "E82: Arabellek ayrılamadı, çıkılıyor..." + +msgid "E83: Cannot allocate buffer, using other one..." +msgstr "E83: Arabellek ayrılamadı, başka bir tane kullanılıyor..." + +msgid "E931: Buffer cannot be registered" +msgstr "E931: Arabellek kaydedilemedi" + +#, c-format +msgid "E937: Attempt to delete a buffer that is in use: %s" +msgstr "E937: Kullanımda olan bir arabellek silinmeye çalışılıyor: %s" + +msgid "E515: No buffers were unloaded" +msgstr "E515: Hiçbir arabellek bellekten kaldırılmadı" + +msgid "E516: No buffers were deleted" +msgstr "E516: Hiçbir arabellek silinmedi" + +msgid "E517: No buffers were wiped out" +msgstr "E517: Hiçbir arabellek yok edilmedi" + +#, c-format +msgid "%d buffer unloaded" +msgid_plural "%d buffers unloaded" +msgstr[0] "%d arabellek bellekten kaldırıldı" +msgstr[1] "%d arabellek bellekten kaldırıldı" + +#, c-format +msgid "%d buffer deleted" +msgid_plural "%d buffers deleted" +msgstr[0] "%d arabellek silindi" +msgstr[1] "%d arabellek silindi" + +#, c-format +msgid "%d buffer wiped out" +msgid_plural "%d buffers wiped out" +msgstr[0] "%d arabellek yok edildi" +msgstr[1] "%d arabellek yok edildi" + +msgid "E90: Cannot unload last buffer" +msgstr "E90: Son arabellek bellekten kaldırılamıyor" + +msgid "E84: No modified buffer found" +msgstr "E84: Değiştirilmiş bir arabellek bulunamadı" + +msgid "E85: There is no listed buffer" +msgstr "E85: Listelenmiş bir arabellek yok" + +msgid "E87: Cannot go beyond last buffer" +msgstr "E87: Son arabellekten öteye gidilemez" + +msgid "E88: Cannot go before first buffer" +msgstr "E88: İlk arabellekten öncesine gidilemez" + +#, c-format +msgid "E89: No write since last change for buffer %d (add ! to override)" +msgstr "" +"E89: %d numaralı arabellek son değişiklikten sonra yazılmadı (geçersiz " +"kılmak için ! ekleyin)" + +msgid "E948: Job still running (add ! to end the job)" +msgstr "E948: İş hâlâ sürüyor (bitirmek için ! ekleyin)" + +msgid "E37: No write since last change (add ! to override)" +msgstr "" +"E37: Son değişiklikten sonra yazılmadı (geçersiz kılmak için ! ekleyin)" + +msgid "E948: Job still running" +msgstr "E948: İş hâlâ sürüyor" + +msgid "E37: No write since last change" +msgstr "E37: Son değişiklikten sonra yazılmadı" + +msgid "W14: Warning: List of file names overflow" +msgstr "W14: Uyarı: Dosya adları taşımı" + +#, c-format +msgid "E92: Buffer %d not found" +msgstr "E92: %d numaralı arabellek bulunamadı" + +#, c-format +msgid "E93: More than one match for %s" +msgstr "E93: %s için birden çok eşleşme" + +#, c-format +msgid "E94: No matching buffer for %s" +msgstr "E94: %s için eşleşen arabellek yok" + +#, c-format +msgid "line %ld" +msgstr "%ld. satır" + +msgid "E95: Buffer with this name already exists" +msgstr "E95: Aynı adda bir arabellek hâlihazırda var" + +msgid " [Modified]" +msgstr " [Değiştirildi]" + +msgid "[Not edited]" +msgstr "[Değiştirilmedi]" + +msgid "[Read errors]" +msgstr "[Okuma hataları]" + +msgid "[RO]" +msgstr "[SO]" + +msgid "[readonly]" +msgstr "[saltokunur]" + +#, c-format +msgid "%ld line --%d%%--" +msgid_plural "%ld lines --%d%%--" +msgstr[0] "%ld. satır --%d%%" +msgstr[1] "%ld. satır --%d%%" + +#, c-format +msgid "line %ld of %ld --%d%%-- col " +msgstr "satır %ld/%ld --%d%%-- sütun " + +msgid "[No Name]" +msgstr "[Adsız]" + +msgid "help" +msgstr "yardım" + +msgid "[Help]" +msgstr "[Yardım]" + +msgid "[Preview]" +msgstr "[Önizleme]" + +msgid "All" +msgstr "Tüm Belge" + +msgid "Bot" +msgstr "Son" + +msgid "Top" +msgstr "Baş" + +msgid "E382: Cannot write, 'buftype' option is set" +msgstr "E382: Yazılamıyor, 'buftype' seçeneği ayarlanmamış" + +msgid "[Prompt]" +msgstr "[İstem]" + +msgid "[Popup]" +msgstr "[Açılır pencere]" + +msgid "[Scratch]" +msgstr "[Geçici alan]" + +msgid "WARNING: The file has been changed since reading it!!!" +msgstr "UYARI: Bu dosya açıldıktan sonra başkası tarafından değiştirilmiş!!!" + +msgid "Do you really want to write to it" +msgstr "Yine de yazmak istiyor musunuz?" + +msgid "[New]" +msgstr "[Yeni]" + +msgid "[New File]" +msgstr "[Yeni Dosya]" + +msgid "E676: No matching autocommands for acwrite buffer" +msgstr "E676: acwrite arabelleği için eşleşen bir otokomut yok" + +msgid "E203: Autocommands deleted or unloaded buffer to be written" +msgstr "E203: Otokomutlar arabelleği silmiş veya yazılması için kaldırmışlar" + +msgid "E204: Autocommand changed number of lines in unexpected way" +msgstr "E204: Otokomut satır sayısını beklenmeyen biçimde değiştirdi" + +msgid "NetBeans disallows writes of unmodified buffers" +msgstr "NetBeans değiştirilmemiş arabelleklerin yazılmasına izin vermez" + +msgid "Partial writes disallowed for NetBeans buffers" +msgstr "NetBeans arabellekleri için kısmî yazmalara izin verilmez" + +msgid "is a directory" +msgstr "bir dizin" + +msgid "is not a file or writable device" +msgstr "bir dosya veya yazılabilir aygıt değil" + +msgid "writing to device disabled with 'opendevice' option" +msgstr "aygıta yazma 'opendevice' seçeneği ile kapatılmış" + +msgid "is read-only (add ! to override)" +msgstr "saltokunur (geçersiz kılmak için ! ekleyin)" + +msgid "E506: Can't write to backup file (add ! to override)" +msgstr "E506: Yedek dosyasına yazılamıyor (geçersiz kılmak için ! ekleyin)" + +msgid "E507: Close error for backup file (add ! to override)" +msgstr "E507: Yedek dosya için kapatma hatası (geçersiz kılmak için ! ekleyin)" + +msgid "E508: Can't read file for backup (add ! to override)" +msgstr "E508: Yedek dosyası okunamıyor (geçersiz kılmak için ! ekleyin)" + +msgid "E509: Cannot create backup file (add ! to override)" +msgstr "E509: Yedek dosyası oluşturulamıyor (geçersiz kılmak için ! ekleyin)" + +msgid "E510: Can't make backup file (add ! to override)" +msgstr "E510: Yedek dosyası yapılamıyor (geçersiz kılmak için ! ekleyin) " + +msgid "E214: Can't find temp file for writing" +msgstr "E214: Yazma için geçici dosya bulunamıyor" + +msgid "E213: Cannot convert (add ! to write without conversion)" +msgstr "E213: Dönüştürülemiyor (dönüştürmeden yazmak için ! ekleyin)" + +msgid "E166: Can't open linked file for writing" +msgstr "E166: Bağlı dosya yazma için açılamıyor" + +msgid "E212: Can't open file for writing" +msgstr "E212: Dosya yazma için açılamıyor" + +msgid "E949: File changed while writing" +msgstr "E949: Dosya yazma sırasında değiştirildi" + +msgid "E512: Close failed" +msgstr "E512: Kapatma başarısız oldu" + +msgid "E513: write error, conversion failed (make 'fenc' empty to override)" +msgstr "" +"E513: Yazma hatası, dönüştürme başarısız (geçersiz kılmak için 'fenc'i boş " +"bırakın)" + +#, c-format +msgid "" +"E513: write error, conversion failed in line %ld (make 'fenc' empty to " +"override)" +msgstr "" +"E513: Yazma hatası, %ld. satırda dönüştürme başarısız (geçersiz kılmak için " +"'fenc'i boş bırakın)" + +msgid "E514: write error (file system full?)" +msgstr "E514: Yazma hatası (dosya sistemi dolu mu?)" + +msgid " CONVERSION ERROR" +msgstr " DÖNÜŞTÜRME HATASI" + +#, c-format +msgid " in line %ld;" +msgstr " %ld. satırda;" + +msgid "[NOT converted]" +msgstr "[dönüştürülmedi]" + +msgid "[converted]" +msgstr "[dönüştürüldü]" + +msgid "[Device]" +msgstr "[Aygıt]" + +msgid " [a]" +msgstr " [a]" + +msgid " appended" +msgstr " iliştirildi" + +msgid " [w]" +msgstr " [w]" + +msgid " written" +msgstr " yazıldı" + +msgid "E205: Patchmode: can't save original file" +msgstr "E205: Yama kipi: Orijinal dosya kaydedilemiyor" + +msgid "E206: patchmode: can't touch empty original file" +msgstr "E206: Yama kipi: Orijinal boş dosyaya dokunulamıyor" + +msgid "E207: Can't delete backup file" +msgstr "E207: Yedek dosyası silinemiyor" + +msgid "" +"\n" +"WARNING: Original file may be lost or damaged\n" +msgstr "" +"\n" +"UYARI: Orijinal dosya kaybolmuş veya hasar görmüş olabilir\n" + +msgid "don't quit the editor until the file is successfully written!" +msgstr "dosya başarılı bir biçimde yazılana kadar düzenleyiciden çıkmayın!" + +msgid "W10: Warning: Changing a readonly file" +msgstr "W10: Uyarı: Saltokunur bir dosya değiştiriliyor" + +msgid "E902: Cannot connect to port" +msgstr "E902: Kapıya bağlanılamıyor" + +msgid "E898: socket() in channel_connect()" +msgstr "E898: channel_connect() içinde socket()" + +#, c-format +msgid "E901: getaddrinfo() in channel_open(): %s" +msgstr "E901: channel_open() içinde getaddrinfo(): %s" + +msgid "E901: gethostbyname() in channel_open()" +msgstr "E901: channel_open() içinde gethostbyname()" + +msgid "E903: received command with non-string argument" +msgstr "E903: Dizi olmayan değişken içeren komut alındı" + +msgid "E904: last argument for expr/call must be a number" +msgstr "E904: İfadenin/çağrının son değişkeni bir sayı olmalıdır" + +msgid "E904: third argument for call must be a list" +msgstr "E904: Çağrının üçüncü değişkeni bir liste olmalıdır" + +#, c-format +msgid "E905: received unknown command: %s" +msgstr "E905: Bilinmeyen komut alındı: %s" + +msgid "E906: not an open channel" +msgstr "E906: Açık bir kanal değil" + +#, c-format +msgid "E630: %s(): write while not connected" +msgstr "E630: %s(): Bağlantı yokken yazım" + +#, c-format +msgid "E631: %s(): write failed" +msgstr "E631: %s(): Yazma başarısız" + +#, c-format +msgid "E917: Cannot use a callback with %s()" +msgstr "E917: %s() ile geri çağırma kullanılamaz" + +msgid "E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel" +msgstr "E912: ch_evalexpr()/ch_sendexpr() raw/nl kanalları ile kullanılamaz" + +msgid "No display" +msgstr "Görüntü yok" + +msgid ": Send failed.\n" +msgstr ": Gönderme başarısız oldu.\n" + +msgid ": Send failed. Trying to execute locally\n" +msgstr ": Gönderme başarısız oldu. Yerel ortamda çalıştırma deneniyor\n" + +#, c-format +msgid "%d of %d edited" +msgstr "%d/%d düzenlendi" + +msgid "No display: Send expression failed.\n" +msgstr "Görüntü yok: Gönderme başarısız oldu.\n" + +msgid ": Send expression failed.\n" +msgstr ": Gönderme başarısız oldu.\n" + +msgid "E240: No connection to the X server" +msgstr "E240: X sunucusuna bağlanılamadı" + +#, c-format +msgid "E241: Unable to send to %s" +msgstr "E241: Şuraya gönderilemedi: %s" + +msgid "E277: Unable to read a server reply" +msgstr "E277: Bir sunucu yanıtı okunamadı" + +msgid "E941: already started a server" +msgstr "E941: Sunucu hâlihazırda çalışıyor" + +msgid "E942: +clientserver feature not available" +msgstr "E942: +clientserver özelliği mevcut değil" + +msgid "E258: Unable to send to client" +msgstr "E258: İstemciye gönderilemiyor" + +msgid "Used CUT_BUFFER0 instead of empty selection" +msgstr "Boş seçim yerine CUT_BUFFER0 kullanıldı" + +msgid "tagname" +msgstr "etiket adı" + +msgid " kind file\n" +msgstr " dosya türü\n" + +msgid "'history' option is zero" +msgstr "'history' seçeneği sıfır" + +msgid "E821: File is encrypted with unknown method" +msgstr "E821: Dosya bilinmeyen bir yöntemle şifrelenmiş" + +msgid "Warning: Using a weak encryption method; see :help 'cm'" +msgstr "" +"Uyarı: Zayıf bir şifreleme yöntemi kullanılıyor; bilgi için: :help 'cm'" + +msgid "Enter encryption key: " +msgstr "Şifreleme anahtarı girin: " + +msgid "Enter same key again: " +msgstr "Aynı anahtarı yeniden girin: " + +msgid "Keys don't match!" +msgstr "Anahtarlar eşleşmiyor!" + +msgid "[crypted]" +msgstr "[şifreli]" + +msgid "Entering Debug mode. Type \"cont\" to continue." +msgstr "Hata Ayıklama kipine giriliyor. Sürdürmek için \"cont\" yazın." + +#, c-format +msgid "Oldval = \"%s\"" +msgstr "Eski değer = \"%s\"" + +# debugger.c:103 +#, c-format +msgid "Newval = \"%s\"" +msgstr "Yeni değer = \"%s\"" + +#, c-format +msgid "line %ld: %s" +msgstr "%ld. satır: %s" + +#, c-format +msgid "cmd: %s" +msgstr "komut: %s" + +msgid "frame is zero" +msgstr "çerçeve sıfır" + +#, c-format +msgid "frame at highest level: %d" +msgstr "çerçeve en yüksek düzeyde: %d" + +#, c-format +msgid "Breakpoint in \"%s%s\" line %ld" +msgstr "\"%s%s\" içinde kesme noktası, %ld. satır" + +#, c-format +msgid "E161: Breakpoint not found: %s" +msgstr "E161: Kesme noktası bulunamadı: %s" + +msgid "No breakpoints defined" +msgstr "Hiçbir kesme noktası tanımlanmamış" + +#, c-format +msgid "%3d %s %s line %ld" +msgstr "%3d %s %s %ld. satır" + +#, c-format +msgid "%3d expr %s" +msgstr "%3d ifade %s" + +msgid "extend() argument" +msgstr "extend() değişkeni" + +#, c-format +msgid "E737: Key already exists: %s" +msgstr "E737: Anahtar hâlihazırda var: %s" + +#, c-format +msgid "E96: Cannot diff more than %d buffers" +msgstr "E96: %d arabellekten fazlasında karşılaştırma yapılamıyor" + +#, c-format +msgid "Not enough memory to use internal diff for buffer \"%s\"" +msgstr "\"%s\" arabelleği için karşılaştırma yapacak yeterli bellek yok" + +msgid "E810: Cannot read or write temp files" +msgstr "E810: Geçici dosyalar okunamıyor veya yazılamıyor" + +msgid "E97: Cannot create diffs" +msgstr "E97: Karşılaştırma yapılamıyor" + +msgid "E960: Problem creating the internal diff" +msgstr "E960: Karşılaştırma hazırlanırken sorun" + +msgid "Patch file" +msgstr "Yama dosyası" + +msgid "E816: Cannot read patch output" +msgstr "E816: Yama çıktısı okunamıyor" + +msgid "E98: Cannot read diff output" +msgstr "E98: Karşılaştırma çıktısı okunamıyor" + +msgid "E959: Invalid diff format." +msgstr "E959: Geçersiz karşılaştırma biçimi" + +msgid "E99: Current buffer is not in diff mode" +msgstr "E99: Şu anki arabellek karşılaştırma kipinde değil" + +msgid "E793: No other buffer in diff mode is modifiable" +msgstr "" +"E793: Karşılaştırma kipindeki başka hiçbir arabellek değiştirilebilir değil" + +msgid "E100: No other buffer in diff mode" +msgstr "E100: Karşılaştırma kipinde başka hiçbir arabellek yok" + +msgid "E101: More than two buffers in diff mode, don't know which one to use" +msgstr "" +"E101: Karşılaştırma kipinde ikiden fazla arabellek var, hangisinin " +"kullanılacağı belli değil" + +#, c-format +msgid "E102: Can't find buffer \"%s\"" +msgstr "E102: Arabellek \"%s\" bulunamıyor" + +#, c-format +msgid "E103: Buffer \"%s\" is not in diff mode" +msgstr "E103: Arabellek \"%s\" karşılaştırma kipinde değil" + +msgid "E787: Buffer changed unexpectedly" +msgstr "E787: Arabellek beklenmeyen bir biçimde değiştirildi" + +msgid "E104: Escape not allowed in digraph" +msgstr "E104: Kaçan, ikili harflerde kullanılamaz" + +msgid "Custom" +msgstr "Özel" + +msgid "Latin supplement" +msgstr "Latin ek" + +msgid "Greek and Coptic" +msgstr "Yunan ve Antik Mısır" + +msgid "Cyrillic" +msgstr "Kiril" + +msgid "Hebrew" +msgstr "İbranca" + +msgid "Arabic" +msgstr "Arapça" + +msgid "Latin extended" +msgstr "Latin genişletilmiş" + +msgid "Greek extended" +msgstr "Yunan genişletilmiş" + +msgid "Punctuation" +msgstr "Noktalama" + +msgid "Super- and subscripts" +msgstr "Üst ve alt simgeler" + +msgid "Currency" +msgstr "Para birimi" + +msgid "Other" +msgstr "Diğer" + +msgid "Roman numbers" +msgstr "Roma rakamları" + +msgid "Arrows" +msgstr "Oklar" + +msgid "Mathematical operators" +msgstr "Matematiksel işleçler" + +msgid "Technical" +msgstr "Teknik" + +msgid "Box drawing" +msgstr "Kutu çizimi" + +msgid "Block elements" +msgstr "Bloklar" + +msgid "Geometric shapes" +msgstr "Geometrik biçimler" + +msgid "Symbols" +msgstr "Semboller" + +msgid "Dingbats" +msgstr "Harf simgeler" + +msgid "CJK symbols and punctuation" +msgstr "ÇJK simgeler ve noktalama" + +msgid "Hiragana" +msgstr "Hiragana" + +msgid "Katakana" +msgstr "Katakana" + +msgid "Bopomofo" +msgstr "Bopomofo" + +msgid "E544: Keymap file not found" +msgstr "E544: Düğme eşlem dosyası bulunamadı" + +msgid "E105: Using :loadkeymap not in a sourced file" +msgstr "E105: :loadkeymap kaynak alınmayan bir dosyada kullanılıyor" + +msgid "E791: Empty keymap entry" +msgstr "E791: Boş düğme eşlem girdisi" + +msgid "E689: Can only index a List, Dictionary or Blob" +msgstr "" +"E689: Yalnızca bir liste, sözlük, veya ikili geniş nesne dizinlenebilir" + +msgid "E708: [:] must come last" +msgstr "E708: [:] en son gelmelidir" + +msgid "E709: [:] requires a List or Blob value" +msgstr "E709: [:] bir liste veya ikili geniş nesne değeri gerektirir" + +msgid "E972: Blob value does not have the right number of bytes" +msgstr "E972: İkili geniş nesne değeri doğru bayt sayısına sahip değil" + +msgid "E996: Cannot lock a range" +msgstr "E996: Erim kilitlenemiyor" + +msgid "E996: Cannot lock a list or dict" +msgstr "E996: Bir liste veya sözlük kilitlenemiyor" + +msgid "E260: Missing name after ->" +msgstr "E260: -> sonrası ad eksik" + +msgid "E695: Cannot index a Funcref" +msgstr "E695: Bir Funcref dizinlenemez" + +msgid "Not enough memory to set references, garbage collection aborted!" +msgstr "Referansları ayarlamak için yetersiz bellek, atık toplama durduruldu" + +msgid "E724: variable nested too deep for displaying" +msgstr "E724: Değişken çok iç içe geçtiğinden görüntülenemiyor" + +msgid "E698: variable nested too deep for making a copy" +msgstr "E698: Değişken kopyalama için çok iç içe geçmiş" + +msgid "" +"\n" +"\tLast set from " +msgstr "" +"\n" +"\tEn son şuradan ayarlandı: " + +msgid "E808: Number or Float required" +msgstr "E808: Sayı veya kayan noktalı değer gerekiyor" + +#, c-format +msgid "E158: Invalid buffer name: %s" +msgstr "E158: Geçersiz arabellek adı: %s" + +msgid "&Ok" +msgstr "&Tamam" + +msgid "E980: lowlevel input not supported" +msgstr "E980: Alt düzey girdi desteklenmiyor" + +#, c-format +msgid "E700: Unknown function: %s" +msgstr "E700: Bilinmeyen işlev: %s" + +msgid "E922: expected a dict" +msgstr "E922: Bir sözlük bekleniyordu" + +msgid "E923: Second argument of function() must be a list or a dict" +msgstr "E923: function() ikinci değişkeni bir liste veya sözlük olmalıdır" + +msgid "" +"&OK\n" +"&Cancel" +msgstr "" +"&Tamam\n" +"İ&ptal" + +msgid "called inputrestore() more often than inputsave()" +msgstr "inputrestore(), inputsave()'den daha fazla çağrıldı" + +msgid "E786: Range not allowed" +msgstr "E786: Erime izin verilmiyor" + +msgid "E701: Invalid type for len()" +msgstr "E701: len() için geçersiz tür" + +msgid "E726: Stride is zero" +msgstr "E726: Sıfır adım" + +msgid "E727: Start past end" +msgstr "E727: Başlangıç bitişten sonra" + +#, c-format +msgid "E962: Invalid action: '%s'" +msgstr "E962: Geçersiz eylem: '%s'" + +#, c-format +msgid "E935: invalid submatch number: %d" +msgstr "E935: Geçersiz alteşleşme numarası: %d" + +msgid "E991: cannot use =<< here" +msgstr "E991: Burada =<< kullanılamaz" + +msgid "E221: Marker cannot start with lower case letter" +msgstr "E221: İmleyici küçük harfle başlayamaz" + +msgid "E172: Missing marker" +msgstr "E172: İmleyici eksik" + +#, c-format +msgid "E990: Missing end marker '%s'" +msgstr "E990: Son imleyici '%s' eksik" + +msgid "E985: .= is not supported with script version >= 2" +msgstr "E985: .= betiğin ikinci sürümünden itibaren desteklenmiyor" + +msgid "E687: Less targets than List items" +msgstr "E687: Liste ögelerinden daha az hedef var" + +msgid "E688: More targets than List items" +msgstr "E688: Liste ögelerinden daha fazla hedef var" + +msgid "E452: Double ; in list of variables" +msgstr "E452: Değişkenler listesinde çifte ;" + +#, c-format +msgid "E738: Can't list variables for %s" +msgstr "E738: %s için değişkenler listelenemiyor" + +msgid "E996: Cannot lock an environment variable" +msgstr "E996: Ortam değişkeni kilitlenemiyor" + +msgid "E996: Cannot lock a register" +msgstr "E996: Yazmaç kilitlenemiyor" + +#, c-format +msgid "E108: No such variable: \"%s\"" +msgstr "E108: Böyle bir değişken yok: \"%s\"" + +msgid "E743: variable nested too deep for (un)lock" +msgstr "E743: Değişken kilitlenemez/kilidi açılamaz, çok iç içe geçmiş" + +#, c-format +msgid "E963: setting %s to value with wrong type" +msgstr "E963: %s yanlış türe sahip değere ayarlanıyor" + +#, c-format +msgid "E795: Cannot delete variable %s" +msgstr "E795: %s değişkeni silinemiyor" + +#, c-format +msgid "E704: Funcref variable name must start with a capital: %s" +msgstr "E704: Funcref değişkeni BÜYÜK harf ile başlamalıdır: %s" + +#, c-format +msgid "E705: Variable name conflicts with existing function: %s" +msgstr "E705: Değişken adı mevcut işlevle çakışıyor: %s" + +#, c-format +msgid "E741: Value is locked: %s" +msgstr "E741: Değer kilitli: %s" + +msgid "Unknown" +msgstr "Bilinmiyor" + +#, c-format +msgid "E742: Cannot change value of %s" +msgstr "E742: %s değeri değiştirilemiyor" + +msgid "E921: Invalid callback argument" +msgstr "E921: Geçersiz geri çağırma değişkeni" + +#, c-format +msgid "<%s>%s%s %d, Hex %02x, Oct %03o, Digr %s" +msgstr "<%s>%s%s %d, Onalt. %02x, Sek. %03o, Digr %s" + +#, c-format +msgid "<%s>%s%s %d, Hex %02x, Octal %03o" +msgstr "<%s>%s%s %d, Onaltılı %02x, Sekizli %03o" + +#, c-format +msgid "> %d, Hex %04x, Oct %o, Digr %s" +msgstr "> %d, Onalt. %04x, Sek. %o, Digr %s" + +#, c-format +msgid "> %d, Hex %08x, Oct %o, Digr %s" +msgstr "> %d, Onalt. %08x, Sek. %o, Digr %s" + +#, c-format +msgid "> %d, Hex %04x, Octal %o" +msgstr "> %d, Onaltılı %04x, Sekizli %o" + +#, c-format +msgid "> %d, Hex %08x, Octal %o" +msgstr "> %d, Onaltılı %08x, Sekizli %o" + +msgid "E134: Cannot move a range of lines into itself" +msgstr "E134: Satırlardan oluşan erim kendi içine taşınamaz" + +#, c-format +msgid "%ld line moved" +msgid_plural "%ld lines moved" +msgstr[0] "%ld satır taşındı" +msgstr[1] "%ld satır taşındı" + +#, c-format +msgid "%ld lines filtered" +msgstr "%ld satır süzüldü" + +msgid "E135: *Filter* Autocommands must not change current buffer" +msgstr "E135: *Süzgeç* otokomutları şu anki arabelleği değiştirmemelidir" + +msgid "[No write since last change]\n" +msgstr "[Son değişiklikten sonra yazılmadı]\n" + +msgid "Save As" +msgstr "Farklı Kaydet" + +msgid "Write partial file?" +msgstr "Dosyanın bir kısmı yazılsın mı?" + +msgid "E140: Use ! to write partial buffer" +msgstr "E140: Arabelleğin bir kısmını yazmak için ! kullanın" + +#, c-format +msgid "Overwrite existing file \"%s\"?" +msgstr "Mevcut \"%s\" dosyasının üzerine yazılsın mı?" + +#, c-format +msgid "Swap file \"%s\" exists, overwrite anyway?" +msgstr "Takas dosyası \"%s\" mevcut, yine de üzerine yazılsın mı?" + +#, c-format +msgid "E768: Swap file exists: %s (:silent! overrides)" +msgstr "E768: Takas dosyası mevcut: %s (:silent! geçersiz kılar)" + +#, c-format +msgid "E141: No file name for buffer %ld" +msgstr "E141: %ld numaralı arabelleğin bir adı yok" + +msgid "E142: File not written: Writing is disabled by 'write' option" +msgstr "E142: Dosya yazılamadı: Yazma 'write' seçeneği ile kapatılmış" + +#, c-format +msgid "" +"'readonly' option is set for \"%s\".\n" +"Do you wish to write anyway?" +msgstr "" +"\"%s\" için 'readonly' (saltokunur) seçeneği açık.\n" +"Yine de yazmak istiyor musunuz?" + +#, c-format +msgid "" +"File permissions of \"%s\" are read-only.\n" +"It may still be possible to write it.\n" +"Do you wish to try?" +msgstr "" +"\"%s\" dosyasının izinleri saltokunur.\n" +"Belki yine de yazılabilir.\n" +"Denemek ister misiniz?" + +#, c-format +msgid "E505: \"%s\" is read-only (add ! to override)" +msgstr "E505: \"%s\" saltokunur (geçersiz kılmak için ! ekleyin)" + +msgid "Edit File" +msgstr "Dosya Düzenle" + +#, c-format +msgid "E143: Autocommands unexpectedly deleted new buffer %s" +msgstr "E143: yeni %s arabelleğini otokomutlar beklenmedik bir biçimde sildi" + +msgid "E144: non-numeric argument to :z" +msgstr "E144: :z için sayısal olmayan değişken" + +msgid "E145: Shell commands and some functionality not allowed in rvim" +msgstr "E145: rvim içinde kabuk komutları ve bazı işlevselliğe izin verilmez" + +msgid "E146: Regular expressions can't be delimited by letters" +msgstr "E146: Düzenli ifadeler harflerle sınırlandırılamaz" + +#, c-format +msgid "replace with %s (y/n/a/q/l/^E/^Y)?" +msgstr "%s ile değiştir (y/n/a/q/l/^E/^Y)?" + +msgid "(Interrupted) " +msgstr "(Yarıda kesildi) " + +#, c-format +msgid "%ld match on %ld line" +msgid_plural "%ld matches on %ld line" +msgstr[0] "%ld eşleşme, %ld satırda" +msgstr[1] "%ld eşleşme, %ld satırda" + +#, c-format +msgid "%ld substitution on %ld line" +msgid_plural "%ld substitutions on %ld line" +msgstr[0] "%ld değiştirme, %ld satırda" +msgstr[1] "%ld değiştirme, %ld satırda" + +#, c-format +msgid "%ld match on %ld lines" +msgid_plural "%ld matches on %ld lines" +msgstr[0] "%ld eşleşme, %ld satırda" +msgstr[1] "%ld eşleşme, %ld satırda" + +#, c-format +msgid "%ld substitution on %ld lines" +msgid_plural "%ld substitutions on %ld lines" +msgstr[0] "%ld değiştirme, %ld satırda" +msgstr[1] "%ld değiştirme, %ld satırda" + +msgid "E147: Cannot do :global recursive with a range" +msgstr "E147: :global özyineli olarak bir erim ile yapılamaz" + +msgid "E148: Regular expression missing from global" +msgstr "E148: Düzenli ifade eksik" + +#, c-format +msgid "Pattern found in every line: %s" +msgstr "Dizginin bulunduğu her satır: %s" + +#, c-format +msgid "Pattern not found: %s" +msgstr "Dizgi bulunamadı: %s" + +msgid "No old files" +msgstr "Eski dosya yok" + +#, c-format +msgid "Save changes to \"%s\"?" +msgstr "Değişiklikler şuraya kaydedilsin mi: \"%s\"?" + +#, c-format +msgid "E947: Job still running in buffer \"%s\"" +msgstr "E947: İş \"%s\" arabelleğinde hâlâ sürüyor" + +#, c-format +msgid "E162: No write since last change for buffer \"%s\"" +msgstr "E162: \"%s\" arabelleği son değişiklikten sonra yazılmadı" + +msgid "Warning: Entered other buffer unexpectedly (check autocommands)" +msgstr "Uyarı: Diğer arabelleğe aniden girildi (otokomutları denetleyin)" + +#, c-format +msgid "E666: compiler not supported: %s" +msgstr "E666: Derleyici desteklenmiyor: %s" + +#, c-format +msgid "W20: Required python version 2.x not supported, ignoring file: %s" +msgstr "W20: Gerekli 2.x Python sürümü desteklenmiyor, dosya yok sayılıyor: %s" + +#, c-format +msgid "W21: Required python version 3.x not supported, ignoring file: %s" +msgstr "W21: Gerekli Python sürümü 3.x desteklenmiyor, dosya yok sayılıyor: %s" + +msgid "Entering Ex mode. Type \"visual\" to go to Normal mode." +msgstr "Ex kipine giriliyor. Normal kipe geri dönmek için \"visual\" yazın." + +msgid "E501: At end-of-file" +msgstr "E501: Dosyanın sonunda" + +#, c-format +msgid "Executing: %s" +msgstr "Çalıştırılıyor: %s" + +msgid "E169: Command too recursive" +msgstr "E169: Komut çok özyineli" + +#, c-format +msgid "E605: Exception not caught: %s" +msgstr "E605: Kural dışı durum yakalanmadı: %s" + +msgid "End of sourced file" +msgstr "Kaynak alınan dosyanın sonu" + +msgid "End of function" +msgstr "İşlevin sonu" + +msgid "E464: Ambiguous use of user-defined command" +msgstr "E464: Kullanıcı tanımlı komutun belirsiz kullanımı" + +msgid "E492: Not an editor command" +msgstr "E492: Bir düzenleyici komutu değil" + +msgid "E981: Command not allowed in rvim" +msgstr "E981: Bu komuta rvim'de izin verilmiyor" + +msgid "E493: Backwards range given" +msgstr "E493: Geriye dönük erim verildi" + +msgid "Backwards range given, OK to swap" +msgstr "Geriye dönük erim verildi, takas edilebilir" + +msgid "E494: Use w or w>>" +msgstr "E494: w veya w>> kullanın" + +msgid "E943: Command table needs to be updated, run 'make cmdidxs'" +msgstr "" +"E943: Komut tablosunun güncellenmesi gerekiyor, 'make cmdidxs' çalıştırın" + +msgid "" +"INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX" +msgstr "" +"DAHİLİ: EX_DFLALL; ADDR_NONE, ADDR_UNSIGNED veya ADDR_QUICKFIX ile birlikte " +"kullanılamaz" + +msgid "E319: Sorry, the command is not available in this version" +msgstr "E319: Üzgünüm, komut bu sürümde mevcut değil" + +#, c-format +msgid "%d more file to edit. Quit anyway?" +msgid_plural "%d more files to edit. Quit anyway?" +msgstr[0] "Düzenlenecek %d dosya daha var. Yine de çıkılsın mı?" +msgstr[1] "Düzenlenecek %d dosya daha var. Yine de çıkılsın mı?" + +#, c-format +msgid "E173: %d more file to edit" +msgid_plural "E173: %d more files to edit" +msgstr[0] "E173: Düzenlenecek %d dosya daha var" +msgstr[1] "E173: Düzenlenecek %d dosya daha var" + +msgid "unknown" +msgstr "bilinmeyen" + +#, c-format +msgid "E185: Cannot find color scheme '%s'" +msgstr "E185: '%s' renk düzeni bulunamadı" + +msgid "Greetings, Vim user!" +msgstr "Selamlar Vim kullanıcısı!" + +msgid "E784: Cannot close last tab page" +msgstr "E784: Son sekme sayfası kapatılamıyor" + +msgid "Already only one tab page" +msgstr "Zaten bir sekme sayfası var" + +msgid "Edit File in new tab page" +msgstr "Dosyayı yeni sekme sayfasında düzenle" + +msgid "Edit File in new window" +msgstr "Dosyayı yeni pencerede düzenle" + +#, c-format +msgid "Tab page %d" +msgstr "Sekme sayfası %d" + +msgid "No swap file" +msgstr "Takas dosyası yok" + +msgid "Append File" +msgstr "Dosya iliştir" + +msgid "E747: Cannot change directory, buffer is modified (add ! to override)" +msgstr "" +"E747: Dizin değiştirilemiyor, arabellek değiştirilmiş (geçersiz kılmak " +"için ! ekleyin)" + +msgid "E186: No previous directory" +msgstr "E186: Öncesinde dizin yok" + +msgid "E187: Unknown" +msgstr "E187: Bilinmeyen" + +msgid "E465: :winsize requires two number arguments" +msgstr "E465: :winsize iki adet sayı değişken gerektirir" + +#, c-format +msgid "Window position: X %d, Y %d" +msgstr "Pencere konumu: X %d, Y %d" + +msgid "E188: Obtaining window position not implemented for this platform" +msgstr "E188: Pencere konumunu alma özelliği bu platformda mevcut değil" + +msgid "E466: :winpos requires two number arguments" +msgstr "E466: :winpos iki adet sayı değişken gerektirir" + +msgid "E930: Cannot use :redir inside execute()" +msgstr "E930: :redir, execute() içinde kullanılamaz" + +msgid "Save Redirection" +msgstr "Yeniden yönlendirmeyi kaydet" + +#, c-format +msgid "E739: Cannot create directory: %s" +msgstr "E739: Dizin oluşturulamıyor: %s" + +#, c-format +msgid "E189: \"%s\" exists (add ! to override)" +msgstr "E189: \"%s\" zaten var (geçersiz kılmak için ! ekleyin)" + +#, c-format +msgid "E190: Cannot open \"%s\" for writing" +msgstr "E190: \"%s\" yazma için açılamıyor" + +msgid "E191: Argument must be a letter or forward/backward quote" +msgstr "E191: Değişken bir harf veya açma/kapama tırnağı olmalıdır" + +msgid "E192: Recursive use of :normal too deep" +msgstr "E192: :normal'in özyineli kullanımı çok derinde" + +msgid "E809: #< is not available without the +eval feature" +msgstr "E809: #<, +eval özelliği olmadan kullanılamaz" + +msgid "E194: No alternate file name to substitute for '#'" +msgstr "E194: '#' yerine koymak için başka dosya adı yok" + +msgid "E495: no autocommand file name to substitute for \"<afile>\"" +msgstr "E495: \"<afile>\" yerine koymak için otokomut dosya adı yok" + +msgid "E496: no autocommand buffer number to substitute for \"<abuf>\"" +msgstr "E496: \"<abuf>\" yerine koymak için otokomut arabellek numarası yok" + +msgid "E497: no autocommand match name to substitute for \"<amatch>\"" +msgstr "E497: \"<amatch>\" yerine koymak için otokomut eşleşme adı yok" + +msgid "E498: no :source file name to substitute for \"<sfile>\"" +msgstr "E498: \"<sfile>\" yerine koymak için :source dosya adı yok" + +msgid "E489: no call stack to substitute for \"<stack>\"" +msgstr "E489: \"<stack>\" yerine koymak için bir çağrı yığını yok" + +msgid "E842: no line number to use for \"<slnum>\"" +msgstr "E842: \"<slnum>\" kullanımı için satır numarası yok" + +msgid "E961: no line number to use for \"<sflnum>\"" +msgstr "E961: \"<sflnum>\" kullanımı için satır numarası yok" + +#, no-c-format +msgid "E499: Empty file name for '%' or '#', only works with \":p:h\"" +msgstr "E499: '%' veya '#' için boş dosya adı, yalnızca \":p:h\" ile çalışır" + +msgid "E500: Evaluates to an empty string" +msgstr "E500: Boş bir satır olarak değer biçer" + +msgid "Untitled" +msgstr "Adsız" + +msgid "E196: No digraphs in this version" +msgstr "E196: Bu sürümde ikili harfler bulunmamaktadır" + +msgid "E608: Cannot :throw exceptions with 'Vim' prefix" +msgstr "E608: 'Vim' öneki ile kural dışı durumlar :throw edilemez" + +#, c-format +msgid "Exception thrown: %s" +msgstr "Kural dışı durum verdi: %s" + +#, c-format +msgid "Exception finished: %s" +msgstr "Kural dışı durum bitti: %s" + +#, c-format +msgid "Exception discarded: %s" +msgstr "Kural dışı durum kenara atıldı: %s" + +#, c-format +msgid "%s, line %ld" +msgstr "%s, %ld. satır" + +#, c-format +msgid "Exception caught: %s" +msgstr "Kural dışı durum yakalandı: %s" + +#, c-format +msgid "%s made pending" +msgstr "%s askıya alındı" + +#, c-format +msgid "%s resumed" +msgstr "%s sürdürüldü" + +#, c-format +msgid "%s discarded" +msgstr "%s kenara atıldı" + +msgid "Exception" +msgstr "Kural dışı durum" + +msgid "Error and interrupt" +msgstr "Hata ve yarıda kesilme" + +msgid "Error" +msgstr "Hata" + +msgid "Interrupt" +msgstr "Yarıda Kesilme" + +msgid "E579: :if nesting too deep" +msgstr "E579: :if'ler çok iç içe geçmiş" + +msgid "E583: multiple :else" +msgstr "E583: Birden fazla :else" + +msgid "E584: :elseif after :else" +msgstr "E584: :else sonrası :elseif" + +msgid "E585: :while/:for nesting too deep" +msgstr "E585: :while/:for çok iç içe geçmiş" + +msgid "E732: Using :endfor with :while" +msgstr "E732: :endfor, :while ile kullanılıyor" + +msgid "E733: Using :endwhile with :for" +msgstr "E733: :endwhile, :for ile kullanılıyor" + +msgid "E579: block nesting too deep" +msgstr "E579: İç içe geçmeler çok derin" + +msgid "E601: :try nesting too deep" +msgstr "E601: :try çok iç içe geçmiş" + +msgid "E604: :catch after :finally" +msgstr "E604: :finally sonrası :catch" + +msgid "E193: :enddef not inside a function" +msgstr "E193: :enddef bir işlev içinde değil" + +msgid "E193: :endfunction not inside a function" +msgstr "E193: :endfunction bir işlev içinde değil" + +msgid "E788: Not allowed to edit another buffer now" +msgstr "E788: Şu anda başka bir arabellek düzenlenemez" + +msgid "E811: Not allowed to change buffer information now" +msgstr "E811: Şu anda arabellek bilgisi değiştirilemez" + +msgid "E199: Active window or buffer deleted" +msgstr "E199: Etkin pencere veya arabellek silinmiş" + +msgid "E812: Autocommands changed buffer or buffer name" +msgstr "E812: Otokomutlar arabelleği veya arabellek adını değiştirdi" + +msgid "Illegal file name" +msgstr "İzin verilmeyen dosya adı" + +msgid "is not a file" +msgstr "bir dosya değil" + +msgid "is a device (disabled with 'opendevice' option)" +msgstr "bir aygıt ('opendevice' seçeneği ile kapatılır)" + +msgid "[New DIRECTORY]" +msgstr "[Yeni DİZİN]" + +msgid "[File too big]" +msgstr "[Dosya çok büyük]" + +msgid "[Permission Denied]" +msgstr "[İzin verilmedi]" + +msgid "E200: *ReadPre autocommands made the file unreadable" +msgstr "E200: *ReadPre otokomutları dosyayı okunamaz hale getirdi" + +msgid "E201: *ReadPre autocommands must not change current buffer" +msgstr "E201: *ReadPre otokomutları şu anki arabelleği değiştirmemeli" + +msgid "Vim: Reading from stdin...\n" +msgstr "Vim: stdin'den okunuyor...\n" + +msgid "Reading from stdin..." +msgstr "stdin'den okunuyor..." + +msgid "E202: Conversion made file unreadable!" +msgstr "E202: Dönüştürme dosyayı okunamaz hale getirdi!" + +msgid "[fifo]" +msgstr "[fifo]" + +msgid "[socket]" +msgstr "[uç nokta]" + +msgid "[character special]" +msgstr "[özel karakterli]" + +msgid "[CR missing]" +msgstr "[Eksik CR]" + +msgid "[long lines split]" +msgstr "[uzun satırlar bölünmüş]" + +#, c-format +msgid "[CONVERSION ERROR in line %ld]" +msgstr "[%ld. satırda DÖNÜŞTÜRME HATASI]" + +#, c-format +msgid "[ILLEGAL BYTE in line %ld]" +msgstr "[%ld. satırda GEÇERSİZ BAYT]" + +msgid "[READ ERRORS]" +msgstr "[OKUMA HATALARI]" + +msgid "Can't find temp file for conversion" +msgstr "Dönüştürme için geçici dosya bulunamadı" + +msgid "Conversion with 'charconvert' failed" +msgstr "'charconvert' ile dönüştürme başarısız" + +msgid "can't read output of 'charconvert'" +msgstr "'charconvert' çıktısı okunamıyor" + +msgid "[dos]" +msgstr "[dos]" + +msgid "[dos format]" +msgstr "[dos biçimi]" + +msgid "[mac]" +msgstr "[mac]" + +msgid "[mac format]" +msgstr "[mac biçimi]" + +msgid "[unix]" +msgstr "[unix]" + +msgid "[unix format]" +msgstr "[unix biçimi]" + +#, c-format +msgid "%ld line, " +msgid_plural "%ld lines, " +msgstr[0] "%ld satır, " +msgstr[1] "%ld satır, " + +#, c-format +msgid "%lld byte" +msgid_plural "%lld bytes" +msgstr[0] "%lld bayt" +msgstr[1] "%lld bayt" + +msgid "[noeol]" +msgstr "[noeol]" + +msgid "[Incomplete last line]" +msgstr "[Tamamlanmamış son satır]" + +#, c-format +msgid "E208: Error writing to \"%s\"" +msgstr "E208: Şuraya yazılamadı: \"%s\"" + +#, c-format +msgid "E209: Error closing \"%s\"" +msgstr "E209: \"%s\" kapatılırken hata" + +#, c-format +msgid "E210: Error reading \"%s\"" +msgstr "E210: \"%s\" okunurken hata" + +msgid "E246: FileChangedShell autocommand deleted buffer" +msgstr "E246: FileChangedShell otokomutu arabelleği sildi" + +#, c-format +msgid "E211: File \"%s\" no longer available" +msgstr "E211: \"%s\" dosyası artık mevcut değil" + +#, c-format +msgid "" +"W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as " +"well" +msgstr "" +"W12: Uyarı: \"%s\" dosyası Vim'deki arabellek de dahil olmak üzere " +"değiştirildi" + +msgid "See \":help W12\" for more info." +msgstr "Ek bilgi için \":help W12\" yazın." + +#, c-format +msgid "W11: Warning: File \"%s\" has changed since editing started" +msgstr "W11: Uyarı: \"%s\" dosyası düzenleme başladığından beri değişti" + +msgid "See \":help W11\" for more info." +msgstr "Ek bilgi için \":help W11\" yazın." + +#, c-format +msgid "W16: Warning: Mode of file \"%s\" has changed since editing started" +msgstr "" +"W16: Uyarı: \"%s\" dosyasının kipi düzenleme başladığından beri değişti" + +msgid "See \":help W16\" for more info." +msgstr "Ek bilgi için \":help W16\" yazın." + +#, c-format +msgid "W13: Warning: File \"%s\" has been created after editing started" +msgstr "W13: Uyarı: \"%s\" dosyası düzenleme başladıktan sonra oluşturuldu" + +msgid "Warning" +msgstr "Uyarı" + +msgid "" +"&OK\n" +"&Load File" +msgstr "" +"&Tamam\n" +"&Dosya Yükle" + +#, c-format +msgid "E462: Could not prepare for reloading \"%s\"" +msgstr "E462: \"%s\" yeniden yükleme için hazırlanamadı" + +#, c-format +msgid "E321: Could not reload \"%s\"" +msgstr "E321: \"%s\" yeniden yüklenemedi" + +msgid "E219: Missing {." +msgstr "E219: { eksik." + +msgid "E220: Missing }." +msgstr "E220: } eksik." + +msgid "<empty>" +msgstr "<boş>" + +msgid "E655: Too many symbolic links (cycle?)" +msgstr "E655: Çok fazla sembolik bağlantı (çevrim?)" + +msgid "writefile() first argument must be a List or a Blob" +msgstr "writefile() ilk değişkeni bir liste veya ikili geniş nesne olmalıdır" + +msgid "Select Directory dialog" +msgstr "Dizin Seç iletişim kutusu" + +msgid "Save File dialog" +msgstr "Dosya Kaydet iletişim kutusu" + +msgid "Open File dialog" +msgstr "Dosya Aç iletişim kutusu" + +msgid "E338: Sorry, no file browser in console mode" +msgstr "E338: Üzgünüm, konsol kipinde dosya tarayıcı yoktur" + +msgid "no matches" +msgstr "eşleşme yok" + +msgid "E854: path too long for completion" +msgstr "E854: Yol tamamlama için çok uzun" + +#, c-format +msgid "" +"E343: Invalid path: '**[number]' must be at the end of the path or be " +"followed by '%s'." +msgstr "" +"E343: Geçersiz yol: '**[sayı]' yolun sonunda olmalı veya sonrasında '%s' " +"gelmelidir" + +#, c-format +msgid "E344: Can't find directory \"%s\" in cdpath" +msgstr "E344: \"%s\" dizini cdpath içinde bulunamadı" + +#, c-format +msgid "E345: Can't find file \"%s\" in path" +msgstr "E345: \"%s\" dosyası yol içinde bulunamadı" + +#, c-format +msgid "E346: No more directory \"%s\" found in cdpath" +msgstr "E346: Başka bir \"%s\" dizini cdpath içinde bulunamadı" + +#, c-format +msgid "E347: No more file \"%s\" found in path" +msgstr "E347: Başka bir \"%s\" dosyası yol içinde bulunamadı" + +msgid "E446: No file name under cursor" +msgstr "E446: İmleç altında bir dosya adı yok" + +#, c-format +msgid "E447: Can't find file \"%s\" in path" +msgstr "E447: \"%s\" dosyası yol içinde bulunamadı" + +msgid "E490: No fold found" +msgstr "E490: Kıvırma bulunamadı" + +msgid "E350: Cannot create fold with current 'foldmethod'" +msgstr "E350: Şu anki 'foldmethod' ile kıvırma oluşturulamıyor" + +msgid "E351: Cannot delete fold with current 'foldmethod'" +msgstr "E351: Şu anki 'foldmethod' ile kıvırma silinemiyor" + +#, c-format +msgid "+--%3ld line folded " +msgid_plural "+--%3ld lines folded " +msgstr[0] "+--%3ld satır kıvrıldı " +msgstr[1] "+--%3ld satır kıvrıldı " + +#, c-format +msgid "+-%s%3ld line: " +msgid_plural "+-%s%3ld lines: " +msgstr[0] "+-%s%3ld satır: " +msgstr[1] "+-%s%3ld satır: " + +msgid "E222: Add to read buffer" +msgstr "E222: Okuma arabelleğine ekle" + +msgid "E223: recursive mapping" +msgstr "E223: Özyineli eşlemleme" + +msgid "E851: Failed to create a new process for the GUI" +msgstr "E851: Grafik arabirim için yeni bir işlem yaratılamadı" + +msgid "E852: The child process failed to start the GUI" +msgstr "E852: Alt işlem grafik arabirimini başlatamadı" + +msgid "E229: Cannot start the GUI" +msgstr "E229: Grafik arabirimi başlatılamıyor" + +#, c-format +msgid "E230: Cannot read from \"%s\"" +msgstr "E230: \"%s\" okunamıyor" + +msgid "E665: Cannot start GUI, no valid font found" +msgstr "E665: Grafik arabirim başlatılamıyor, geçerli bir font bulunamadı" + +msgid "E231: 'guifontwide' invalid" +msgstr "E231: 'guifontwide' geçersiz" + +msgid "E599: Value of 'imactivatekey' is invalid" +msgstr "E599: 'imactivatekey' değeri geçersiz" + +msgid "No match at cursor, finding next" +msgstr "İmleç konumunda eşleşme bulunamadı, sonraki bulunuyor" + +msgid "<cannot open> " +msgstr "<açılamıyor> " + +#, c-format +msgid "E616: vim_SelFile: can't get font %s" +msgstr "E616: vim_SelFile: %s fontu bulunamıyor" + +msgid "E614: vim_SelFile: can't return to current directory" +msgstr "E614: vim_SelFile: Şu anki dizine dönülemiyor" + +msgid "Pathname:" +msgstr "Yol adı:" + +msgid "E615: vim_SelFile: can't get current directory" +msgstr "E615: vim_SelFile: Şu anki dizin bulunamıyor" + +msgid "OK" +msgstr "Tamam" + +msgid "Cancel" +msgstr "İptal" + +msgid "Scrollbar Widget: Could not get geometry of thumb pixmap." +msgstr "Kaydırma Parçacığı: Kenar piksel haritası geometrisi bulunamadı" + +msgid "Vim dialog" +msgstr "Vim" + +msgid "E232: Cannot create BalloonEval with both message and callback" +msgstr "E232: Hem ileti hem de geri çağırma ile BallonEval oluşturulamıyor" + +msgid "_Save" +msgstr "_Kaydet" + +msgid "_Open" +msgstr "_Aç" + +msgid "_Cancel" +msgstr "İ_ptal" + +msgid "_OK" +msgstr "_Tamam" + +msgid "" +"&Yes\n" +"&No\n" +"&Cancel" +msgstr "" +"&Evet\n" +"&Hayır\n" +"İ&ptal" + +msgid "Yes" +msgstr "Evet" + +msgid "No" +msgstr "Hayır" + +msgid "Input _Methods" +msgstr "Giriş _Yöntemleri" + +msgid "VIM - Search and Replace..." +msgstr "VİM - Ara ve Değiştir..." + +msgid "VIM - Search..." +msgstr "VİM - Ara..." + +msgid "Find what:" +msgstr "Bulunacak nesne:" + +msgid "Replace with:" +msgstr "Şununla değiştir:" + +msgid "Match whole word only" +msgstr "Tam sözcükleri ara" + +msgid "Match case" +msgstr "BÜYÜK/küçük harf duyarlı" + +msgid "Direction" +msgstr "Yön" + +msgid "Up" +msgstr "Yukarı" + +msgid "Down" +msgstr "Aşağı" + +msgid "Find Next" +msgstr "Sonrakini Bul" + +msgid "Replace" +msgstr "Değiştir" + +msgid "Replace All" +msgstr "Tümünü Değiştir" + +msgid "_Close" +msgstr "K_apat" + +msgid "Vim: Received \"die\" request from session manager\n" +msgstr "Vim: Oturum yöneticisinden işi sonlandırma isteği geldi\n" + +msgid "Close tab" +msgstr "Sekmeyi kapat" + +msgid "New tab" +msgstr "Yeni sekme" + +msgid "Open Tab..." +msgstr "Sekme Aç..." + +msgid "Vim: Main window unexpectedly destroyed\n" +msgstr "Vim: Ana pencere beklenmedik bir biçimde gitti\n" + +msgid "&Filter" +msgstr "&Süz" + +msgid "&Cancel" +msgstr "İ&ptal" + +msgid "Directories" +msgstr "Dizinler" + +msgid "Filter" +msgstr "Süzgeç" + +msgid "&Help" +msgstr "&Yardım" + +msgid "Files" +msgstr "Dosyalar" + +msgid "&OK" +msgstr "&Tamam" + +msgid "Selection" +msgstr "Seçim" + +msgid "Find &Next" +msgstr "Sonrakini &Bul" + +msgid "&Replace" +msgstr "&Değiştir" + +msgid "Replace &All" +msgstr "Tümünü D&eğiştir" + +msgid "&Undo" +msgstr "&Geri al" + +msgid "Open tab..." +msgstr "Sekme aç..." + +msgid "Find string" +msgstr "Dizi bul" + +msgid "Find & Replace" +msgstr "Bul ve Değiştir" + +msgid "Not Used" +msgstr "Kullanılmıyor" + +msgid "Directory\t*.nothing\n" +msgstr "Directory\t*.hiçbir şey\n" + +#, c-format +msgid "E671: Cannot find window title \"%s\"" +msgstr "E671: Pencere başlığı \"%s\" bulunamıyor" + +#, c-format +msgid "E243: Argument not supported: \"-%s\"; Use the OLE version." +msgstr "E243: \"-%s\" değişkeni desteklenmiyor; OLE sürümünü kullanın." + +msgid "E988: GUI cannot be used. Cannot execute gvim.exe." +msgstr "E988: Grafik arabirim kullanılamaz. gvim.exe çalıştırılamadı." + +msgid "E672: Unable to open window inside MDI application" +msgstr "E672: MDI uygulaması içinde pencere açılamıyor" + +msgid "Vim E458: Cannot allocate colormap entry, some colors may be incorrect" +msgstr "" +"Vim E458: Renk eşlemi girdisi ayrılamadı, bazı renkler hatalı görünebilir" + +#, c-format +msgid "E250: Fonts for the following charsets are missing in fontset %s:" +msgstr "E250: %s yazıtipi seti içinde şu karakter setleri için fontlar eksik:" + +#, c-format +msgid "E252: Fontset name: %s" +msgstr "E252: Yazıtipi seti adı: %s" + +#, c-format +msgid "Font '%s' is not fixed-width" +msgstr "'%s' yazıtipi sabit aralıklı değil" + +#, c-format +msgid "E253: Fontset name: %s" +msgstr "E253: Yazıtipi seti adı: %s" + +#, c-format +msgid "Font0: %s" +msgstr "Yazıtipi0: %s" + +#, c-format +msgid "Font%d: %s" +msgstr "Yazıtipi%d: %s" + +#, c-format +msgid "Font%d width is not twice that of font0" +msgstr "Yazıtipi%d genişliği yazıtipi0 genişliğinin iki katı olmalıdır" + +#, c-format +msgid "Font0 width: %d" +msgstr "Yazıtipi0 genişliği: %d" + +#, c-format +msgid "Font%d width: %d" +msgstr "Yazıtipi%d genişliği: %d" + +msgid "E284: Cannot set IC values" +msgstr "E284: Girdi bağlamı değerleri ayarlanamıyor" + +msgid "E285: Failed to create input context" +msgstr "E285: Girdi bağlamı oluşturulamadı" + +msgid "E286: Failed to open input method" +msgstr "E286: Giriş yöntemi açılamadı" + +msgid "E287: Warning: Could not set destroy callback to IM" +msgstr "E287: Uyarı: Giriş yöntemine yok etme geri çağırması ayarlanamadı" + +msgid "E288: input method doesn't support any style" +msgstr "E288: Giriş yöntemi herhangi bir biçemi desteklemiyor" + +msgid "E289: input method doesn't support my preedit type" +msgstr "E289: Giriş yöntemi benim ön düzenleme türümü desteklemiyor" + +msgid "Invalid font specification" +msgstr "Geçersiz yazıtipi belirtimi" + +msgid "&Dismiss" +msgstr "So&nlandır" + +msgid "no specific match" +msgstr "belirli bir eşleşme yok" + +msgid "Vim - Font Selector" +msgstr "Vim - Yazıtipi Seçicisi" + +msgid "Name:" +msgstr "Ad:" + +msgid "Show size in Points" +msgstr "Büyüklüğü puntolarla göster" + +msgid "Encoding:" +msgstr "Kodlama:" + +msgid "Font:" +msgstr "Yazıtipi:" + +msgid "Style:" +msgstr "Biçem:" + +msgid "Size:" +msgstr "Büyüklük:" + +msgid "E550: Missing colon" +msgstr "E550: İki nokta eksik" + +msgid "E551: Illegal component" +msgstr "E551: Geçersiz bileşen" + +msgid "E552: digit expected" +msgstr "E552: Basamak bekleniyordu" + +#, c-format +msgid "Page %d" +msgstr "Sayfa %d" + +msgid "No text to be printed" +msgstr "Yazdırılacak metin yok" + +#, c-format +msgid "Printing page %d (%d%%)" +msgstr "Sayfa yazdırılıyor: %d (%d%%)" + +#, c-format +msgid " Copy %d of %d" +msgstr " Kopya %d/%d" + +#, c-format +msgid "Printed: %s" +msgstr "Yazdırıldı: %s" + +msgid "Printing aborted" +msgstr "Yazdırma durduruldu" + +msgid "E455: Error writing to PostScript output file" +msgstr "E455: PostScript çıktı dosyasına yazarken hata" + +#, c-format +msgid "E624: Can't open file \"%s\"" +msgstr "E624: \"%s\" dosyası açılamıyor" + +#, c-format +msgid "E457: Can't read PostScript resource file \"%s\"" +msgstr "E457: PostScript kaynak dosyası \"%s\" okunamıyor" + +#, c-format +msgid "E618: file \"%s\" is not a PostScript resource file" +msgstr "E618: \"%s\" dosyası bir PostScript kaynak dosyası değil" + +#, c-format +msgid "E619: file \"%s\" is not a supported PostScript resource file" +msgstr "E619: \"%s\" dosyası desteklenen bir PostScript kaynak dosyası değil" + +#, c-format +msgid "E621: \"%s\" resource file has wrong version" +msgstr "E621: \"%s\" kaynak dosyası sürümü hatalı" + +msgid "E673: Incompatible multi-byte encoding and character set." +msgstr "E673: Uyumsuz çoklu bit kodlaması ve karakter seti." + +msgid "E674: printmbcharset cannot be empty with multi-byte encoding." +msgstr "E674: printmbcharset çoklu bit kodlamada boş olamaz" + +msgid "E675: No default font specified for multi-byte printing." +msgstr "E675: Çoklu bit yazdırma için öntanımlı yazıtipi ayarlanmamış." + +msgid "E324: Can't open PostScript output file" +msgstr "E324: PostScript çıktı dosyası açılamıyor" + +#, c-format +msgid "E456: Can't open file \"%s\"" +msgstr "E456: \"%s\" dosyası açılamıyor" + +msgid "E456: Can't find PostScript resource file \"prolog.ps\"" +msgstr "E456: PostScript kaynak dosyası \"prolog.ps\" bulunamıyor" + +msgid "E456: Can't find PostScript resource file \"cidfont.ps\"" +msgstr "E456: PostScript kaynak dosyası \"cidfont.ps\" bulunamıyor" + +#, c-format +msgid "E456: Can't find PostScript resource file \"%s.ps\"" +msgstr "E456: PostScript kaynak dosyası \"%s.ps\" bulunamıyor" + +#, c-format +msgid "E620: Unable to convert to print encoding \"%s\"" +msgstr "E620: \"%s\" yazdırma kodlamasına dönüştürülemiyor" + +msgid "Sending to printer..." +msgstr "Yazıcıya gönderiliyor..." + +msgid "E365: Failed to print PostScript file" +msgstr "E365: PostScript dosyası yazdırılamadı" + +msgid "Print job sent." +msgstr "Yazdırma işi gönderildi" + +msgid "E478: Don't panic!" +msgstr "E478: Panik yok!" + +#, c-format +msgid "E661: Sorry, no '%s' help for %s" +msgstr "E661: Üzgünüm, '%s' yardımı %s için mevcut değil" + +#, c-format +msgid "E149: Sorry, no help for %s" +msgstr "E149: Üzgünüm, %s için yardım mevcut değil" + +#, c-format +msgid "Sorry, help file \"%s\" not found" +msgstr "Üzgünüm, \"%s\" yardım dosyası bulunamadı" + +#, c-format +msgid "E151: No match: %s" +msgstr "E151: Eşleşme bulunamadı: %s" + +#, c-format +msgid "E152: Cannot open %s for writing" +msgstr "E152: %s yazma için açılamıyor" + +#, c-format +msgid "E153: Unable to open %s for reading" +msgstr "E153: %s okuma için açılamıyor" + +#, c-format +msgid "E670: Mix of help file encodings within a language: %s" +msgstr "E670: Bir dilde yardım dosyası kodlamaları karıştı: %s" + +#, c-format +msgid "E154: Duplicate tag \"%s\" in file %s/%s" +msgstr "E154: Şu dosyada yinelenen \"%s\" etiketi: %s/%s" + +#, c-format +msgid "E150: Not a directory: %s" +msgstr "E150: %s bir dizin değil" + +msgid "E679: recursive loop loading syncolor.vim" +msgstr "E679: syncolor.vim yüklenirken özyineli döngü" + +#, c-format +msgid "E411: highlight group not found: %s" +msgstr "E411: Vurgulama grubu bulunamadı: %s" + +#, c-format +msgid "E412: Not enough arguments: \":highlight link %s\"" +msgstr "E412: Yetersiz sayıda değişken: \":highlight link %s\"" + +#, c-format +msgid "E413: Too many arguments: \":highlight link %s\"" +msgstr "E413: Çok fazla değişken: \":highlight link %s\"" + +msgid "E414: group has settings, highlight link ignored" +msgstr "E414: Grup ayarları mevcut, vurgulama bağlantısı yok sayıldı" + +#, c-format +msgid "E415: unexpected equal sign: %s" +msgstr "E415: Beklenmedik eşittir imi: %s" + +#, c-format +msgid "E416: missing equal sign: %s" +msgstr "E416: Eksik eşittir imi: %s" + +#, c-format +msgid "E417: missing argument: %s" +msgstr "E417: Eksik değişkenler: %s" + +#, c-format +msgid "E418: Illegal value: %s" +msgstr "E418: İzin verilmeyen değer: %s" + +msgid "E419: FG color unknown" +msgstr "E419: Bilinmeyen metin rengi" + +msgid "E420: BG color unknown" +msgstr "E420: Bilinmeyen ardalan rengi" + +msgid "E453: UL color unknown" +msgstr "E453: Bilinmeyen alt çizme rengi" + +#, c-format +msgid "E421: Color name or number not recognized: %s" +msgstr "E421: Renk adı veya numarası tanımlanamadı: %s" + +#, c-format +msgid "E422: terminal code too long: %s" +msgstr "E422: Uçbirim kodu çok uzun: %s" + +#, c-format +msgid "E423: Illegal argument: %s" +msgstr "E423: İzin verilmeyen değişken: %s" + +msgid "E424: Too many different highlighting attributes in use" +msgstr "E424: Çok fazla değişik vurgulama kuralları kullanılıyor" + +msgid "E669: Unprintable character in group name" +msgstr "E669: Grup adında yazdırılamayan karakter" + +msgid "W18: Invalid character in group name" +msgstr "W18: Grup adında geçersiz karakter" + +msgid "E849: Too many highlight and syntax groups" +msgstr "E849: Çok fazla vurgulama ve sözdizim grupları" + +msgid "Add a new database" +msgstr "Yeni bir veritabanı ekle" + +msgid "Query for a pattern" +msgstr "Bir dizgiyi sorgula" + +msgid "Show this message" +msgstr "Bu iletiyi göster" + +msgid "Kill a connection" +msgstr "Bir bağlantıyı kes" + +msgid "Reinit all connections" +msgstr "Tüm bağlantıları yeniden kur" + +msgid "Show connections" +msgstr "Bağlantıları göster" + +#, c-format +msgid "E560: Usage: cs[cope] %s" +msgstr "E560: Kullanım: cs[cope] %s" + +msgid "This cscope command does not support splitting the window.\n" +msgstr "Bu cscope komutu pencereyi bölmeyi desteklemiyor.\n" + +msgid "E562: Usage: cstag <ident>" +msgstr "E562: Kullanım: cstag <ad>" + +msgid "E257: cstag: tag not found" +msgstr "E257: cstag: Etiket bulunamadı" + +#, c-format +msgid "E563: stat(%s) error: %d" +msgstr "E563: stat(%s) hatası: %d" + +msgid "E563: stat error" +msgstr "E563: stat hatası" + +#, c-format +msgid "E564: %s is not a directory or a valid cscope database" +msgstr "E564: %s bir dizin veya geçerli bir cscope veritabanı değil" + +#, c-format +msgid "Added cscope database %s" +msgstr "cscope veritabanı %s eklendi" + +#, c-format +msgid "E262: error reading cscope connection %d" +msgstr "E262: cscope bağlantısı %d okunurken hata" + +msgid "E561: unknown cscope search type" +msgstr "E561: Bilinmeyen cscope arama türü" + +msgid "E566: Could not create cscope pipes" +msgstr "E566: cscope veri yolları oluşturulamadı" + +msgid "E622: Could not fork for cscope" +msgstr "E622: cscope için çatal oluşturulamadı" + +msgid "cs_create_connection setpgid failed" +msgstr "cs_create_connection: setpgid başarısız oldu" + +msgid "cs_create_connection exec failed" +msgstr "cs_create_connection: exec başarısız oldu" + +msgid "cs_create_connection: fdopen for to_fp failed" +msgstr "cs_create_connection: to_fp için fdopen başarısız oldu" + +msgid "cs_create_connection: fdopen for fr_fp failed" +msgstr "cs_create_connection: fr_fp için fdopen başarısız oldu" + +msgid "E623: Could not spawn cscope process" +msgstr "E623: cscope işlemi ortaya çıkarılamadı" + +msgid "E567: no cscope connections" +msgstr "E567: cscope bağlantıları yok" + +#, c-format +msgid "E469: invalid cscopequickfix flag %c for %c" +msgstr "E469: Geçersiz cscopequickfix bayrağı %c, %c için" + +#, c-format +msgid "E259: no matches found for cscope query %s of %s" +msgstr "E259: cscope sorgusu %s/%s için eşleşme bulunamadı" + +msgid "cscope commands:\n" +msgstr "cscope komutları:\n" + +#, c-format +msgid "%-5s: %s%*s (Usage: %s)" +msgstr "%-5s: %s%*s (Kullanım: %s)" + +msgid "" +"\n" +" a: Find assignments to this symbol\n" +" c: Find functions calling this function\n" +" d: Find functions called by this function\n" +" e: Find this egrep pattern\n" +" f: Find this file\n" +" g: Find this definition\n" +" i: Find files #including this file\n" +" s: Find this C symbol\n" +" t: Find this text string\n" +msgstr "" +"\n" +" a: Bu sembole yapılan atamaları bul\n" +" c: Bu işlevi çağıran işlevleri bul\n" +" d: bu işlev tarafından çağrılan işlevleri bul\n" +" e: Bu egrep dizgisini bul\n" +" f: Bu dosyayı bul\n" +" g: Bu tanımı bul\n" +" i: Bu dosyayı içeren (#including) dosyaları bul\n" +" s: Bu \"C\" sembolünü bul\n" +" t: Bu metin dizisini bul\n" + +#, c-format +msgid "E625: cannot open cscope database: %s" +msgstr "E625: cscope veritabanı açılamıyor: %s" + +msgid "E626: cannot get cscope database information" +msgstr "E626: cscope veritabanı bilgisi alınamıyor" + +msgid "E568: duplicate cscope database not added" +msgstr "E568: Yinelenen cscope veritabanı eklenmemiş" + +#, c-format +msgid "E261: cscope connection %s not found" +msgstr "E261: %s cscope bağlantısı bulunamadı" + +#, c-format +msgid "cscope connection %s closed" +msgstr "%s cscope bağlantısı bitirildi" + +msgid "E570: fatal error in cs_manage_matches" +msgstr "E570: cs_manage_matches içinde onulmaz hata" + +#, c-format +msgid "Cscope tag: %s" +msgstr "cscope etiketi: %s" + +msgid "" +"\n" +" # line" +msgstr "" +"\n" +" # satır" + +msgid "filename / context / line\n" +msgstr "dosya adı / bağlam / satır\n" + +#, c-format +msgid "E609: Cscope error: %s" +msgstr "E609: cscope hatası: %s" + +msgid "All cscope databases reset" +msgstr "Tüm cscope veritabanları sıfırlandı" + +msgid "no cscope connections\n" +msgstr "cscope bağlantısı yok\n" + +msgid " # pid database name prepend path\n" +msgstr " # pid veritabanı adı başlangıç yolu\n" + +msgid "Lua library cannot be loaded." +msgstr "Lua kitaplığı yüklenemedi." + +msgid "cannot save undo information" +msgstr "Geri al bilgisi kaydedilemiyor" + +msgid "" +"E815: Sorry, this command is disabled, the MzScheme libraries could not be " +"loaded." +msgstr "" +"E815: Üzgünüm, bu komut etkin değil, MzScheme kitaplıkları yüklenemedi." + +msgid "" +"E895: Sorry, this command is disabled, the MzScheme's racket/base module " +"could not be loaded." +msgstr "" +"E895: Üzgünüm, bu komut etkin değil, MzScheme'in racket/base birimi " +"yüklenemedi." + +msgid "invalid expression" +msgstr "geçersiz ifade" + +msgid "expressions disabled at compile time" +msgstr "ifadeler derleme aşamasında kapatılmış" + +msgid "hidden option" +msgstr "gizli seçenek" + +msgid "unknown option" +msgstr "bilinmeyen seçenek" + +msgid "window index is out of range" +msgstr "pencere dizini erimin dışında" + +msgid "couldn't open buffer" +msgstr "arabellek açılamadı" + +msgid "cannot delete line" +msgstr "satır silinemiyor" + +msgid "cannot replace line" +msgstr "satır değiştirilemiyor" + +msgid "cannot insert line" +msgstr "satır eklenemiyor" + +msgid "string cannot contain newlines" +msgstr "dizi \"yeni satır\" imi içeremez" + +msgid "error converting Scheme values to Vim" +msgstr "Scheme değerlerini Vim değerlerine dönüştürürken hata" + +msgid "Vim error: ~a" +msgstr "Vim hatası: ~a" + +msgid "Vim error" +msgstr "Vim hatası" + +msgid "buffer is invalid" +msgstr "arabellek geçersiz" + +msgid "window is invalid" +msgstr "pencere geçersiz" + +msgid "linenr out of range" +msgstr "linenr erimin dışında" + +msgid "not allowed in the Vim sandbox" +msgstr "Vim kum havuzunda izin verilmiyor" + +msgid "E836: This Vim cannot execute :python after using :py3" +msgstr "E836: Bu Vim :py3 komutundan sonra :python komutunu çalıştıramaz" + +msgid "" +"E263: Sorry, this command is disabled, the Python library could not be " +"loaded." +msgstr "E263: Üzgünüm, bu komut etkin değil, Python kitaplığı yüklenemedi" + +msgid "" +"E887: Sorry, this command is disabled, the Python's site module could not be " +"loaded." +msgstr "" +"E887: Üzgünüm, bu komut etkin değil, Python'un site birimi yüklenemedi." + +msgid "E659: Cannot invoke Python recursively" +msgstr "E659: Python özyineli olarak çalıştırılamıyor" + +msgid "E837: This Vim cannot execute :py3 after using :python" +msgstr "E837: Bu Vim :python komutundan sonra :py3 komutunu çalıştıramaz" + +msgid "E265: $_ must be an instance of String" +msgstr "E265: $_ bir dizi örneği olmalıdır" + +msgid "" +"E266: Sorry, this command is disabled, the Ruby library could not be loaded." +msgstr "E266: Üzgünüm, bu komut etkin değil, Ruby kitaplığı yüklenemedi." + +msgid "E267: unexpected return" +msgstr "E267: Beklenmeyen dönüş" + +msgid "E268: unexpected next" +msgstr "E268: Beklenmeyen sonraki" + +msgid "E269: unexpected break" +msgstr "E269: Beklenmeyen kesme" + +msgid "E270: unexpected redo" +msgstr "E270: Beklenmeyen yinele komutu" + +msgid "E271: retry outside of rescue clause" +msgstr "E271: retry, rescue işlecinin dışında" + +msgid "E272: unhandled exception" +msgstr "E272: İşletilemeyen kural dışı durum" + +#, c-format +msgid "E273: unknown longjmp status %d" +msgstr "E273: Bilinmeyen longjmp durumu %d" + +msgid "invalid buffer number" +msgstr "Geçersiz arabellek numarası" + +msgid "not implemented yet" +msgstr "henüz uygulanmadı" + +msgid "cannot set line(s)" +msgstr "satır(lar) ayarlanamıyor" + +msgid "invalid mark name" +msgstr "geçersiz im adı" + +msgid "mark not set" +msgstr "im ayarlanmamış" + +#, c-format +msgid "row %d column %d" +msgstr "satır %d sütun %d" + +msgid "cannot insert/append line" +msgstr "satır eklenemiyor/iliştirilemiyor" + +msgid "line number out of range" +msgstr "satır numarası erimin dışında" + +msgid "unknown flag: " +msgstr "geçersiz bayrak: " + +msgid "unknown vimOption" +msgstr "geçersiz vimOption" + +msgid "keyboard interrupt" +msgstr "klavye araya girdi" + +msgid "cannot create buffer/window command: object is being deleted" +msgstr "arabellek/pencere komutu oluşturulamadı: öge şu anda siliniyor" + +msgid "" +"cannot register callback command: buffer/window is already being deleted" +msgstr "geri çağırma komutu kaydedilemiyor: arabellek/pencere zaten siliniyor" + +msgid "" +"E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim." +"org" +msgstr "" +"E280: ONULMAZ TCL HATASI: Başvuru listesi hasar görmüş! Lütfen bunu vim-" +"dev@vim.org adresine bildirin" + +msgid "cannot register callback command: buffer/window reference not found" +msgstr "" +"geri çağırma komutu kaydedilemiyor: arabellek/pencere başvurusu bulunamadı" + +msgid "" +"E571: Sorry, this command is disabled: the Tcl library could not be loaded." +msgstr "E571: Üzgünüm, bu komut etkin değil: Tcl kitaplığı yüklenemedi." + +#, c-format +msgid "E572: exit code %d" +msgstr "E572: %d çıkış kodu" + +msgid "cannot get line" +msgstr "satır alınamıyor" + +msgid "Unable to register a command server name" +msgstr "Bir komut sunucusu adı kaydedilemiyor" + +msgid "E248: Failed to send command to the destination program" +msgstr "E248: Hedef programa komut gönderimi başarısız oldu" + +#, c-format +msgid "E573: Invalid server id used: %s" +msgstr "E573: Geçersiz sunucu kimliği kullanıldı: %s" + +msgid "E251: VIM instance registry property is badly formed. Deleted!" +msgstr "E251: VİM oturumu kayıt değeri düzgün oluşturulmamış. Silindi!" + +#, c-format +msgid "%ld lines to indent... " +msgstr "girintilenecek %ld satır kaldı... " + +#, c-format +msgid "%ld line indented " +msgid_plural "%ld lines indented " +msgstr[0] "%ld satır girintilendi " +msgstr[1] "%ld satır girintilendi" + +msgid " Keyword completion (^N^P)" +msgstr " Anahtar sözcük tamamlaması (^N^P)" + +msgid " ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" +msgstr " ^X kipi (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)" + +msgid " Whole line completion (^L^N^P)" +msgstr " Tam satır tamamlaması (^L^N^P)" + +msgid " File name completion (^F^N^P)" +msgstr " Dosya adı tamamlaması (^F^N^P)" + +msgid " Tag completion (^]^N^P)" +msgstr " Etiket tamamlaması (^]^N^P)" + +msgid " Path pattern completion (^N^P)" +msgstr " Yol dizgisi tamamlaması (^N^P)" + +msgid " Definition completion (^D^N^P)" +msgstr " Tanım tamamlaması (^D^N^P)" + +msgid " Dictionary completion (^K^N^P)" +msgstr " Sözlük tamamlaması (^K^N^P)" + +msgid " Thesaurus completion (^T^N^P)" +msgstr " Eşanlamlılar sözlüğü tamamlaması (^T^N^P)" + +msgid " Command-line completion (^V^N^P)" +msgstr " Komut satırı tamamlaması (^V^N^P)" + +msgid " User defined completion (^U^N^P)" +msgstr " Kullanıcı tanımlı tamamlamalar (^U^N^P)" + +msgid " Omni completion (^O^N^P)" +msgstr " Omni tamamlaması (^O^N^P)" + +msgid " Spelling suggestion (s^N^P)" +msgstr " Yazım önerisi (s^N^P)" + +msgid " Keyword Local completion (^N^P)" +msgstr " Dahili anahtar sözcük tamamlaması (^N^P)" + +msgid "Hit end of paragraph" +msgstr "Paragrafın sonuna varıldı" + +msgid "E839: Completion function changed window" +msgstr "E839: Tamamlama işlevi pencereyi değiştirdi" + +msgid "E840: Completion function deleted text" +msgstr "E840: Tamamlama işlevi metni sildi" + +msgid "'dictionary' option is empty" +msgstr "'dictionary' seçeneği boş" + +msgid "'thesaurus' option is empty" +msgstr "'thesaurus' seçeneği boş" + +#, c-format +msgid "Scanning dictionary: %s" +msgstr "Sözlük taranıyor: %s" + +msgid " (insert) Scroll (^E/^Y)" +msgstr " (ekle) Kaydır (^E/^Y)" + +msgid " (replace) Scroll (^E/^Y)" +msgstr " (değiştir) Kaydır (^E/^Y)" + +msgid "E785: complete() can only be used in Insert mode" +msgstr "E785: complete() yalnızca Ekleme kipinde kullanılabilir" + +#, c-format +msgid "Scanning: %s" +msgstr "Taranıyor: %s" + +msgid "Scanning tags." +msgstr "Etiketler taranıyor..." + +msgid "match in file" +msgstr "dosya içinde eşleşme" + +msgid " Adding" +msgstr " Ekleniyor" + +msgid "-- Searching..." +msgstr "-- Aranıyor..." + +msgid "Back at original" +msgstr "Başlangıca geri dönüldü" + +msgid "Word from other line" +msgstr "Sözcük diğer satırdan" + +msgid "The only match" +msgstr "Tek eşleşen" + +#, c-format +msgid "match %d of %d" +msgstr "eşleşme %d/%d" + +#, c-format +msgid "match %d" +msgstr "eşleşme %d" + +msgid "E920: _io file requires _name to be set" +msgstr "E920: _io dosyası _name ayarlı olmasını gerektirir" + +msgid "E915: in_io buffer requires in_buf or in_name to be set" +msgstr "E915: in_io arabelleği in_buf veya in_name ayarlı olmasını gerektirir" + +#, c-format +msgid "E918: buffer must be loaded: %s" +msgstr "E918: Arabellek yüklenmiş olmalıdır: %s" + +msgid "E916: not a valid job" +msgstr "E916: Geçerli bir iş değil" + +#, c-format +msgid "E491: json decode error at '%s'" +msgstr "E491: '%s' konumunda json çözümü hatası" + +#, c-format +msgid "E938: Duplicate key in JSON: \"%s\"" +msgstr "E938: JSON'da yinelenmiş anahtar: \"%s\"" + +#, c-format +msgid "E899: Argument of %s must be a List or Blob" +msgstr "E899: %s değişkeni bir liste veya ikili geniş nesne olmalıdır" + +msgid "E900: maxdepth must be non-negative number" +msgstr "E900: maxdepth negatif olmayan bir sayı olmalı" + +msgid "flatten() argument" +msgstr "flatten() değişkeni" + +#, c-format +msgid "E696: Missing comma in List: %s" +msgstr "E696: Listede virgül eksik: %s" + +msgid "sort() argument" +msgstr "sort() değişkeni" + +msgid "uniq() argument" +msgstr "uniq() değişkeni" + +msgid "E702: Sort compare function failed" +msgstr "E702: Sıralayıp karşılaştırma işlevi başarısız oldu" + +msgid "E882: Uniq compare function failed" +msgstr "E882: Benzersizlik karşılaştırma işlevi başarısız oldu" + +msgid "map() argument" +msgstr "map() değişkeni" + +msgid "mapnew() argument" +msgstr "mapnew() değişkeni" + +msgid "filter() argument" +msgstr "filter() değişkeni" + +msgid "add() argument" +msgstr "add() değişkeni" + +msgid "insert() argument" +msgstr "insert() değişkeni" + +msgid "remove() argument" +msgstr "remove() değişkeni" + +msgid "reverse() argument" +msgstr "reverse() değişkeni" + +#, c-format +msgid "Current %slanguage: \"%s\"" +msgstr "Şu anki %sdil: \"%s\"" + +#, c-format +msgid "E197: Cannot set language to \"%s\"" +msgstr "E197: \"%s\" diline ayarlanamıyor" + +msgid "Unknown option argument" +msgstr "Bilinmeyen seçenek değişkeni" + +msgid "Too many edit arguments" +msgstr "Çok fazla düzenleme değişkeni" + +msgid "Argument missing after" +msgstr "Şundan sonra değişken eksik:" + +msgid "Garbage after option argument" +msgstr "Seçenek değişkeninden sonra anlamsız veri" + +msgid "Too many \"+command\", \"-c command\" or \"--cmd command\" arguments" +msgstr "Çok fazla \"+komut\", \"-c komut\" veya \"--cmd komut\" değişkeni" + +msgid "Invalid argument for" +msgstr "Şunun için geçersiz değişken:" + +#, c-format +msgid "%d files to edit\n" +msgstr "%d dosya düzenleniyor\n" + +msgid "netbeans is not supported with this GUI\n" +msgstr "NetBeans bu grafik arabirimde desteklenmiyor\n" + +msgid "'-nb' cannot be used: not enabled at compile time\n" +msgstr "'-nb' kullanılamaz: Derleme sırasında etkinleştirilmemiş\n" + +msgid "This Vim was not compiled with the diff feature." +msgstr "Bu Vim karşılaştırma özelliği ile derlenmemiş" + +msgid "Attempt to open script file again: \"" +msgstr "Betik dosyası yeniden açılmaya çalışılıyor: \"" + +msgid "Cannot open for reading: \"" +msgstr "Okuma için açılamıyor: \"" + +msgid "Cannot open for script output: \"" +msgstr "Betik çıktısı için açılamıyor: \"" + +msgid "Vim: Error: Failure to start gvim from NetBeans\n" +msgstr "Vim: Hata: gvim'i NetBeans içinden başlatma başarısız oldu\n" + +msgid "Vim: Error: This version of Vim does not run in a Cygwin terminal\n" +msgstr "Vim: Hata: Vim'in bu sürümü bir Cygwin uçbirimi içinde çalışmaz\n" + +msgid "Vim: Warning: Output is not to a terminal\n" +msgstr "Vim: Uyarı: Çıktı bir uçbirime değil\n" + +msgid "Vim: Warning: Input is not from a terminal\n" +msgstr "Vim: Uyarı: Girdi bir uçbirimden değil\n" + +msgid "pre-vimrc command line" +msgstr "vimrc uygulanma öncesi komut satırı" + +#, c-format +msgid "E282: Cannot read from \"%s\"" +msgstr "E282: Şuradan okunamıyor: \"%s\"" + +msgid "" +"\n" +"More info with: \"vim -h\"\n" +msgstr "" +"\n" +"Daha fazla bilgi için: \"vim -h\"\n" + +msgid "[file ..] edit specified file(s)" +msgstr "[dosya ..] belirlenen dosyaları düzenle" + +msgid "- read text from stdin" +msgstr "- stdin'den metni oku" + +msgid "-t tag edit file where tag is defined" +msgstr "-t etiket etiket tanımlanan dosyaları düzenle" + +msgid "-q [errorfile] edit file with first error" +msgstr "-q [hatalıd.] hata içeren ilk dosyayı düzenle" + +msgid "" +"\n" +"\n" +"Usage:" +msgstr "" +"\n" +"\n" +"Kullanım:" + +msgid " vim [arguments] " +msgstr " vim [değişkenler] " + +msgid "" +"\n" +" or:" +msgstr "" +"\n" +" veya:" + +msgid "" +"\n" +"Where case is ignored prepend / to make flag upper case" +msgstr "" +"\n" +"BÜYÜK/küçük harfin yok sayıldığı yerde bayrağı BÜYÜK harfli yapmak için " +"başına / koyun" + +msgid "" +"\n" +"\n" +"Arguments:\n" +msgstr "" +"\n" +"\n" +"Değişkenler:\n" + +msgid "--\t\t\tOnly file names after this" +msgstr "--\t\t\tBundan sonra yalnızca dosya adları" + +msgid "--literal\t\tDon't expand wildcards" +msgstr "--literal\t\tJoker karakterleri genişletme!" + +msgid "-register\t\tRegister this gvim for OLE" +msgstr "-register\t\tBu gvim'i OLE için kaydet" + +msgid "-unregister\t\tUnregister gvim for OLE" +msgstr "-unregister\t\tgvim'in OLE kaydını sil" + +msgid "-g\t\t\tRun using GUI (like \"gvim\")" +msgstr "-g\t\t\tGrafik arabirim kullanarak çalıştır (\"gvim\" gibi)" + +msgid "-f or --nofork\tForeground: Don't fork when starting GUI" +msgstr "-f veya --nofork\tÖnalan: Grafik arabirim başlatılırken çatallama!" + +msgid "-v\t\t\tVi mode (like \"vi\")" +msgstr "-v\t\t\tVi kipi (\"vi\" gibi)" + +msgid "-e\t\t\tEx mode (like \"ex\")" +msgstr "-e\t\t\tEx kipi (\"ex\" gibi)" + +msgid "-E\t\t\tImproved Ex mode" +msgstr "-E\t\t\tGeliştirilmiş Ex kipi" + +msgid "-s\t\t\tSilent (batch) mode (only for \"ex\")" +msgstr "-s\t\t\tSessiz (toplu iş) kipi (yalnızca \"ex\" için)" + +msgid "-d\t\t\tDiff mode (like \"vimdiff\")" +msgstr "-d\t\t\tKarşılaştırma kipi (like \"vimdiff\")" + +msgid "-y\t\t\tEasy mode (like \"evim\", modeless)" +msgstr "-y\t\t\tKolay kip (\"evim\" gibi, kipsiz)" + +msgid "-R\t\t\tReadonly mode (like \"view\")" +msgstr "-R\t\t\tSaltokunur kip (\"view\" gibi)" + +msgid "-Z\t\t\tRestricted mode (like \"rvim\")" +msgstr "-Z\t\t\tKısıtlanmış kip (\"rvim\" gibi)" + +msgid "-m\t\t\tModifications (writing files) not allowed" +msgstr "-m\t\t\tDeğişikliklere (dosya yazma) izin verilmez" + +msgid "-M\t\t\tModifications in text not allowed" +msgstr "-M\t\t\tMetinde değişikliklere izin verilmez" + +msgid "-b\t\t\tBinary mode" +msgstr "-b\t\t\tİkili kip" + +msgid "-l\t\t\tLisp mode" +msgstr "-l\t\t\tLisp kipi" + +msgid "-C\t\t\tCompatible with Vi: 'compatible'" +msgstr "-C\t\t\tVi ile uyumlu: 'compatible'" + +msgid "-N\t\t\tNot fully Vi compatible: 'nocompatible'" +msgstr "-N\t\t\tTümüyle Vi uyumlu değil: 'nocompatible'" + +msgid "-V[N][fname]\t\tBe verbose [level N] [log messages to fname]" +msgstr "-V[N][dosya]\t\tAyrıntılı bilgi ver [N düzeyi] [iletileri dosyaya yaz]" + +msgid "-D\t\t\tDebugging mode" +msgstr "-D\t\t\tHata ayıklama kipi" + +msgid "-n\t\t\tNo swap file, use memory only" +msgstr "-n\t\t\tTakas dosyası kullanma, yalnızca belleğe yaz" + +msgid "-r\t\t\tList swap files and exit" +msgstr "-r\t\t\tTakas dosyalarını listele ve çık" + +msgid "-r (with file name)\tRecover crashed session" +msgstr "-r (dosya adı ile)\tÇöken oturumu kurtar" + +msgid "-L\t\t\tSame as -r" +msgstr "-L\t\t\t-r ile aynı" + +msgid "-f\t\t\tDon't use newcli to open window" +msgstr "-f\t\t\tPencere açmak için yeni komut satırı arabirimi kullanma" + +msgid "-dev <device>\t\tUse <device> for I/O" +msgstr "-dev <aygıt>\t\tGirdi/Çıktı için <aygıt>'ı kullan" + +msgid "-A\t\t\tStart in Arabic mode" +msgstr "-A\t\t\tArapça kipinde başla" + +msgid "-H\t\t\tStart in Hebrew mode" +msgstr "-H\t\t\tİbranca kipinde başla" + +msgid "-T <terminal>\tSet terminal type to <terminal>" +msgstr "-T <uçbirim>\t\tUçbirim türünü <uçbirim>'e ayarla" + +msgid "--not-a-term\t\tSkip warning for input/output not being a terminal" +msgstr "--not-a-term\t\tGirdi/Çıktının bir uçbirime olmadığı uyarısını atla" + +msgid "--ttyfail\t\tExit if input or output is not a terminal" +msgstr "--ttyfail\t\tGirdi veya çıktı bir uçbirime değilse çık" + +msgid "-u <vimrc>\t\tUse <vimrc> instead of any .vimrc" +msgstr "-u <vimrc>\t\tHerhangi bir .vimrc yerine <vimrc> kullan" + +msgid "-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc" +msgstr "-U <gvimrc>\t\tHerhangi bir .gvimrc yerine <gvimrc> kullan" + +msgid "--noplugin\t\tDon't load plugin scripts" +msgstr "--noplugin\t\tEklenti betiklerini yükleme!" + +msgid "-p[N]\t\tOpen N tab pages (default: one for each file)" +msgstr "-p[N]\t\tN sekme sayfası aç (öntanımlı: her dosya için bir sekme)" + +msgid "-o[N]\t\tOpen N windows (default: one for each file)" +msgstr "-o[N]\t\tN pencere aç (öntanımlı: her dosya için bir pencere)" + +msgid "-O[N]\t\tLike -o but split vertically" +msgstr "-O[N]\t\t-o gibi, yalnızca dikey bölerek" + +msgid "+\t\t\tStart at end of file" +msgstr "+\t\t\tDosyanın sonunda başlat" + +msgid "+<lnum>\t\tStart at line <lnum>" +msgstr "+<satırno>\t\t<satırno> numaralı satırda başlat" + +msgid "--cmd <command>\tExecute <command> before loading any vimrc file" +msgstr "--cmd <komut>\tHerhangi bir vimrc dosyası yüklemeden <komut> çalıştır" + +msgid "-c <command>\t\tExecute <command> after loading the first file" +msgstr "-c <komut>\t\tİlk dosyayı yükleyip <komut> komutunu çalıştır" + +msgid "-S <session>\t\tSource file <session> after loading the first file" +msgstr "-S <oturum>\t\tİlk dosyayı yükleyip <oturum> dosyasını kaynak al" + +msgid "-s <scriptin>\tRead Normal mode commands from file <scriptin>" +msgstr "-s <betikgir>\tNormal kip komutlarını <betikgir> dosyasından oku" + +msgid "-w <scriptout>\tAppend all typed commands to file <scriptout>" +msgstr "-w <betikçık>\tGirilen tüm komutları <betikçık> dosyasına iliştir" + +msgid "-W <scriptout>\tWrite all typed commands to file <scriptout>" +msgstr "-W <betikçık>\tGirilen tüm komutları <betikçık> dosyasına yaz" + +msgid "-x\t\t\tEdit encrypted files" +msgstr "-x\t\t\tŞifrelenmiş dosyaları düzenle" + +msgid "-display <display>\tConnect Vim to this particular X-server" +msgstr "-display <ekran>\tVim'i bu belirtilen X sunucusuna bağla" + +msgid "-X\t\t\tDo not connect to X server" +msgstr "-X\t\t\tX sunucusuna bağlama" + +msgid "--remote <files>\tEdit <files> in a Vim server if possible" +msgstr "--remote <dosya>\tOlanaklıysa bir Vim sunucusuda <dosya> düzenler" + +msgid "--remote-silent <files> Same, don't complain if there is no server" +msgstr "--remote-silent <dosya> Aynısı, yalnızca sunucu yoksa şikayet etmez" + +msgid "" +"--remote-wait <files> As --remote but wait for files to have been edited" +msgstr "" +"--remote-wait <dosya> ---remote gibi, yalnızca düzenlenme bitişini bekle" + +msgid "" +"--remote-wait-silent <files> Same, don't complain if there is no server" +msgstr "" +"--remote-wait-silent <dosya> Aynısı, yalnızca sunucu yoksa şikayet etmez" + +msgid "" +"--remote-tab[-wait][-silent] <files> As --remote but use tab page per file" +msgstr "" +"--remote-tab[-wait][-silent] <dosya> --remote, artı sekme sayfası kullanır" + +msgid "--remote-send <keys>\tSend <keys> to a Vim server and exit" +msgstr "" +"--remote-send <anahtar>\tBir Vim sunucusuna <anahtar> gönderir ve çıkar" + +msgid "--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result" +msgstr "" +"--remote-expr <ifade>\t<ifade>'leri bir Vim sunucusunda değerlendirir ve " +"sonuçları yazdırır" + +msgid "--serverlist\t\tList available Vim server names and exit" +msgstr "--serverlist\t\tMevcut Vim sunucu adlarını listeler ve çıkar" + +msgid "--servername <name>\tSend to/become the Vim server <name>" +msgstr "--servername <ad>\t<ad> Vim sunucusuna gönder veya sunucu ol" + +msgid "--startuptime <file>\tWrite startup timing messages to <file>" +msgstr "--startuptime <dsy>\tBaşlangıç zamanlama iletilerini <dsy>'ya yaz" + +msgid "-i <viminfo>\t\tUse <viminfo> instead of .viminfo" +msgstr "-i <viminfo>\t\t.viminfo yerine <viminfo> kullan" + +msgid "--clean\t\t'nocompatible', Vim defaults, no plugins, no viminfo" +msgstr "--clean\t\t'nocompatible', Vim öntanımlıları, eklenti-viminfo yok" + +msgid "-h or --help\tPrint Help (this message) and exit" +msgstr "-h veya --help\tYardımı (bu iletiyi) yazdırır ve çıkar" + +msgid "--version\t\tPrint version information and exit" +msgstr "--version\t\tSürüm bilgisini yazdırır ve çıkar" + +msgid "" +"\n" +"Arguments recognised by gvim (Motif version):\n" +msgstr "" +"\n" +"gvim tarafından tanınan değişkenler (Motif sürümü):\n" + +msgid "" +"\n" +"Arguments recognised by gvim (neXtaw version):\n" +msgstr "" +"\n" +"gvim tarafından tanınan değişkenler (neXtaw sürümü):\n" + +msgid "" +"\n" +"Arguments recognised by gvim (Athena version):\n" +msgstr "" +"\n" +"gvim tarafından tanınan değişkenler (Athena sürümü):\n" + +msgid "-display <display>\tRun Vim on <display>" +msgstr "-display <ekran>\tVim'i <ekran>'da çalıştır" + +msgid "-iconic\t\tStart Vim iconified" +msgstr "-iconic\t\tVim'i simge durumunda başlat" + +msgid "-background <color>\tUse <color> for the background (also: -bg)" +msgstr "-background <renk>\tArdalanı <renk> yap (kısa: -bg)" + +msgid "-foreground <color>\tUse <color> for normal text (also: -fg)" +msgstr "-foreground <renk>\tNormal metin için <renk> kullan (kısa: -fg)" + +msgid "-font <font>\t\tUse <font> for normal text (also: -fn)" +msgstr "-font <font>\t\tNormal metin için <font> yazıtipini kullan (kısa: -fn)" + +msgid "-boldfont <font>\tUse <font> for bold text" +msgstr "-boldfont <font>\tKalın metin için <font> yazıtipini kullan" + +msgid "-italicfont <font>\tUse <font> for italic text" +msgstr "-italicfont <font>\tEğik metin için <font> yazıtipini kullan" + +msgid "-geometry <geom>\tUse <geom> for initial geometry (also: -geom)" +msgstr "-geometry <geom>\tBaşlangıç boyutları için <geom> kullan (kısa -geom)" + +msgid "-borderwidth <width>\tUse a border width of <width> (also: -bw)" +msgstr "-borderwidth <gnşlk>\t<gnşlk> kenar genişliği kullan (kısa: -bw)" + +msgid "-scrollbarwidth <width> Use a scrollbar width of <width> (also: -sw)" +msgstr "" +"-scrollbarwidth <gnşlk> Kaydırma çubuğu için <gnşlk> genişlik (kısa: -sw)" + +msgid "-menuheight <height>\tUse a menu bar height of <height> (also: -mh)" +msgstr "" +"-menuheight <yükseklik>\t<yükseklik> menü çubuğu yüksekliği (kısa: -mh)" + +msgid "-reverse\t\tUse reverse video (also: -rv)" +msgstr "-reverse\t\tTersine dönmüş video kullan (kısa: -rv)" + +msgid "+reverse\t\tDon't use reverse video (also: +rv)" +msgstr "+reverse\t\tTersine dönmüş video kullanma (kısa: +rv)" + +msgid "-xrm <resource>\tSet the specified resource" +msgstr "-xrm <kaynak>\tBelirtilen kaynağı ayarla" + +msgid "" +"\n" +"Arguments recognised by gvim (GTK+ version):\n" +msgstr "" +"\n" +"gvim tarafından tanınan değişkenler (GTK+ sürümü):\n" + +msgid "-display <display>\tRun Vim on <display> (also: --display)" +msgstr "-display <ekran>\tVim'i <ekran>'da çalıştır (veya: --display)" + +msgid "--role <role>\tSet a unique role to identify the main window" +msgstr "--role <rol>\tAna pencereyi tanımlamak için eşsiz bir rol ayarla" + +msgid "--socketid <xid>\tOpen Vim inside another GTK widget" +msgstr "--socketid <xid>\tBaşka bir GTK parçacığında Vim'i aç" + +msgid "--echo-wid\t\tMake gvim echo the Window ID on stdout" +msgstr "--echo-wid\t\tgvim'in pencere kimliğini stdout'ta echo yapmasını sağla" + +msgid "-P <parent title>\tOpen Vim inside parent application" +msgstr "-P <üst başlık>\tVim'i üst uygulama içinde aç" + +msgid "--windowid <HWND>\tOpen Vim inside another win32 widget" +msgstr "--windowid <HWND>\tVim'i başka bir win32 parçacığı içinde aç" + +#, c-format +msgid "E224: global abbreviation already exists for %s" +msgstr "E224: %s için global kısaltma hâlihazırda var" + +#, c-format +msgid "E225: global mapping already exists for %s" +msgstr "E225: %s için global eşlemleme hâlihazırda var " + +#, c-format +msgid "E226: abbreviation already exists for %s" +msgstr "E226: %s için kısaltma hâlihazırda var" + +#, c-format +msgid "E227: mapping already exists for %s" +msgstr "E227: %s için eşlemleme hâlihazırda var" + +msgid "No abbreviation found" +msgstr "Kısaltma bulunamadı" + +msgid "No mapping found" +msgstr "Eşlemleme bulunamadı" + +msgid "E228: makemap: Illegal mode" +msgstr "E228: makemap: İzin verilmeyen kip" + +msgid "E460: entries missing in mapset() dict argument" +msgstr "E460: mapset() sözlük değişkeninde eksik girdiler" + +#, c-format +msgid "E357: 'langmap': Matching character missing for %s" +msgstr "E357: 'langmap': %s için eşleşen karakter eksik" + +#, c-format +msgid "E358: 'langmap': Extra characters after semicolon: %s" +msgstr "E358: 'langmap': Noktalı virgülden sonra ek karakterler: %s" + +msgid "No marks set" +msgstr "İm ayarlanmamış" + +#, c-format +msgid "E283: No marks matching \"%s\"" +msgstr "E283: \"%s\" ile eşleşen im yok" + +msgid "" +"\n" +"mark line col file/text" +msgstr "" +"\n" +"im satr stn dosya/metin" + +msgid "" +"\n" +" jump line col file/text" +msgstr "" +"\n" +" atla satr stn dosya/metin" + +msgid "" +"\n" +"change line col text" +msgstr "" +"\n" +"dğşklk satr stn metin" + +#, c-format +msgid "E799: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E799: Geçersiz ID: %d (1'e eşit veya 1'den büyük olmalıdır)" + +#, c-format +msgid "E801: ID already taken: %d" +msgstr "E801: Kullanımda olan ID: %d" + +msgid "E290: List or number required" +msgstr "E290: Liste veya numara gerekiyor" + +#, c-format +msgid "E802: Invalid ID: %d (must be greater than or equal to 1)" +msgstr "E802: Geçersiz ID: %d (1'e eşit veya 1'den büyük olmalıdır)" + +#, c-format +msgid "E803: ID not found: %d" +msgstr "E803: ID bulunamadı: %d" + +#, c-format +msgid "E798: ID is reserved for \":match\": %d" +msgstr "E798: ID, \":match\" için ayrılmış: %d" + +msgid "E543: Not a valid codepage" +msgstr "E543: Geçerli bir kod sayfası değil" + +msgid "E293: block was not locked" +msgstr "E293: Blok kilitlenmemişti" + +msgid "E294: Seek error in swap file read" +msgstr "E294: Takas dosyası okumasında arama hatası" + +msgid "E295: Read error in swap file" +msgstr "E295: Takas dosyasında okuma hatası" + +msgid "E296: Seek error in swap file write" +msgstr "E296: Takas dosyası yazmasında arama hatası" + +msgid "E297: Write error in swap file" +msgstr "E297: Takas dosyasında yazma hatası" + +msgid "E300: Swap file already exists (symlink attack?)" +msgstr "E300: Takas dosyası hâlihazırda var (sembol bağı saldırısı?)" + +msgid "E298: Didn't get block nr 0?" +msgstr "E298: 0 numaralı blok alınmadı mı?" + +msgid "E298: Didn't get block nr 1?" +msgstr "E298: 1 numaralı blok alınmadı mı?" + +msgid "E298: Didn't get block nr 2?" +msgstr "E298: 2 numaralı blok alınmadı mı?" + +msgid "E843: Error while updating swap file crypt" +msgstr "E843: Takas dosyası şifrelemesi güncellenirken hata" + +msgid "E301: Oops, lost the swap file!!!" +msgstr "E301: Hay aksi, takas dosyasını kaybettik!" + +msgid "E302: Could not rename swap file" +msgstr "E302: Takas dosyası adı değiştirilemedi" + +#, c-format +msgid "E303: Unable to open swap file for \"%s\", recovery impossible" +msgstr "E303: \"%s\" için takas dosyası açılamadı, artık kurtarma yapılamaz" + +msgid "E304: ml_upd_block0(): Didn't get block 0??" +msgstr "E304: ml_upd_block(): 0 numaralı blok alınmadı mı?" + +#, c-format +msgid "E305: No swap file found for %s" +msgstr "E305: %s için takas dosyası bulunamadı" + +msgid "Enter number of swap file to use (0 to quit): " +msgstr "Kullanılacak takas dosyasının numarasını girin (çıkmak için 0): " + +#, c-format +msgid "E306: Cannot open %s" +msgstr "E306: %s açılamıyor" + +msgid "Unable to read block 0 from " +msgstr "Blok 0 şuradan okunamıyor: " + +msgid "" +"\n" +"Maybe no changes were made or Vim did not update the swap file." +msgstr "" +"\n" +"Herhangi bir değişiklik yapılmadı veya Vim takas dosyasını güncellemedi" + +msgid " cannot be used with this version of Vim.\n" +msgstr " Vim'in bu sürümüyle kullanılamaz.\n" + +msgid "Use Vim version 3.0.\n" +msgstr "Vim 3.0 sürümünü kullanın.\n" + +#, c-format +msgid "E307: %s does not look like a Vim swap file" +msgstr "E307: %s Vim takas dosyasına pek benzemiyor" + +msgid " cannot be used on this computer.\n" +msgstr " bu bilgisayarda kullanılamaz.\n" + +msgid "The file was created on " +msgstr "Dosya şurada oluşturuldu " + +msgid "" +",\n" +"or the file has been damaged." +msgstr "" +",\n" +"veya dosya zarar görmüş" + +#, c-format +msgid "" +"E833: %s is encrypted and this version of Vim does not support encryption" +msgstr "E833: %s şifrelenmiş ve Vim'in bu sürümü şifrelemeyi desteklemiyor" + +msgid " has been damaged (page size is smaller than minimum value).\n" +msgstr " hasar görmüş (sayfa boyutu olabilecek en az değerden daha küçük).\n" + +#, c-format +msgid "Using swap file \"%s\"" +msgstr "\"%s\" takas dosyası kullanılıyor" + +#, c-format +msgid "Original file \"%s\"" +msgstr "Orijinal dosya \"%s\"" + +msgid "E308: Warning: Original file may have been changed" +msgstr "E308: Uyarı: Orijinal dosya değiştirilmiş olabilir" + +#, c-format +msgid "Swap file is encrypted: \"%s\"" +msgstr "Takas dosyası şifrelenmiş: \"%s\"" + +msgid "" +"\n" +"If you entered a new crypt key but did not write the text file," +msgstr "" +"\n" +"Yeni bir şifreleme anahtarı girmiş, fakat metin dosyasını yazmamışsanız," + +msgid "" +"\n" +"enter the new crypt key." +msgstr "" +"\n" +"yeni şifreleme anahtarını girin" + +msgid "" +"\n" +"If you wrote the text file after changing the crypt key press enter" +msgstr "" +"\n" +"Metin dosyasını şifreleme anahtarını değiştirdikten sonra yazdıysanız " +"Enter'a basın" + +msgid "" +"\n" +"to use the same key for text file and swap file" +msgstr "" +"\n" +"metin dosyası ve takas dosyası için aynı anahtarı kullanmak için" + +#, c-format +msgid "E309: Unable to read block 1 from %s" +msgstr "E309: Blok 1 %s içinden okunamıyor" + +msgid "???MANY LINES MISSING" +msgstr "???ÇOK FAZLA SATIR EKSİK" + +msgid "???LINE COUNT WRONG" +msgstr "???SATIR SAYISI YANLIŞ" + +msgid "???EMPTY BLOCK" +msgstr "???BOŞ BLOK" + +msgid "???LINES MISSING" +msgstr "???SATIRLAR EKSİK" + +#, c-format +msgid "E310: Block 1 ID wrong (%s not a .swp file?)" +msgstr "E310: Blok 1 kimliği yanlış (%s bir .swp dosyası değil mi?)" + +msgid "???BLOCK MISSING" +msgstr "???EKSİK BLOK" + +msgid "??? from here until ???END lines may be messed up" +msgstr "??? konumundan ???SON konumuna kadar satırlar bozulmuş olabilir" + +msgid "??? from here until ???END lines may have been inserted/deleted" +msgstr "" +"??? konumundan ???SON konumuna kadar satırlar eklenmiş/silinmiş olabilir" + +msgid "???END" +msgstr "???SON" + +msgid "E311: Recovery Interrupted" +msgstr "E311: Kurtarma yarıda kesildi" + +msgid "" +"E312: Errors detected while recovering; look for lines starting with ???" +msgstr "" +"E312: Kurtarma sırasında hatalar bulundu, ??? ile başlayan satırlara bakın" + +msgid "See \":help E312\" for more information." +msgstr "Ek bilgi için \":help E312\" yazın." + +msgid "Recovery completed. You should check if everything is OK." +msgstr "Kurtarma tamamlandı. Her şey yolunda mı diye lütfen bir bakın." + +msgid "" +"\n" +"(You might want to write out this file under another name\n" +msgstr "" +"\n" +"(Bu dosyası başka bir adla kaydetmek isteyebilir ve orijinal\n" + +msgid "and run diff with the original file to check for changes)" +msgstr "dosya ile (varsa) karşılaştırmasını yapmak isteyebilirsiniz)" + +msgid "Recovery completed. Buffer contents equals file contents." +msgstr "Kurtarma tamamlandı. Arabellek içeriği dosya içeriğine eşit." + +msgid "" +"\n" +"You may want to delete the .swp file now." +msgstr "" +"\n" +"Bu .swp dosyasını silmeniz iyi olur." + +msgid "" +"\n" +"Note: process STILL RUNNING: " +msgstr "" +"\n" +"Not: İşlem HÂL ÇALIŞIYOR: " + +msgid "Using crypt key from swap file for the text file.\n" +msgstr "" +"Metin dosyası için takas dosyasındaki şifreleme anahtarı kullanılıyor.\n" + +msgid "Swap files found:" +msgstr "Takas dosyası bulundu:" + +msgid " In current directory:\n" +msgstr " Şu anki dizinde:\n" + +msgid " Using specified name:\n" +msgstr " Belirtilen şu adla:\n" + +msgid " In directory " +msgstr " Şu dizinde: " + +msgid " -- none --\n" +msgstr " -- hiçbiri --\n" + +msgid " owned by: " +msgstr " sahibi: " + +msgid " dated: " +msgstr " tarih: " + +msgid " dated: " +msgstr " tarih: " + +msgid " [from Vim version 3.0]" +msgstr " [Vim 3.0 sürümünden itibaren]" + +msgid " [does not look like a Vim swap file]" +msgstr " [bir Vim takas dosyasına benzemiyor]" + +msgid " file name: " +msgstr " dosya adı: " + +msgid "" +"\n" +" modified: " +msgstr "" +"\n" +" değiştirilme: " + +msgid "YES" +msgstr "EVET" + +msgid "no" +msgstr "hayır" + +msgid "" +"\n" +" user name: " +msgstr "" +"\n" +" kullanıcı adı: " + +msgid " host name: " +msgstr " anamakine adı: " + +msgid "" +"\n" +" host name: " +msgstr "" +"\n" +" anamakine adı: " + +msgid "" +"\n" +" process ID: " +msgstr "" +"\n" +" işlem kimliği: " + +msgid " (STILL RUNNING)" +msgstr " (HÅLÅ ÇALIŞIYOR)" + +msgid "" +"\n" +" [not usable with this version of Vim]" +msgstr "" +"\n" +" [Vim'in bu sürümüyle kullanılamaz]" + +msgid "" +"\n" +" [not usable on this computer]" +msgstr "" +"\n" +" [bu bilgisayarda kullanılabilir değil]" + +msgid " [cannot be read]" +msgstr " [okunamıyor]" + +msgid " [cannot be opened]" +msgstr " [açılamadı]" + +msgid "E313: Cannot preserve, there is no swap file" +msgstr "E313: Korunamıyor, bir takas dosyası yok" + +msgid "File preserved" +msgstr "Dosya korundu" + +msgid "E314: Preserve failed" +msgstr "E314: Koruma başarısız oldu" + +#, c-format +msgid "E315: ml_get: invalid lnum: %ld" +msgstr "E315: ml_get: geçersiz satır numarası: %ld" + +#, c-format +msgid "E316: ml_get: cannot find line %ld in buffer %d %s" +msgstr "E316: ml_get: %ld. satır %d %s arabelleğinde bulunamıyor" + +msgid "E317: pointer block id wrong 3" +msgstr "E317: Blok 3 gösterge kimliği yanlış" + +msgid "stack_idx should be 0" +msgstr "stack_idx 0 olmalı" + +msgid "E318: Updated too many blocks?" +msgstr "E318: Çok fazla blok mu güncellendi?" + +msgid "E317: pointer block id wrong 4" +msgstr "E317: Blok 4 gösterge kimliği yanlış" + +msgid "deleted block 1?" +msgstr "Blok 1 mi silindi?" + +#, c-format +msgid "E320: Cannot find line %ld" +msgstr "E320: %ld. satır bulunamıyor" + +msgid "E317: pointer block id wrong" +msgstr "E317: Gösterge blok kimliği yanlış" + +msgid "pe_line_count is zero" +msgstr "pe_line_count sıfır" + +#, c-format +msgid "E322: line number out of range: %ld past the end" +msgstr "E322: satır numarası erimin dışında: %ld en sonuncuyu geçmiş" + +#, c-format +msgid "E323: line count wrong in block %ld" +msgstr "E323: %ld. blokta satır sayısı yanlış" + +msgid "Stack size increases" +msgstr "Yığın boyutu artıyor" + +msgid "E317: pointer block id wrong 2" +msgstr "E317: Blok 2 gösterge kimliği yanlış" + +#, c-format +msgid "E773: Symlink loop for \"%s\"" +msgstr "E773: \"%s\" için sembol bağı döngüsü" + +msgid "E325: ATTENTION" +msgstr "E325: DİKKAT" + +msgid "" +"\n" +"Found a swap file by the name \"" +msgstr "" +"\n" +"Şu adla bir takas dosyası bulundu: \"" + +msgid "While opening file \"" +msgstr "şu dosya açılırken: \"" + +msgid " CANNOT BE FOUND" +msgstr " BULUNAMADI" + +msgid " NEWER than swap file!\n" +msgstr " takas dosyasından DAHA YENİ!\n" + +msgid "" +"\n" +"(1) Another program may be editing the same file. If this is the case,\n" +" be careful not to end up with two different instances of the same\n" +" file when making changes. Quit, or continue with caution.\n" +msgstr "" +"\n" +"(1) Bu dosya başka bir programda da açık olabilir. Eğer öyleyse, aynı\n" +" dosyanın iki ayrı örneğiyle karşılaşmamak için değişiklik yaparken\n" +" lütfen dikkatli olun. Ya programdan çıkın ya da dikkatli ilerleyin.\n" + +msgid "(2) An edit session for this file crashed.\n" +msgstr "(2) Bu dosya düzenleme oturumu çöktü.\n" + +msgid " If this is the case, use \":recover\" or \"vim -r " +msgstr " Durum buysa, \":recover\" veya \"vim -r " + +msgid "" +"\"\n" +" to recover the changes (see \":help recovery\").\n" +msgstr "" +"\"\n" +" yapıp değişiklikleri kurtarın (ek bilgi için \":help recovery\").\n" + +msgid " If you did this already, delete the swap file \"" +msgstr " Eğer bunu yaptıysanız, bu iletiyi bir daha görmemek için \"" + +msgid "" +"\"\n" +" to avoid this message.\n" +msgstr "" +"\"\n" +" takas dosyasını silin.\n" + +msgid "Found a swap file that is not useful, deleting it" +msgstr "Bir işe yaramayan bir takas dosyası bulundu, siliniyor" + +msgid "Swap file \"" +msgstr "Swap dosyası \"" + +msgid "\" already exists!" +msgstr "\" zaten var!" + +msgid "VIM - ATTENTION" +msgstr "VİM - DİKKAT" + +msgid "Swap file already exists!" +msgstr "Takas dosyası hâlihazırda var!" + +msgid "" +"&Open Read-Only\n" +"&Edit anyway\n" +"&Recover\n" +"&Quit\n" +"&Abort" +msgstr "" +"&Saltokunur aç\n" +"&Düzenle\n" +"Kur&tar\n" +"Çı&k\n" +"Du&rdur" + +msgid "" +"&Open Read-Only\n" +"&Edit anyway\n" +"&Recover\n" +"&Delete it\n" +"&Quit\n" +"&Abort" +msgstr "" +"&Saltokunur aç\n" +"&Düzenle\n" +"Kur&tar\n" +"S&il\n" +"Çı&k\n" +"Du&rdur" + +msgid "E326: Too many swap files found" +msgstr "E326: Çok fazla takas dosyası bulundu" + +msgid "E327: Part of menu-item path is not sub-menu" +msgstr "E327: Menü öge yolunun bir kısmı alt menü değil" + +#, c-format +msgid "E329: No menu \"%s\"" +msgstr "E329: Menü \"%s\" yok" + +msgid "E792: Empty menu name" +msgstr "E792: Boş menü adı" + +msgid "E330: Menu path must not lead to a sub-menu" +msgstr "E330: Menü yolu bir alt menüye çıkmamalı" + +msgid "E331: Must not add menu items directly to menu bar" +msgstr "E331: Menü ögeleri doğrudan menü çubuğuna eklenmemeli" + +msgid "E332: Separator cannot be part of a menu path" +msgstr "E332: Ayırıcı bir menü yolunun parçası olamaz" + +msgid "" +"\n" +"--- Menus ---" +msgstr "" +"\n" +"--- Menüler ---" + +msgid "Tear off this menu" +msgstr "Bu menüyü dışarıya al" + +#, c-format +msgid "E335: Menu not defined for %s mode" +msgstr "E335: Menü %s kipi için tanımlanmamış" + +msgid "E333: Menu path must lead to a menu item" +msgstr "E333: Menü yolu bir menü ögesine çıkmalı" + +#, c-format +msgid "E334: Menu not found: %s" +msgstr "E334: Menü bulunamadı %s" + +msgid "E336: Menu path must lead to a sub-menu" +msgstr "E336: Menü yolu bir alt menüye çıkmalı" + +msgid "E337: Menu not found - check menu names" +msgstr "E337: Menü bulunamadı - menü adlarını denetle" + +#, c-format +msgid "Error detected while compiling %s:" +msgstr "%s derlenirken hata tespit edildi:" + +#, c-format +msgid "Error detected while processing %s:" +msgstr "%s işlenirken hata tespit edildi:" + +#, c-format +msgid "line %4ld:" +msgstr "satır %4ld:" + +#, c-format +msgid "E354: Invalid register name: '%s'" +msgstr "E354: Geçersiz yazmaç adı: '%s'" + +msgid "Messages maintainer: Bram Moolenaar <Bram@vim.org>" +msgstr "Türkçeye çeviren: Emir SARI <bitigchi@me.com>" + +msgid "Interrupt: " +msgstr "Yarıda kes: " + +msgid "Press ENTER or type command to continue" +msgstr "Sürdürmek için ENTER'a basın veya komut girin" + +#, c-format +msgid "%s line %ld" +msgstr "%s %ld. satır" + +msgid "-- More --" +msgstr "-- Daha fazla --" + +msgid " SPACE/d/j: screen/page/line down, b/u/k: up, q: quit " +msgstr " BOŞLUK/d/j: ekran/sayfa/satır aşağı, b/u/k: yukarı, q: çık " + +msgid "Question" +msgstr "Soru" + +msgid "" +"&Yes\n" +"&No" +msgstr "" +"&Evet\n" +"&Hayır" + +msgid "" +"&Yes\n" +"&No\n" +"Save &All\n" +"&Discard All\n" +"&Cancel" +msgstr "" +"&Evet\n" +"&Hayır\n" +"Hepsini &Kaydet\n" +"&Tümünü At\n" +"İ&ptal" + +msgid "E766: Insufficient arguments for printf()" +msgstr "E766: printf() için yetersiz değişkenler" + +msgid "E807: Expected Float argument for printf()" +msgstr "E807: printf() için kayan noktalı değer türünde değişken bekleniyordu" + +msgid "E767: Too many arguments to printf()" +msgstr "E767: printf() için çok fazla değişken" + +msgid "Type number and <Enter> or click with the mouse (q or empty cancels): " +msgstr "" +"Sayı girip <Enter>'a veya fare düğmesine basın (q veya boş iptal eder): " + +msgid "Type number and <Enter> (q or empty cancels): " +msgstr "Sayı girip <Enter>'a basın (q veya boş iptal eder): " + +#, c-format +msgid "%ld more line" +msgid_plural "%ld more lines" +msgstr[0] "%ld daha fazla satır" +msgstr[1] "%ld daha fazla satır" + +#, c-format +msgid "%ld line less" +msgid_plural "%ld fewer lines" +msgstr[0] "%ld daha az satır" +msgstr[1] "%ld daha az satır" + +msgid " (Interrupted)" +msgstr " (Yarıda kesildi)" + +msgid "Beep!" +msgstr "Bip!" + +msgid "E677: Error writing temp file" +msgstr "E677: Geçici dosya yazılırken hata" + +msgid "ERROR: " +msgstr "HATA: " + +#, c-format +msgid "" +"\n" +"[bytes] total alloc-freed %lu-%lu, in use %lu, peak use %lu\n" +msgstr "" +"\n" +"[bitler] toplam ayrılan/boşaltılan %lu-%lu, kullanımda %lu, doruk nokt. %lu\n" + +#, c-format +msgid "" +"[calls] total re/malloc()'s %lu, total free()'s %lu\n" +"\n" +msgstr "" +"[çağrılar] toplam re/malloc()'lar %lu, toplam free()'ler %lu\n" +"\n" + +msgid "E341: Internal error: lalloc(0, )" +msgstr "E341: İç hata: lalloc(0, )" + +#, c-format +msgid "E342: Out of memory! (allocating %lu bytes)" +msgstr "E342: Yetersiz bellek! (%lu bit ayrılıyor)" + +#, c-format +msgid "Calling shell to execute: \"%s\"" +msgstr "Çalıştırmak için çağrılan kabuk: \"%s\"" + +msgid "E545: Missing colon" +msgstr "E545: İki nokta eksik" + +msgid "E546: Illegal mode" +msgstr "E546: İzin verilmeyen kip" + +msgid "E547: Illegal mouseshape" +msgstr "E547: İzin verilmeyen fare imleci türü" + +msgid "E548: digit expected" +msgstr "E548: Basamak bekleniyordu" + +msgid "E549: Illegal percentage" +msgstr "E549: İzin verilmeyen yüzde" + +#, c-format +msgid "E668: Wrong access mode for NetBeans connection info file: \"%s\"" +msgstr "" +"E668: NetBeans bağlantı bilgisi dosyası için yanlış erişim kipi: \"%s\"" + +#, c-format +msgid "E658: NetBeans connection lost for buffer %d" +msgstr "E658: Arabellek %d için NetBeans bağlantısı koptu" + +msgid "E838: netbeans is not supported with this GUI" +msgstr "E838: NetBeans bu grafik arabirimde desteklenmiyor" + +msgid "E511: netbeans already connected" +msgstr "E511: NetBeans hâlihazırda bağlı" + +#, c-format +msgid "E505: %s is read-only (add ! to override)" +msgstr "E505: %s saltokunur (geçersiz kılmak için ! ekleyin)" + +msgid "E349: No identifier under cursor" +msgstr "E349: İmleç altında bir tanımlayıcı yok" + +msgid "Warning: terminal cannot highlight" +msgstr "Uyarı: Uçbirim vurgulama yapamıyor" + +msgid "E348: No string under cursor" +msgstr "E348: İmleç altında bir dizi yok" + +msgid "E352: Cannot erase folds with current 'foldmethod'" +msgstr "E352: Şu anki 'foldmethod' ile kıvırmalar silinemiyor" + +msgid "E664: changelist is empty" +msgstr "E664: Değişiklik listesi boş" + +msgid "E662: At start of changelist" +msgstr "E662: Değişiklik listesinin başında" + +msgid "E663: At end of changelist" +msgstr "E663: Değişiklik listesinin sonunda" + +msgid "Type :qa! and press <Enter> to abandon all changes and exit Vim" +msgstr "" +"Değişikliklerden vazgeçip Vim'den çıkmak için :qa! yazıp <Enter>'a basın" + +msgid "Type :qa and press <Enter> to exit Vim" +msgstr "Vim'den çıkmak için :qa yazıp <Enter>'a basın" + +#, c-format +msgid "%ld line %sed %d time" +msgid_plural "%ld line %sed %d times" +msgstr[0] "%ld satır, %s %d kez" +msgstr[1] "%ld satır, %s %d kez" + +#, c-format +msgid "%ld lines %sed %d time" +msgid_plural "%ld lines %sed %d times" +msgstr[0] "%ld satır, %s %d kez" +msgstr[1] "%ld satır, %s %d kez" + +msgid "cannot yank; delete anyway" +msgstr "kopyalanamıyor, silindi" + +#, c-format +msgid "%ld line changed" +msgid_plural "%ld lines changed" +msgstr[0] "%ld satır değiştirildi" +msgstr[1] "%ld satır değiştirildi" + +#, c-format +msgid "%d line changed" +msgid_plural "%d lines changed" +msgstr[0] "%d satır değiştirildi" +msgstr[1] "%d satır değiştirildi" + +#, c-format +msgid "%ld Cols; " +msgstr "%ld Sütun; " + +#, c-format +msgid "Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes" +msgstr "%s%ld/%ld satır; %lld/%lld sözcük; %lld/%lld bit seçildi" + +#, c-format +msgid "" +"Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of " +"%lld Bytes" +msgstr "" +"%s%ld/%ld satır; %lld/%lld sözcük; %lld/%lld karakter; %lld/%lld bit seçildi" + +#, c-format +msgid "Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld" +msgstr "Sütun %s/%s; Satır %ld/%ld; Sözcük %lld/%lld; Bit %lld/%lld" + +#, c-format +msgid "" +"Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte " +"%lld of %lld" +msgstr "" +"Sütun %s/%s; Satır %ld/%ld; Sözcük %lld/%lld; Karakter %lld/%lld; Bit %lld/" +"%lld" + +#, c-format +msgid "(+%lld for BOM)" +msgstr "(BOM için +%lld)" + +msgid "E774: 'operatorfunc' is empty" +msgstr "E774: 'operatorfunc' boş" + +msgid "E775: Eval feature not available" +msgstr "E775: Eval özelliği mevcut değil" + +msgid "E518: Unknown option" +msgstr "E518: Bilinmeyen seçenek" + +msgid "E519: Option not supported" +msgstr "E519: Özellik desteklenmiyor" + +msgid "E520: Not allowed in a modeline" +msgstr "E520: Bir kip satırında izin verilmiyor" + +msgid "E992: Not allowed in a modeline when 'modelineexpr' is off" +msgstr "E992: 'modelineexpr' kapalıyken bir kip satırında izin verilmiyor" + +msgid "E846: Key code not set" +msgstr "E846: Anahtar kodu ayarlanmamış" + +msgid "E521: Number required after =" +msgstr "E521: = sonrası sayı gerekiyor" + +msgid "E522: Not found in termcap" +msgstr "E522: termcap içinde bulunamadı" + +msgid "E946: Cannot make a terminal with running job modifiable" +msgstr "E946: Uçbirim bir iş çalışırken değiştirilebilir yapılamaz" + +msgid "E590: A preview window already exists" +msgstr "E590: Bir önizleme penceresi hâlihazırda mevcut" + +msgid "W17: Arabic requires UTF-8, do ':set encoding=utf-8'" +msgstr "W17: Arapça UTF-8 gerektirir, ':set encoding=utf-8' yapın" + +msgid "E954: 24-bit colors are not supported on this environment" +msgstr "E954: 24 bit renkler bu ortamda desteklenmiyor" + +#, c-format +msgid "E593: Need at least %d lines" +msgstr "E593: En azından %d satır gerekli" + +#, c-format +msgid "E594: Need at least %d columns" +msgstr "E594: En azından %d sütun gerekli" + +#, c-format +msgid "E355: Unknown option: %s" +msgstr "E355: Bilinmeyen seçenek: %s" + +#, c-format +msgid "E521: Number required: &%s = '%s'" +msgstr "E521: Sayı gerekiyor: &%s = '%s'" + +msgid "" +"\n" +"--- Terminal codes ---" +msgstr "" +"\n" +"--- Uçbirim kodları ---" + +msgid "" +"\n" +"--- Global option values ---" +msgstr "" +"\n" +"--- Global seçenek değerleri ---" + +msgid "" +"\n" +"--- Local option values ---" +msgstr "" +"\n" +"--- Yerel seçenek değerleri ---" + +msgid "" +"\n" +"--- Options ---" +msgstr "" +"\n" +"--- Seçenekler ---" + +msgid "E356: get_varp ERROR" +msgstr "E356: get_varp HATASI" + +#, c-format +msgid "E539: Illegal character <%s>" +msgstr "E539: İzin verilmeyen karakter <%s>" + +#, c-format +msgid "For option %s" +msgstr "%s seçeneği için" + +msgid "E540: Unclosed expression sequence" +msgstr "E540: Kapatılmamış ifade sıralaması" + +msgid "E542: unbalanced groups" +msgstr "E542: Dengelenmemiş gruplar" + +msgid "E529: Cannot set 'term' to empty string" +msgstr "E529: Boş dizi için 'term' ayarlanamıyor" + +msgid "E530: Cannot change term in GUI" +msgstr "E530: Grafik arabirimde uçbirim değiştirilemez" + +msgid "E531: Use \":gui\" to start the GUI" +msgstr "E531: Grafik arabirimi başlatmak için \":gui\" yazın" + +msgid "E589: 'backupext' and 'patchmode' are equal" +msgstr "E589: 'backupext' ve 'patchmode' birbirine eşit" + +msgid "E834: Conflicts with value of 'listchars'" +msgstr "E834: 'listchars' değeriyle çakışmalar var" + +msgid "E835: Conflicts with value of 'fillchars'" +msgstr "E835: 'fillchars' değeriyle çakışmalar var" + +msgid "E617: Cannot be changed in the GTK+ 2 GUI" +msgstr "E617: GTK+ 2 grafik arabiriminde değiştirilemez" + +#, c-format +msgid "E950: Cannot convert between %s and %s" +msgstr "E950: %s ve %s arasında dönüştürme yapılamıyor" + +msgid "E524: Missing colon" +msgstr "E524: İki nokta eksik" + +msgid "E525: Zero length string" +msgstr "E525: Sıfır uzunlukta dizi" + +#, c-format +msgid "E526: Missing number after <%s>" +msgstr "E526: <%s> sonrasında sayı eksik" + +msgid "E527: Missing comma" +msgstr "E527: Virgül eksik" + +msgid "E528: Must specify a ' value" +msgstr "E528: Bir ' değeri belirtmeli" + +msgid "E595: 'showbreak' contains unprintable or wide character" +msgstr "E595: 'showbreak' yazdırılamaz veya geniş karakter içeriyor" + +msgid "E596: Invalid font(s)" +msgstr "E596: Geçersiz font(lar)" + +msgid "E597: can't select fontset" +msgstr "E597: Yazıtipi seti seçilemiyor" + +msgid "E598: Invalid fontset" +msgstr "E598: Geçersiz yazıtipi seti" + +msgid "E533: can't select wide font" +msgstr "E533: Geniş yazıtipi seçilemiyor" + +msgid "E534: Invalid wide font" +msgstr "E534: Geçersiz geniş yazıtipi" + +#, c-format +msgid "E535: Illegal character after <%c>" +msgstr "E535: <%c> sonrası izin verilmeyen karakter" + +msgid "E536: comma required" +msgstr "E536: Virgül gerekiyor" + +#, c-format +msgid "E537: 'commentstring' must be empty or contain %s" +msgstr "E537: 'commentstring' boş olmalı veya %s içermeli" + +msgid "cannot open " +msgstr "Açılamıyor: " + +msgid "VIM: Can't open window!\n" +msgstr "VİM: Pencere açılamıyor!\n" + +msgid "Need Amigados version 2.04 or later\n" +msgstr "AmigaDOS 2.04 sürümü veya sonrası gerekli\n" + +#, c-format +msgid "Need %s version %ld\n" +msgstr "%s %ld sürümü gerekli\n" + +msgid "Cannot open NIL:\n" +msgstr "NIL açılamıyor:\n" + +msgid "Cannot create " +msgstr "Oluşturulamıyor: " + +#, c-format +msgid "Vim exiting with %d\n" +msgstr "Vim %d ile çıkıyor\n" + +msgid "cannot change console mode ?!\n" +msgstr "Konsol kipi değiştirilemiyor?!\n" + +msgid "mch_get_shellsize: not a console??\n" +msgstr "mch_get_shellsize: Bir konsol değil??\n" + +msgid "E360: Cannot execute shell with -f option" +msgstr "E360: Kabuk -f seçeneği ile çalıştırılamıyor" + +msgid "Cannot execute " +msgstr "Çalıştırılamıyor: " + +msgid "shell " +msgstr "kabuk " + +msgid " returned\n" +msgstr " döndürüldü\n" + +msgid "ANCHOR_BUF_SIZE too small." +msgstr "ANCHOR_BUF_SIZE çok küçük." + +msgid "I/O ERROR" +msgstr "GİRDİ/ÇIKTI HATASI" + +msgid "Message" +msgstr "İleti" + +msgid "E237: Printer selection failed" +msgstr "E237: Yazıcı seçimi başarısız oldu" + +#, c-format +msgid "to %s on %s" +msgstr "%s, %s üzerinde" + +#, c-format +msgid "E613: Unknown printer font: %s" +msgstr "E613: Bilinmeyen yazıcı fontu: %s" + +#, c-format +msgid "E238: Print error: %s" +msgstr "E238: Yazdırma hatası: %s" + +#, c-format +msgid "Printing '%s'" +msgstr "'%s' yazdırılıyor" + +#, c-format +msgid "E244: Illegal charset name \"%s\" in font name \"%s\"" +msgstr "E244: Geçersiz karakter adı \"%s\", bulunduğu yazıtipi: \"%s\"" + +#, c-format +msgid "E244: Illegal quality name \"%s\" in font name \"%s\"" +msgstr "E244: İzin verilmeyen nitelik adı: \"%s\", bulunduğu yazıtipi: \"%s\"" + +#, c-format +msgid "E245: Illegal char '%c' in font name \"%s\"" +msgstr "" +"E245: İzin verilmeyen karakter '%c', bulunduğu yer: \"%s\" yazıtipi adı" + +#, c-format +msgid "Opening the X display took %ld msec" +msgstr "X ekranını açma %ld milisaniye sürdü" + +msgid "" +"\n" +"Vim: Got X error\n" +msgstr "" +"\n" +"Vim: X hatası alındı\n" + +#, c-format +msgid "restoring display %s" +msgstr "%s ekranı geri getiriliyor" + +msgid "Testing the X display failed" +msgstr "X ekran testi başarısız oldu" + +msgid "Opening the X display timed out" +msgstr "X ekran açılması zaman aşımına uğradı" + +msgid "" +"\n" +"Could not get security context for " +msgstr "" +"\n" +"Şunun için güvenlik bağlamı alınamadı: " + +msgid "" +"\n" +"Could not set security context for " +msgstr "" +"\n" +"Şunun için güvenlik bağlamı alınamadı: " + +#, c-format +msgid "Could not set security context %s for %s" +msgstr "Güvenlik bağlamı %s %s için alınamadı" + +#, c-format +msgid "Could not get security context %s for %s. Removing it!" +msgstr "Güvenlik bağlamı %s %s için alınamadı. Kaldırılıyor!" + +msgid "" +"\n" +"Cannot execute shell sh\n" +msgstr "" +"\n" +"sh kabuğu çalıştırılamıyor\n" + +msgid "" +"\n" +"shell returned " +msgstr "" +"\n" +"Program çıktı: " + +msgid "" +"\n" +"Cannot create pipes\n" +msgstr "" +"\n" +"Veri yolları oluşturulamıyor\n" + +msgid "" +"\n" +"Cannot fork\n" +msgstr "" +"\n" +"Çatallanamıyor\n" + +msgid "" +"\n" +"Cannot execute shell " +msgstr "" +"\n" +"Kabuk çalıştırılamıyor " + +msgid "" +"\n" +"Command terminated\n" +msgstr "" +"\n" +"Komut sonlandırıldı\n" + +msgid "XSMP lost ICE connection" +msgstr "XSMP, ICE bağlantısını kopardı" + +#, c-format +msgid "dlerror = \"%s\"" +msgstr "dlerror = \"%s\"" + +msgid "Opening the X display failed" +msgstr "X ekran açılışı başarısız oldu" + +msgid "XSMP handling save-yourself request" +msgstr "Kendini kurtarma isteği XSMP tarafından gerçekleştiriliyor" + +msgid "XSMP opening connection" +msgstr "XSMP bağlantıyı açıyor" + +msgid "XSMP ICE connection watch failed" +msgstr "XSMP ICE bağlantı izlemesi başarısız oldu" + +#, c-format +msgid "XSMP SmcOpenConnection failed: %s" +msgstr "XSMP SmcOpenConnection başarısız oldu: %s" + +msgid "At line" +msgstr "Satırda" + +#, c-format +msgid "Vim: Caught %s event\n" +msgstr "Vim: %s olayı yakalandı\n" + +msgid "close" +msgstr "kapat" + +msgid "logoff" +msgstr "oturumu kapat" + +msgid "shutdown" +msgstr "kapat" + +msgid "E371: Command not found" +msgstr "E371: Komut bulunamadı" + +msgid "" +"VIMRUN.EXE not found in your $PATH.\n" +"External commands will not pause after completion.\n" +"See :help win32-vimrun for more information." +msgstr "" +"VIMRUN.EXE $PATH üzerinde bulunamadı.\n" +"Dış komutlar tamamlandıktan sonra duraklamayacak.\n" +"Ek bilgi için :help win32-vimrun yazın." + +msgid "Vim Warning" +msgstr "Vim - Uyarı" + +#, c-format +msgid "shell returned %d" +msgstr "Program %d numaralı kod ile çıktı" + +msgid "E861: Cannot open a second popup with a terminal" +msgstr "E861: Bir uçbirimle ikinci bir açılır pencere açılamıyor" + +msgid "E450: buffer number, text or a list required" +msgstr "E450: Arabellek numarası, metin veya liste gerekiyor" + +#, c-format +msgid "E997: Tabpage not found: %d" +msgstr "E997: Sekme bulunamadı: %d" + +#, c-format +msgid "E993: window %d is not a popup window" +msgstr "E993: %d penceresi bir açılır pencere değil" + +msgid "E994: Not allowed in a popup window" +msgstr "E994: Açılır pencere içinde izin verilmiyor" + +msgid "E863: Not allowed for a terminal in a popup window" +msgstr "E863: Açılır pencere içinde uçbirime izin verilmiyor" + +msgid "E750: First use \":profile start {fname}\"" +msgstr "E750: İlk kullanım \":profile start {dosyaadı}\"" + +msgid "E553: No more items" +msgstr "E553: Öge yok" + +msgid "E925: Current quickfix list was changed" +msgstr "E925: Geçerli hızlı düzelt listesi değiştirildi" + +msgid "E926: Current location list was changed" +msgstr "E926: Geçerli konum listesi değiştirildi" + +#, c-format +msgid "E372: Too many %%%c in format string" +msgstr "E372: Biçim dizisinde çok fazla %%%c" + +#, c-format +msgid "E373: Unexpected %%%c in format string" +msgstr "E373: Biçimlendirme dizisinde beklenmeyen %%%c" + +msgid "E374: Missing ] in format string" +msgstr "E374: Biçimlendirme dizisinde ] eksik" + +#, c-format +msgid "E375: Unsupported %%%c in format string" +msgstr "E375: Biçimlendirme dizisinde desteklenmeyen %%%c" + +#, c-format +msgid "E376: Invalid %%%c in format string prefix" +msgstr "E376: Biçimlendirme dizisi önekinde geçersiz %%%c" + +#, c-format +msgid "E377: Invalid %%%c in format string" +msgstr "E377: Biçimlendirme dizisinde geçersiz %%%c" + +msgid "E378: 'errorformat' contains no pattern" +msgstr "E378: 'errorformat' bir dizgi içermiyor" + +msgid "E379: Missing or empty directory name" +msgstr "E379: Eksik veya boş dizin adı" + +msgid "E924: Current window was closed" +msgstr "E924: Geçerli pencere kapatıldı" + +#, c-format +msgid "(%d of %d)%s%s: " +msgstr "(%d/%d)%s%s: " + +msgid " (line deleted)" +msgstr " (satır silindi)" + +#, c-format +msgid "%serror list %d of %d; %d errors " +msgstr "%shata listesi %d/%d; %d hata " + +msgid "E380: At bottom of quickfix stack" +msgstr "E380: Hızlı düzelt yığınının en dibinde" + +msgid "E381: At top of quickfix stack" +msgstr "E381: Hızlı düzelt yığınının en tepesinde" + +msgid "No entries" +msgstr "Girdi yok" + +msgid "Error file" +msgstr "Hata dosyası" + +msgid "E683: File name missing or invalid pattern" +msgstr "E683: Dosya adı eksik veya geçersiz dizgi" + +#, c-format +msgid "Cannot open file \"%s\"" +msgstr "\"%s\" dosyası açılamıyor" + +msgid "cannot have both a list and a \"what\" argument" +msgstr "ya birinci ya da son değişken belirtilmelidir" + +msgid "E681: Buffer is not loaded" +msgstr "E681: Arabellek yüklenemedi" + +msgid "E777: String or List expected" +msgstr "E777: Dizi veya liste bekleniyordu" + +#, c-format +msgid "E927: Invalid action: '%s'" +msgstr "E927: Geçersiz eylem: '%s'" + +#, c-format +msgid "E369: invalid item in %s%%[]" +msgstr "E369: %s%%[] içinde geçersiz öge" + +#, c-format +msgid "E769: Missing ] after %s[" +msgstr "E769: %s[ sonrasında ] eksik" + +msgid "E944: Reverse range in character class" +msgstr "E944: Karakter sınıfında geriye dönük erim" + +msgid "E945: Range too large in character class" +msgstr "E945: Karakter sınıfında erim çok büyük" + +#, c-format +msgid "E53: Unmatched %s%%(" +msgstr "E53: Eşleşmemiş %s%%(" + +#, c-format +msgid "E54: Unmatched %s(" +msgstr "E54: Eşleşmemiş %s(" + +#, c-format +msgid "E55: Unmatched %s)" +msgstr "E55: Eşleşmemiş %s)" + +msgid "E66: \\z( not allowed here" +msgstr "E66: \\z('ye burada izin verilmiyor" + +msgid "E67: \\z1 - \\z9 not allowed here" +msgstr "E67: \\z1 - \\z9'a burada izin verilmiyor" + +#, c-format +msgid "E69: Missing ] after %s%%[" +msgstr "E69: %s%%[ sonrasında ] eksik" + +#, c-format +msgid "E70: Empty %s%%[]" +msgstr "E70: Boş %s%%[]" + +msgid "E956: Cannot use pattern recursively" +msgstr "E956: Dizgi özyineli olarak kullanılamaz" + +#, c-format +msgid "E654: missing delimiter after search pattern: %s" +msgstr "E654: Arama dizgisi sonrasında eksik sınırlandırıcı: %s" + +#, c-format +msgid "E554: Syntax error in %s{...}" +msgstr "E554: %s{...} içinde sözdizimi hatası" + +#, c-format +msgid "E888: (NFA regexp) cannot repeat %s" +msgstr "E888: (NFA regexp) %s tekrar edemiyor" + +msgid "" +"E864: \\%#= can only be followed by 0, 1, or 2. The automatic engine will be " +"used " +msgstr "" +"E864: \\%#= sonrasında yalnızca 0, 1, veya 2 gelebilir. Otomatik motor " +"kullanılacak " + +msgid "Switching to backtracking RE engine for pattern: " +msgstr "Şu dizgi için düzenli ifade iz sürme motoruna geçiliyor: " + +msgid "E65: Illegal back reference" +msgstr "E65: Geçersiz dönüş başvurusu" + +msgid "E63: invalid use of \\_" +msgstr "E63: Geçersiz kullanım: \\_" + +#, c-format +msgid "E64: %s%c follows nothing" +msgstr "E64: %s%c tek başına kullanılıyor" + +msgid "E68: Invalid character after \\z" +msgstr "E68: \\z sonrası geçersiz karakter" + +#, c-format +msgid "E678: Invalid character after %s%%[dxouU]" +msgstr "E678: %s%%[dxouU] sonrası geçersiz karakter" + +#, c-format +msgid "E71: Invalid character after %s%%" +msgstr "E71: %s%% sonrası geçersiz karakter" + +#, c-format +msgid "E59: invalid character after %s@" +msgstr "E59: %s@ sonrası geçersiz karakter" + +#, c-format +msgid "E60: Too many complex %s{...}s" +msgstr "E60: Çok fazla karmaşık %s{...}(lar)" + +#, c-format +msgid "E61: Nested %s*" +msgstr "E61: İç içe geçmiş %s*" + +#, c-format +msgid "E62: Nested %s%c" +msgstr "E62: İç içe geçmiş %s%c" + +msgid "E50: Too many \\z(" +msgstr "E50: Çok fazla \\z(" + +#, c-format +msgid "E51: Too many %s(" +msgstr "E51: Çok fazla %s(" + +msgid "E52: Unmatched \\z(" +msgstr "E52: Eşleşmemiş \\z(" + +msgid "E339: Pattern too long" +msgstr "E339: Dizgi çok uzun" + +msgid "External submatches:\n" +msgstr "Dış alteşleşmeler:\n" + +msgid "E865: (NFA) Regexp end encountered prematurely" +msgstr "E865: (BSO) Düzenli ifade sonu çok erken geldi" + +#, c-format +msgid "E866: (NFA regexp) Misplaced %c" +msgstr "E866: (BSO düzenli ifadesi) Yanlış yere koyulmuş %c" + +#, c-format +msgid "E877: (NFA regexp) Invalid character class: %d" +msgstr "E877: (BSO düzenli ifadesi) Geçersiz karakter sınıfı: %d" + +msgid "E951: \\% value too large" +msgstr "E951: \\% çok büyük bir değer" + +#, c-format +msgid "E867: (NFA) Unknown operator '\\z%c'" +msgstr "E867: (BSO) Bilinmeyen işleç '\\z%c'" + +#, c-format +msgid "E867: (NFA) Unknown operator '\\%%%c'" +msgstr "E867: (BSO) Bilinmeyen işleç '\\%%%c'" + +msgid "E868: Error building NFA with equivalence class!" +msgstr "E868: Eşdeğerli sınıf ile BSO inşa ederken hata!" + +#, c-format +msgid "E869: (NFA) Unknown operator '\\@%c'" +msgstr "E869: (BSO) Bilinmeyen işleç '\\@%c'" + +msgid "E870: (NFA regexp) Error reading repetition limits" +msgstr "E870: (BSO düzenli ifadesi) Yineleme sınırlarımı okurken hata" + +msgid "E871: (NFA regexp) Can't have a multi follow a multi" +msgstr "E871: (BSO düzenli ifadesi) Bir çoklunun ardından çoklu gelemez" + +msgid "E872: (NFA regexp) Too many '('" +msgstr "E872: (BSO düzenli ifadesi) Çok fazla '('" + +msgid "E879: (NFA regexp) Too many \\z(" +msgstr "E879: (BSO düzenli ifadesi) Çok fazla \\z(" + +msgid "E873: (NFA regexp) proper termination error" +msgstr "E873: (BSO düzenli ifadesi) Düzgün sonlandırma hatası" + +msgid "Could not open temporary log file for writing, displaying on stderr... " +msgstr "" +"Geçici günlük dosyası yazma için açılamıyor, stderr'de görüntüleniyor..." + +msgid "E874: (NFA) Could not pop the stack!" +msgstr "E874: (BSO) Yığın çıkartılamadı!" + +msgid "" +"E875: (NFA regexp) (While converting from postfix to NFA), too many states " +"left on stack" +msgstr "" +"E875: (BSO düzenli ifadesi) (Art takı'dan BSO'ya çevirirken), yığında çok " +"fazla durum bırakıldı" + +msgid "E876: (NFA regexp) Not enough space to store the whole NFA " +msgstr "" +"E876: (BSO düzenli ifadesi) Tüm BSO'yu depolamak için yeterli alan yok " + +msgid "E878: (NFA) Could not allocate memory for branch traversal!" +msgstr "E878: (BSO) Dal gezinmesi için bellek ayrılamadı!" + +msgid "E748: No previously used register" +msgstr "E748: Daha önce kullanılan bir yazmaç yok" + +#, c-format +msgid "freeing %ld lines" +msgstr "%ld satırlık yer açılıyor" + +#, c-format +msgid " into \"%c" +msgstr " \"%c" + +#, c-format +msgid "block of %ld line yanked%s" +msgid_plural "block of %ld lines yanked%s" +msgstr[0] "%ld satırlık blok şuraya kopyalandı:%s" +msgstr[1] "%ld satırlık blok şuraya kopyalandı:%s" + +#, c-format +msgid "%ld line yanked%s" +msgid_plural "%ld lines yanked%s" +msgstr[0] "%ld satır şuraya kopyalandı:%s" +msgstr[1] "%ld satır şuraya kopyalandı:%s" + +#, c-format +msgid "E353: Nothing in register %s" +msgstr "E353: Yazmaç %s boş" + +msgid "" +"\n" +"Type Name Content" +msgstr "" +"\n" +"Tür Ad İçerik" + +msgid "" +"E883: search pattern and expression register may not contain two or more " +"lines" +msgstr "" +"E883: Arama dizgisi ve ifade yazmacı iki veya daha fazla satır içeremez" + +msgid " VREPLACE" +msgstr " SANAL DEĞİŞTİR" + +msgid " REPLACE" +msgstr " DEĞİŞTİR" + +msgid " REVERSE" +msgstr " GERİ AL" + +msgid " INSERT" +msgstr " EKLE" + +msgid " (insert)" +msgstr " (ekle)" + +msgid " (replace)" +msgstr " (değiştir)" + +msgid " (vreplace)" +msgstr " (sanal değiştir)" + +msgid " Hebrew" +msgstr " İbranca" + +msgid " Arabic" +msgstr " Arapça" + +msgid " (paste)" +msgstr " (yapıştır)" + +msgid " VISUAL" +msgstr " GÖRSEL" + +msgid " VISUAL LINE" +msgstr " GÖRSEL SATIR" + +msgid " VISUAL BLOCK" +msgstr " GÖRSEL BLOK" + +msgid " SELECT" +msgstr " SEÇ" + +msgid " SELECT LINE" +msgstr " SATIR SEÇ" + +msgid " SELECT BLOCK" +msgstr " BLOK SEÇ" + +msgid "recording" +msgstr "kaydediliyor" + +#, c-format +msgid "Searching for \"%s\" in \"%s\"" +msgstr "\"%s\", \"%s\" içinde aranıyor" + +#, c-format +msgid "Searching for \"%s\"" +msgstr "\"%s\" aranıyor" + +#, c-format +msgid "not found in '%s': \"%s\"" +msgstr "'%s' içinde bulunamadı: \"%s\"" + +msgid "Source Vim script" +msgstr "Vim betiği kaynak al" + +#, c-format +msgid "Cannot source a directory: \"%s\"" +msgstr "Dizin kaynak alınamıyor: \"%s\"" + +#, c-format +msgid "could not source \"%s\"" +msgstr "\"%s\" kaynak alınamadı" + +#, c-format +msgid "line %ld: could not source \"%s\"" +msgstr "%ld. satır: \"%s\" kaynak alınamadı" + +#, c-format +msgid "sourcing \"%s\"" +msgstr "\"%s\" kaynak alınıyor" + +#, c-format +msgid "line %ld: sourcing \"%s\"" +msgstr "%ld. satır: \"%s\" kaynak alınıyor" + +#, c-format +msgid "finished sourcing %s" +msgstr "%s kaynak alınması bitti" + +#, c-format +msgid "continuing in %s" +msgstr "%s içinde sürdürülüyor" + +msgid "modeline" +msgstr "kip satırı" + +msgid "--cmd argument" +msgstr "--cmd değişkeni" + +msgid "-c argument" +msgstr "-c değişkeni" + +msgid "environment variable" +msgstr "ortam değişkeni" + +msgid "error handler" +msgstr "hata işleyicisi" + +msgid "W15: Warning: Wrong line separator, ^M may be missing" +msgstr "W15: Uyarı: Yanlış satır ayırıcısı, ^M eksik olabilir" + +msgid "E167: :scriptencoding used outside of a sourced file" +msgstr "E167: :scriptencoding kaynak alınmış bir dosyanın dışında kullanıldı" + +msgid "E984: :scriptversion used outside of a sourced file" +msgstr "E984: :scriptversion kaynak alınmış bir dosyanın dışında kullanıldı" + +#, c-format +msgid "E999: scriptversion not supported: %d" +msgstr "E999: desteklenmeyen scriptversion: %d" + +msgid "E168: :finish used outside of a sourced file" +msgstr "E168: :finish kaynak alınmış bir dosyanın dışında kullanıldı" + +#, c-format +msgid "E383: Invalid search string: %s" +msgstr "E383: Geçersiz arama dizisi: %s" + +#, c-format +msgid "E384: search hit TOP without match for: %s" +msgstr "E384: Arama dosyanın BAŞINA vardı, %s bulunamadı" + +#, c-format +msgid "E385: search hit BOTTOM without match for: %s" +msgstr "E385: Arama dosyanın SONUNA vardı, %s bulunamadı" + +msgid "E386: Expected '?' or '/' after ';'" +msgstr "E386: ';' sonrasında '?' veya '/' bekleniyordu" + +msgid " (includes previously listed match)" +msgstr " (daha önce listelenen eşleşmeyi içerir)" + +msgid "--- Included files " +msgstr "--- İçerilen dosyalar " + +msgid "not found " +msgstr "bulunamadı " + +msgid "in path ---\n" +msgstr "yolda ---\n" + +msgid " (Already listed)" +msgstr " (Hâlihazırda listelenmiş)" + +msgid " NOT FOUND" +msgstr " BULUNAMADI" + +#, c-format +msgid "Scanning included file: %s" +msgstr "İçerilen dosya taranıyor: %s" + +#, c-format +msgid "Searching included file %s" +msgstr "İçerilen dosya %s aranıyor" + +msgid "E387: Match is on current line" +msgstr "E387: Eşleşme şu anda bulunulan satırda" + +msgid "All included files were found" +msgstr "Tüm içerilen dosyalar bulundu" + +msgid "No included files" +msgstr "İçerilen dosya yok" + +msgid "E388: Couldn't find definition" +msgstr "E388: Tanım bulunamadı" + +msgid "E389: Couldn't find pattern" +msgstr "E389: Dizgi bulunamadı" + +msgid "Save View" +msgstr "Görünümü Kaydet" + +msgid "Save Session" +msgstr "Oturumu Kaydet" + +msgid "Save Setup" +msgstr "Kurulumu Kaydet" + +msgid "[Deleted]" +msgstr "[Silindi]" + +msgid "" +"\n" +"--- Signs ---" +msgstr "" +"\n" +"--- İşaretler ---" + +#, c-format +msgid "Signs for %s:" +msgstr "%s için işaretler:" + +#, c-format +msgid " group=%s" +msgstr " grup=%s" + +#, c-format +msgid " line=%ld id=%d%s name=%s priority=%d" +msgstr " satır=%ld id=%d%s ad=%s öncelik=%d" + +msgid "E612: Too many signs defined" +msgstr "E612: Çok fazla işaret tanımlanmış" + +#, c-format +msgid "E239: Invalid sign text: %s" +msgstr "E239: Geçersiz işaret metni: %s" + +#, c-format +msgid "E155: Unknown sign: %s" +msgstr "E155: Bilinmeyen işaret: %s" + +#, c-format +msgid "E885: Not possible to change sign %s" +msgstr "E885: %s işaretini değiştirmek olanaklı değil" + +msgid "E159: Missing sign number" +msgstr "E159: İşaret numarası eksik" + +#, c-format +msgid "E157: Invalid sign ID: %d" +msgstr "E157: Geçersiz işaret kimliği: %d" + +msgid "E934: Cannot jump to a buffer that does not have a name" +msgstr "E934: Adı olmayan bir arabelleğe atlamak olanaklı değil" + +#, c-format +msgid "E160: Unknown sign command: %s" +msgstr "E160: Bilinmeyen işaret komutu: %s" + +msgid "E156: Missing sign name" +msgstr "E156: İşaret adı eksik" + +msgid " (NOT FOUND)" +msgstr " (BULUNAMADI)" + +msgid " (not supported)" +msgstr " (desteklenmiyor)" + +#, c-format +msgid "Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\"" +msgstr "Uyarı: Sözcük listesi \"%s_%s.spl\" veya \"%s_ascii.spl\" bulunamıyor" + +#, c-format +msgid "Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\"" +msgstr "Uyarı: Sözcük listesi \"%s.%s.spl\" veya \"%s.ascii.spl\" bulunamıyor" + +msgid "E797: SpellFileMissing autocommand deleted buffer" +msgstr "E797: SpellFileMissing otokomutu arabelleği sildi" + +#, c-format +msgid "Warning: region %s not supported" +msgstr "Uyarı: %s bölgesi desteklenmiyor" + +msgid "E752: No previous spell replacement" +msgstr "E752: Öncesinde düzeltilmiş bir yazım yok" + +#, c-format +msgid "E753: Not found: %s" +msgstr "E753: Bulunamadı: %s" + +msgid "E758: Truncated spell file" +msgstr "E758: Kırpılmış yazım dosyası" + +#, c-format +msgid "Trailing text in %s line %d: %s" +msgstr "%s içinde %d. satır ucunda fazladan metin: %s" + +#, c-format +msgid "Affix name too long in %s line %d: %s" +msgstr "%s içinde %d. satırda ek adı çok uzun: %s" + +msgid "E761: Format error in affix file FOL, LOW or UPP" +msgstr "E761: Ekler dosyası FOL, LOW veya UPP içinde biçimlendirme hatası" + +msgid "E762: Character in FOL, LOW or UPP is out of range" +msgstr "E762: FOL, LOW veya UPP içindeki karakterler erimin dışında" + +msgid "Compressing word tree..." +msgstr "Sözcük soyağacı sıkıştırılıyor..." + +#, c-format +msgid "Reading spell file \"%s\"" +msgstr "Yazım dosyası \"%s\" okunuyor" + +msgid "E757: This does not look like a spell file" +msgstr "E757: Bu bir yazım dosyasına benzemiyor" + +msgid "E771: Old spell file, needs to be updated" +msgstr "E771: Eski yazım dosyası, güncellenmesi gerekiyor" + +msgid "E772: Spell file is for newer version of Vim" +msgstr "E772: Yazım dosyası Vim'in daha yeni bir sürümü için" + +msgid "E770: Unsupported section in spell file" +msgstr "E770: Yazım dosyasında desteklenmeyen bölüm" + +#, c-format +msgid "E778: This does not look like a .sug file: %s" +msgstr "E778: Bu bir .sug dosyasına benzemiyor: %s" + +#, c-format +msgid "E779: Old .sug file, needs to be updated: %s" +msgstr "E779: Eski .sug dosyası, güncellenmesi gerekiyor: %s" + +#, c-format +msgid "E780: .sug file is for newer version of Vim: %s" +msgstr "E780: Bu .sug dosyası Vim'in daha yeni bir sürümü için: %s" + +#, c-format +msgid "E781: .sug file doesn't match .spl file: %s" +msgstr "E781: .sug dosyası .spl dosyasına eşleşmiyor: %s" + +#, c-format +msgid "E782: error while reading .sug file: %s" +msgstr "E782: .sug dosyasını okurken hata: %s" + +#, c-format +msgid "Reading affix file %s..." +msgstr "%s ekler dosyası okunuyor..." + +#, c-format +msgid "Conversion failure for word in %s line %d: %s" +msgstr "%s içinde %d. satırda sözcük için dönüştürme hatası: %s" + +#, c-format +msgid "Conversion in %s not supported: from %s to %s" +msgstr "%s içinde dönüştürme desteklenmiyor: %s konumundan %s konumuna" + +#, c-format +msgid "Invalid value for FLAG in %s line %d: %s" +msgstr "%s içinde %d. satırda BAYRAKTA geçersiz değer: %s" + +#, c-format +msgid "FLAG after using flags in %s line %d: %s" +msgstr "%s içinde %d. satırda bayraklardan sonra BAYRAK: %s" + +#, c-format +msgid "" +"Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line " +"%d" +msgstr "" +"%s içinde %d. satırda PFX ögesinden sonra COMPOUNDFORBIDFLAG tanımlamak " +"hatalı sonuçlar verebilir" + +#, c-format +msgid "" +"Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line " +"%d" +msgstr "" +"%s içinde %d. satırda PFX ögesinden sonra COMPOUNDPERMITFLAG tanımlamak " +"hatalı sonuçlar verebilir" + +#, c-format +msgid "Wrong COMPOUNDRULES value in %s line %d: %s" +msgstr "%s içinde %d. satırda yanlış COMPOUNDRULES değeri: %s" + +#, c-format +msgid "Wrong COMPOUNDWORDMAX value in %s line %d: %s" +msgstr "%s içinde %d. satırda yanlış COMPOUNDWORDMAX değeri: %s" + +#, c-format +msgid "Wrong COMPOUNDMIN value in %s line %d: %s" +msgstr "%s içinde %d. satırda yanlış COMPOUNDMIN değeri: %s" + +#, c-format +msgid "Wrong COMPOUNDSYLMAX value in %s line %d: %s" +msgstr "%s içinde %d. satırda yanlış COMPOUNDSYLMAX değeri: %s" + +#, c-format +msgid "Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s" +msgstr "%s içinde %d. satırda yanlış CHECKCOMPOUNDPATTERN değeri: %s" + +#, c-format +msgid "Different combining flag in continued affix block in %s line %d: %s" +msgstr "" +"%s içinde %d. satırdaki sürdürülen ek bloğunda farklı birleştirici bayrak: %s" + +#, c-format +msgid "Duplicate affix in %s line %d: %s" +msgstr "%s içinde %d. satırda yinelenen ek: %s" + +#, c-format +msgid "" +"Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in %s " +"line %d: %s" +msgstr "" +"Ek aynı zamanda %s içinde %d. satırda BAD/RARE/KEEPCASE/NEEDAFFIX/" +"NEEDCOMPOUND/NOSUGGEST için de kullanılmış: %s" + +#, c-format +msgid "Expected Y or N in %s line %d: %s" +msgstr "%s içinde %d. satırda Y veya N bekleniyordu: %s" + +#, c-format +msgid "Broken condition in %s line %d: %s" +msgstr "%s içinde %d. satırda yerine getirilmeyen koşul: %s" + +#, c-format +msgid "Expected REP(SAL) count in %s line %d" +msgstr "%s içinde %d. satırda REP(SAL) toplam sayısı bekleniyordu" + +#, c-format +msgid "Expected MAP count in %s line %d" +msgstr "%s içinde %d. satırda MAP toplam sayısı bekleniyordu" + +#, c-format +msgid "Duplicate character in MAP in %s line %d" +msgstr "%s içinde %d. satırda MAP içinde yinelenen karakter" + +#, c-format +msgid "Unrecognized or duplicate item in %s line %d: %s" +msgstr "%s içinde %d. satırda yinelenen veya tanınmayan öge: %s" + +#, c-format +msgid "Missing FOL/LOW/UPP line in %s" +msgstr "%s içinde FOL/LOW/UPP satırı eksik" + +msgid "COMPOUNDSYLMAX used without SYLLABLE" +msgstr "COMPOUNDSYLMAX, SYLLABLE olmadan kullanılmış" + +msgid "Too many postponed prefixes" +msgstr "Çok fazla ertelenen önek" + +msgid "Too many compound flags" +msgstr "Çok fazla bileşik bayrak" + +msgid "Too many postponed prefixes and/or compound flags" +msgstr "Çok fazla ertelenen önek ve/veya bileşik bayrak" + +#, c-format +msgid "Missing SOFO%s line in %s" +msgstr "%s içinde SOFO%s satırı eksik" + +#, c-format +msgid "Both SAL and SOFO lines in %s" +msgstr "%s içinde hem SAL hem SOFO satırı" + +#, c-format +msgid "Flag is not a number in %s line %d: %s" +msgstr "%s içinde %d. satırda bayrak bir sayı değil: %s" + +#, c-format +msgid "Illegal flag in %s line %d: %s" +msgstr "%s içinde %d. satırda izin verilmeyen bayrak: %s" + +#, c-format +msgid "%s value differs from what is used in another .aff file" +msgstr "%s değeri diğer bir .aff dosyasında kullanılan değerden farklı" + +#, c-format +msgid "Reading dictionary file %s..." +msgstr "Sözlük dosyası %s okunuyor..." + +#, c-format +msgid "E760: No word count in %s" +msgstr "E760: %s içinde sözcük sayımı yok" + +#, c-format +msgid "line %6d, word %6ld - %s" +msgstr "satır %6d, sözcük %6ld - %s" + +#, c-format +msgid "Duplicate word in %s line %d: %s" +msgstr "%s içinde %d. satırda yinelenen sözcük: %s" + +#, c-format +msgid "First duplicate word in %s line %d: %s" +msgstr "%s içinde %d. satırdaki ilk yinelenen sözcük: %s" + +#, c-format +msgid "%d duplicate word(s) in %s" +msgstr "%d yinelenen sözcük, %s içinde" + +#, c-format +msgid "Ignored %d word(s) with non-ASCII characters in %s" +msgstr "%d sözcük %s içinde ASCII olmayan karakterler içerdiğinden yok sayıldı" + +#, c-format +msgid "Reading word file %s..." +msgstr "Sözcük dosyası %s okunuyor..." + +#, c-format +msgid "Conversion failure for word in %s line %ld: %s" +msgstr "%s içinde %ld. satırda sözcük için dönüştürme hatası: %s" + +#, c-format +msgid "Duplicate /encoding= line ignored in %s line %ld: %s" +msgstr "%s içinde %ld. satırda yinelenen /encoding= satırı yok sayıldı: %s" + +#, c-format +msgid "/encoding= line after word ignored in %s line %ld: %s" +msgstr "" +"%s içinde %ld. satırda sözcükten sonra gelen /encoding= yok sayıldı: %s" + +#, c-format +msgid "Duplicate /regions= line ignored in %s line %ld: %s" +msgstr "%s içinde %ld. satırda yinelenen /regions= satırı yok sayıldı: %s" + +#, c-format +msgid "Too many regions in %s line %ld: %s" +msgstr "%s içinde %ld. satırda çok fazla bölge: %s" + +#, c-format +msgid "/ line ignored in %s line %ld: %s" +msgstr "%s içinde %ld. satırda / satırı yok sayılıyor: %s" + +#, c-format +msgid "Invalid region nr in %s line %ld: %s" +msgstr "%s içinde %ld. satırda geçersiz bölge numarası: %s" + +#, c-format +msgid "Unrecognized flags in %s line %ld: %s" +msgstr "%s içinde %ld. satırda tanınmayan bayraklar: %s" + +#, c-format +msgid "Ignored %d words with non-ASCII characters" +msgstr "ASCII olmayan karakter içeren %d sözcük yok sayıldı" + +msgid "E845: Insufficient memory, word list will be incomplete" +msgstr "E845: Yetersiz bellek, sözcük listesi tam olmayacak" + +#, c-format +msgid "Compressed %s: %ld of %ld nodes; %ld (%ld%%) remaining" +msgstr "%s sıkıştırılıyor: %ld/%ld uç sıkıştırıldı; %ld (%%%ld) kalan" + +msgid "Reading back spell file..." +msgstr "Yazım dosyası yeniden okunuyor..." + +msgid "Performing soundfolding..." +msgstr "Sesler evriştiriliyor..." + +#, c-format +msgid "Number of words after soundfolding: %ld" +msgstr "Ses evriştirme sonrası sözcük sayısı: %ld" + +#, c-format +msgid "Total number of words: %d" +msgstr "Toplam sözcük sayısı: %d" + +#, c-format +msgid "Writing suggestion file %s..." +msgstr "Öneriler dosyası %s yazılıyor..." + +#, c-format +msgid "Estimated runtime memory use: %d bytes" +msgstr "Tahmini çalıştırılan bellek kullanımı: %d bit" + +msgid "E751: Output file name must not have region name" +msgstr "E751: Çıktı dosyası bir bölge adı içermemelidir" + +#, c-format +msgid "E754: Only up to %d regions supported" +msgstr "E754: En çok %d bölgeye kadar desteklenmektedir" + +#, c-format +msgid "E755: Invalid region in %s" +msgstr "E755: %s içinde geçersiz bölge" + +msgid "Warning: both compounding and NOBREAK specified" +msgstr "Uyarı: Hem bileştirme hem NOBREAK belirtilmiş" + +#, c-format +msgid "Writing spell file %s..." +msgstr "Yazım dosyası %s yazılıyor..." + +msgid "Done!" +msgstr "Yapıldı!" + +#, c-format +msgid "E765: 'spellfile' does not have %d entries" +msgstr "E765: 'spellfile' içinde %d adet girdi yok" + +#, c-format +msgid "Word '%.*s' removed from %s" +msgstr "'%.*s' sözcüğü %s içinden çıkartıldı" + +#, c-format +msgid "Word '%.*s' added to %s" +msgstr "'%.*s' sözcüğü %s dosyasına eklendi" + +msgid "E763: Word characters differ between spell files" +msgstr "E763: Sözcük karakterleri yazım dosyaları arasında ayrım gösteriyor" + +msgid "E783: duplicate char in MAP entry" +msgstr "E783: MAP girdisinde yinelenen karakter" + +msgid "Sorry, no suggestions" +msgstr "Üzgünüm, şu an için bir önerim yok" + +#, c-format +msgid "Sorry, only %ld suggestions" +msgstr "Üzgünüm, yalnızca %ld öneri" + +#, c-format +msgid "Change \"%.*s\" to:" +msgstr "\"%.*s\" şuna değiştirilecek:" + +#, c-format +msgid " < \"%.*s\"" +msgstr " < \"%.*s\"" + +#, c-format +msgid "E390: Illegal argument: %s" +msgstr "E390: İzin verilmeyen değişken: %s" + +msgid "No Syntax items defined for this buffer" +msgstr "Bu arabellek için sözdizim ögeleri tanımlanmamış" + +msgid "'redrawtime' exceeded, syntax highlighting disabled" +msgstr "'redrawtime' aşıldı, sözdizim vurgulaması kapatıldı" + +msgid "syntax conceal on" +msgstr "sözdizim gizlemesi açık" + +msgid "syntax conceal off" +msgstr "sözdizim gizlemesi kapalı" + +msgid "syntax case ignore" +msgstr "sözdizim BÜYÜK/küçük harf yok say" + +msgid "syntax case match" +msgstr "sözdizim BÜYÜK/küçük harfe duyarlı" + +msgid "syntax foldlevel start" +msgstr "sözdizim kıvırma düzeyi başlangıcı" + +msgid "syntax foldlevel minimum" +msgstr "sözdizim kıvırma düzeyi an az" + +msgid "syntax spell toplevel" +msgstr "bir sözdizim içinde olmayan metinde yazım denetimi yap" + +msgid "syntax spell notoplevel" +msgstr "bir sözdizim içinde olmayan metinde yazım denetimi yapma" + +msgid "syntax spell default" +msgstr "@Spell kümesi varsa yazım denetimi yapma (öntanımlı)" + +msgid "syntax iskeyword " +msgstr "sözdizim anahtar sözcük" + +msgid "syntax iskeyword not set" +msgstr "sözdizim anahtar sözcük ayarlanmamış" + +#, c-format +msgid "E391: No such syntax cluster: %s" +msgstr "E391: Böyle bir sözdizim kümesi yok: %s" + +msgid "syncing on C-style comments" +msgstr "C biçemli komutlar eşitleniyor" + +msgid "no syncing" +msgstr "eşitleme yok" + +msgid "syncing starts at the first line" +msgstr "eşitleme ilk satırda başlar" + +msgid "syncing starts " +msgstr "eşitleme başlangıcı " + +msgid " lines before top line" +msgstr " satır, en üst satır öncesi" + +msgid "" +"\n" +"--- Syntax sync items ---" +msgstr "" +"\n" +"--- Sözdizim eşitleme ögeleri ---" + +msgid "" +"\n" +"syncing on items" +msgstr "" +"\n" +"ögeler eşitleniyor" + +msgid "" +"\n" +"--- Syntax items ---" +msgstr "" +"\n" +"--- Sözdizim ögeleri ---" + +#, c-format +msgid "E392: No such syntax cluster: %s" +msgstr "E392: Böyle bir sözdizim kümesi yok: %s" + +msgid "from the first line" +msgstr "ilk satırdan" + +msgid "minimal " +msgstr "en az biçimde " + +msgid "maximal " +msgstr "en çok biçimde " + +msgid "; match " +msgstr "; eşleşme " + +msgid " line breaks" +msgstr " satır sonu" + +msgid "E395: contains argument not accepted here" +msgstr "E395: Burada kabul edilmeyen bir değişken içeriyor" + +msgid "E844: invalid cchar value" +msgstr "E844: Geçersiz cchar değeri" + +msgid "E393: group[t]here not accepted here" +msgstr "E393: group[t]here burada kabul edilmez" + +#, c-format +msgid "E394: Didn't find region item for %s" +msgstr "E394: %s için bölge ögesi bulunamadı" + +msgid "E397: Filename required" +msgstr "E397: Dosya adı gerekiyor" + +msgid "E847: Too many syntax includes" +msgstr "E847: Çok fazla sözdizim kuralı" + +#, c-format +msgid "E789: Missing ']': %s" +msgstr "E789: ']' eksik: %s" + +#, c-format +msgid "E890: trailing char after ']': %s]%s" +msgstr "E890: ']' sonrası fazladan karakter: %s]%s" + +#, c-format +msgid "E398: Missing '=': %s" +msgstr "E398: '=' eksik: %s" + +#, c-format +msgid "E399: Not enough arguments: syntax region %s" +msgstr "E399: Yetersiz değişken: %s sözdizim bölgesi" + +msgid "E848: Too many syntax clusters" +msgstr "E848: Çok fazla sözdizim kümesi" + +msgid "E400: No cluster specified" +msgstr "E400: Belirli bir küme yok" + +#, c-format +msgid "E401: Pattern delimiter not found: %s" +msgstr "E401: Dizgi sınırlandırıcısı bulunamadı: %s" + +#, c-format +msgid "E402: Garbage after pattern: %s" +msgstr "E402: Dizgiden sonra anlamsız veri: %s" + +msgid "E403: syntax sync: line continuations pattern specified twice" +msgstr "E403: Sözdizim eşitlemesi: Satır devamları dizgisi iki kez tanımlanmış" + +#, c-format +msgid "E404: Illegal arguments: %s" +msgstr "E404: İzin verilmeyen değişkenler: %s" + +#, c-format +msgid "E405: Missing equal sign: %s" +msgstr "E405: Eşittir imi eksik: %s" + +#, c-format +msgid "E406: Empty argument: %s" +msgstr "E406: Boş değişken: %s" + +#, c-format +msgid "E407: %s not allowed here" +msgstr "E407: %s burada kullanılamaz" + +#, c-format +msgid "E408: %s must be first in contains list" +msgstr "E408: %s öncelikle içerenler listesinde olmalı" + +#, c-format +msgid "E409: Unknown group name: %s" +msgstr "E409: Bilinmeyen grup adı: %s" + +#, c-format +msgid "E410: Invalid :syntax subcommand: %s" +msgstr "E410: Geçersiz :syntax altkomutu: %s" + +msgid "" +" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN" +msgstr "" +" TOPLAM SAYI EŞ EN YAVAŞ ORTALAMA AD DİZGİ" + +msgid "E555: at bottom of tag stack" +msgstr "E555: Etiket yığınının en dibinde" + +msgid "E556: at top of tag stack" +msgstr "E556: Etiket yığınının en tepesinde" + +msgid "E986: cannot modify the tag stack within tagfunc" +msgstr "E986: Etiket yığını tagfunc dahilinde değiştirilemiyor" + +msgid "E987: invalid return value from tagfunc" +msgstr "E987: Etiket işlevinden geçersiz dönüş değeri" + +msgid "E425: Cannot go before first matching tag" +msgstr "E425: İlk eşleşen etiketten önceye gidilemiyor" + +#, c-format +msgid "E426: tag not found: %s" +msgstr "E426: Etiket bulunamadı: %s" + +msgid "E427: There is only one matching tag" +msgstr "E427: Eşleşen yalnızca bir etiket var" + +msgid "E428: Cannot go beyond last matching tag" +msgstr "E428: Son eşleşen etiketten öteye gidilemiyor" + +#, c-format +msgid "File \"%s\" does not exist" +msgstr "Dosya \"%s\" mevcut değil" + +#, c-format +msgid "tag %d of %d%s" +msgstr "etiket %d/%d%s" + +msgid " or more" +msgstr " veya daha fazla" + +msgid " Using tag with different case!" +msgstr " Etiket değişik bir durumla kullanılıyor!" + +#, c-format +msgid "E429: File \"%s\" does not exist" +msgstr "E429: Dosya \"%s\" mevcut değil" + +msgid " # pri kind tag" +msgstr " # ön tür etiket" + +msgid "file\n" +msgstr "dosya\n" + +msgid "" +"\n" +" # TO tag FROM line in file/text" +msgstr "" +"\n" +" # ETİKETE SATIRDAN dosya/metin içinde" + +#, c-format +msgid "Searching tags file %s" +msgstr "Etiket dosyası %s aranıyor" + +#, c-format +msgid "E430: Tag file path truncated for %s\n" +msgstr "E430: %s için etiket dosyası yolu kırpıldı\n" + +#, c-format +msgid "E431: Format error in tags file \"%s\"" +msgstr "E431: Etiket dosyası \"%s\" içinde biçim hatası" + +#, c-format +msgid "Before byte %ld" +msgstr "%ld bitinden önce" + +#, c-format +msgid "E432: Tags file not sorted: %s" +msgstr "E432: Etiket dosyası sıralanmadı: %s" + +msgid "E433: No tags file" +msgstr "E433: Etiket dosyası yok" + +msgid "Ignoring long line in tags file" +msgstr "Etiket dosyasındaki uzun satır yok sayılıyor" + +msgid "E434: Can't find tag pattern" +msgstr "E434: Etiket dizgisi bulunamıyor" + +msgid "E435: Couldn't find tag, just guessing!" +msgstr "E435: Etiket bulunamadı, tahmin ediliyor!" + +#, c-format +msgid "Duplicate field name: %s" +msgstr "Yinelenen alan adı: %s" + +msgid "' not known. Available builtin terminals are:" +msgstr "' bilinmiyor. Kullanılabilir uçbirimler şunlar:" + +msgid "defaulting to '" +msgstr "öntanımlı olarak '" + +msgid "E557: Cannot open termcap file" +msgstr "E557: termcap dosyası açılamıyor" + +msgid "E558: Terminal entry not found in terminfo" +msgstr "E558: terminfo içinde uçbirim girdisi bulunamadı" + +msgid "E559: Terminal entry not found in termcap" +msgstr "E559: termcap içinde uçbirim bilgisi bulunamadı" + +#, c-format +msgid "E436: No \"%s\" entry in termcap" +msgstr "E436: termcap içinde \"%s\" girdisi yok" + +msgid "E437: terminal capability \"cm\" required" +msgstr "E437: \"cm\" uçbirim kabiliyeti gerekiyor" + +msgid "" +"\n" +"--- Terminal keys ---" +msgstr "" +"\n" +"--- Uçbirim düğmeleri ---" + +msgid "Cannot open $VIMRUNTIME/rgb.txt" +msgstr "$VIMRUNTIME/rgb.txt açılamıyor" + +#, c-format +msgid "E181: Invalid attribute: %s" +msgstr "E181: Geçersiz öznitelik: %s" + +msgid "E279: Sorry, ++shell is not supported on this system" +msgstr "E279: Üzgünüm, ++shell bu sistemde desteklenmiyor" + +#, c-format +msgid "Kill job in \"%s\"?" +msgstr "\"%s\" içindeki iş sonlandırılsın mı?" + +msgid "Terminal" +msgstr "Uçbirim" + +msgid "Terminal-finished" +msgstr "Uçbirim-bitti" + +msgid "active" +msgstr "etkin" + +msgid "running" +msgstr "çalışıyor" + +msgid "finished" +msgstr "bitti" + +msgid "E958: Job already finished" +msgstr "E958: İş bitti bile" + +#, c-format +msgid "E953: File exists: %s" +msgstr "E953: Dosya mevcut: %s" + +msgid "E955: Not a terminal buffer" +msgstr "E955: Bir uçbirim arabelleği değil" + +msgid "E982: ConPTY is not available" +msgstr "E982: ConPTY mevcut değil" + +#, c-format +msgid "E971: Property type %s does not exist" +msgstr "E971: Özellik türü %s mevcut değil" + +#, c-format +msgid "E964: Invalid column number: %ld" +msgstr "E964: Geçersiz sütun numarası: %ld" + +#, c-format +msgid "E966: Invalid line number: %ld" +msgstr "E966: Geçersiz satır numarası: %ld" + +msgid "E965: missing property type name" +msgstr "E965: Özellik tür adı eksik" + +msgid "E275: Cannot add text property to unloaded buffer" +msgstr "E275: Bellekten kaldırılmış arabelleğe metin özelliği eklenemiyor" + +msgid "E967: text property info corrupted" +msgstr "E967: Metin özellik bilgisi hasarlı" + +msgid "E968: Need at least one of 'id' or 'type'" +msgstr "E968: En azından bir 'id' veya 'type' gerekli" + +msgid "E860: Need 'id' and 'type' with 'both'" +msgstr "E860: 'both' ile 'id' ve 'type' gerekli" + +#, c-format +msgid "E969: Property type %s already defined" +msgstr "E969: Özellik türü %s hâlihazırda tanımlanmış" + +#, c-format +msgid "E970: Unknown highlight group name: '%s'" +msgstr "E970: Bilinmeyen vurgulama grup adı: '%s'" + +msgid "(Invalid)" +msgstr "(Geçersiz)" + +msgid "%a %b %d %H:%M:%S %Y" +msgstr "%a %b %d %H:%M:%S %Y" + +#, c-format +msgid "%ld second ago" +msgid_plural "%ld seconds ago" +msgstr[0] "%ld saniye önce" +msgstr[1] "%ld saniye önce" + +msgid "E805: Using a Float as a Number" +msgstr "E805: Bir Kayan Noktalı Değer, Sayı yerine kullanılıyor" + +msgid "E703: Using a Funcref as a Number" +msgstr "E703: Bir Funcref, Sayı yerine kullanılıyor" + +msgid "E745: Using a List as a Number" +msgstr "E745: Bir Liste, Sayı yerine kullanılıyor" + +msgid "E728: Using a Dictionary as a Number" +msgstr "E728: Bir Sözlük, Sayı yerine kullanılıyor" + +msgid "E611: Using a Special as a Number" +msgstr "E611: Bir Özel, Sayı yerine kullanılıyor" + +msgid "E910: Using a Job as a Number" +msgstr "E910: Bir İş, Sayı yerine kullanılıyor" + +msgid "E913: Using a Channel as a Number" +msgstr "E913: Bir Kanal, Sayı yerine kullanılıyor" + +msgid "E974: Using a Blob as a Number" +msgstr "E974: Bir İkili Geniş Nesne, Sayı yerine kullanılıyor" + +msgid "E891: Using a Funcref as a Float" +msgstr "E891: Bir Funcref, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E892: Using a String as a Float" +msgstr "E892: Bir Dizi, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E893: Using a List as a Float" +msgstr "E893: Bir Liste, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E894: Using a Dictionary as a Float" +msgstr "E894: Bir Sözlük, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E362: Using a boolean value as a Float" +msgstr "E362: Bir Boole Değeri, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E907: Using a special value as a Float" +msgstr "E907: Bir Özel Değer, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E911: Using a Job as a Float" +msgstr "E911: Bir İş, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E914: Using a Channel as a Float" +msgstr "E914: Bir Kanal, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E975: Using a Blob as a Float" +msgstr "E975: Bir İkili Geniş Nesne, Kayan Noktalı Değer yerine kullanılıyor" + +msgid "E729: using Funcref as a String" +msgstr "E729: Funcref bir Dizi yerine kullanılıyor" + +msgid "E730: using List as a String" +msgstr "E730: Liste bir Dizi yerine kullanılıyor" + +msgid "E731: using Dictionary as a String" +msgstr "E731: Sözlük bir Dizi yerine kullanılıyor" + +msgid "E976: using Blob as a String" +msgstr "E976: İkili Geniş Nesne bir Dizi yerine kullanılıyor" + +msgid "E977: Can only compare Blob with Blob" +msgstr "" +"E977: Bir ikili geniş öğe yalnızca kendinden bir başkası ile " +"karşılaştırılabilir" + +msgid "E691: Can only compare List with List" +msgstr "E691: Bir liste yalnızca başka bir liste ile karşılaştırılabilir" + +msgid "E692: Invalid operation for List" +msgstr "E692: Geçersiz liste işlemi" + +msgid "E735: Can only compare Dictionary with Dictionary" +msgstr "E735: Bir sözlük yalnızca başka bir sözlük ile karşılaştırılabilir" + +msgid "E736: Invalid operation for Dictionary" +msgstr "E736: Geçersiz sözlük işlemi" + +msgid "E694: Invalid operation for Funcrefs" +msgstr "E694: Geçersiz Funcref işlemi" + +#, c-format +msgid "E112: Option name missing: %s" +msgstr "E112: Seçenek adı eksik: %s" + +msgid "E973: Blob literal should have an even number of hex characters" +msgstr "" +"E973: İkili geniş nesne hazır bilgisi çift onalt. karakterlere iye olmalıdır" + +#, c-format +msgid "E114: Missing quote: %s" +msgstr "E114: Tırnak imi eksik: %s" + +#, c-format +msgid "E115: Missing quote: %s" +msgstr "E115: Tırnak imi eksik: %s" + +msgid "new shell started\n" +msgstr "yeni kabuk başlatıldı\n" + +msgid "Vim: Error reading input, exiting...\n" +msgstr "Vim: Girdi okunurken hata, çıkılıyor...\n" + +msgid "E881: Line count changed unexpectedly" +msgstr "E881: Satır sayısı beklenmeyen bir biçimde değişti" + +msgid "No undo possible; continue anyway" +msgstr "Geri alma olanaklı değil; bekleme yapma" + +#, c-format +msgid "E828: Cannot open undo file for writing: %s" +msgstr "E828: Geri al dosyası yazma için açılamıyor: %s" + +#, c-format +msgid "E825: Corrupted undo file (%s): %s" +msgstr "E825: Hasarlı geri al dosyası (%s): %s" + +msgid "Cannot write undo file in any directory in 'undodir'" +msgstr "Geri al dosyası 'undodir' içindeki herhangi bir dizine yazılamıyor" + +#, c-format +msgid "Will not overwrite with undo file, cannot read: %s" +msgstr "Geri al dosyası üzerine yazmayacak, bu okunamıyor: %s" + +#, c-format +msgid "Will not overwrite, this is not an undo file: %s" +msgstr "Üzerine yazılmayacak, bu bir geri al dosyası değil: %s" + +msgid "Skipping undo file write, nothing to undo" +msgstr "Geri al yazması atlanıyor, geri alınacak bir şey yok" + +#, c-format +msgid "Writing undo file: %s" +msgstr "Geri al dosyası yazılıyor: %s" + +#, c-format +msgid "E829: write error in undo file: %s" +msgstr "E829: Geri al dosyasında yazma hatası: %s" + +#, c-format +msgid "Not reading undo file, owner differs: %s" +msgstr "Geri al dosyası okunmayacak, sahibi farklı: %s" + +#, c-format +msgid "Reading undo file: %s" +msgstr "Geri al dosyası okunuyor: %s" + +#, c-format +msgid "E822: Cannot open undo file for reading: %s" +msgstr "E822: Geri al dosyası okuma için açılamıyor: %s" + +#, c-format +msgid "E823: Not an undo file: %s" +msgstr "E823: Bir geri al dosyası değil: %s" + +#, c-format +msgid "E832: Non-encrypted file has encrypted undo file: %s" +msgstr "E832: Şifrelenmemiş dosyanın şifrelenmiş bir geri al dosyası var: %s" + +#, c-format +msgid "E826: Undo file decryption failed: %s" +msgstr "E826: Geri al dosyası şifre çözümü başarısız oldu: %s" + +#, c-format +msgid "E827: Undo file is encrypted: %s" +msgstr "E827: Geri al dosyası şifrelenmiş: %s" + +#, c-format +msgid "E824: Incompatible undo file: %s" +msgstr "E824: Uyumsuz geri al dosyası: %s" + +msgid "File contents changed, cannot use undo info" +msgstr "Dosya içeriği değişmiş, geri alma bilgisi kullanılamaz" + +#, c-format +msgid "Finished reading undo file %s" +msgstr "%s geri al dosyasının okunması bitti" + +msgid "Already at oldest change" +msgstr "Hâlihazırda en eski değişiklik üzerinde" + +msgid "Already at newest change" +msgstr "Hâlihazırda en yeni değişiklik üzerinde" + +#, c-format +msgid "E830: Undo number %ld not found" +msgstr "E830: %ld numaralı geri alma bulunamadı" + +msgid "E438: u_undo: line numbers wrong" +msgstr "E438: u_undo: Satır numaraları yanlış" + +msgid "more line" +msgstr "ek satır" + +msgid "more lines" +msgstr "ek satır" + +msgid "line less" +msgstr "daha az satır" + +msgid "fewer lines" +msgstr "daha az satır" + +msgid "change" +msgstr "değişiklik" + +msgid "changes" +msgstr "değişiklik" + +#, c-format +msgid "%ld %s; %s #%ld %s" +msgstr "%ld %s; %s #%ld %s" + +msgid "before" +msgstr "şundan önce:" + +msgid "after" +msgstr "şundan sonra:" + +msgid "Nothing to undo" +msgstr "Geri alınacak bir şey yok" + +msgid "number changes when saved" +msgstr "kaydedildiğinde numara değişir" + +msgid "E790: undojoin is not allowed after undo" +msgstr "E790: Geri al sonrasında geri almalar birleştirilemez" + +msgid "E439: undo list corrupt" +msgstr "E439: Geri al listesi hasarlı" + +msgid "E440: undo line missing" +msgstr "E440: Geri al satırı eksik" + +msgid "" +"\n" +" Name Args Address Complete Definition" +msgstr "" +"\n" +" Ad Dğkl Adres Tam Tanım" + +msgid "No user-defined commands found" +msgstr "Kullanıcı tanımlı bir komut bulunamadı" + +#, c-format +msgid "E180: Invalid address type value: %s" +msgstr "E180: Geçersiz adres türü değeri: %s" + +#, c-format +msgid "E180: Invalid complete value: %s" +msgstr "E180: Geçersiz tam değer: %s" + +msgid "E468: Completion argument only allowed for custom completion" +msgstr "E468: Tamamlama değişkenine yalnızca özel tamamlamalarda izin verilir" + +msgid "E467: Custom completion requires a function argument" +msgstr "E467: Özel tamamlama bir işlev değişkeni gerektirir" + +msgid "E175: No attribute specified" +msgstr "E175: Bir öznitelik belirtilmemiş" + +msgid "E176: Invalid number of arguments" +msgstr "E176: Geçersiz değişken sayısı" + +msgid "E177: Count cannot be specified twice" +msgstr "E177: Sayım iki defa belirtilemez" + +msgid "E178: Invalid default value for count" +msgstr "E178: Sayım için geçersiz öntanımlı değer" + +msgid "E179: argument required for -complete" +msgstr "E179: -complete için değişken gerekiyor" + +msgid "E179: argument required for -addr" +msgstr "E179: -addr için değişken gerekiyor" + +#, c-format +msgid "E174: Command already exists: add ! to replace it: %s" +msgstr "E174: Komut zaten mevcut: değiştirmek için ! ekleyin: %s" + +msgid "E182: Invalid command name" +msgstr "E182: Geçersiz komut adı" + +msgid "E183: User defined commands must start with an uppercase letter" +msgstr "E183: Kullanıcı tanımlı komutlar BÜYÜK harfle başlamalıdır" + +msgid "E841: Reserved name, cannot be used for user defined command" +msgstr "E841: Ayrılmış ad, kullanıcı tanımlı komut için kullanılamaz" + +#, c-format +msgid "E184: No such user-defined command: %s" +msgstr "E184: Böyle bir kullanıcı tanımlı komut yok: %s" + +#, c-format +msgid "E122: Function %s already exists, add ! to replace it" +msgstr "E122: %s işlevi hâlihazırda mevcut, değiştirmek için ! ekleyin" + +msgid "E717: Dictionary entry already exists" +msgstr "E717: Sözlük girdisi hâlihazırda mevcut" + +msgid "E718: Funcref required" +msgstr "E718: Funcref gerekiyor" + +#, c-format +msgid "E130: Unknown function: %s" +msgstr "E130: Bilinmeyen işlev: %s" + +#, c-format +msgid "E125: Illegal argument: %s" +msgstr "E125: İzin verilmeyen değişken: %s" + +#, c-format +msgid "E853: Duplicate argument name: %s" +msgstr "E853: Yinelenen değişken adı: %s" + +msgid "E989: Non-default argument follows default argument" +msgstr "E989: Öntanımlı olmayan değişken öntanımlı değişkenden sonra" + +#, c-format +msgid "E451: Expected }: %s" +msgstr "E451: } bekleniyordu: %s" + +#, c-format +msgid "E740: Too many arguments for function %s" +msgstr "E740: %s işlevi için çok fazla değişken" + +#, c-format +msgid "E116: Invalid arguments for function %s" +msgstr "E116: %s işlevi için geçersiz değişkenler" + +msgid "E132: Function call depth is higher than 'maxfuncdepth'" +msgstr "E132: İşlevin çağırdığı derinlik 'maxfuncdepth'ten daha yüksek" + +#, c-format +msgid "calling %s" +msgstr "%s çağrılıyor" + +#, c-format +msgid "%s aborted" +msgstr "%s durduruldu" + +#, c-format +msgid "%s returning #%ld" +msgstr "%s, #%ld döndürüyor" + +#, c-format +msgid "%s returning %s" +msgstr "%s, %s döndürüyor" + +msgid "E699: Too many arguments" +msgstr "E699: Çok fazla değişken" + +#, c-format +msgid "E276: Cannot use function as a method: %s" +msgstr "E276: İşlev bir yöntem olarak kullanılamaz: %s" + +#, c-format +msgid "E120: Using <SID> not in a script context: %s" +msgstr "E120: <SID> bir betik bağlamında kullanılmıyor: %s" + +#, c-format +msgid "E725: Calling dict function without Dictionary: %s" +msgstr "E725: dic işlevi bir sözlük olmadan çağrılıyor: %s" + +msgid "E129: Function name required" +msgstr "E129: İşlev adı gerekiyor" + +#, c-format +msgid "E128: Function name must start with a capital or \"s:\": %s" +msgstr "E128: İşlev adı bir BÜYÜK harfle veya \"s:\" ile başlamalı: %s" + +#, c-format +msgid "E884: Function name cannot contain a colon: %s" +msgstr "E884: İşlev adı iki nokta içeremez: %s" + +msgid "E454: function list was modified" +msgstr "E454: İşlev listesi değiştirilmiş" + +#, c-format +msgid "E123: Undefined function: %s" +msgstr "E123: Tanımlanmamış işlev: %s" + +#, c-format +msgid "E124: Missing '(': %s" +msgstr "E124: '(' eksik: %s" + +msgid "E862: Cannot use g: here" +msgstr "E862: g: burada kullanılamaz" + +#, c-format +msgid "E932: Closure function should not be at top level: %s" +msgstr "E932: Kapatma işlevi en üst düzeyde olmamalıdır: %s" + +msgid "E126: Missing :endfunction" +msgstr "E126: :endfunction eksik" + +#, c-format +msgid "W1001: Text found after :enddef: %s" +msgstr "W1001: :enddef sonrası metin bulundu: %s" + +#, c-format +msgid "W22: Text found after :endfunction: %s" +msgstr "W22: :endfunction sonrası metin bulundu: %s" + +#, c-format +msgid "E707: Function name conflicts with variable: %s" +msgstr "E707: İşlev adı şu değişken ile çakışıyor: %s" + +#, c-format +msgid "E127: Cannot redefine function %s: It is in use" +msgstr "E127: %s işlevi yeniden tanımlanamıyor: Şu an kullanımda" + +#, c-format +msgid "E746: Function name does not match script file name: %s" +msgstr "E746: İşlev adı betik dosyası adına eşleşmiyor: %s" + +#, c-format +msgid "E131: Cannot delete function %s: It is in use" +msgstr "E131: %s işlevi silinemiyor: Şu an kullanımda" + +msgid "E133: :return not inside a function" +msgstr "E133: :return bir işlev içinde değil" + +#, c-format +msgid "%s (%s, compiled %s)" +msgstr "%s (%s, %s tarihinde derlendi)" + +msgid "" +"\n" +"MS-Windows 64-bit GUI/console version" +msgstr "" +"\n" +"MS-Windows 64-bit grafik arabirim/konsol sürümü" + +msgid "" +"\n" +"MS-Windows 32-bit GUI/console version" +msgstr "" +"\n" +"MS-Windows 32-bit grafik arabirim/konsol sürümü" + +msgid "" +"\n" +"MS-Windows 64-bit GUI version" +msgstr "" +"\n" +"MS-Windows 64-bit grafik arabirim sürümü" + +msgid "" +"\n" +"MS-Windows 32-bit GUI version" +msgstr "" +"\n" +"MS-Windows 32-bit grafik arabirim sürümü" + +msgid " with OLE support" +msgstr ", OLE desteği ile" + +msgid "" +"\n" +"MS-Windows 64-bit console version" +msgstr "" +"\n" +"MS-Windows 64-bit konsol sürümü" + +msgid "" +"\n" +"MS-Windows 32-bit console version" +msgstr "" +"\n" +"MS-Windows 32-bit konsol sürümü" + +msgid "" +"\n" +"macOS version" +msgstr "" +"\n" +"macOS sürümü" + +msgid "" +"\n" +"macOS version w/o darwin feat." +msgstr "" +"\n" +"Darwin özellikleri olmayan macOS sürümü" + +msgid "" +"\n" +"OpenVMS version" +msgstr "" +"\n" +"OpenVMS sürümü" + +msgid "" +"\n" +"Included patches: " +msgstr "" +"\n" +"İçerilen yamalar: " + +msgid "" +"\n" +"Extra patches: " +msgstr "" +"\n" +"Ek yamalar: " + +msgid "Modified by " +msgstr "Değiştirme: " + +msgid "" +"\n" +"Compiled " +msgstr "" +"\n" +"Derleyen:" + +msgid "by " +msgstr " " + +msgid "" +"\n" +"Huge version " +msgstr "" +"\n" +"Dev sürüm " + +msgid "" +"\n" +"Big version " +msgstr "" +"\n" +"Büyük sürüm " + +msgid "" +"\n" +"Normal version " +msgstr "" +"\n" +"Orta boy sürüm " + +msgid "" +"\n" +"Small version " +msgstr "" +"\n" +"Küçük sürüm " + +msgid "" +"\n" +"Tiny version " +msgstr "" +"\n" +"Ufak sürüm " + +msgid "without GUI." +msgstr "(grafik arabirim içermez)." + +msgid "with GTK3 GUI." +msgstr "(GTK3 grafik arabirim ile)." + +msgid "with GTK2-GNOME GUI." +msgstr "(GTK2-GNOME grafik arabirim ile)." + +msgid "with GTK2 GUI." +msgstr "(GTK2 grafik arabirim ile)." + +msgid "with X11-Motif GUI." +msgstr "(X11-Motif grafik arabirim ile)." + +msgid "with X11-neXtaw GUI." +msgstr "(X11-neXtaw grafik arabirim ile)." + +msgid "with X11-Athena GUI." +msgstr "(X11-Athena grafik arabirim ile)." + +msgid "with Haiku GUI." +msgstr "(Haiku grafik arabirimi ile)." + +msgid "with Photon GUI." +msgstr "(Photon grafik arabirim ile)." + +msgid "with GUI." +msgstr "(grafik arabirim ile)." + +msgid " Features included (+) or not (-):\n" +msgstr " İçerilen özellikler (+), içerilmeyenler (-) ile gösterilir:\n" + +msgid " system vimrc file: \"" +msgstr " sistem vimrc dosyası: \"" + +msgid " user vimrc file: \"" +msgstr " kullanıcı vimrc dosyası: \"" + +msgid " 2nd user vimrc file: \"" +msgstr " kullanıcı 2. vimrc dosyası: \"" + +msgid " 3rd user vimrc file: \"" +msgstr " kullanıcı 3. vimrc dosyası: \"" + +msgid " user exrc file: \"" +msgstr " kullanıcı exrc dosyası: \"" + +msgid " 2nd user exrc file: \"" +msgstr " kullanıcı 2. exrc dosyası: \"" + +msgid " system gvimrc file: \"" +msgstr " sistem gvimrc dosyası: \"" + +msgid " user gvimrc file: \"" +msgstr " kullanıcı gvimrc dosyası: \"" + +msgid "2nd user gvimrc file: \"" +msgstr " kullanıcı 2. gvimrc dosyası: \"" + +msgid "3rd user gvimrc file: \"" +msgstr " kullanıcı 3. gvimrc dosyası: \"" + +msgid " defaults file: \"" +msgstr " öntanımlılar dosyası: \"" + +msgid " system menu file: \"" +msgstr " sistem menü dosyaları: \"" + +msgid " fall-back for $VIM: \"" +msgstr " $VIM öntanımlı konumu: \"" + +msgid " f-b for $VIMRUNTIME: \"" +msgstr "$VIMRUNTIME öntanımlı konumu: \"" + +msgid "Compilation: " +msgstr "Derleme: " + +msgid "Compiler: " +msgstr "Derleyici: " + +msgid "Linking: " +msgstr "Bağlama: " + +msgid " DEBUG BUILD" +msgstr " HATA AYIKLAMA AMAÇLI SÜRÜM" + +msgid "VIM - Vi IMproved" +msgstr "VİM - Vi IMproved" + +msgid "version " +msgstr "sürüm: " + +msgid "by Bram Moolenaar et al." +msgstr "geliştirme: Bram Moolenaar ve diğerleri" + +msgid "Vim is open source and freely distributable" +msgstr "Vim açık kaynaklıdır ve özgürce dağıtılabilir" + +msgid "Help poor children in Uganda!" +msgstr "Uganda'daki yoksul çocuklara yardım edin!" + +msgid "type :help iccf<Enter> for information " +msgstr "ek bilgi için :help iccf<Enter> " + +msgid "type :q<Enter> to exit " +msgstr "çıkmak için :q<Enter> " + +msgid "type :help<Enter> or <F1> for on-line help" +msgstr "yardım belgeleri için :help<Enter> veya <F1> " + +msgid "type :help version8<Enter> for version info" +msgstr "sürüm bilgisi için :help version8<Enter> " + +msgid "Running in Vi compatible mode" +msgstr "Vi uyumlu kipte çalışıyor" + +msgid "type :set nocp<Enter> for Vim defaults" +msgstr "öntanımlı ayarlar için :set nocp<Enter> " + +msgid "type :help cp-default<Enter> for info on this" +msgstr "ek bilgi için :help cp-default<Enter>" + +msgid "menu Help->Orphans for information " +msgstr "bilgi için menü -> Yardım -> Yetimler" + +msgid "Running modeless, typed text is inserted" +msgstr "Kipsiz çalışıyor, girilen metin doğrudan eklenir" + +msgid "menu Edit->Global Settings->Toggle Insert Mode " +msgstr "menü -> Düzen -> Genel Ayarlar -> Ekleme Kipine Geç" + +msgid " for two modes " +msgstr " iki kip için " + +msgid "menu Edit->Global Settings->Toggle Vi Compatible" +msgstr "menü -> Düzen -> Genel Ayarlar -> Vi Uyumlu Kipi Aç/Kapat" + +msgid " for Vim defaults " +msgstr " Vim öntanımlıları için " + +msgid "Sponsor Vim development!" +msgstr "Vim'in geliştirilmesine sponsor olun!" + +msgid "Become a registered Vim user!" +msgstr "Kayıtlı bir Vim kullanıcısı olun!" + +msgid "type :help sponsor<Enter> for information " +msgstr "bilgi için :help sponsor<Enter> " + +msgid "type :help register<Enter> for information " +msgstr "bilgi için :help register<Enter> " + +msgid "menu Help->Sponsor/Register for information " +msgstr "bilgi için Yardım -> Sponsorluk/Kayıt" + +msgid "[end of lines]" +msgstr "[satırların sonu]" + +msgid "global" +msgstr "global" + +msgid "buffer" +msgstr "arabellek" + +msgid "window" +msgstr "pencere" + +msgid "tab" +msgstr "sekme" + +msgid "" +"\n" +"# Buffer list:\n" +msgstr "" +"\n" +"# Arabellek listesi:\n" + +#, c-format +msgid "" +"\n" +"# %s History (newest to oldest):\n" +msgstr "" +"\n" +"# %s Geçmişi (yeniden eskiye):\n" + +msgid "Command Line" +msgstr "Komut Satırı" + +msgid "Search String" +msgstr "Arama Dizisi" + +msgid "Expression" +msgstr "İfade" + +msgid "Input Line" +msgstr "Girdi Satırı" + +msgid "Debug Line" +msgstr "Hata Ayıklama Satırı" + +msgid "" +"\n" +"# Bar lines, copied verbatim:\n" +msgstr "" +"\n" +"# Tam sureti kopyalanan | satırları:\n" + +#, c-format +msgid "%sviminfo: %s in line: " +msgstr "%sviminfo: satırdaki %s: " + +msgid "E136: viminfo: Too many errors, skipping rest of file" +msgstr "E136: viminfo: Çok fazla hata, dosyanın geri kalanı atlanıyor" + +msgid "" +"\n" +"# global variables:\n" +msgstr "" +"\n" +"# global değişkenler:\n" + +msgid "" +"\n" +"# Last Substitute String:\n" +"$" +msgstr "" +"\n" +"# Son Değiştirilen Dizi:\n" +"$" + +#, c-format +msgid "" +"\n" +"# Last %sSearch Pattern:\n" +"~" +msgstr "" +"\n" +"# Son %sArama Dizgileri:\n" +"~" + +msgid "Substitute " +msgstr "Şunu değiştir: " + +msgid "Illegal register name" +msgstr "İzin verilmeyen yazmaç adı" + +msgid "" +"\n" +"# Registers:\n" +msgstr "" +"\n" +"# Yazmaçlar:\n" + +#, c-format +msgid "E574: Unknown register type %d" +msgstr "E574: Bilinmeyen yazmaç türü %d" + +msgid "" +"\n" +"# History of marks within files (newest to oldest):\n" +msgstr "" +"\n" +"# Dosyalardaki imlerin geçmişi (yeniden eskiye):\n" + +msgid "" +"\n" +"# File marks:\n" +msgstr "" +"\n" +"# Dosya imleri:\n" + +msgid "" +"\n" +"# Jumplist (newest first):\n" +msgstr "" +"\n" +"# Atlama listesi (önce en yeniler):\n" + +msgid "Missing '>'" +msgstr "'>' eksik" + +msgid "Illegal starting char" +msgstr "İzin verilmeyen başlangıç karakteri" + +#, c-format +msgid "# This viminfo file was generated by Vim %s.\n" +msgstr "# Bu viminfo dosyası Vim %s tarafından oluşturulmuştur.\n" + +msgid "" +"# You may edit it if you're careful!\n" +"\n" +msgstr "" +"# Yapabileceğinizi düşünüyorsanız bu dosyayı düzenleyebilirsiniz!\n" +"\n" + +msgid "# Value of 'encoding' when this file was written\n" +msgstr "# Bu dosya yazıldığı sırada mevcut 'encoding'in değeri\n" + +#, c-format +msgid "Reading viminfo file \"%s\"%s%s%s%s" +msgstr "\"%s\" viminfo dosyası okunuyor...%s%s%s%s" + +msgid " info" +msgstr " bilgiler-" + +msgid " marks" +msgstr " imler-" + +msgid " oldfiles" +msgstr " düzenleme geçmişi" + +msgid " FAILED" +msgstr " BAŞARISIZ" + +#, c-format +msgid "E137: Viminfo file is not writable: %s" +msgstr "E137: Viminfo dosyası yazılabilir değil: %s" + +#, c-format +msgid "E929: Too many viminfo temp files, like %s!" +msgstr "E929: Çok fazla viminfo geçici dosyası, örneğin %s!" + +#, c-format +msgid "E138: Can't write viminfo file %s!" +msgstr "E138: viminfo dosyası %s yazılamıyor!" + +#, c-format +msgid "Writing viminfo file \"%s\"" +msgstr "viminfo dosyası \"%s\" yazılıyor" + +#, c-format +msgid "E886: Can't rename viminfo file to %s!" +msgstr "E886: viminfo dosyasının adı %s olarak değiştirilemiyor!" + +msgid "E195: Cannot open viminfo file for reading" +msgstr "E195: viminfo dosyası okuma için açılamıyor" + +msgid "Already only one window" +msgstr "Zaten tek pencere" + +#, c-format +msgid "E92: Buffer %ld not found" +msgstr "E92: Arabellek %ld bulunamadı" + +msgid "E441: There is no preview window" +msgstr "E441: Önizleme penceresi yok" + +msgid "E242: Can't split a window while closing another" +msgstr "E242: Bir başka pencere kapatılırken pencere bölünemez" + +msgid "E442: Can't split topleft and botright at the same time" +msgstr "E442: Üst sol ve alt sağ pencereler aynı anda bölünemez" + +msgid "E443: Cannot rotate when another window is split" +msgstr "E443: Başka bir pencere bölünmüşken döndürme yapılamaz" + +msgid "E444: Cannot close last window" +msgstr "E444: Son pencere kapatılamıyor" + +msgid "E814: Cannot close window, only autocmd window would remain" +msgstr "E814: Pencere kapatılamıyor, yalnızca otokomut penceresi açık kalır" + +msgid "E445: Other window contains changes" +msgstr "E445: Diğer pencerede değişiklikler var" + +msgid "E366: Not allowed to enter a popup window" +msgstr "E366: Bir açılır pencereye girişe izin verilmiyor" + +#, c-format +msgid "E370: Could not load library %s" +msgstr "E370: %s kitaplığı yüklenemedi" + +msgid "Sorry, this command is disabled: the Perl library could not be loaded." +msgstr "Üzgünüm, bu komut etkin değil: Perl kitaplığı yüklenemedi." + +msgid "E299: Perl evaluation forbidden in sandbox without the Safe module" +msgstr "" +"E299: Güvenli modül olmadan kum havuzu içinde Perl değerlendirmesine izin " +"verilmiyor" + +msgid "Edit with &multiple Vims" +msgstr "Birden &fazla Vim ile düzenle" + +msgid "Edit with single &Vim" +msgstr "Tek bir &Vim ile düzenle" + +msgid "Diff with Vim" +msgstr "Vim kullanarak karşılaştır" + +msgid "Edit with &Vim" +msgstr "&Vim ile düzenle" + +msgid "Edit with existing Vim" +msgstr "Mevcut Vim ile düzenle" + +msgid "Edit with existing Vim - " +msgstr "Mevcut Vim ile düzenle - " + +msgid "Edits the selected file(s) with Vim" +msgstr "Seçili dosyaları Vim ile düzenler" + +msgid "Error creating process: Check if gvim is in your path!" +msgstr "İşlem oluşturulurken hata: gvim'in yol üzerinde olduğundan emin olun!" + +msgid "gvimext.dll error" +msgstr "gvimext.dll hatası" + +msgid "Path length too long!" +msgstr "Yol çok uzun!" + +#, c-format +msgid "E121: Undefined variable: %s" +msgstr "E121: Tanımlanmamış değişken: %s" + +#, c-format +msgid "E121: Undefined variable: %c:%s" +msgstr "E121: Tanımlanmamış değişken: %c:%s" + +msgid "E476: Invalid command" +msgstr "E476: Geçersiz komut" + +#, c-format +msgid "E476: Invalid command: %s" +msgstr "E476: Geçersiz komut: %s" + +msgid "E710: List value has more items than targets" +msgstr "E710: Liste değeri hedeften daha fazla ögeye sahip" + +msgid "E711: List value does not have enough items" +msgstr "E711: Liste değeri yeterli ögeye sahip değil" + +msgid "E719: Cannot slice a Dictionary" +msgstr "E719: Bir Sözlük dilimlenemiyor" + +msgid "" +"E856: \"assert_fails()\" second argument must be a string or a list with one " +"or two strings" +msgstr "" +"E856: \"assert_fails()\" ikinci değişkeni bir dizi veya bir veya iki dizili " +"bir liste olmalıdır" + +msgid "E909: Cannot index a special variable" +msgstr "E909: Özel bir değişken dizinlenemiyor" + +#, c-format +msgid "E1100: Missing :var: %s" +msgstr "E1100: :var eksik: %s" + +#, c-format +msgid "E1001: Variable not found: %s" +msgstr "E1001: Değişken bulunamadı: %s" + +#, c-format +msgid "E1002: Syntax error at %s" +msgstr "E1002: %s konumunda sözdizim hatası" + +msgid "E1003: Missing return value" +msgstr "E1003: Dönüş değeri eksik" + +#, c-format +msgid "E1004: White space required before and after '%s'" +msgstr "E1004: '%s' öncesinde ve sonrasında boşluk gerekiyor" + +msgid "E1005: Too many argument types" +msgstr "E1005: Çok fazla değişken türü" + +#, c-format +msgid "E1006: %s is used as an argument" +msgstr "E1006: %s bir değişken olarak kullanılıyor" + +msgid "E1007: Mandatory argument after optional argument" +msgstr "E1007: İsteğe bağlı değişken sonrasında zorunlu değişken" + +msgid "E1008: Missing <type>" +msgstr "E1008: <tür> eksik" + +msgid "E1009: Missing > after type" +msgstr "E1009: Tür sonrasında > eksik" + +#, c-format +msgid "E1010: Type not recognized: %s" +msgstr "E1010: Tür tanımlanamadı: %s" + +#, c-format +msgid "E1011: Name too long: %s" +msgstr "E1011: Ad çok uzun: %s" + +#, c-format +msgid "E1012: Type mismatch; expected %s but got %s" +msgstr "E1012: Tür uyumsuzluğu, %s bekleniyordu, ancak %s alındı" + +#, c-format +msgid "E1013: Argument %d: type mismatch, expected %s but got %s" +msgstr "E1013: %d değişkeni: Tür uyumsuzluğu, %s bekleniyordu, ancak %s alındı" + +#, c-format +msgid "E1014: Invalid key: %s" +msgstr "E1014: Geçersiz anahtar: %s" + +#, c-format +msgid "E1015: Name expected: %s" +msgstr "E1015: Ad bekleniyordu: %s" + +#, c-format +msgid "E1016: Cannot declare a %s variable: %s" +msgstr "E1016: Bir %s değişkeni tanımlanamıyor: %s" + +#, c-format +msgid "E1016: Cannot declare an environment variable: %s" +msgstr "E1016: Bir ortam değişkeni tanımlanamıyor: %s" + +#, c-format +msgid "E1017: Variable already declared: %s" +msgstr "E1017: Değişken halihazırda tanımlanmış: %s" + +#, c-format +msgid "E1018: Cannot assign to a constant: %s" +msgstr "E1018: Bir sabite atanamıyor: %s" + +msgid "E1019: Can only concatenate to string" +msgstr "E1019: Yalnızca bir diziye birleştirilebilir" + +#, c-format +msgid "E1020: Cannot use an operator on a new variable: %s" +msgstr "E1020: Yeni bir değişken üzerinde bir işleç kullanılamaz: %s" + +msgid "E1021: Const requires a value" +msgstr "E1021: Sabit, bir değer gerektirir" + +msgid "E1022: Type or initialization required" +msgstr "E1022: Tür veya ilklendirme gerekiyor" + +#, c-format +msgid "E1023: Using a Number as a Bool: %d" +msgstr "E1023: Bir Sayı, bir Bool yerine kullanılıyor: %d" + +msgid "E1024: Using a Number as a String" +msgstr "E1024: Bir Sayı, bir Dizi yerine kullanılıyor" + +msgid "E1025: Using } outside of a block scope" +msgstr "E1025: } bir blok kapsamı dışında kullanılıyor" + +msgid "E1026: Missing }" +msgstr "E1026: } eksik" + +msgid "E1027: Missing return statement" +msgstr "E1027: Dönüş ifadesi eksik" + +msgid "E1028: Compiling :def function failed" +msgstr "E1028: :def işlevi derleme başarısız" + +#, c-format +msgid "E1029: Expected %s but got %s" +msgstr "E1029: %s bekleniyordu ancak %s alındı" + +#, c-format +msgid "E1030: Using a String as a Number: \"%s\"" +msgstr "E1030: Bir Dizi, bir Sayı yerine kullanılıyor: \"%s\"" + +msgid "E1031: Cannot use void value" +msgstr "E1031: Boş değer kullanılamaz" + +msgid "E1032: Missing :catch or :finally" +msgstr "E1032: :catch veya :finally eksik" + +msgid "E1033: Catch unreachable after catch-all" +msgstr "E1033: catch-all sonrası catch ulaşılamıyor" + +#, c-format +msgid "E1034: Cannot use reserved name %s" +msgstr "E1034: Ayrılmış ad %s kullanılamaz" + +msgid "E1035: % requires number arguments" +msgstr "E1035: %, sayı değişkenler gerektirir" + +#, c-format +msgid "E1036: %c requires number or float arguments" +msgstr "E1036: %c, sayı veya kayan noktalı değer değişkenler gerektirir" + +#, c-format +msgid "E1037: Cannot use \"%s\" with %s" +msgstr "E1037: \"%s\", %s ile birlikte kullanılamaz" + +msgid "E1038: \"vim9script\" can only be used in a script" +msgstr "E1038: \"vim9script\" yalnızca bir betikte kullanılabilir" + +msgid "E1039: \"vim9script\" must be the first command in a script" +msgstr "E1039: \"vim9script\" bir betikteki ilk komut olmalıdır" + +msgid "E1040: Cannot use :scriptversion after :vim9script" +msgstr "E1040: :vim9script sonrası :scriptversion kullanılamaz" + +#, c-format +msgid "E1041: Redefining script item %s" +msgstr "E1041: Betik ögesi %s yeniden tanımlanıyor" + +msgid "E1042: Export can only be used in vim9script" +msgstr "E1042: Dışa aktarım yalnızca vim9script içinde kullanılabilir" + +msgid "E1043: Invalid command after :export" +msgstr "E1043: :export sonrası geçersiz komut" + +msgid "E1044: Export with invalid argument" +msgstr "E1044: Geçersiz değişkenle dışa aktarım" + +msgid "E1045: Missing \"as\" after *" +msgstr "E1045: * sonrası \"as\" eksik" + +msgid "E1046: Missing comma in import" +msgstr "E1046: İçe aktarımda virgül eksik" + +msgid "E1047: Syntax error in import" +msgstr "E1047: İçe aktarımda sözdizim hatası" + +#, c-format +msgid "E1048: Item not found in script: %s" +msgstr "E1048: Betikte öge bulunamadı: %s" + +#, c-format +msgid "E1049: Item not exported in script: %s" +msgstr "E1049: Betikte öge dışa aktarılmadı: %s" + +msgid "E1050: Colon required before a range" +msgstr "E1050: Bir erim öncesi iki nokta gerekiyor" + +msgid "E1051: Wrong argument type for +" +msgstr "E1051: + için hatalı değişken türü" + +#, c-format +msgid "E1052: Cannot declare an option: %s" +msgstr "E1052: Bir seçenek tanımlanamıyor: %s" + +#, c-format +msgid "E1053: Could not import \"%s\"" +msgstr "E1053: \"%s\" içe aktarılamadı" + +#, c-format +msgid "E1054: Variable already declared in the script: %s" +msgstr "E1054: Betikte değişken halihazırda tanımlanmış: %s" + +msgid "E1055: Missing name after ..." +msgstr "E1055: ... sonraki ad eksik" + +#, c-format +msgid "E1056: Expected a type: %s" +msgstr "E1056: Bir tür bekleniyordu: %s" + +msgid "E1057: Missing :enddef" +msgstr "E1057: :enddef eksik" + +msgid "E1058: Function nesting too deep" +msgstr "E1058: İşlev çok iç içe geçmiş" + +#, c-format +msgid "E1059: No white space allowed before colon: %s" +msgstr "E1059: İki nokta öncesinde boşluğa izin verilmiyor: %s" + +#, c-format +msgid "E1060: Expected dot after name: %s" +msgstr "E1060: Ad sonrası nokta bekleniyordu: %s" + +#, c-format +msgid "E1061: Cannot find function %s" +msgstr "E1061: %s işlevi bulunamıyor" + +msgid "E1062: Cannot index a Number" +msgstr "E1062: Bir Sayı dizinlenemiyor" + +msgid "E1063: Type mismatch for v: variable" +msgstr "E1063: v: değişkeni için tür uyumsuzluğu" + +#, c-format +msgid "E1066: Cannot declare a register: %s" +msgstr "E1066: Bir yazmaç tanımlanamıyor: %s" + +#, c-format +msgid "E1067: Separator mismatch: %s" +msgstr "E1067: Ayırıcı uyumsuzluğu: %s" + +#, c-format +msgid "E1068: No white space allowed before '%s'" +msgstr "E1068: '%s' önce boşluğa izin verilmiyor" + +#, c-format +msgid "E1069: White space required after '%s'" +msgstr "E1069: '%s' sonrası boşluk gerekiyor" + +msgid "E1070: Missing \"from\"" +msgstr "E1070: \"from\" eksik" + +msgid "E1071: Invalid string after \"from\"" +msgstr "E1071: \"from\" sonrası geçersiz dizi" + +#, c-format +msgid "E1072: Cannot compare %s with %s" +msgstr "E1072: %s, %s ile karşılaştırılamıyor" + +#, c-format +msgid "E1073: Name already defined: %s" +msgstr "E1073: Ad halihazırda tanımlanmış: %s" + +msgid "E1074: No white space allowed after dot" +msgstr "E1074: Nokta sonrası boşluğa izin verilmiyor" + +#, c-format +msgid "E1075: Namespace not supported: %s" +msgstr "E1075: Ad alanı desteklenmiyor: %s" + +msgid "E1076: This Vim is not compiled with float support" +msgstr "E1076: Bu Vim kayan noktalı değer desteği ile derlenmemiş" + +#, c-format +msgid "E1077: Missing argument type for %s" +msgstr "E1077: %s için değişken türü eksik" + +#, c-format +msgid "E1081: Cannot unlet %s" +msgstr "E1081: %s sabitten değişkene çevrilemiyor" + +#, c-format +msgid "E1082: Cannot use a namespaced variable: %s" +msgstr "E1082: Ad alanına alınmış bir değişken kullanılamaz: %s" + +msgid "E1083: Missing backtick" +msgstr "E1083: Ters eğik kesme imi eksik" + +#, c-format +msgid "E1084: Cannot delete Vim9 script function %s" +msgstr "E1084: Vim9 betik işlevi %s silinemiyor" + +#, c-format +msgid "E1085: Not a callable type: %s" +msgstr "E1085: Çağrılabilir bir tür değil: %s" + +msgid "E1086: Cannot use :function inside :def" +msgstr "E1086: :def içinde :function kullanılamaz" + +msgid "E1087: Cannot use an index when declaring a variable" +msgstr "E1087: Bir değişken tanımlarken indeks kullanılamaz" + +#, c-format +msgid "E1089: Unknown variable: %s" +msgstr "E1089: Bilinmeyen değişken: %s" + +#, c-format +msgid "E1090: Cannot assign to argument %s" +msgstr "E1090: %s değişkenine atanamıyor" + +#, c-format +msgid "E1091: Function is not compiled: %s" +msgstr "E1091: İşlev derlenmemiş: %s" + +msgid "E1092: Cannot use a list for a declaration" +msgstr "E1092: Tanımlama için bir liste kullanılamaz" + +#, c-format +msgid "E1093: Expected %d items but got %d" +msgstr "E1093: %d öge bekleniyordu, ancak %d alındı" + +msgid "E1094: Import can only be used in a script" +msgstr "E1094: İçe aktarım yalnızca bir betikte kullanılabilir" + +msgid "E1095: Unreachable code after :return" +msgstr "E1095: :return sonrası ulaşılamayan kod" + +msgid "E1096: Returning a value in a function without a return type" +msgstr "E1096: Dönüş türü olmayan bir işlevde bir değer döndürülüyor" + +msgid "E1097: Line incomplete" +msgstr "E1097: Satır tamamlanmamış" + +#, c-format +msgid "E1099: Unknown error while executing %s" +msgstr "E1099: %s çalıştırılırken bilinmeyen hata" + +#, c-format +msgid "E1101: Cannot declare a script variable in a function: %s" +msgstr "E1101: Bir işlevde bir betik değişkeni tanımlanamıyor: %s" + +#, c-format +msgid "E1102: Lambda function not found: %s" +msgstr "E1102: Lambda işlevi bulunamadı: %s" + +msgid "E1103: Dictionary not set" +msgstr "E1103: Sözlük ayarlanmamış" + +msgid "E1104: Missing >" +msgstr "E1104: > eksik" + +#, c-format +msgid "E1105: Cannot convert %s to string" +msgstr "E1105: %s bir diziye dönüştürülemiyor" + +msgid "E1106: One argument too many" +msgstr "E1106: Bir değişken fazladan" + +#, c-format +msgid "E1106: %d arguments too many" +msgstr "E1106: %d değişken fazladan" + +msgid "E1107: String, List, Dict or Blob required" +msgstr "E1107: Dizi, Liste, Sözlük veya İkili Nesne gerekiyor" + +#, c-format +msgid "E1108: Item not found: %s" +msgstr "E1108: Öge bulunamadı: %s" + +#, c-format +msgid "E1109: List item %d is not a List" +msgstr "E1109: Liste ögesi %d bir Liste değil" + +#, c-format +msgid "E1110: List item %d does not contain 3 numbers" +msgstr "E1110: Liste ögesi %d 3 sayı içermiyor" + +#, c-format +msgid "E1111: List item %d range invalid" +msgstr "E1111: Liste ögesi %d erimi geçersiz" + +#, c-format +msgid "E1112: List item %d cell width invalid" +msgstr "E1112: Liste ögesi %d hücre genişliği geçersiz" + +#, c-format +msgid "E1113: Overlapping ranges for 0x%lx" +msgstr "E1113: 0x%lx için üst üste binen erimler" + +msgid "E1114: Only values of 0x100 and higher supported" +msgstr "E1114: Yalnızca 0x100 ve daha yüksek değerler destekleniyor" + +msgid "E1115: \"assert_fails()\" fourth argument must be a number" +msgstr "E1115: \"assert_fails()\" dördüncü değişkeni bir sayı olmalıdır" + +msgid "E1116: \"assert_fails()\" fifth argument must be a string" +msgstr "E1116: \"assert_fails()\" beşinci değişkeni bir dizi olmalıdır" + +msgid "E1117: Cannot use ! with nested :def" +msgstr "E1117: !, iç içe geçmiş :def ile kullanılamaz" + +msgid "E1118: Cannot change list" +msgstr "E1118: Liste değiştirilemez" + +msgid "E1119: Cannot change list item" +msgstr "E1119: Liste ögesi değiştirilemez" + +msgid "E1120: Cannot change dict" +msgstr "E1120: Sözlük değiştirilemez" + +msgid "E1121: Cannot change dict item" +msgstr "E1121: Sözlük ögesi değiştirilemez" + +#, c-format +msgid "E1122: Variable is locked: %s" +msgstr "E1122: Değişken kilitli: %s" + +#, c-format +msgid "E1123: Missing comma before argument: %s" +msgstr "E1123: Değişken öncesi virgül eksik: %s" + +#, c-format +msgid "E1124: \"%s\" cannot be used in legacy Vim script" +msgstr "E1124: \"%s\" yalnızca eski Vim betiklerinde kullanılabilir" + +msgid "E1125: Final requires a value" +msgstr "E1125: Final, bir değer gerektirir" + +msgid "E1126: Cannot use :let in Vim9 script" +msgstr "E1126: :let, Vim9 betiğinde kullanılamaz" + +msgid "E1127: Missing name after dot" +msgstr "E1127: Nokta sonrası ad eksik" + +msgid "E1128: } without {" +msgstr "E1128: { olmadan }" + +msgid "E1129: Throw with empty string" +msgstr "E1129: Boş dizi ile \"Throw\"" + +msgid "E1130: Cannot add to null list" +msgstr "E1130: Null listesine bir öge eklenemez" + +msgid "E1131: Cannot add to null blob" +msgstr "E1131: Null ikili geniş nesnesine ekleme yapılamaz" + +msgid "E1132: Missing function argument" +msgstr "E1132: İşlev değişkeni eksik" + +msgid "E1133: Cannot extend a null dict" +msgstr "E1133: Bir null sözlük genişletilemez" + +msgid "E1134: Cannot extend a null list" +msgstr "E1134: Bir null listesi genişletilemez" + +#, c-format +msgid "E1135: Using a String as a Bool: \"%s\"" +msgstr "E1135: Bir Dizi, bir Boole yerine kullanılıyor: \"%s\"" + +msgid "E1135: <Cmd> mapping must end with <CR>" +msgstr "E1135: <Cmd> eşlemlemesi <CR> ile bitmelidir" + +msgid "E1136: <Cmd> mapping must end with <CR> before second <Cmd>" +msgstr "E1136: <Cmd> eşlemlemesi ikinci <Cmd>'den önce <CR> ile bitmelidir" + +#, c-format +msgid "E1137: <Cmd> mapping must not include %s key" +msgstr "E1137: <Cmd> eşlemlemesi %s anahtarını içermemelidir" + +msgid "E1138: Using a Bool as a Number" +msgstr "E1138: Bir Boole, Sayı yerine kullanılıyor" + +msgid "E1139: Missing matching bracket after dict key" +msgstr "E1139: Sözlük anahtarı sonrası eşleşen ayraç eksik" + +msgid "E1140: For argument must be a sequence of lists" +msgstr "E1140: For değişkeni listelerin bir sıralaması olmalıdır" + +msgid "E1141: Indexable type required" +msgstr "E1141: İndekslenebilir tür gerekiyor" + +msgid "--No lines in buffer--" +msgstr "--Arabellek içinde satır yok--" + +msgid "E470: Command aborted" +msgstr "E470: Komut durduruldu" + +msgid "E471: Argument required" +msgstr "E471: Değişken gerekiyor" + +msgid "E10: \\ should be followed by /, ? or &" +msgstr "E10: \\ sonrasında /, ? veya & gelmeli" + +msgid "E11: Invalid in command-line window; <CR> executes, CTRL-C quits" +msgstr "E11: Komut satırı penceresinde geçersiz; <CR> çalıştırır, CTRL-C çıkar" + +msgid "E12: Command not allowed from exrc/vimrc in current dir or tag search" +msgstr "" +"E12: Geçerli dizin veya etiket aramasında exrc veya vimrc'den komutlara izin " +"verilmiyor" + +msgid "E171: Missing :endif" +msgstr "E171: :endif eksik" + +msgid "E603: :catch without :try" +msgstr "E603: :try olmadan :catch" + +msgid "E606: :finally without :try" +msgstr "E606: :try olmadan :finally" + +msgid "E607: multiple :finally" +msgstr "E607: Birden fazla :finally" + +msgid "E600: Missing :endtry" +msgstr "E600: :endtry eksik" + +msgid "E602: :endtry without :try" +msgstr "E602: :try olmadan :endtry" + +msgid "E170: Missing :endwhile" +msgstr "E170: :endwhile eksik" + +msgid "E170: Missing :endfor" +msgstr "E170: :endfor eksik" + +msgid "E588: :endwhile without :while" +msgstr "E588: :while olmadan :endwhile" + +msgid "E588: :endfor without :for" +msgstr "E588: :for olmadan :endfor" + +msgid "E13: File exists (add ! to override)" +msgstr "E13: Dosya mevcut (geçersiz kılmak için ! ekleyin)" + +msgid "E472: Command failed" +msgstr "E472: Komut başarısız oldu" + +#, c-format +msgid "E234: Unknown fontset: %s" +msgstr "E234: Bilinmeyen yazıtipi seti: %s" + +#, c-format +msgid "E235: Unknown font: %s" +msgstr "E235: Bilinmeyen yazıtipi: %s" + +#, c-format +msgid "E236: Font \"%s\" is not fixed-width" +msgstr "E236: \"%s\" yazıtipi sabit genişlikli değil" + +msgid "E473: Internal error" +msgstr "E473: İç hata" + +#, c-format +msgid "E685: Internal error: %s" +msgstr "E685: İç hata: %s" + +msgid "Interrupted" +msgstr "Yarıda kesildi" + +msgid "E474: Invalid argument" +msgstr "E474: Geçersiz değişken" + +#, c-format +msgid "E475: Invalid argument: %s" +msgstr "E475: Geçersiz değişken: %s" + +#, c-format +msgid "E983: Duplicate argument: %s" +msgstr "E983: Yinelenen değişken: %s" + +#, c-format +msgid "E475: Invalid value for argument %s" +msgstr "E475: %s değişkeni için geçersiz değer" + +#, c-format +msgid "E475: Invalid value for argument %s: %s" +msgstr "E475: %s değişkeni için geçersiz değer: %s" + +#, c-format +msgid "E15: Invalid expression: %s" +msgstr "E15: Geçersiz ifade: %s" + +msgid "E16: Invalid range" +msgstr "E16: Geçersiz erim" + +#, c-format +msgid "E17: \"%s\" is a directory" +msgstr "E17: \"%s\" bir dizin" + +msgid "E756: Spell checking is not possible" +msgstr "E756: Yazım denetimi olanaklı değil" + +#, c-format +msgid "E364: Library call failed for \"%s()\"" +msgstr "E364: \"%s()\" için kitaplık çağrısı başarısız oldu" + +msgid "E667: Fsync failed" +msgstr "E667: Fsync başarısız oldu" + +#, c-format +msgid "E448: Could not load library function %s" +msgstr "E448: %s kitaplık işlevi yüklenemedi" + +msgid "E19: Mark has invalid line number" +msgstr "E19: İm satır numarası geçersiz" + +msgid "E20: Mark not set" +msgstr "E20: İm ayarlanmamış" + +msgid "E21: Cannot make changes, 'modifiable' is off" +msgstr "E21: Değişiklik yapılamıyor, 'modifiable' kapalı" + +msgid "E22: Scripts nested too deep" +msgstr "E22: Betikler çok iç içe geçmiş" + +msgid "E23: No alternate file" +msgstr "E23: Başka bir dosya yok" + +msgid "E24: No such abbreviation" +msgstr "E24: Böyle bir kısaltma yok" + +msgid "E477: No ! allowed" +msgstr "E477: ! imine izin verilmiyor" + +msgid "E25: GUI cannot be used: Not enabled at compile time" +msgstr "E25: Grafik arabirim kullanılamaz: Derlenirken etkinleştirilmemiş" + +msgid "E26: Hebrew cannot be used: Not enabled at compile time\n" +msgstr "E26: İbranca kullanılamaz: Derlenirken etkinleştirilmemiş\n" + +msgid "E27: Farsi support has been removed\n" +msgstr "E27: Farsça desteği kaldırıldı\n" + +msgid "E800: Arabic cannot be used: Not enabled at compile time\n" +msgstr "E800: Arapça kullanılamaz: Derlenirken etkinleştirilmemiş\n" + +#, c-format +msgid "E28: No such highlight group name: %s" +msgstr "E28: Böyle bir vurgulama grup adı yok: %s" + +msgid "E29: No inserted text yet" +msgstr "E29: Henüz bir metin eklenmedi" + +msgid "E30: No previous command line" +msgstr "E30: Öncesinde komut satırı yok" + +msgid "E31: No such mapping" +msgstr "E31: Böyle bir eşlem yok" + +msgid "E479: No match" +msgstr "E479: Eşleşme yok" + +#, c-format +msgid "E480: No match: %s" +msgstr "E480: Eşleşme yok: %s" + +msgid "E32: No file name" +msgstr "E32: Dosya adı yok" + +msgid "E33: No previous substitute regular expression" +msgstr "E33: Öncesinde yerine geçen bir düzenli ifade yok" + +msgid "E34: No previous command" +msgstr "E34: Öncesinde komut yok" + +msgid "E35: No previous regular expression" +msgstr "E35: Öncesinde düzenli ifade yok" + +msgid "E481: No range allowed" +msgstr "E481: Erime izin verilmiyor" + +msgid "E36: Not enough room" +msgstr "E36: Yeterli alan yok" + +#, c-format +msgid "E247: no registered server named \"%s\"" +msgstr "E247: \"%s\" adlı kayıtlı bir sunucu yok" + +#, c-format +msgid "E482: Can't create file %s" +msgstr "E482: %s dosyası oluşturulamıyor" + +msgid "E483: Can't get temp file name" +msgstr "E483: Geçici dosya adı alınamıyor" + +#, c-format +msgid "E484: Can't open file %s" +msgstr "E484: %s dosyası açılamıyor" + +#, c-format +msgid "E485: Can't read file %s" +msgstr "E485: %s dosyası okunamıyor" + +msgid "E38: Null argument" +msgstr "E38: Anlamsız değişken" + +msgid "E39: Number expected" +msgstr "E39: Sayı bekleniyordu" + +#, c-format +msgid "E40: Can't open errorfile %s" +msgstr "E40: Hata dosyası %s açılamıyor" + +msgid "E233: cannot open display" +msgstr "E233: Görüntü açılamıyor" + +msgid "E41: Out of memory!" +msgstr "E41: Bellek yetersiz!" + +msgid "Pattern not found" +msgstr "Dizgi bulunamadı" + +#, c-format +msgid "E486: Pattern not found: %s" +msgstr "E486: Dizgi bulunamadı: %s" + +msgid "E487: Argument must be positive" +msgstr "E487: Değişken pozitif olmalı" + +msgid "E459: Cannot go back to previous directory" +msgstr "E459: Bir önceki dizine gidilemiyor" + +msgid "E42: No Errors" +msgstr "E42: Hata yok" + +msgid "E776: No location list" +msgstr "E776: Konum listesi yok" + +msgid "E43: Damaged match string" +msgstr "E43: Hasarlı eşleşme dizisi" + +msgid "E44: Corrupted regexp program" +msgstr "E44: Bozulmuş regexp programı" + +msgid "E45: 'readonly' option is set (add ! to override)" +msgstr "E45: 'readonly' seçeneği ayarlanmış (geçersiz kılmak için ! ekleyin)" + +#, c-format +msgid "E734: Wrong variable type for %s=" +msgstr "E734: %s= için yanlış değişken türü" + +#, c-format +msgid "E461: Illegal variable name: %s" +msgstr "E461: İzin verilmeyen değişken adı: %s" + +msgid "E995: Cannot modify existing variable" +msgstr "E995: Mevcut değişken değiştirilemiyor" + +#, c-format +msgid "E46: Cannot change read-only variable \"%s\"" +msgstr "E46: Salt okunur değişken \"%s\" değiştirilemiyor" + +#, c-format +msgid "E794: Cannot set variable in the sandbox: \"%s\"" +msgstr "E794: Değişken kum havuzunda ayarlanamıyor: \"%s\"" + +msgid "E928: String required" +msgstr "E928: Dizi gerekiyor" + +msgid "E713: Cannot use empty key for Dictionary" +msgstr "E713: Sözlük için boş anahtar kullanılamaz" + +msgid "E715: Dictionary required" +msgstr "E715: Sözlük gerekiyor" + +#, c-format +msgid "E684: list index out of range: %ld" +msgstr "E684: Liste sırası erimin dışında: %ld" + +#, c-format +msgid "E979: Blob index out of range: %ld" +msgstr "E979: İkili geniş nesne sırası erimin dışında: %ld" + +msgid "E978: Invalid operation for Blob" +msgstr "E978: İkili geniş nesne için geçersiz işlem" + +#, c-format +msgid "E118: Too many arguments for function: %s" +msgstr "E118: İşlev için çok fazla değişken: %s" + +#, c-format +msgid "E119: Not enough arguments for function: %s" +msgstr "E119: Şu işlev için yetersiz sayıda değişken: %s" + +#, c-format +msgid "E933: Function was deleted: %s" +msgstr "E933: İşlev silinmiş: %s" + +#, c-format +msgid "E716: Key not present in Dictionary: \"%s\"" +msgstr "E716: Anahtar sözlükte mevcut değil: \"%s\"" + +msgid "E714: List required" +msgstr "E714: Liste gerekiyor" + +msgid "E897: List or Blob required" +msgstr "E897: Liste veya ikili geniş nesne gerekiyor" + +#, c-format +msgid "E697: Missing end of List ']': %s" +msgstr "E697: Liste sonunda ']' eksik: %s" + +#, c-format +msgid "E712: Argument of %s must be a List or Dictionary" +msgstr "E712: %s ögesinin değişkeni bir liste veya sözlük olmalıdır" + +#, c-format +msgid "E896: Argument of %s must be a List, Dictionary or Blob" +msgstr "E896: %s değişkeni bir liste, sözlük veya ikili geniş nesne olmalıdır" + +msgid "E804: Cannot use '%' with Float" +msgstr "E804: Bir kayan noktalı değer ile '%' kullanılamaz" + +msgid "E908: using an invalid value as a String" +msgstr "E908: Geçersiz bir değer bir Dizi yerine kullanılıyor" + +msgid "E996: Cannot lock an option" +msgstr "E996: Seçenek kilitlenemiyor" + +#, c-format +msgid "E113: Unknown option: %s" +msgstr "E113: Bilinmeyen seçenek: %s" + +msgid "E18: Unexpected characters in :let" +msgstr "E18: :let içinde beklenmeyen karakter" + +#, c-format +msgid "E998: Reduce of an empty %s with no initial value" +msgstr "E998: Başlangıç değeri olmayan boş bir %s için reduce() yapılamıyor" + +#, c-format +msgid "E857: Dictionary key \"%s\" required" +msgstr "E857: Sözlük anahtarı \"%s\" gerekiyor" + +msgid "E47: Error while reading errorfile" +msgstr "E47: Hata dosyası okunurken hata" + +msgid "E48: Not allowed in sandbox" +msgstr "E48: Kum havuzunda izin verilmiyor" + +msgid "E523: Not allowed here" +msgstr "E523: Burada izin verilmiyor" + +msgid "E578: Not allowed to change text here" +msgstr "E578: Burada metin değişikliğine izin verilmiyor" + +msgid "E565: Not allowed to change text or change window" +msgstr "E565: Pencere veya metin değişikliğine izin verilmiyor" + +msgid "E359: Screen mode setting not supported" +msgstr "E359: Ekran kipi ayarı desteklenmiyor" + +msgid "E49: Invalid scroll size" +msgstr "E49: Geçersiz kaydırma boyutu" + +msgid "E91: 'shell' option is empty" +msgstr "E91: 'shell' seçeneği boş" + +msgid "E255: Couldn't read in sign data!" +msgstr "E255: İşaret verisi okunamadı!" + +msgid "E72: Close error on swap file" +msgstr "E72: Takas dosyasında kapama hatası" + +msgid "E73: tag stack empty" +msgstr "E73: Etiket yığını boş" + +msgid "E74: Command too complex" +msgstr "E74: Komut çok karmaşık" + +msgid "E75: Name too long" +msgstr "E75: Ad çok uzun" + +msgid "E76: Too many [" +msgstr "E76: Çok fazla [" + +msgid "E77: Too many file names" +msgstr "E77: Çok fazla dosya adı" + +msgid "E488: Trailing characters" +msgstr "E488: Sonda fazladan karakterler" + +#, c-format +msgid "E488: Trailing characters: %s" +msgstr "E488: Sonda fazladan karakterler: %s" + +msgid "E78: Unknown mark" +msgstr "E78: Bilinmeyen im" + +msgid "E79: Cannot expand wildcards" +msgstr "E79: Joker karakterleri genişletilemiyor" + +msgid "E591: 'winheight' cannot be smaller than 'winminheight'" +msgstr "E591: 'winheight' değeri 'winminheight' değerinden küçük olamaz" + +msgid "E592: 'winwidth' cannot be smaller than 'winminwidth'" +msgstr "E592: 'winwidth' değeri 'winminwidth' değerinden küçük olamaz" + +msgid "E80: Error while writing" +msgstr "E80: Yazma sırasında hata" + +msgid "E939: Positive count required" +msgstr "E939: Pozitif sayım gerekiyor" + +msgid "E81: Using <SID> not in a script context" +msgstr "E81: <SID> bir betik bağlamında kullanılmıyor" + +#, c-format +msgid "E107: Missing parentheses: %s" +msgstr "E107: Ayraç eksik: %s" + +msgid "E110: Missing ')'" +msgstr "E110: ')' eksik" + +#, c-format +msgid "E720: Missing colon in Dictionary: %s" +msgstr "E720: Sözlükte iki nokta eksik: %s" + +#, c-format +msgid "E721: Duplicate key in Dictionary: \"%s\"" +msgstr "E721: Sözlükte yinelenmiş anahtar: \"%s\"" + +#, c-format +msgid "E722: Missing comma in Dictionary: %s" +msgstr "E722: Sözlükte virgül eksik: %s" + +#, c-format +msgid "E723: Missing end of Dictionary '}': %s" +msgstr "E723: Sözlük sonu '}' eksik: %s" + +msgid "E449: Invalid expression received" +msgstr "E449: Geçersiz ifade alındı" + +msgid "E463: Region is guarded, cannot modify" +msgstr "E463: Bölge korunuyor, değiştirilemez" + +msgid "E744: NetBeans does not allow changes in read-only files" +msgstr "E744: NetBeans salt okunur dosyalarda değişikliklere izin vermiyor" + +msgid "E363: pattern uses more memory than 'maxmempattern'" +msgstr "E363: Dizgi 'maxmempattern' ögesinden daha fazla bellek kullanıyor" + +msgid "E749: empty buffer" +msgstr "E749: Boş arabellek" + +#, c-format +msgid "E86: Buffer %ld does not exist" +msgstr "E86: Arabellek %ld mevcut değil" + +msgid "E682: Invalid search pattern or delimiter" +msgstr "E682: Geçersiz arama dizgisi veya sınırlandırıcısı" + +msgid "E139: File is loaded in another buffer" +msgstr "E139: Dosya başka bir arabellekte yüklü" + +#, c-format +msgid "E764: Option '%s' is not set" +msgstr "E764: '%s' seçeneği ayarlanmamış" + +msgid "E850: Invalid register name" +msgstr "E850: Geçersiz yazmaç adı" + +msgid "E806: using Float as a String" +msgstr "E806: Kayan Noktalı Değer, bir Dizi yerine kullanılıyor" + +#, c-format +msgid "E919: Directory not found in '%s': \"%s\"" +msgstr "E919: '%s' içinde dizin bulunamadı: \"%s\"" + +msgid "E952: Autocommand caused recursive behavior" +msgstr "E952: Otokomut özyineli davranışa neden oldu" + +msgid "E813: Cannot close autocmd or popup window" +msgstr "E813: Otokomut veya açılır pencere kapatılamıyor" + +msgid "E328: Menu only exists in another mode" +msgstr "E328: Menü yalnızca başka bir kipte mevcut" + +msgid "E957: Invalid window number" +msgstr "E957: Geçersiz pencere numarası" + +#, c-format +msgid "E686: Argument of %s must be a List" +msgstr "E686: %s değişkeni bir liste olmalı" + +msgid "E109: Missing ':' after '?'" +msgstr "E109: '?' sonrası ':' eksik" + +msgid "E690: Missing \"in\" after :for" +msgstr "E690: :for sonrası \"in\" eksik" + +#, c-format +msgid "E117: Unknown function: %s" +msgstr "E117: Bilinmeyen işlev: %s" + +msgid "E111: Missing ']'" +msgstr "E111: ']' eksik" + +msgid "E581: :else without :if" +msgstr "E581: :if olmadan :else" + +msgid "E582: :elseif without :if" +msgstr "E582: :if olmadan :elseif" + +msgid "E580: :endif without :if" +msgstr "E580: :if olmadan :endif" + +msgid "E586: :continue without :while or :for" +msgstr "E586: :while veya :for olmadan :continue" + +msgid "E587: :break without :while or :for" +msgstr "E587: :while veya :for olmadan :break" + +msgid "E274: No white space allowed before parenthesis" +msgstr "E274: Ayraçtan önce boşluğa izin verilmiyor" + +#, c-format +msgid "E940: Cannot lock or unlock variable %s" +msgstr "E940: Değişken %s kilitlenemiyor veya açılamıyor" + +#, c-format +msgid "E254: Cannot allocate color %s" +msgstr "E254: %s rengi ayrılamıyor" + +msgid "search hit TOP, continuing at BOTTOM" +msgstr "Arama dosyanın BAŞINI geçti, dosyanın SONUNDAN sürüyor" + +msgid "search hit BOTTOM, continuing at TOP" +msgstr "Arama dosyanın SONUNU geçti, dosyanın BAŞINDAN sürüyor" + +msgid " line " +msgstr " satır " + +#, c-format +msgid "Need encryption key for \"%s\"" +msgstr "\"%s\" için şifreleme anahtarı gerekli" + +msgid "empty keys are not allowed" +msgstr "boş anahtarlara izin verilmiyor" + +msgid "dictionary is locked" +msgstr "sözlük kilitli" + +msgid "list is locked" +msgstr "liste kilitli" + +#, c-format +msgid "failed to add key '%s' to dictionary" +msgstr "'%s' anahtarı sözlüğe eklenemedi" + +#, c-format +msgid "index must be int or slice, not %s" +msgstr "dizin bir tamsayı veya dilim olmalıdır, %s olamaz" + +#, c-format +msgid "expected str() or unicode() instance, but got %s" +msgstr "str() veya unicode() örneği bekleniyordu, %s geldi" + +#, c-format +msgid "expected bytes() or str() instance, but got %s" +msgstr "bytes() veya str() örneği bekleniyordu, %s geldi" + +#, c-format +msgid "" +"expected int(), long() or something supporting coercing to long(), but got %s" +msgstr "" +"int(), long() veya long()'a baskıyı destekleyen bir şey bekleniyordu, %s " +"geldi" + +#, c-format +msgid "expected int() or something supporting coercing to int(), but got %s" +msgstr "int() veya int()'e baskıyı destekleyen bir şey bekleniyordu, %s geldi" + +msgid "value is too large to fit into C int type" +msgstr "değer C tamsayı türüne sığmak için çok büyük" + +msgid "value is too small to fit into C int type" +msgstr "değer C tamsayı türüne sığmak için çok küçük" + +msgid "number must be greater than zero" +msgstr "sayı sıfırdan büyük olmalı" + +msgid "number must be greater or equal to zero" +msgstr "sayı sıfıra eşit veya sıfırdan büyük olmalı" + +msgid "can't delete OutputObject attributes" +msgstr "OutputObject öznitelikleri silinemiyor" + +#, c-format +msgid "invalid attribute: %s" +msgstr "geçersiz öznitelik: %s" + +msgid "E264: Python: Error initialising I/O objects" +msgstr "E264: Python: Girdi/Çıktı nesneleri başlatılırken hata" + +msgid "failed to change directory" +msgstr "dizin değiştirilemedi" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got %s" +msgstr "imp.find_module() sonucu olarak 3 çoklu öge bekleniyordu, %s geldi" + +#, c-format +msgid "expected 3-tuple as imp.find_module() result, but got tuple of size %d" +msgstr "" +"imp.find_module() sonucu olarak 3 tuple bekleniyordu, %d boyutlu çok öge " +"geldi" + +msgid "internal error: imp.find_module returned tuple with NULL" +msgstr "iç hata: imp.find_module BOŞ bir çoklu öge döndürdü" + +msgid "cannot delete vim.Dictionary attributes" +msgstr "vim.Dictionary öznitelikleri silinemiyor" + +msgid "cannot modify fixed dictionary" +msgstr "sabit sözlük değiştirilemiyor" + +#, c-format +msgid "cannot set attribute %s" +msgstr "%s özniteliği ayarlanamıyor" + +msgid "hashtab changed during iteration" +msgstr "Sağlama tablosu dürüm sırasında değişti" + +#, c-format +msgid "expected sequence element of size 2, but got sequence of size %d" +msgstr "2 boyut bir sıralama bekleniyordu, ancak %d boyut bir sıralama geldi" + +msgid "list constructor does not accept keyword arguments" +msgstr "liste yapıcısı anahtar sözcük değişkenleri kabul etmez" + +msgid "list index out of range" +msgstr "liste dizini erimin dışında" + +#, c-format +msgid "internal error: failed to get Vim list item %d" +msgstr "iç hata: %d vim liste ögesi alınamadı" + +msgid "slice step cannot be zero" +msgstr "dilim adımı sıfır olamaz" + +#, c-format +msgid "attempt to assign sequence of size greater than %d to extended slice" +msgstr "genişletilmiş dilime %d boyuttan büyük bir sıralamayı atama denemesi" + +#, c-format +msgid "internal error: no Vim list item %d" +msgstr "iç hata: %d vim liste ögesi yok" + +msgid "internal error: not enough list items" +msgstr "iç hata: yeterli liste ögesi yok" + +msgid "internal error: failed to add item to list" +msgstr "iç hata: öge listeye eklenemedi" + +#, c-format +msgid "attempt to assign sequence of size %d to extended slice of size %d" +msgstr "%d boyut sıralamayı %d boyut genişletilmiş dizine atama denemesi" + +msgid "failed to add item to list" +msgstr "öge listeye eklenemedi" + +msgid "cannot delete vim.List attributes" +msgstr "vim.List öznitelikleri silinemiyor" + +msgid "cannot modify fixed list" +msgstr "sabit liste değiştirilemiyor" + +#, c-format +msgid "unnamed function %s does not exist" +msgstr "adsız %s işlevi mevcut değil" + +#, c-format +msgid "function %s does not exist" +msgstr "%s işlevi mevcut değil" + +#, c-format +msgid "failed to run function %s" +msgstr "%s işlevi çalıştırılamadı" + +msgid "unable to get option value" +msgstr "seçenek değeri alınamadı" + +msgid "internal error: unknown option type" +msgstr "iç hata: bilinmeyen seçenek türü" + +msgid "problem while switching windows" +msgstr "pencereler arasında gezinirken hata" + +#, c-format +msgid "unable to unset global option %s" +msgstr "%s global seçenek ayarı kapatılamıyor" + +#, c-format +msgid "unable to unset option %s which does not have global value" +msgstr "global değeri olmayan %s seçenek ayarı kapatılamıyor" + +msgid "attempt to refer to deleted tab page" +msgstr "silinmiş sekme sayfasına başvurma denemesi" + +msgid "no such tab page" +msgstr "böyle bir sekme sayfası yok" + +msgid "attempt to refer to deleted window" +msgstr "silinmiş pencereye başvurma denemesi" + +msgid "readonly attribute: buffer" +msgstr "saltokunur öznitelik: arabellek" + +msgid "cursor position outside buffer" +msgstr "imleç konumu arabelleğin dışında" + +msgid "no such window" +msgstr "böyle bir pencere yok" + +msgid "attempt to refer to deleted buffer" +msgstr "silinmiş arabelleğe başvurma denemesi" + +msgid "failed to rename buffer" +msgstr "arabellek adı değiştirilemedi" + +msgid "mark name must be a single character" +msgstr "im adı tek bir karakterden olmalıdır" + +#, c-format +msgid "expected vim.Buffer object, but got %s" +msgstr "vim.Buffer nesnesi bekleniyordu, %s geldi" + +#, c-format +msgid "failed to switch to buffer %d" +msgstr "%d arabelleğine geçilemedi" + +#, c-format +msgid "expected vim.Window object, but got %s" +msgstr "vim.Window nesnesi bekleniyordu, %s geldi" + +msgid "failed to find window in the current tab page" +msgstr "mevcut sekme sayfasında pencere bulunamadı" + +msgid "did not switch to the specified window" +msgstr "belirtilen pencereye geçilemedi" + +#, c-format +msgid "expected vim.TabPage object, but got %s" +msgstr "vim.TabPage nesnesi bekleniyordu, %s geldi" + +msgid "did not switch to the specified tab page" +msgstr "belirtilen sekme sayfasına geçilemedi" + +msgid "failed to run the code" +msgstr "kod çalıştırılamadı" + +msgid "E858: Eval did not return a valid python object" +msgstr "E858: Eval geçerli bir python nesnesi döndürmedi" + +msgid "E859: Failed to convert returned python object to a Vim value" +msgstr "E859: Döndürülen python nesnesi vim değerine dönüştürülemedi" + +#, c-format +msgid "unable to convert %s to a Vim dictionary" +msgstr "%s vim sözlüğüne dönüştürülemedi" + +#, c-format +msgid "unable to convert %s to a Vim list" +msgstr "%s vim listesine dönüştürülemedi" + +#, c-format +msgid "unable to convert %s to a Vim structure" +msgstr "%s vim yapısına dönüştürülemedi" + +msgid "internal error: NULL reference passed" +msgstr "iç hata: BOŞ başvuru geçirildi" + +msgid "internal error: invalid value type" +msgstr "iç hata: geçersiz değer türü" + +msgid "" +"Failed to set path hook: sys.path_hooks is not a list\n" +"You should now do the following:\n" +"- append vim.path_hook to sys.path_hooks\n" +"- append vim.VIM_SPECIAL_PATH to sys.path\n" +msgstr "" +"Yol kancası ayarlanamadı: sys.path_hooks bir liste değil\n" +"Şimdi şunları yapmanız gerekiyor:\n" +"- vim.path_hook'u sys.path_hooks'a iliştirmek\n" +"- vim.VIM_SPECIAL_PATH'i sys.path'e iliştirmek\n" + +msgid "" +"Failed to set path: sys.path is not a list\n" +"You should now append vim.VIM_SPECIAL_PATH to sys.path" +msgstr "" +"Yol ayarlanamadı: sys.path bir liste değil\n" +"Şimdi vim.VIM_SPECIAL_PATH'i sys.path'e iliştirmelisiniz" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*.*)\t*.*\n" +msgstr "" +"Vim makro dosyaları (*.vim)\t*.vim\n" +"Tüm Dosyalar (*.*)\t*.*\n" + +msgid "All Files (*.*)\t*.*\n" +msgstr "Tüm Dosyalar (*.*)\t*.*\n" + +msgid "" +"All Files (*.*)\t*.*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB code (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Tüm Dosyalar (*.*)\t*.*\n" +"C kaynak dosyaları (*.c, *.h)\t*.c;*.h\n" +"C++ kaynak dosyaları (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"VB kodu (*.bas, *.frm)\t*.bas;*.frm\n" +"Vim dosyaları (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "" +"Vim macro files (*.vim)\t*.vim\n" +"All Files (*)\t*\n" +msgstr "" +"Vim makro dosyaları (*.vim)\t*.vim\n" +"Tüm Dosyalar (*)\t*\n" + +msgid "All Files (*)\t*\n" +msgstr "Tüm Dosyalar (*)\t*\n" + +msgid "" +"All Files (*)\t*\n" +"C source (*.c, *.h)\t*.c;*.h\n" +"C++ source (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim files (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" +msgstr "" +"Tüm Dosyalar (*)\t*\n" +"C kaynak dosyaları (*.c, *.h)\t*.c;*.h\n" +"C++ kaynak dosyaları (*.cpp, *.hpp)\t*.cpp;*.hpp\n" +"Vim dosyaları (*.vim, _vimrc, _gvimrc)\t*.vim;_vimrc;_gvimrc\n" + +msgid "GVim" +msgstr "GVim" + +msgid "Text Editor" +msgstr "Metin Düzenleyici" + +msgid "Edit text files" +msgstr "Metin dosyaları düzenleyin" + +msgid "Text;editor;" +msgstr "Metin;düzenleyici;" + +msgid "Vim" +msgstr "Vim" + +msgid "(local to window)" +msgstr "(pencereye yerel)" + +msgid "(local to buffer)" +msgstr "(arabelleğe yerel)" + +msgid "(global or local to buffer)" +msgstr "(arabelleğe global veya yerel)" + +msgid "" +"\" Each \"set\" line shows the current value of an option (on the left)." +msgstr "\" Her \"set\" satırı bir seçeneğin geçerli değerini gösterir (solda)." + +msgid "\" Hit <Enter> on a \"set\" line to execute it." +msgstr "\" Değiştirmek için bir \"set\" satırında <Enter>'a basın." + +msgid "\" A boolean option will be toggled." +msgstr "\" Bir Boole değeri işletilecektir." + +msgid "" +"\" For other options you can edit the value before hitting " +"<Enter>." +msgstr "" +"\" Diğer seçenekler için <Enter>'a basmadan önce değeri " +"düzenleyebilirsiniz." + +msgid "\" Hit <Enter> on a help line to open a help window on this option." +msgstr "" +"\" Yardım penceresini açmak için seçenek adı üzerinde <Enter>'a basın." + +msgid "\" Hit <Enter> on an index line to jump there." +msgstr "" +"\" Bir seçeneğe atlamak için indeks satırının üzerinde <Enter>'a basın." + +msgid "\" Hit <Space> on a \"set\" line to refresh it." +msgstr "" +"\" Bir seçeneği yenilemek için bir \"set\" satırının üzerinde <Boşluk>'a " +"basın." + +msgid "important" +msgstr "önemli" + +msgid "behave very Vi compatible (not advisable)" +msgstr "olabildiğince Vi uyumlu biçimde davran (önerilmez)" + +msgid "list of flags to specify Vi compatibility" +msgstr "Vi uyumluluğu bayrakları listesi" + +msgid "use Insert mode as the default mode" +msgstr "Ekleme kipini öntanımlı kip olarak kullan" + +msgid "paste mode, insert typed text literally" +msgstr "yapıştır kipi, girilen metni doğrudan ekle" + +msgid "key sequence to toggle paste mode" +msgstr "yapıştır kipini açıp/kapatmak için düğme sıralaması" + +msgid "list of directories used for runtime files and plugins" +msgstr "çalışma zamanı dosyaları ve eklentileri için kullanılan dizinler" + +msgid "list of directories used for plugin packages" +msgstr "eklenti paketleri için kullanılan dizinlerin listesi" + +msgid "name of the main help file" +msgstr "ana yardım dosyasının adı" + +msgid "moving around, searching and patterns" +msgstr "dolaşma, arama ve dizgeler" + +msgid "list of flags specifying which commands wrap to another line" +msgstr "hangi komutların diğer satıra kaydırıldığını belirleyen bayraklar\n" +"listesi" + +msgid "" +"many jump commands move the cursor to the first non-blank\n" +"character of a line" +msgstr "" +"çoğu atlama komutu, imleci satırın boş olmayan ilk\n" +"karakterine taşır" + +msgid "nroff macro names that separate paragraphs" +msgstr "paragrafları ayıran nroff makro adları" + +msgid "nroff macro names that separate sections" +msgstr "bölümleri ayıran nroff makro adları" + +msgid "list of directory names used for file searching" +msgstr "dosya arama için kullanılan dizin adları listesi" + +msgid "list of directory names used for :cd" +msgstr ":cd için kullanılan dizin adları listesi" + +msgid "change to directory of file in buffer" +msgstr "arabellekteki dosyanın olduğu dizine değiştir" + +msgid "search commands wrap around the end of the buffer" +msgstr "arama komutları, arabelleğin sonunda kaydırılır" + +msgid "show match for partly typed search command" +msgstr "bir kısmı yazılmış arama komutu ile eşleşeni göster" + +msgid "change the way backslashes are used in search patterns" +msgstr "arama dizgilerinde ters eğik çizginin kullanımını değiştir" + +msgid "select the default regexp engine used" +msgstr "öntanımlı kullanılan düzenli ifade motorunu seç" + +msgid "ignore case when using a search pattern" +msgstr "bir arama dizgisinde BÜYÜK/küçük harf ayrımını yok say" + +msgid "override 'ignorecase' when pattern has upper case characters" +msgstr "dizgide BÜYÜK harf varsa 'ignorecase'i geçersiz kıl" + +msgid "what method to use for changing case of letters" +msgstr "BÜYÜK/küçük harf değiştirirken hangi yöntemin kullanılacağı" + +msgid "maximum amount of memory in Kbyte used for pattern matching" +msgstr "dizgi eşleşme için kullanılabilecek en çok bellek miktarı (KiB)" + +msgid "pattern for a macro definition line" +msgstr "bir makro tanım satırı için dizgi" + +msgid "pattern for an include-file line" +msgstr "bir 'include-file' satırı için dizgi" + +msgid "expression used to transform an include line to a file name" +msgstr "bir 'include' satırını dosya adına dönüştürmede kullanılan ifade" + +msgid "tags" +msgstr "etiketler" + +msgid "use binary searching in tags files" +msgstr "etiketler dosyasında ikili arama kullan" + +msgid "number of significant characters in a tag name or zero" +msgstr "bir etiket adındaki belirgin karakterlerin sayısı veya sıfır" + +msgid "list of file names to search for tags" +msgstr "etiketlerin aranacağı dosyaların listesi" + +msgid "" +"how to handle case when searching in tags files:\n" +"\"followic\" to follow 'ignorecase', \"ignore\" or \"match\"" +msgstr "" +"etiket dosyalarında arama yaparken BÜYÜK/küçük harf kullanımı:\n" +"'ignorecase', \"ignore\" veya \"match\"den sonra \"followic\" gelir" + +msgid "file names in a tags file are relative to the tags file" +msgstr "bir etiket dosyasındaki dosya adları etiket dosyasına görelidir" + +msgid "a :tag command will use the tagstack" +msgstr "bir :tag komutu etiket yığınını kullanır" + +msgid "when completing tags in Insert mode show more info" +msgstr "Ekleme kipinde etiketleri tamamlarken daha çok bilgi göster" + +msgid "a function to be used to perform tag searches" +msgstr "etiket aramaları gerçekleştirmek için bir işlev kullanılır" + +msgid "command for executing cscope" +msgstr "cscope çalıştırmak için kullanılacak komut" + +msgid "use cscope for tag commands" +msgstr "etiket komutları için cscope kullan" + +msgid "0 or 1; the order in which \":cstag\" performs a search" +msgstr "0 veya 1; \":cstag\"in arama yaparken kullanacağı sıra" + +msgid "give messages when adding a cscope database" +msgstr "bir cscope veritabanı eklerken iletiler göster" + +msgid "how many components of the path to show" +msgstr "yolun kaç tane bileşeninin gösterileceği" + +msgid "when to open a quickfix window for cscope" +msgstr "cscope için ne zaman bir hızlı düzelt penceresinin açılacağı" + +msgid "file names in a cscope file are relative to that file" +msgstr "bir cscope dosyasındaki o dosyaya göreli olan dosya adları" + +msgid "displaying text" +msgstr "metin görüntüleme" + +msgid "number of lines to scroll for CTRL-U and CTRL-D" +msgstr "CTRL-U ve CTRL-D için kaydırılacak satır sayısı" + +msgid "number of screen lines to show around the cursor" +msgstr "imleç etrafında gösterilecek ekran satırları sayısı" + +msgid "long lines wrap" +msgstr "uzun satırları kaydır" + +msgid "wrap long lines at a character in 'breakat'" +msgstr "'breakat' içindeki bir karakterde uzun satırları kaydır" + +msgid "preserve indentation in wrapped text" +msgstr "kaydırılmış metindeki girintilemeyi koru" + +msgid "adjust breakindent behaviour" +msgstr "'breakindent' davranışını ayarla" + +msgid "which characters might cause a line break" +msgstr "hangi karakterler bir satır sonuna neden olabilir" + +msgid "string to put before wrapped screen lines" +msgstr "kaydırılmış ekran satırlarından önce konumlanacak dizi" + +msgid "minimal number of columns to scroll horizontally" +msgstr "en az yatay kaydırma sütunu sayısı" + +msgid "minimal number of columns to keep left and right of the cursor" +msgstr "imlecin sağında ve solunda bırakılacak en az sütun sayısı" + +msgid "" +"include \"lastline\" to show the last line even if it doesn't fit\n" +"include \"uhex\" to show unprintable characters as a hex number" +msgstr "" +"eğer sığmasa bile son satırı göstermek için \"lastline\"ı içer\n" +"yazdırılamayan karakterleri onaltılık olarak göstermek için\n" +"\"uhex\" içer" + +msgid "characters to use for the status line, folds and filler lines" +msgstr "durum satırı, kıvırma ve doldurucular için kullanılan karakterler" + +msgid "number of lines used for the command-line" +msgstr "komut satırı için kullanılan satırların sayısı" + +msgid "width of the display" +msgstr "ekranın genişliği" + +msgid "number of lines in the display" +msgstr "ekrandaki satırların sayısı" + +msgid "number of lines to scroll for CTRL-F and CTRL-B" +msgstr "CTRL-F ve CTRL-B için kaydırılacak satır sayısı" + +msgid "don't redraw while executing macros" +msgstr "makroları çalıştırırken yenileme yapma" + +msgid "timeout for 'hlsearch' and :match highlighting in msec" +msgstr "'hlsearch' ve : match vurgulaması için zaman aşımı (milisaniye)" + +msgid "" +"delay in msec for each char written to the display\n" +"(for debugging)" +msgstr "" +"ekrana yazılan her karakter için gecikme süresi (milisaniye)\n" +"(hata ayıklama için)" + +msgid "show <Tab> as ^I and end-of-line as $" +msgstr "<Tab>'ı ^I ve satır sonunu $ olarak göster" + +msgid "list of strings used for list mode" +msgstr "liste kipi için kullanılan diziler listesi" + +msgid "show the line number for each line" +msgstr "her satır için satır numarasını göster" + +msgid "show the relative line number for each line" +msgstr "her satır için göreli satır numarasını göster" + +msgid "number of columns to use for the line number" +msgstr "satır numarası için kullanılacak sütün sayısı" + +msgid "controls whether concealable text is hidden" +msgstr "gizlenebilir metnin saklı olup olmadığını denetler" + +msgid "modes in which text in the cursor line can be concealed" +msgstr "imleç satırındaki metnin gizlenebileceği kipler" + +msgid "syntax, highlighting and spelling" +msgstr "sözdizim, vurgulama ve yazım denetimi" + +msgid "\"dark\" or \"light\"; the background color brightness" +msgstr "\"dark\" veya \"light\"; arka plan renk parlaklığı" + +msgid "type of file; triggers the FileType event when set" +msgstr "dosya türü; ayarlandığında FileType olayını tetikler" + +msgid "name of syntax highlighting used" +msgstr "kullanılan sözdizim vurgulamanın adı" + +msgid "maximum column to look for syntax items" +msgstr "sözdizim ögeleri için bakılacak en çok sütun sayısı" + +msgid "which highlighting to use for various occasions" +msgstr "çeşitli durumlarda hangi vurgulamanın kullanılacağı" + +msgid "highlight all matches for the last used search pattern" +msgstr "son kullanılan arama dizgisi için tüm eşleşmeleri vurgula" + +msgid "highlight group to use for the window" +msgstr "pencere için kullanılacak vurgulama grubu" + +msgid "use GUI colors for the terminal" +msgstr "uçbirim için grafik arabirim renklerini kullan" + +msgid "highlight the screen column of the cursor" +msgstr "imlecin ekrandaki sütununu vurgula" + +msgid "highlight the screen line of the cursor" +msgstr "imlecin ekrandaki satırını vurgula" + +msgid "specifies which area 'cursorline' highlights" +msgstr "'cursorline'ın hangi alanı vurgulayacağı" + +msgid "columns to highlight" +msgstr "vurgulanacak sütunlar" + +msgid "highlight spelling mistakes" +msgstr "yazım yanlışlarını vurgula" + +msgid "list of accepted languages" +msgstr "kabul edilen dillerin listesi" + +msgid "file that \"zg\" adds good words to" +msgstr "\"zg\" komutunun düzgün sözcükleri ekleyeceği dosya" + +msgid "pattern to locate the end of a sentence" +msgstr "bir tümcenin sonunu bulmak için kullanılan dizgi" + +msgid "flags to change how spell checking works" +msgstr "yazım denetiminin nice çalıştığını değiştirmek için bayraklar" + +msgid "methods used to suggest corrections" +msgstr "düzeltmeleri önermek için yöntemler" + +msgid "amount of memory used by :mkspell before compressing" +msgstr "sıkıştırma öncesi :mkspell tarafından kullanılan bellek" + +msgid "multiple windows" +msgstr "çoklu pencereler" + +msgid "0, 1 or 2; when to use a status line for the last window" +msgstr "0, 1 veya 2; son pencere için ne zaman bir durum satırı\n" +"kullanılacağı" + +msgid "alternate format to be used for a status line" +msgstr "durum satırı için kullanılabilecek alternatif biçim" + +msgid "make all windows the same size when adding/removing windows" +msgstr "pencere eklerken/kaldırırken tüm pencereleri aynı boyuta getir" + +msgid "in which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"" +msgstr "'equalalways'in hangi yönde çalıştığı: \"ver\", \"hor\" veya \"both\"" + +msgid "minimal number of lines used for the current window" +msgstr "geçerli pencere için kullanılan en az satır sayısı" + +msgid "minimal number of lines used for any window" +msgstr "herhangi bir pencere için kullanılan en az satır sayısı" + +msgid "keep the height of the window" +msgstr "pencerenin yüksekliğini tut" + +msgid "keep the width of the window" +msgstr "pencerenin genişliğini tut" + +msgid "minimal number of columns used for the current window" +msgstr "geçerli pencere için kullanılan en az sütun sayısı" + +msgid "minimal number of columns used for any window" +msgstr "herhangi bir pencere için kullanılan en az sütun sayısı" + +msgid "initial height of the help window" +msgstr "yardım penceresinin başlangıç yüksekliği" + +msgid "use a popup window for preview" +msgstr "önizleme için bir açılır pencere kullan" + +msgid "default height for the preview window" +msgstr "önizleme penceresi için öntanımlı yükseklik" + +msgid "identifies the preview window" +msgstr "önizleme penceresini tanımlar" + +msgid "don't unload a buffer when no longer shown in a window" +msgstr "arabellek artık pencerede görüntülenmiyorsa bellekten kaldırma" + +msgid "" +"\"useopen\" and/or \"split\"; which window to use when jumping\n" +"to a buffer" +msgstr "" +"\"useopen\" ve/veya \"split\"; bir belleğe atlarken hangi\n" +"pencerenin kullanılacağı" + +msgid "a new window is put below the current one" +msgstr "geçerli pencerenin altına yeni bir pencere koyulur" + +msgid "a new window is put right of the current one" +msgstr "yeni bir pencere geçerli pencerenin sağına koyulur" + +msgid "this window scrolls together with other bound windows" +msgstr "bu pencere, bağlı diğer pencerelerle birlikte kayar" + +msgid "\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'" +msgstr "\"ver\", \"hor\" ve/veya \"jump\"; 'scrollbind' için seçenekler listesi" + +msgid "this window's cursor moves together with other bound windows" +msgstr "bu pencerenin imleci bağlı diğer pencerelerle birlikte kayar" + +msgid "size of a terminal window" +msgstr "bir uçbirim penceresinin boyutu" + +msgid "key that precedes Vim commands in a terminal window" +msgstr "bir uçbirim penceresinde Vim komutlarından önce gelen düğme" + +msgid "max number of lines to keep for scrollback in a terminal window" +msgstr "bir uçbirim penceresinde geri kaydırma için kullanılacak\n" +"en çok satır sayısı" + +msgid "type of pty to use for a terminal window" +msgstr "bir uçbirim penceresi için kullanılacak pty türü" + +msgid "name of the winpty dynamic library" +msgstr "winpty devingen kitaplığının adı" + +msgid "multiple tab pages" +msgstr "çoklu sekme sayfaları" + +msgid "0, 1 or 2; when to use a tab pages line" +msgstr "0, 1 veya 2; ne zaman bir sekme sayfası satırının kullanılacağı" + +msgid "maximum number of tab pages to open for -p and \"tab all\"" +msgstr "-p ve \"tab all\"un açacağı en çok sekme sayfası sayısı" + +msgid "custom tab pages line" +msgstr "özelleştirilmiş sekme sayfası satırı" + +msgid "custom tab page label for the GUI" +msgstr "grafik arabirim için özelleştirilmiş sekme sayfası etiketi" + +msgid "custom tab page tooltip for the GUI" +msgstr "grafik arabirim için özelleştirilmiş sekme sayfası bilgi kutusu" + +msgid "terminal" +msgstr "uçbirim" + +msgid "name of the used terminal" +msgstr "kullanılan uçbirimin adı" + +msgid "alias for 'term'" +msgstr "'term' için arma" + +msgid "check built-in termcaps first" +msgstr "önce iç termcaps'i denetle" + +msgid "terminal connection is fast" +msgstr "uçbirim bağlantısı hızlı" + +msgid "terminal that requires extra redrawing" +msgstr "ek yenileme gerektiren uçbirim" + +msgid "recognize keys that start with <Esc> in Insert mode" +msgstr "Ekleme kipinde <Esc> ile başlayan düğmeleri tanı" + +msgid "minimal number of lines to scroll at a time" +msgstr "herhangi bir zamanda kaydırılacak en az satır sayısı" + +msgid "maximum number of lines to use scrolling instead of redrawing" +msgstr "yenileme yerine kaydırma kullanacak en çok satır sayısı" + +msgid "specifies what the cursor looks like in different modes" +msgstr "imlecin farklı kiplerde nice göründüğünü belirler" + +msgid "show info in the window title" +msgstr "pencere başlığında bilgi görüntüle" + +msgid "percentage of 'columns' used for the window title" +msgstr "pencere başlığı için kullanılacak 'columns' yüzdesi" + +msgid "when not empty, string to be used for the window title" +msgstr "boş değilken, pencere başlığı yerine kullanılacak dizi" + +msgid "string to restore the title to when exiting Vim" +msgstr "Vim'den çıkarken başlığın döndürüleceği dizi" + +msgid "set the text of the icon for this window" +msgstr "bu pencere için simgenin metnini ayarla" + +msgid "when not empty, text for the icon of this window" +msgstr "boş değilken, bu pencerenin simgesi için metin" + +msgid "restore the screen contents when exiting Vim" +msgstr "Vim'den çıkarken ekran içeriğini eski haline getir" + +msgid "using the mouse" +msgstr "fare kullanımı" + +msgid "list of flags for using the mouse" +msgstr "fare kullanımı için bayraklar listesi" + +msgid "the window with the mouse pointer becomes the current one" +msgstr "fare imlecinin olduğu pencere geçerli pencere olur" + +msgid "the window with the mouse pointer scrolls with the mouse wheel" +msgstr "fare imlecinin olduğu pencere fare tekerleği ile kaydırılabilir" + +msgid "hide the mouse pointer while typing" +msgstr "yazı yazarken fare imlecini gizle" + +msgid "" +"\"extend\", \"popup\" or \"popup_setpos\"; what the right\n" +"mouse button is used for" +msgstr "" +"\"extend\", \"popup\" veya \"popup_setpos\"; sağ fare düğmesinin\"\n" +"ne için kullanıldığı" + +msgid "maximum time in msec to recognize a double-click" +msgstr "bir çif tıklamayı tanımak için en çok süre (milisaniye)" + +msgid "\"xterm\", \"xterm2\", \"sgr\", etc.; type of mouse" +msgstr "\"xterm\", \"xterm2\", \"sgr\" vb.; fare türü" + +msgid "what the mouse pointer looks like in different modes" +msgstr "farklı kiplerde fare imlecinin nice göründüğü" + +msgid "GUI" +msgstr "grafik arabirim" + +msgid "list of font names to be used in the GUI" +msgstr "grafik arabirimde kullanılacak yazıtiplerinin listesi" + +msgid "pair of fonts to be used, for multibyte editing" +msgstr "çoklu bayt düzenlemede kullanılacak yazıtipi eşleşmeleri" + +msgid "list of font names to be used for double-wide characters" +msgstr "çift genişlikli karakterler için kullanılacak yazıtiplerinin listesi" + +msgid "use smooth, antialiased fonts" +msgstr "düzletilmiş yazıtipleri kullan" + +msgid "list of flags that specify how the GUI works" +msgstr "grafik arabirimin nice çalıştığını belirleyen bayraklar listesi" + +msgid "\"icons\", \"text\" and/or \"tooltips\"; how to show the toolbar" +msgstr "" +"\"icons\", \"text\" ve/veya \"tooltips\"; araç çubuğu kipleri " + +msgid "size of toolbar icons" +msgstr "araç çubuğu simgelerinin boyutu" + +msgid "room (in pixels) left above/below the window" +msgstr "pencerenin altında/üstünde bırakılan alan (piksel)" + +msgid "options for text rendering" +msgstr "metin dokuması için seçenekler" + +msgid "use a pseudo-tty for I/O to external commands" +msgstr "dış komutlara, girdi çıktı için yalancı-tty kullan" + +msgid "" +"\"last\", \"buffer\" or \"current\": which directory used for the file " +"browser" +msgstr "" +"\"last\", \"buffer\" veya \"current\"; dosya tarayıcısı için hangi dizinin " +"kullanıldığı" + +msgid "language to be used for the menus" +msgstr "menüler için kullanılan dil" + +msgid "maximum number of items in one menu" +msgstr "bir menüdeki en çok öge sayısı" + +msgid "\"no\", \"yes\" or \"menu\"; how to use the ALT key" +msgstr "\"no\", \"yes\" veya \"menu\"; ALT düğmesinin nice kullanılacağı" + +msgid "number of pixel lines to use between characters" +msgstr "karakterler arasında kullanılacak piksel satırları sayısı" + +msgid "delay in milliseconds before a balloon may pop up" +msgstr "bir balonun patlamadan önceki gecikme (milisaniye)" + +msgid "use balloon evaluation in the GUI" +msgstr "grafik arabirimde balon değerlendirme kullan" + +msgid "use balloon evaluation in the terminal" +msgstr "uçbirimde balon değerlendirme kullan" + +msgid "expression to show in balloon eval" +msgstr "balon değerlendirmesinde gösterilecek ifade" + +msgid "printing" +msgstr "yazdırma" + +msgid "list of items that control the format of :hardcopy output" +msgstr ":hardcopy çıktısının biçimini denetleyen ögelerin listesi" + +msgid "name of the printer to be used for :hardcopy" +msgstr ":hardcopy için kullanılan yazıcının adı" + +msgid "expression used to print the PostScript file for :hardcopy" +msgstr ":hardcopy için PostScript dosyasını yazdırmada kullanılan ifade" + +msgid "name of the font to be used for :hardcopy" +msgstr ":hardcopy için kullanılan yazıtipinin adı" + +msgid "format of the header used for :hardcopy" +msgstr ":hardcopy için kullanılan üstbilginin biçimi" + +msgid "encoding used to print the PostScript file for :hardcopy" +msgstr ":hardcopy için Postscript dosyasını yazdırmada kullanılan kodlama" + +msgid "the CJK character set to be used for CJK output from :hardcopy" +msgstr ":hardcopy'deki ÇJK çıktısında kullanılan ÇJK karakter seti" + +msgid "list of font names to be used for CJK output from :hardcopy" +msgstr ":hardcopy'deki ÇJK çıktısında kullanılan ÇJK yazıtipi" + +msgid "messages and info" +msgstr "iletiler ve bilgi" + +msgid "add 's' flag in 'shortmess' (don't show search message)" +msgstr "'shortness'daki 's' bayrağını ekle (arama iletisini gösterme)" + +msgid "list of flags to make messages shorter" +msgstr "iletileri kısalaştırmak için kullanılan bayraklar listesi" + +msgid "show (partial) command keys in the status line" +msgstr "durum satırında (kısmi) komut düğmelerini göster" + +msgid "display the current mode in the status line" +msgstr "durum satırında geçerli kipi görüntüle" + +msgid "show cursor position below each window" +msgstr "her pencerenin altında imleç konumunu göster" + +msgid "alternate format to be used for the ruler" +msgstr "cetvel için kullanılan alternatif biçim" + +msgid "threshold for reporting number of changed lines" +msgstr "değiştirilmiş satırların sayısını raporlama eşiği" + +msgid "the higher the more messages are given" +msgstr "ne kadar yüksek olursa o kadar çok ileti olur" + +msgid "file to write messages in" +msgstr "iletilerin içine yazılacağı dosya" + +msgid "pause listings when the screen is full" +msgstr "ekran doluyken listelemeleri duraklat" + +msgid "start a dialog when a command fails" +msgstr "bir komut başarısız olursa iletişim kutusu göster" + +msgid "ring the bell for error messages" +msgstr "hata iletilerinde zili çal" + +msgid "use a visual bell instead of beeping" +msgstr "bipleme yerine görsel zil kullan" + +msgid "do not ring the bell for these reasons" +msgstr "bu nedenlerle zili çalma" + +msgid "list of preferred languages for finding help" +msgstr "yardım için yeğlenen diller listesi" + +msgid "selecting text" +msgstr "metin seçme" + +msgid "\"old\", \"inclusive\" or \"exclusive\"; how selecting text behaves" +msgstr "\"old\", \"inclusive\" veya \"exclusive\"; metin seçim davranışı" + +msgid "" +"\"mouse\", \"key\" and/or \"cmd\"; when to start Select mode\n" +"instead of Visual mode" +msgstr "" +"\"mouse\", \"key\", ve/veya \"cmd\"; Görsel kip yerine Seçim\n" +"kipinin başlatılacağı zaman" + +msgid "" +"\"unnamed\" to use the * register like unnamed register\n" +"\"autoselect\" to always put selected text on the clipboard" +msgstr "" +"\"unnamed\": * yazmacını adsız yazmaç gibi kullan\n" +"\"autoselect\": seçili metni her zaman panoya koy" + +msgid "\"startsel\" and/or \"stopsel\"; what special keys can do" +msgstr "\"startsel\" ve/veya \"stopsel\"; özel düğmelerin işlevleri" + +msgid "editing text" +msgstr "metin düzenleme" + +msgid "maximum number of changes that can be undone" +msgstr "geri alınabilecek en çok değişiklik sayısı" + +msgid "automatically save and restore undo history" +msgstr "geri al geçmişini kendiliğinden kaydet ve eski haline getir" + +msgid "list of directories for undo files" +msgstr "geri al dosyaları için dizinler listesi" + +msgid "maximum number lines to save for undo on a buffer reload" +msgstr "arabellek yeniden yüklemesinde geri al için kaydedilecek\n" +"en çok satır sayısı" + +msgid "changes have been made and not written to a file" +msgstr "yapılan; ancak bir dosyaya yazılmayan değişiklikler" + +msgid "buffer is not to be written" +msgstr "arabellek, yazım için değil" + +msgid "changes to the text are possible" +msgstr "metne değişiklik yapımı olanaklı" + +msgid "line length above which to break a line" +msgstr "sonrasında yeni satır yapılacak satır uzunluğu" + +msgid "margin from the right in which to break a line" +msgstr "sonrasında yeni satır yapılacak sağ kenar boşluğu" + +msgid "specifies what <BS>, CTRL-W, etc. can do in Insert mode" +msgstr "<BS>, CTRL-W, vb. Ekleme kipinde ne yapabileceğini belirtir" + +msgid "definition of what comment lines look like" +msgstr "yorum satırlarının nice görüneceğinin tanımı" + +msgid "list of flags that tell how automatic formatting works" +msgstr "kendiliğinden biçimlendirmenin nice çalıştığını anlatan\n" +"bayraklar listesi" + +msgid "pattern to recognize a numbered list" +msgstr "numaralandırılmış bir listeyi tanımak için dizgi" + +msgid "expression used for \"gq\" to format lines" +msgstr "satırları biçimlendirmek için \"gq\" için kullanılan ifade" + +msgid "specifies how Insert mode completion works for CTRL-N and CTRL-P" +msgstr "Ekleme kipi tamamlamasının CTRL-N ve CTRL-P için nice çalıştığını\n" +"belirler" + +msgid "whether to use a popup menu for Insert mode completion" +msgstr "Ekleme kipi tamamlaması için açılır menü kullanımı" + +msgid "options for the Insert mode completion info popup" +msgstr "Ekleme kipi tamamlama açılır penceresi için seçenekler" + +msgid "maximum height of the popup menu" +msgstr "açılır menünün en çok yüksekliği" + +msgid "minimum width of the popup menu" +msgstr "açılır menünün en çok genişliği" + +msgid "user defined function for Insert mode completion" +msgstr "Ekleme kipi tamamlaması için kullanıcı tanımlı işlev" + +msgid "function for filetype-specific Insert mode completion" +msgstr "dosya türüne özel Ekleme kipi tamamlaması için işlev" + +msgid "list of dictionary files for keyword completion" +msgstr "anahtar sözcük tamamlaması için sözlük dosyaları listesi" + +msgid "list of thesaurus files for keyword completion" +msgstr "anahtar sözcük tamamlaması için eşanlamlılar sözlüğü dosyaları\n" +"listesi" + +msgid "adjust case of a keyword completion match" +msgstr "anahtar sözcük tamamlama eşleşmesinin BÜYÜK/küçük harfini ayarla" + +msgid "enable entering digraphs with c1 <BS> c2" +msgstr "c1 <BS> c2 ile ikili harflerin girilmesini etkinleştir" + +msgid "the \"~\" command behaves like an operator" +msgstr "\"~\" komutu bir işleç gibi davranır" + +msgid "function called for the \"g@\" operator" +msgstr "\"g@\" işleci için çağrılan işlev" + +msgid "when inserting a bracket, briefly jump to its match" +msgstr "bir ayraç eklendiğinde hemen eşine atla" + +msgid "tenth of a second to show a match for 'showmatch'" +msgstr "bir 'showmatch' eşleşmesini göstermek için saniyenin onda biri" + +msgid "list of pairs that match for the \"%\" command" +msgstr "\"%\" komutu için eşleşen eşleşmelerin listesi" + +msgid "use two spaces after '.' when joining a line" +msgstr "bir satırı birleştirirken '.' sonrası iki boşluk kullan" + +msgid "" +"\"alpha\", \"octal\", \"hex\", \"bin\" and/or \"unsigned\"; number formats\n" +"recognized for CTRL-A and CTRL-X commands" +msgstr "" +"\"alpha\", \"octal\", \"hex\", \"bin\" ve/veya \"unsigned\"; CTRL-A ve\n" +"CTRL-X komutları için tanınan sayı biçimleri" + +msgid "tabs and indenting" +msgstr "sekmeler ve girintileme" + +msgid "number of spaces a <Tab> in the text stands for" +msgstr "metinde bir <Tab>'ın denk olduğu boşluk sayısı" + +msgid "number of spaces used for each step of (auto)indent" +msgstr "her bir kendiliğinden girintileme için kullanılan boşluk sayısı" + +msgid "list of number of spaces a tab counts for" +msgstr "bir sekmenin denk olduğu boşlukların sayısının listesi" + +msgid "list of number of spaces a soft tabsstop counts for" +msgstr "bir yumuşak sekmedurağının denk olduğu boşlukların sayısı listesi" + +msgid "a <Tab> in an indent inserts 'shiftwidth' spaces" +msgstr "bir girintideki <Tab>, 'shiftwidth' kadar boşluk ekler" + +msgid "if non-zero, number of spaces to insert for a <Tab>" +msgstr "eğer sıfırdan farklıysa, bir <Tab> için eklenecek boşluk sayısı" + +msgid "round to 'shiftwidth' for \"<<\" and \">>\"" +msgstr "\"<<\" ve \">>\" için 'shiftwidth'e yuvarla" + +msgid "expand <Tab> to spaces in Insert mode" +msgstr "Ekleme kipinde <Tab>'ı boşluklara genişlet" + +msgid "automatically set the indent of a new line" +msgstr "yeni bir satırın girintisini kendiliğinden ayarla" + +msgid "do clever autoindenting" +msgstr "akıllı kendiliğinden girintileme yap" + +msgid "enable specific indenting for C code" +msgstr "C kodu için özel girintilemeyi etkinleştir" + +msgid "options for C-indenting" +msgstr "C girintilemesi için seçenekler" + +msgid "keys that trigger C-indenting in Insert mode" +msgstr "Ekleme kipinde C girintilemesini tetikleyen düğmeler" + +msgid "list of words that cause more C-indent" +msgstr "daha çok C girintilemesine neden olan sözcüklerin listesi" + +msgid "expression used to obtain the indent of a line" +msgstr "bir satırın girintisini elde etmek için kullanılan ifade" + +msgid "keys that trigger indenting with 'indentexpr' in Insert mode" +msgstr "Ekleme kipinde 'indentexpr' ile girintilemeyi tetikleyen düğmeler" + +msgid "copy whitespace for indenting from previous line" +msgstr "bir önceki satırdan girintileme için boşlukları kopyala" + +msgid "preserve kind of whitespace when changing indent" +msgstr "girintilemeyi değiştirirken boşluk türünü koru" + +msgid "enable lisp mode" +msgstr "lisp kipini etkinleştir" + +msgid "words that change how lisp indenting works" +msgstr "lisp girintilemesinin nice çalıştığını değiştiren sözcükler" + +msgid "folding" +msgstr "kıvırma" + +msgid "unset to display all folds open" +msgstr "tüm kıvırmaları açık görüntülemek için ayarı kaldır" + +msgid "folds with a level higher than this number will be closed" +msgstr "bu sayıdan daha yüksek düzeyli kıvırmalar kapatılacak" + +msgid "value for 'foldlevel' when starting to edit a file" +msgstr "bir dosyayı düzenlemeye başlarkenki 'foldlevel' değeri" + +msgid "width of the column used to indicate folds" +msgstr "kıvırmaları belirtmek için kullanılan sütunun genişliği" + +msgid "expression used to display the text of a closed fold" +msgstr "kapalı bir kıvırmanın metnini görüntülemek için kullanılan ifade" + +msgid "set to \"all\" to close a fold when the cursor leaves it" +msgstr "imleç ayrıldığında kıvırmayı kapatmak için \"all\" olarak ayarlayın" + +msgid "specifies for which commands a fold will be opened" +msgstr "hangi komutlarda bir kıvırmanın açılacağını belirler" + +msgid "minimum number of screen lines for a fold to be closed" +msgstr "bir kıvırmanın kapatılması için en az ekran satırı sayısı" + +msgid "template for comments; used to put the marker in" +msgstr "yorumlar için şablon; imleyiciyi içine koymak için kullanılır" + +msgid "" +"folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" or \"diff\"" +msgstr "" +"kıvırma türü: \"manual\", \"indent\", \"expr\", \"marker\",\n" +"\"syntax\" veya \"diff\"" + +msgid "expression used when 'foldmethod' is \"expr\"" +msgstr "'foldmethod' \"expr\" olduğundan kullanılacak ifade" + +msgid "used to ignore lines when 'foldmethod' is \"indent\"" +msgstr "'foldmethod' \"indent\" olduğunda satırları yok saymada kullanılır" + +msgid "markers used when 'foldmethod' is \"marker\"" +msgstr "'foldmethod' \"marker\" olduğunda kullanılan imleyiciler" + +msgid "maximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\"" +msgstr "'foldmethod' \"indent\" veya \"syntax\" olduğunda kullanılan en çok\n" +"kıvırma derinliği" + +msgid "diff mode" +msgstr "diff kipi" + +msgid "use diff mode for the current window" +msgstr "geçerli pencere için diff kipi kullan" + +msgid "options for using diff mode" +msgstr "diff kipi kullanımı için seçenekler" + +msgid "expression used to obtain a diff file" +msgstr "bir diff dosyası elde etmek için kullanılan ifade" + +msgid "expression used to patch a file" +msgstr "bir dosyayı yamalamak için kullanılan ifade" + +msgid "mapping" +msgstr "eşlemleme" + +msgid "maximum depth of mapping" +msgstr "en çok eşlemleme derinliği" + +msgid "recognize mappings in mapped keys" +msgstr "eşlemlenmiş düğmelerdeki eşlemlemeleri tanımla" + +msgid "allow timing out halfway into a mapping" +msgstr "bir eşlemlemenin yarısında zaman aşımına izin ver" + +msgid "allow timing out halfway into a key code" +msgstr "bir düğme kodunun yarısında zaman aşımına izin ver" + +msgid "time in msec for 'timeout'" +msgstr "'timeout' için süre (milisaniye)" + +msgid "time in msec for 'ttimeout'" +msgstr "'ttimeout' için süre (milisaniye)" + +msgid "reading and writing files" +msgstr "dosyaları okuma ve yazma" + +msgid "enable using settings from modelines when reading a file" +msgstr "dosya okurken ayarları kip satırından kullanımı etkinleştir" + +msgid "allow setting expression options from a modeline" +msgstr "ifade seçeneklerini bir kip satırından ayarlamaya izin ver" + +msgid "number of lines to check for modelines" +msgstr "kip satırlarını denetlemede kullanılacak satırların sayısı" + +msgid "binary file editing" +msgstr "ikili dosya düzenleme" + +msgid "last line in the file has an end-of-line" +msgstr "dosyanın son satırında bir satırsonu var" + +msgid "fixes missing end-of-line at end of text file" +msgstr "bir metin dosyasının sonundaki eksik satırsonlarını onarır" + +msgid "prepend a Byte Order Mark to the file" +msgstr "dosyanın önüne bir Bayt Sıralama İmi ekle" + +msgid "end-of-line format: \"dos\", \"unix\" or \"mac\"" +msgstr "satırsonu biçimi: \"dos\", \"unix\" veya \"mac\"" + +msgid "list of file formats to look for when editing a file" +msgstr "bir dosyayı düzenlerken bakılacak dosya biçimler listesi" + +msgid "obsolete, use 'fileformat'" +msgstr "eskimiş, yerine 'fileformat' kullanın" + +msgid "obsolete, use 'fileformats'" +msgstr "eskimiş, yerine 'fileformats' kullanın" + +msgid "writing files is allowed" +msgstr "dosya yazımına izin verilir" + +msgid "write a backup file before overwriting a file" +msgstr "bir dosyanın üzerine yazmadan önce bir yedek dosyası yaz" + +msgid "keep a backup after overwriting a file" +msgstr "bir dosyanın üzerine yazdıktan sonra bir yedek tut" + +msgid "patterns that specify for which files a backup is not made" +msgstr "bir yedeği yapılmayan dosyaları belirleyen dizgi" + +msgid "whether to make the backup as a copy or rename the existing file" +msgstr "yedeğin kopya olarak mı yoksa ad değişikliği ile mi yapılacağı" + +msgid "list of directories to put backup files in" +msgstr "yedek dosyalarının koyulacağı dizinlerin listesi" + +msgid "file name extension for the backup file" +msgstr "yedek dosyası için dosya adı uzantısı" + +msgid "automatically write a file when leaving a modified buffer" +msgstr "değiştirilmiş arabellekten çıkarken dosyayı kendiliğinden yaz" + +msgid "as 'autowrite', but works with more commands" +msgstr "'autowrite' gibi, ancak daha çok komutla çalışır" + +msgid "always write without asking for confirmation" +msgstr "onay beklemeden her zaman yaz" + +msgid "automatically read a file when it was modified outside of Vim" +msgstr "Vim dışında değiştirildiğinde dosyayı kendiliğinden oku" + +msgid "keep oldest version of a file; specifies file name extension" +msgstr "bir dosyanın en eski sürümünü tut; dosya adı uzantısı belirler" + +msgid "forcibly sync the file to disk after writing it" +msgstr "yazımdan sonra dosyayı zorla diske eşitle" + +msgid "use 8.3 file names" +msgstr "8.3 dosya adlarını kullan" + +msgid "encryption method for file writing: zip, blowfish or blowfish2" +msgstr "dosya yazımı için şifreleme yöntemi: zip, blowfish veya blowfish2" + +msgid "the swap file" +msgstr "takas dosyası" + +msgid "list of directories for the swap file" +msgstr "takas dosyası için dizinler listesi" + +msgid "use a swap file for this buffer" +msgstr "bu arabellek için bir takas dosyası kullan" + +msgid "\"sync\", \"fsync\" or empty; how to flush a swap file to disk" +msgstr "\"sync\", \"fsync\", veya boş; bir takas dosyasının diske\n" +"nice floşlanacağı" + +msgid "number of characters typed to cause a swap file update" +msgstr "takas dosyası güncellemesi için yazılması gereken karakter sayısı" + +msgid "time in msec after which the swap file will be updated" +msgstr "takas dosyasının güncelleneceği süre dilimi (milisaniye)" + +msgid "maximum amount of memory in Kbyte used for one buffer" +msgstr "bir arabellek için kullanılacak en çok bellek miktarı (KiB)" + +msgid "maximum amount of memory in Kbyte used for all buffers" +msgstr "tüm arabellekler için kullanılacak en çok bellek miktarı (KiB)" + +msgid "command line editing" +msgstr "komut satırı düzenleme" + +msgid "how many command lines are remembered" +msgstr "kaç tane komut satırının hatırlandığı" + +msgid "key that triggers command-line expansion" +msgstr "komut satırı ifadesi tetikleyen düğme" + +msgid "like 'wildchar' but can also be used in a mapping" +msgstr "'wildchar' gibi; ancak bir eşlemleme içinde kullanılabilir" + +msgid "specifies how command line completion works" +msgstr "komut satırı tamamlamasının nasıl çalıştığını belirtir" + +msgid "empty or \"tagfile\" to list file name of matching tags" +msgstr "eşleşen etiketlerin dosya adını listelemek için boş veya \"tagfile\"" + +msgid "list of file name extensions that have a lower priority" +msgstr "düşük öncelikli dosya adı uzantılarının listesi" + +msgid "list of file name extensions added when searching for a file" +msgstr "bir dosya ararken eklenen dosya adı uzantılarının listesi" + +msgid "list of patterns to ignore files for file name completion" +msgstr "dosya adı tamamlaması için yok sayılacak dizgelerin listesi" + +msgid "ignore case when using file names" +msgstr "dosya adları kullanırken BÜYÜK/küçük harf yok say" + +msgid "ignore case when completing file names" +msgstr "dosya adları tamamlarken BÜYÜK/küçük harf yok say" + +msgid "command-line completion shows a list of matches" +msgstr "komut satırı tamamlaması, eşleşmelerin bir listesini gösterir" + +msgid "key used to open the command-line window" +msgstr "komut satırı penceresini açmak için kullanılan düğme" + +msgid "height of the command-line window" +msgstr "komut satırı penceresinin yüksekliği" + +msgid "executing external commands" +msgstr "dış komutları çalıştırma" + +msgid "name of the shell program used for external commands" +msgstr "dış komutlar için kullanılan kabuk programının adı" + +msgid "when to use the shell or directly execute a command" +msgstr "ne zaman kabuğu kullanmalı veya doğrudan bir komut çalıştırmalı" + +msgid "character(s) to enclose a shell command in" +msgstr "bir kabuk komutunu çevreleyen karakter(ler)" + +msgid "like 'shellquote' but include the redirection" +msgstr "'shellquote' gibi; ancak yeniden yönlendirmeyi içer" + +msgid "characters to escape when 'shellxquote' is (" +msgstr "'shellxquote' ( iken kaçırılacak karakterler" + +msgid "argument for 'shell' to execute a command" +msgstr "bir komut çalıştırmak için 'shell' için değişken" + +msgid "used to redirect command output to a file" +msgstr "komut çıktısını bir dosyaya yeniden yönlendirmek için kullanılır" + +msgid "use a temp file for shell commands instead of using a pipe" +msgstr "bir veri yolu kullanımı yerine kabuk komutları için geçici\n" +"bir dosya kullan" + +msgid "program used for \"=\" command" +msgstr "\"=\" komutu için kullanılan program" + +msgid "program used to format lines with \"gq\" command" +msgstr "\"gq\" komutu ile satır biçimlemek için kullanılan program" + +msgid "program used for the \"K\" command" +msgstr "\"K\" komutu için kullanılan program" + +msgid "warn when using a shell command and a buffer has changes" +msgstr "bir kabuk komutu kullanılıyorsa ve arabellekte değişiklikler\n" +"varsa uyar" + +msgid "running make and jumping to errors (quickfix)" +msgstr "make çalıştırma ve hatalara atlama (hızlı düzelt)" + +msgid "name of the file that contains error messages" +msgstr "hata iletileri içeren dosyanın adı" + +msgid "list of formats for error messages" +msgstr "hata iletileri için biçim listesi" + +msgid "program used for the \":make\" command" +msgstr "\":make\" komutu için kullanılan program" + +msgid "string used to put the output of \":make\" in the error file" +msgstr "\":make\" komutunun çıktısını hata dosyasına koymak için\n" +"kullanılan dizi" + +msgid "name of the errorfile for the 'makeprg' command" +msgstr "'makeprg' komutu için hata dosyası adı" + +msgid "program used for the \":grep\" command" +msgstr "\":grep\" komutu için kullanılan program" + +msgid "list of formats for output of 'grepprg'" +msgstr "'grepprg' çıktısı için kullanılan biçimlerin listesi" + +msgid "encoding of the \":make\" and \":grep\" output" +msgstr "\":make\" ve \":grep\" çıktılarının kodlaması" + +msgid "function to display text in the quickfix window" +msgstr "hızlı düzelt içinde metin düzenlemek için işlev" + +msgid "system specific" +msgstr "sisteme özel" + +msgid "use forward slashes in file names; for Unix-like shells" +msgstr "dosya adlarında eğik çizgi kullan; Unix tarzı kabuklar için" + +msgid "specifies slash/backslash used for completion" +msgstr "tamamlama için kullanılan eğik/ters eğik çizgiyi belirler" + +msgid "language specific" +msgstr "dile özel ayarlar" + +msgid "specifies the characters in a file name" +msgstr "bir dosya adındaki karakterleri belirtir" + +msgid "specifies the characters in an identifier" +msgstr "bir tanımlayıcıdaki karakterleri belirler" + +msgid "specifies the characters in a keyword" +msgstr "bir anahtar sözcükteki karakterleri belirler" + +msgid "specifies printable characters" +msgstr "yazdırılabilir karakterleri belirler" + +msgid "specifies escape characters in a string" +msgstr "bir dizideki kaçış karakterlerini belirler" + +msgid "display the buffer right-to-left" +msgstr "arabelleği sağdan sola görüntüle" + +msgid "when to edit the command-line right-to-left" +msgstr "komut satırının ne zaman sağdan sola düzenleneceği" + +msgid "insert characters backwards" +msgstr "karakterleri geriye doğru ekle" + +msgid "allow CTRL-_ in Insert and Command-line mode to toggle 'revins'" +msgstr "'revins' açıp kapatmak için Ekleme ve Komut Satırı kipinde\n" +"CTRL-_ izin ver" + +msgid "the ASCII code for the first letter of the Hebrew alphabet" +msgstr "İbran abecesinin ilk harfinin ASCII kodu" + +msgid "use Hebrew keyboard mapping" +msgstr "İbranca klavye eşlemlemesini kullan" + +msgid "use phonetic Hebrew keyboard mapping" +msgstr "fonetik İbranca klavye eşlemlemesini kullan" + +msgid "prepare for editing Arabic text" +msgstr "Arapça metni düzenleme için hazırlan" + +msgid "perform shaping of Arabic characters" +msgstr "Arapça karakterlerin şekillendirmesini gerçekleştir" + +msgid "terminal will perform bidi handling" +msgstr "sağdan sola yazımı uçbirim gerçekleştirecek" + +msgid "name of a keyboard mapping" +msgstr "bir klavye eşlemlemesinin adı" + +msgid "list of characters that are translated in Normal mode" +msgstr "Normal kipte çevrilen karakterlerin listesi" + +msgid "apply 'langmap' to mapped characters" +msgstr "eşlemlenen karakterlere 'langmap' uygula" + +msgid "when set never use IM; overrules following IM options" +msgstr "ayarlandığında hiçbir zaman IM kullanma; aşağıdaki IM seçeneklerini " +"geçersiz kılar" + +msgid "in Insert mode: 1: use :lmap; 2: use IM; 0: neither" +msgstr "Ekleme kipinde: 1: :lmap kullan; 2; IM kullan; 0: hiçbiri" + +msgid "input method style, 0: on-the-spot, 1: over-the-spot" +msgstr "girdi yöntemi stili, 0: on-the-spot, 1: over-the-spot" + +msgid "entering a search pattern: 1: use :lmap; 2: use IM; 0: neither" +msgstr "bir arama dizgisi gir: 1: :lmap kullan; 2: IM kullan; 0: hiçbiri" + +msgid "when set always use IM when starting to edit a command line" +msgstr "" +"ayarlandığında, bir komut satırı düzenlemeye başlarken her zaman IM kullan" + +msgid "function to obtain IME status" +msgstr "IME durumunu elde etmek için işlev" + +msgid "function to enable/disable IME" +msgstr "IME'yi etkinleştirmek/devre dışı bırakmak için işlev" + +msgid "multi-byte characters" +msgstr "çoklu bayt karakterler" + +msgid "" +"character encoding used in Vim: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\", etc." +msgstr "" +"Vim'de kullanılan karakter kodlamaları: \"latin1\", \"utf-8\",\n" +"\"euc-jp\", \"big5\" gibi" + +msgid "character encoding for the current file" +msgstr "geçerli dosya için karakter kodlaması" + +msgid "automatically detected character encodings" +msgstr "karakter kodlamasını kendiliğinden algıla" + +msgid "character encoding used by the terminal" +msgstr "uçbirim tarafından kullanılan karakter kodlaması" + +msgid "expression used for character encoding conversion" +msgstr "karakter kodlaması dönüşümü için kullanılan ifade" + +msgid "delete combining (composing) characters on their own" +msgstr "birleştiren (oluşturucu) karakterleri kendi başına kullan" + +msgid "maximum number of combining (composing) characters displayed" +msgstr "en çok görüntülenen birleştiren (oluşturucu) karakterlerin sayısı" + +msgid "key that activates the X input method" +msgstr "X girdi yöntemini etkinleştiren düğme" + +msgid "width of ambiguous width characters" +msgstr "belirsiz genişlikli karakterlerin genişliği" + +msgid "emoji characters are full width" +msgstr "emoji karakterleri tam genişliklidir" + +msgid "various" +msgstr "çeşitli" + +msgid "" +"when to use virtual editing: \"block\", \"insert\", \"all\"\n" +"and/or \"onemore\"" +msgstr "" +"ne zaman sanal düzenleme kullanmalı: \"block\", \"insert\",\n" +"\"all\" ve/veya \"onemore\"" + +msgid "list of autocommand events which are to be ignored" +msgstr "yok sayılacak otokomut olayları" + +msgid "load plugin scripts when starting up" +msgstr "başlarken eklenti betiklerini yükle" + +msgid "enable reading .vimrc/.exrc/.gvimrc in the current directory" +msgstr "geçerli dizinde .vimrc/.exrc/.gvimrc okumayı etkinleştir" + +msgid "safer working with script files in the current directory" +msgstr "geçerli dizinde betik dosyalarıyla daha güvenli çalışma" + +msgid "use the 'g' flag for \":substitute\"" +msgstr "\":substitute\" için 'g' bayrağını kullan" + +msgid "'g' and 'c' flags of \":substitute\" toggle" +msgstr "\":substitute\" açma/kapama düğmesinin 'g' ve 'c' bayrakları" + +msgid "allow reading/writing devices" +msgstr "aygıtları okumaya/yazmaya izin ver" + +msgid "maximum depth of function calls" +msgstr "işlev çağrılarının en çok derinliği" + +msgid "list of words that specifies what to put in a session file" +msgstr "bir oturum dosyasına ne koyulacağını belirleyen sözcükler listesi" + +msgid "list of words that specifies what to save for :mkview" +msgstr ":mkview için neyin kaydedileceğini belirleyen sözcükler listesi" + +msgid "directory where to store files with :mkview" +msgstr ":mkview ile dosyaların depolanacağı dizin" + +msgid "list that specifies what to write in the viminfo file" +msgstr "viminfo dosyasına nelerin yazılacağını belirleyen liste" + +msgid "file name used for the viminfo file" +msgstr "viminfo dosyası için kullanılan dosya adı" + +msgid "what happens with a buffer when it's no longer in a window" +msgstr "bir arabellek artık bir pencerede değilken ne olacağı" + +msgid "empty, \"nofile\", \"nowrite\", \"quickfix\", etc.: type of buffer" +msgstr "boş, \"nofile\", \"nowrite\", \"quickfix\" vb.: arabellek türü" + +msgid "whether the buffer shows up in the buffer list" +msgstr "arabelleğin, arabellek listesinde görünüp görünmeyeceği" + +msgid "set to \"msg\" to see all error messages" +msgstr "tüm hata iletilerini görmek için \"msg\" olarak ayarlayın" + +msgid "whether to show the signcolumn" +msgstr "işaret sütununun görünüp görünmeyeceği" + +msgid "interval in milliseconds between polls for MzScheme threads" +msgstr "MzScheme iş parçacıkları için anketler arasındaki süre (milisaniye)" + +msgid "name of the Lua dynamic library" +msgstr "Lua devingen kitaplığının adı" + +msgid "name of the Perl dynamic library" +msgstr "Perl devingen kitaplığının adı" + +msgid "whether to use Python 2 or 3" +msgstr "Python 2 veya 3 mü kullanılacağı" + +msgid "name of the Python 2 dynamic library" +msgstr "Python 2 devingen kitaplığının adı" + +msgid "name of the Python 2 home directory" +msgstr "Python 2 ev dizininin adı" + +msgid "name of the Python 3 dynamic library" +msgstr "Python 3 devingen kitaplığının adı" + +msgid "name of the Python 3 home directory" +msgstr "Python 3 ev dizininin adı" + +msgid "name of the Ruby dynamic library" +msgstr "Ruby devingen kitaplığının adı" + +msgid "name of the Tcl dynamic library" +msgstr "Tcl devingen kitaplığının adı" + +msgid "name of the MzScheme dynamic library" +msgstr "MzScheme devingen kitaplığının adı" + +msgid "name of the MzScheme GC dynamic library" +msgstr "MzScheme GC devingen kitaplığının adı" diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index 32c9750628..7d452d6797 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -421,6 +421,10 @@ void pum_redraw(void) } grid_assign_handle(&pum_grid); + + pum_grid.zindex = ((State == CMDLINE) + ? kZIndexCmdlinePopupMenu : kZIndexPopupMenu); + bool moved = ui_comp_put_grid(&pum_grid, pum_row, pum_col-col_off, pum_height, grid_width, false, true); bool invalid_grid = moved || pum_invalid; @@ -439,7 +443,7 @@ void pum_redraw(void) int row_off = pum_above ? pum_height : 0; ui_call_win_float_pos(pum_grid.handle, -1, cstr_to_string(anchor), pum_anchor_grid, pum_row-row_off, pum_col-col_off, - false); + false, pum_grid.zindex); } diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 0785fa703d..1a9bbe26f0 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -100,6 +100,7 @@ typedef struct qf_list_S { char_u *qf_title; ///< title derived from the command that created ///< the error list or set by setqflist typval_T *qf_ctx; ///< context set by setqflist/setloclist + char_u *qf_qftf; ///< 'quickfixtextfunc' setting for this list struct dir_stack_T *qf_dir_stack; char_u *qf_directory; @@ -1999,6 +2000,11 @@ static int copy_loclist(const qf_list_T *from_qfl, qf_list_T *to_qfl) } else { to_qfl->qf_ctx = NULL; } + if (from_qfl->qf_qftf != NULL) { + to_qfl->qf_qftf = vim_strsave(from_qfl->qf_qftf); + } else { + to_qfl->qf_qftf = NULL; + } if (from_qfl->qf_count) { if (copy_loclist_entries(from_qfl, to_qfl) == FAIL) { @@ -2666,7 +2672,7 @@ static void qf_goto_win_with_qfl_file(int qf_fnum) static int qf_jump_to_usable_window(int qf_fnum, bool newwin, int *opened_window) { - win_T *usable_win_ptr = NULL; + win_T *usable_wp = NULL; bool usable_win = false; // If opening a new window, then don't use the location list referred by @@ -2675,8 +2681,8 @@ static int qf_jump_to_usable_window(int qf_fnum, bool newwin, qf_info_T *ll_ref = newwin ? NULL : curwin->w_llist_ref; if (ll_ref != NULL) { // Find a non-quickfix window with this location list - usable_win_ptr = qf_find_win_with_loclist(ll_ref); - if (usable_win_ptr != NULL) { + usable_wp = qf_find_win_with_loclist(ll_ref); + if (usable_wp != NULL) { usable_win = true; } } @@ -2704,7 +2710,7 @@ static int qf_jump_to_usable_window(int qf_fnum, bool newwin, *opened_window = true; // close it when fail } else { if (curwin->w_llist_ref != NULL) { // In a location window - qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref); + qf_goto_win_with_ll_file(usable_wp, qf_fnum, ll_ref); } else { // In a quickfix window qf_goto_win_with_qfl_file(qf_fnum); } @@ -2798,7 +2804,7 @@ static void qf_jump_goto_line(linenr_T qf_lnum, int qf_col, char_u qf_viscol, // Move the cursor to the first line in the buffer pos_T save_cursor = curwin->w_cursor; curwin->w_cursor.lnum = 0; - if (!do_search(NULL, '/', qf_pattern, (long)1, SEARCH_KEEP, NULL)) { + if (!do_search(NULL, '/', '/', qf_pattern, (long)1, SEARCH_KEEP, NULL)) { curwin->w_cursor = save_cursor; } } @@ -3032,14 +3038,11 @@ theend: qfl->qf_ptr = qf_ptr; qfl->qf_index = qf_index; } - if (p_swb != old_swb && opened_window) { + if (p_swb != old_swb && p_swb == empty_option && opened_window) { // Restore old 'switchbuf' value, but not when an autocommand or // modeline has changed the value. - if (p_swb == empty_option) { - p_swb = old_swb; - swb_flags = old_swb_flags; - } else - free_string_option(old_swb); + p_swb = old_swb; + swb_flags = old_swb_flags; } } @@ -3382,6 +3385,7 @@ static void qf_free(qf_list_T *qfl) XFREE_CLEAR(qfl->qf_title); tv_free(qfl->qf_ctx); qfl->qf_ctx = NULL; + XFREE_CLEAR(qfl->qf_qftf); qfl->qf_id = 0; qfl->qf_changedtick = 0L; } @@ -3721,7 +3725,7 @@ void ex_copen(exarg_T *eap) lnum = qfl->qf_index; // Fill the buffer with the quickfix list. - qf_fill_buffer(qfl, curbuf, NULL); + qf_fill_buffer(qfl, curbuf, NULL, curwin->handle); decr_quickfix_busy(); @@ -3884,6 +3888,11 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last) buf = qf_find_buf(qi); if (buf != NULL) { linenr_T old_line_count = buf->b_ml.ml_line_count; + int qf_winid = 0; + + if (IS_LL_STACK(qi)) { + qf_winid = curwin->handle; + } if (old_last == NULL) { // set curwin/curbuf to buf and save a few things @@ -3892,7 +3901,7 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last) qf_update_win_titlevar(qi); - qf_fill_buffer(qf_get_curlist(qi), buf, old_last); + qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid); buf_inc_changedtick(buf); if (old_last == NULL) { @@ -3911,70 +3920,75 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last) } // Add an error line to the quickfix buffer. -static int qf_buf_add_line(buf_T *buf, linenr_T lnum, const qfline_T *qfp, - char_u *dirname, bool first_bufline) - FUNC_ATTR_NONNULL_ALL +static int qf_buf_add_line(qf_list_T *qfl, buf_T *buf, linenr_T lnum, + const qfline_T *qfp, char_u *dirname, + char_u *qftf_str, bool first_bufline) + FUNC_ATTR_NONNULL_ARG(1, 2, 4, 5) { int len; buf_T *errbuf; - if (qfp->qf_module != NULL) { - STRLCPY(IObuff, qfp->qf_module, IOSIZE - 1); - len = (int)STRLEN(IObuff); - } else if (qfp->qf_fnum != 0 - && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL - && errbuf->b_fname != NULL) { - if (qfp->qf_type == 1) { // :helpgrep - STRLCPY(IObuff, path_tail(errbuf->b_fname), IOSIZE - 1); - } else { - // Shorten the file name if not done already. - // For optimization, do this only for the first entry in a - // buffer. - if (first_bufline - && (errbuf->b_sfname == NULL - || path_is_absolute(errbuf->b_sfname))) { - if (*dirname == NUL) { - os_dirname(dirname, MAXPATHL); + if (qftf_str != NULL) { + STRLCPY(IObuff, qftf_str, IOSIZE); + } else { + if (qfp->qf_module != NULL) { + STRLCPY(IObuff, qfp->qf_module, IOSIZE); + len = (int)STRLEN(IObuff); + } else if (qfp->qf_fnum != 0 + && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL + && errbuf->b_fname != NULL) { + if (qfp->qf_type == 1) { // :helpgrep + STRLCPY(IObuff, path_tail(errbuf->b_fname), IOSIZE); + } else { + // Shorten the file name if not done already. + // For optimization, do this only for the first entry in a + // buffer. + if (first_bufline + && (errbuf->b_sfname == NULL + || path_is_absolute(errbuf->b_sfname))) { + if (*dirname == NUL) { + os_dirname(dirname, MAXPATHL); + } + shorten_buf_fname(errbuf, dirname, false); } - shorten_buf_fname(errbuf, dirname, false); + STRLCPY(IObuff, errbuf->b_fname, IOSIZE); } - STRLCPY(IObuff, errbuf->b_fname, IOSIZE - 1); + len = (int)STRLEN(IObuff); + } else { + len = 0; } - len = (int)STRLEN(IObuff); - } else { - len = 0; - } - if (len < IOSIZE - 1) { - IObuff[len++] = '|'; - } - if (qfp->qf_lnum > 0) { - snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%" PRId64, - (int64_t)qfp->qf_lnum); - len += (int)STRLEN(IObuff + len); + if (len < IOSIZE - 1) { + IObuff[len++] = '|'; + } + if (qfp->qf_lnum > 0) { + snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%" PRId64, + (int64_t)qfp->qf_lnum); + len += (int)STRLEN(IObuff + len); + + if (qfp->qf_col > 0) { + snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), " col %d", + qfp->qf_col); + len += (int)STRLEN(IObuff + len); + } - if (qfp->qf_col > 0) { - snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), " col %d", - qfp->qf_col); + snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%s", + (char *)qf_types(qfp->qf_type, qfp->qf_nr)); len += (int)STRLEN(IObuff + len); + } else if (qfp->qf_pattern != NULL) { + qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len); + len += (int)STRLEN(IObuff + len); + } + if (len < IOSIZE - 2) { + IObuff[len++] = '|'; + IObuff[len++] = ' '; } - snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%s", - (char *)qf_types(qfp->qf_type, qfp->qf_nr)); - len += (int)STRLEN(IObuff + len); - } else if (qfp->qf_pattern != NULL) { - qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len); - len += (int)STRLEN(IObuff + len); + // Remove newlines and leading whitespace from the text. + // For an unrecognized line keep the indent, the compiler may + // mark a word with ^^^^. + qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text, + IObuff + len, IOSIZE - len); } - if (len < IOSIZE - 2) { - IObuff[len++] = '|'; - IObuff[len++] = ' '; - } - - // Remove newlines and leading whitespace from the text. - // For an unrecognized line keep the indent, the compiler may - // mark a word with ^^^^. - qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text, - IObuff + len, IOSIZE - len); if (ml_append_buf(buf, lnum, IObuff, (colnr_T)STRLEN(IObuff) + 1, false) == FAIL) { @@ -3983,17 +3997,56 @@ static int qf_buf_add_line(buf_T *buf, linenr_T lnum, const qfline_T *qfp, return OK; } +static list_T *call_qftf_func(qf_list_T *qfl, + int qf_winid, + long start_idx, + long end_idx) +{ + char_u *qftf = p_qftf; + list_T *qftf_list = NULL; + + // If 'quickfixtextfunc' is set, then use the user-supplied function to get + // the text to display. Use the local value of 'quickfixtextfunc' if it is + // set. + if (qfl->qf_qftf != NULL) { + qftf = qfl->qf_qftf; + } + if (qftf != NULL && *qftf != NUL) { + typval_T args[1]; + + // create the dict argument + dict_T *const dict = tv_dict_alloc_lock(VAR_FIXED); + + tv_dict_add_nr(dict, S_LEN("quickfix"), IS_QF_LIST(qfl)); + tv_dict_add_nr(dict, S_LEN("winid"), qf_winid); + tv_dict_add_nr(dict, S_LEN("id"), qfl->qf_id); + tv_dict_add_nr(dict, S_LEN("start_idx"), start_idx); + tv_dict_add_nr(dict, S_LEN("end_idx"), end_idx); + dict->dv_refcount++; + args[0].v_type = VAR_DICT; + args[0].vval.v_dict = dict; + + qftf_list = call_func_retlist(qftf, 1, args); + dict->dv_refcount--; + } + + return qftf_list; +} + /// Fill current buffer with quickfix errors, replacing any previous contents. /// curbuf must be the quickfix buffer! /// If "old_last" is not NULL append the items after this one. /// When "old_last" is NULL then "buf" must equal "curbuf"! Because ml_delete() /// is used and autocommands will be triggered. -static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last) +static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, + int qf_winid) FUNC_ATTR_NONNULL_ARG(2) { linenr_T lnum; qfline_T *qfp; const bool old_KeyTyped = KeyTyped; + list_T *qftf_list = NULL; + listitem_T *qftf_li = NULL; if (old_last == NULL) { if (buf != curbuf) { @@ -4026,8 +4079,19 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last) } lnum = buf->b_ml.ml_line_count; } + + qftf_list = call_qftf_func(qfl, qf_winid, lnum + 1, (long)qfl->qf_count); + qftf_li = tv_list_first(qftf_list); + while (lnum < qfl->qf_count) { - if (qf_buf_add_line(buf, lnum, qfp, dirname, + char_u *qftf_str = NULL; + + if (qftf_li != NULL) { + // Use the text supplied by the user defined function + qftf_str = (char_u *)tv_get_string_chk(TV_LIST_ITEM_TV(qftf_li)); + } + + if (qf_buf_add_line(qfl, buf, lnum, qfp, dirname, qftf_str, prev_bufnr != qfp->qf_fnum) == FAIL) { break; } @@ -4037,6 +4101,10 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last) if (qfp == NULL) { break; } + + if (qftf_li != NULL) { + qftf_li = TV_LIST_ITEM_NEXT(qftf_list, qftf_li); + } } if (old_last == NULL) { // Delete the empty line which is now at the end @@ -5665,7 +5733,10 @@ static int get_qfline_items(qfline_T *qfp, list_T *list) /// Add each quickfix error to list "list" as a dictionary. /// If qf_idx is -1, use the current list. Otherwise, use the specified list. -int get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list) +/// If eidx is not 0, then return only the specified entry. Otherwise return +/// all the entries. +int get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, int eidx, + list_T *list) { qf_info_T *qi = qi_arg; qf_list_T *qfl; @@ -5682,6 +5753,10 @@ int get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list) } } + if (eidx < 0) { + return OK; + } + if (qf_idx == INVALID_QFIDX) { qf_idx = qi->qf_curlist; } @@ -5696,7 +5771,13 @@ int get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list) } FOR_ALL_QFL_ITEMS(qfl, qfp, i) { - get_qfline_items(qfp, list); + if (eidx > 0) { + if (eidx == i) { + return get_qfline_items(qfp, list); + } + } else if (get_qfline_items(qfp, list) == FAIL) { + return FAIL; + } } return OK; @@ -5743,7 +5824,7 @@ static int qf_get_list_from_lines(dict_T *what, dictitem_T *di, dict_T *retdict) if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat, true, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0) { - (void)get_errorlist(qi, NULL, 0, l); + (void)get_errorlist(qi, NULL, 0, 0, l); qf_free(&qi->qf_lists[0]); } xfree(qi); @@ -5934,11 +6015,13 @@ static int qf_getprop_filewinid(const win_T *wp, const qf_info_T *qi, return tv_dict_add_nr(retdict, S_LEN("filewinid"), winid); } -/// Return the quickfix list items/entries as 'items' in retdict -static int qf_getprop_items(qf_info_T *qi, int qf_idx, dict_T *retdict) +/// Return the quickfix list items/entries as 'items' in retdict. +/// If eidx is not 0, then return the item at the specified index. +static int qf_getprop_items(qf_info_T *qi, int qf_idx, int eidx, + dict_T *retdict) { list_T *l = tv_list_alloc(kListLenMayKnow); - get_errorlist(qi, NULL, qf_idx, l); + get_errorlist(qi, NULL, qf_idx, eidx, l); tv_dict_add_list(retdict, S_LEN("items"), l); return OK; @@ -5963,15 +6046,18 @@ static int qf_getprop_ctx(qf_list_T *qfl, dict_T *retdict) return status; } -/// Return the current quickfix list index as 'idx' in retdict -static int qf_getprop_idx(qf_list_T *qfl, dict_T *retdict) +/// Return the current quickfix list index as 'idx' in retdict. +/// If a specific entry index (eidx) is supplied, then use that. +static int qf_getprop_idx(qf_list_T *qfl, int eidx, dict_T *retdict) { - int curidx = qfl->qf_index; - if (qf_list_empty(qfl)) { - // For empty lists, current index is set to 0 - curidx = 0; + if (eidx == 0) { + eidx = qfl->qf_index; + if (qf_list_empty(qfl)) { + // For empty lists, current index is set to 0 + eidx = 0; + } } - return tv_dict_add_nr(retdict, S_LEN("idx"), curidx); + return tv_dict_add_nr(retdict, S_LEN("idx"), eidx); } /// Return quickfix/location list details (title) as a dictionary. @@ -5984,6 +6070,7 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) dictitem_T *di = NULL; int status = OK; int qf_idx = INVALID_QFIDX; + int eidx = 0; if ((di = tv_dict_find(what, S_LEN("lines"))) != NULL) { return qf_get_list_from_lines(what, di, retdict); @@ -6006,6 +6093,14 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) qfl = qf_get_list(qi, qf_idx); + // If an entry index is specified, use that + if ((di = tv_dict_find(what, S_LEN("idx"))) != NULL) { + if (di->di_tv.v_type != VAR_NUMBER) { + return FAIL; + } + eidx = (int)di->di_tv.vval.v_number; + } + if (flags & QF_GETLIST_TITLE) { status = qf_getprop_title(qfl, retdict); } @@ -6016,7 +6111,7 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) status = tv_dict_add_nr(retdict, S_LEN("winid"), qf_winid(qi)); } if ((status == OK) && (flags & QF_GETLIST_ITEMS)) { - status = qf_getprop_items(qi, qf_idx, retdict); + status = qf_getprop_items(qi, qf_idx, eidx, retdict); } if ((status == OK) && (flags & QF_GETLIST_CONTEXT)) { status = qf_getprop_ctx(qfl, retdict); @@ -6025,7 +6120,7 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) status = tv_dict_add_nr(retdict, S_LEN("id"), qfl->qf_id); } if ((status == OK) && (flags & QF_GETLIST_IDX)) { - status = qf_getprop_idx(qfl, retdict); + status = qf_getprop_idx(qfl, eidx, retdict); } if ((status == OK) && (flags & QF_GETLIST_SIZE)) { status = tv_dict_add_nr(retdict, S_LEN("size"), @@ -6042,6 +6137,17 @@ int qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict) return status; } +/// Set the current index in the specified quickfix list +static int qf_setprop_qftf(qf_info_T *qi, qf_list_T *qfl, + dictitem_T *di) +{ + XFREE_CLEAR(qfl->qf_qftf); + if (di->di_tv.v_type == VAR_STRING && di->di_tv.vval.v_string != NULL) { + qfl->qf_qftf = vim_strsave(di->di_tv.vval.v_string); + } + return OK; +} + /// Add a new quickfix entry to list at 'qf_idx' in the stack 'qi' from the /// items in the dict 'd'. If it is a valid error entry, then set 'valid_entry' /// to true. @@ -6407,6 +6513,9 @@ static int qf_set_properties(qf_info_T *qi, const dict_T *what, int action, if ((di = tv_dict_find(what, S_LEN("idx"))) != NULL) { retval = qf_setprop_curidx(qi, qfl, di); } + if ((di = tv_dict_find(what, S_LEN("quickfixtextfunc"))) != NULL) { + retval = qf_setprop_qftf(qi, qfl, di); + } if (newlist || retval == OK) { qf_list_changed(qfl); diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index d7693c7a6f..e0cc25421a 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -3436,7 +3436,7 @@ static long bt_regexec_multi(regmmatch_T *rmp, win_T *win, buf_T *buf, } /// Match a regexp against a string ("line" points to the string) or multiple -/// lines ("line" is NULL, use reg_getline()). +/// lines (if "line" is NULL, use reg_getline()). /// @return 0 for failure, or number of lines contained in the match. static long bt_regexec_both(char_u *line, colnr_T col, // column to start search @@ -6665,6 +6665,10 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, int len = 0; /* init for GCC */ static char_u *eval_result = NULL; + // We need to keep track of how many backslashes we escape, so that the byte + // counts for `extmark_splice` are correct. + int num_escaped = 0; + // Be paranoid... if ((source == NULL && expr == NULL) || dest == NULL) { EMSG(_(e_null)); @@ -6840,6 +6844,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, // later. Used to insert a literal CR. default: if (backslash) { + num_escaped += 1; if (copy) { *dst = '\\'; } @@ -6979,7 +6984,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest, *dst = NUL; exit: - return (int)((dst - dest) + 1); + return (int)((dst - dest) + 1 - num_escaped); } diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index b6bcee3fda..923db6422e 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -6491,7 +6491,7 @@ static long nfa_regtry(nfa_regprog_T *prog, } /// Match a regexp against a string ("line" points to the string) or multiple -/// lines ("line" is NULL, use reg_getline()). +/// lines (if "line" is NULL, use reg_getline()). /// /// @param line String in which to search or NULL /// @param startcol Column to start looking for match diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 1e20b77c5c..5151d82c1b 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -2084,6 +2084,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, colnr_T trailcol = MAXCOL; // start of trailing spaces colnr_T leadcol = 0; // start of leading spaces bool need_showbreak = false; // overlong line, skip first x chars + sign_attrs_T sattrs[SIGN_SHOW_MAX]; // attributes for signs + int num_signs; // number of signs for line int line_attr = 0; // attribute for the whole line int line_attr_lowprio = 0; // low-priority attribute for the line matchitem_T *cur; // points to the match list @@ -2099,6 +2101,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool search_attr_from_match = false; // if search_attr is from :match bool has_decor = false; // this buffer has decoration bool do_virttext = false; // draw virtual text for this line + int win_col_offset; // offsett for window columns char_u buf_fold[FOLD_TEXT_LEN + 1]; // Hold value returned by get_foldtext @@ -2375,11 +2378,14 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, wp->w_last_cursorline = wp->w_cursor.lnum; } + memset(sattrs, 0, sizeof(sattrs)); + num_signs = buf_get_signattrs(wp->w_buffer, lnum, sattrs); + // If this line has a sign with line highlighting set line_attr. // TODO(bfredl, vigoux): this should not take priority over decoration! - v = buf_getsigntype(wp->w_buffer, lnum, SIGN_LINEHL, 0, 1); - if (v != 0) { - line_attr = sign_get_attr((int)v, SIGN_LINEHL); + sign_attrs_T * sattr = sign_get_attr(SIGN_LINEHL, sattrs, 0, 1); + if (sattr != NULL) { + line_attr = sattr->sat_linehl; } // Highlight the current line in the quickfix window. @@ -2696,7 +2702,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int count = win_signcol_count(wp); if (count > 0) { get_sign_display_info( - false, wp, lnum, row, + false, wp, sattrs, row, startrow, filler_lines, filler_todo, count, &c_extra, &c_final, extra, sizeof(extra), &p_extra, &n_extra, @@ -2715,10 +2721,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, // in 'lnum', then display the sign instead of the line // number. if (*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u' - && buf_findsign_id(wp->w_buffer, lnum, (char_u *)"*") != 0) { + && num_signs > 0) { int count = win_signcol_count(wp); get_sign_display_info( - true, wp, lnum, row, + true, wp, sattrs, row, startrow, filler_lines, filler_todo, count, &c_extra, &c_final, extra, sizeof(extra), &p_extra, &n_extra, @@ -2768,11 +2774,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, n_extra = number_width(wp) + 1; char_attr = win_hl_attr(wp, HLF_N); - int num_sign = buf_getsigntype( - wp->w_buffer, lnum, SIGN_NUMHL, 0, 1); - if (num_sign != 0) { + sign_attrs_T *num_sattr = sign_get_attr(SIGN_NUMHL, sattrs, 0, 1); + if (num_sattr != NULL) { // :sign defined with "numhl" highlight. - char_attr = sign_get_attr(num_sign, SIGN_NUMHL); + char_attr = num_sattr->sat_numhl; } else if ((wp->w_p_cul || wp->w_p_rnu) && lnum == wp->w_cursor.lnum && filler_todo == 0) { @@ -2786,6 +2791,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } + if (draw_state == WL_NR && n_extra == 0) { + win_col_offset = off; + } + if (wp->w_briopt_sbr && draw_state == WL_BRI - 1 && n_extra == 0 && *p_sbr != NUL) { // draw indent after showbreak value @@ -2900,7 +2909,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, && vcol >= (long)wp->w_virtcol) || (number_only && draw_state > WL_NR)) && filler_todo <= 0) { - draw_virt_text(buf, &col, grid->Columns); + draw_virt_text(buf, win_col_offset, &col, grid->Columns); grid_put_linebuf(grid, row, 0, col, -grid->Columns, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); // Pretend we have finished updating the window. Except when @@ -3154,6 +3163,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, mb_utf8 = false; } } else { + assert(p_extra != NULL); c = *p_extra; mb_c = c; // If the UTF-8 character is more than one byte: @@ -3940,13 +3950,15 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, draw_color_col = advance_color_col(VCOL_HLC, &color_cols); VirtText virt_text = KV_INITIAL_VALUE; + bool has_aligned = false; if (err_text) { int hl_err = syn_check_group((char_u *)S_LEN("ErrorMsg")); kv_push(virt_text, ((VirtTextChunk){ .text = err_text, .hl_id = hl_err })); do_virttext = true; } else if (has_decor) { - virt_text = decor_redraw_virt_text(wp->w_buffer, &decor_state); + virt_text = decor_redraw_eol(wp->w_buffer, &decor_state, &line_attr, + &has_aligned); if (kv_size(virt_text)) { do_virttext = true; } @@ -3958,7 +3970,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, grid->Columns * (row - startrow + 1) + v && lnum != wp->w_cursor.lnum) || draw_color_col || line_attr_lowprio || line_attr - || diff_hlf != (hlf_T)0 || do_virttext)) { + || diff_hlf != (hlf_T)0 || do_virttext + || has_aligned)) { int rightmost_vcol = 0; int i; @@ -3996,7 +4009,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } int base_attr = hl_combine_attr(line_attr_lowprio, diff_attr); - if (base_attr || line_attr) { + if (base_attr || line_attr || has_aligned) { rightmost_vcol = INT_MAX; } @@ -4074,7 +4087,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, } } - draw_virt_text(buf, &col, grid->Columns); + draw_virt_text(buf, win_col_offset, &col, grid->Columns); grid_put_linebuf(grid, row, 0, col, grid->Columns, wp->w_p_rl, wp, wp->w_hl_attr_normal, false); row++; @@ -4295,7 +4308,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, && !wp->w_p_rl; // Not right-to-left. int draw_col = col - boguscols; - draw_virt_text(buf, &draw_col, grid->Columns); + draw_virt_text(buf, win_col_offset, &draw_col, grid->Columns); grid_put_linebuf(grid, row, 0, draw_col, grid->Columns, wp->w_p_rl, wp, wp->w_hl_attr_normal, wrap); if (wrap) { @@ -4372,51 +4385,62 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, return row; } -void draw_virt_text(buf_T *buf, int *end_col, int max_col) +void draw_virt_text(buf_T *buf, int col_off, int *end_col, int max_col) { DecorState *state = &decor_state; + int right_pos = max_col; for (size_t i = 0; i < kv_size(state->active); i++) { - HlRange *item = &kv_A(state->active, i); - if (item->start_row == state->row && kv_size(item->virt_text) - && item->virt_text_pos == kVTOverlay - && item->virt_col >= 0) { - VirtText vt = item->virt_text; - LineState s = LINE_STATE(""); - int virt_attr = 0; - int col = item->virt_col; - size_t virt_pos = 0; - item->virt_col = -2; // deactivate + DecorRange *item = &kv_A(state->active, i); + if (item->start_row == state->row && kv_size(item->decor.virt_text)) { + if (item->win_col == -1) { + if (item->decor.virt_text_pos == kVTRightAlign) { + right_pos -= item->decor.col; + item->win_col = right_pos; + } else if (item->decor.virt_text_pos == kVTWinCol) { + item->win_col = MAX(item->decor.col+col_off, 0); + } + } + if (item->win_col < 0) { + continue; + } + VirtText vt = item->decor.virt_text; + HlMode hl_mode = item->decor.hl_mode; + LineState s = LINE_STATE(""); + int virt_attr = 0; + int col = item->win_col; + size_t virt_pos = 0; + item->win_col = -2; // deactivate - while (col < max_col) { - if (!*s.p) { - if (virt_pos == kv_size(vt)) { - break; - } - s.p = kv_A(vt, virt_pos).text; - int hl_id = kv_A(vt, virt_pos).hl_id; - virt_attr = hl_id > 0 ? syn_id2attr(hl_id) : 0; - virt_pos++; - continue; - } - int attr; - bool through = false; - if (item->hl_mode == kHlModeCombine) { - attr = hl_combine_attr(linebuf_attr[col], virt_attr); - } else if (item->hl_mode == kHlModeBlend) { - through = (*s.p == ' '); - attr = hl_blend_attrs(linebuf_attr[col], virt_attr, &through); - } else { - attr = virt_attr; + while (col < max_col) { + if (!*s.p) { + if (virt_pos == kv_size(vt)) { + break; } - schar_T dummy[2]; - int cells = line_putchar(&s, through ? dummy : &linebuf_char[col], - max_col-col, false); + s.p = kv_A(vt, virt_pos).text; + int hl_id = kv_A(vt, virt_pos).hl_id; + virt_attr = hl_id > 0 ? syn_id2attr(hl_id) : 0; + virt_pos++; + continue; + } + int attr; + bool through = false; + if (hl_mode == kHlModeCombine) { + attr = hl_combine_attr(linebuf_attr[col], virt_attr); + } else if (hl_mode == kHlModeBlend) { + through = (*s.p == ' '); + attr = hl_blend_attrs(linebuf_attr[col], virt_attr, &through); + } else { + attr = virt_attr; + } + schar_T dummy[2]; + int cells = line_putchar(&s, through ? dummy : &linebuf_char[col], + max_col-col, false); + linebuf_attr[col++] = attr; + if (cells > 1) { linebuf_attr[col++] = attr; - if (cells > 1) { - linebuf_attr[col++] = attr; - } } - *end_col = MAX(*end_col, col); + } + *end_col = MAX(*end_col, col); } } } @@ -4450,7 +4474,7 @@ void screen_adjust_grid(ScreenGrid **grid, int *row_off, int *col_off) static void get_sign_display_info( bool nrcol, win_T *wp, - linenr_T lnum, + sign_attrs_T sattrs[], int row, int startrow, int filler_lines, @@ -4467,8 +4491,6 @@ static void get_sign_display_info( int *sign_idxp ) { - int text_sign; - // Draw cells with the sign value or blank. *c_extrap = ' '; *c_finalp = NUL; @@ -4480,10 +4502,9 @@ static void get_sign_display_info( } if (row == startrow + filler_lines && filler_todo <= 0) { - text_sign = buf_getsigntype(wp->w_buffer, lnum, SIGN_TEXT, - *sign_idxp, count); - if (text_sign != 0) { - *pp_extra = sign_get_text(text_sign); + sign_attrs_T *sattr = sign_get_attr(SIGN_TEXT, sattrs, *sign_idxp, count); + if (sattr != NULL) { + *pp_extra = sattr->sat_text; if (*pp_extra != NULL) { *c_extrap = NUL; *c_finalp = NUL; @@ -4516,7 +4537,7 @@ static void get_sign_display_info( (*pp_extra)[*n_extrap] = NUL; } } - *char_attrp = sign_get_attr(text_sign, SIGN_TEXT); + *char_attrp = sattr->sat_texthl; } } @@ -5452,32 +5473,50 @@ static void win_redr_border(win_T *wp) schar_T *chars = wp->w_float_config.border_chars; int *attrs = wp->w_float_config.border_attr; - int endrow = grid->Rows-1, endcol = grid->Columns-1; - grid_puts_line_start(grid, 0); - grid_put_schar(grid, 0, 0, chars[0], attrs[0]); - for (int i = 1; i < endcol; i++) { - grid_put_schar(grid, 0, i, chars[1], attrs[1]); - } - grid_put_schar(grid, 0, endcol, chars[2], attrs[2]); - grid_puts_line_flush(false); + int *adj = wp->w_border_adj; + int irow = wp->w_height_inner, icol = wp->w_width_inner; - for (int i = 1; i < endrow; i++) { - grid_puts_line_start(grid, i); - grid_put_schar(grid, i, 0, chars[7], attrs[7]); - grid_puts_line_flush(false); - grid_puts_line_start(grid, i); - grid_put_schar(grid, i, endcol, chars[3], attrs[3]); + if (adj[0]) { + grid_puts_line_start(grid, 0); + if (adj[3]) { + grid_put_schar(grid, 0, 0, chars[0], attrs[0]); + } + for (int i = 0; i < icol; i++) { + grid_put_schar(grid, 0, i+adj[3], chars[1], attrs[1]); + } + if (adj[1]) { + grid_put_schar(grid, 0, icol+adj[3], chars[2], attrs[2]); + } grid_puts_line_flush(false); } - grid_puts_line_start(grid, endrow); - grid_put_schar(grid, endrow, 0, chars[6], attrs[6]); - for (int i = 1; i < endcol; i++) { - grid_put_schar(grid, endrow, i, chars[5], attrs[5]); + for (int i = 0; i < irow; i++) { + if (adj[3]) { + grid_puts_line_start(grid, i+adj[0]); + grid_put_schar(grid, i+adj[0], 0, chars[7], attrs[7]); + grid_puts_line_flush(false); + } + if (adj[1]) { + int ic = (i == 0 && !adj[0] && chars[2][0]) ? 2 : 3; + grid_puts_line_start(grid, i+adj[0]); + grid_put_schar(grid, i+adj[0], icol+adj[3], chars[ic], attrs[ic]); + grid_puts_line_flush(false); + } + } + + if (adj[2]) { + grid_puts_line_start(grid, irow+adj[0]); + if (adj[3]) { + grid_put_schar(grid, irow+adj[0], 0, chars[6], attrs[6]); + } + for (int i = 0; i < icol; i++) { + int ic = (i == 0 && !adj[3] && chars[6][0]) ? 6 : 5; + grid_put_schar(grid, irow+adj[0], i+adj[3], chars[ic], attrs[ic]); + } + grid_put_schar(grid, irow+adj[0], icol+adj[3], chars[4], attrs[4]); + grid_puts_line_flush(false); } - grid_put_schar(grid, endrow, endcol, chars[4], attrs[4]); - grid_puts_line_flush(false); } // Low-level functions to manipulate invidual character cells on the @@ -6206,7 +6245,7 @@ void check_for_delay(int check_msg_scroll) && !did_wait_return && emsg_silent == 0) { ui_flush(); - os_delay(1000L, true); + os_delay(1006L, true); emsg_on_display = false; if (check_msg_scroll) { msg_scroll = false; @@ -6245,7 +6284,7 @@ void win_grid_alloc(win_T *wp) grid_alloc(grid_allocated, total_rows, total_cols, wp->w_grid_alloc.valid, false); grid_allocated->valid = true; - if (wp->w_border_adj) { + if (wp->w_floating && wp->w_float_config.border) { wp->w_redr_border = true; } was_resized = true; @@ -6265,8 +6304,8 @@ void win_grid_alloc(win_T *wp) if (want_allocation) { grid->target = grid_allocated; - grid->row_offset = wp->w_border_adj; - grid->col_offset = wp->w_border_adj; + grid->row_offset = wp->w_border_adj[0]; + grid->col_offset = wp->w_border_adj[3]; } else { grid->target = &default_grid; grid->row_offset = wp->w_winrow; @@ -7507,6 +7546,10 @@ void screen_resize(int width, int height) Rows = height; Columns = width; check_shellsize(); + int max_p_ch = Rows - min_rows() + 1; + if (!ui_has(kUIMessages) && p_ch > max_p_ch) { + p_ch = max_p_ch ? max_p_ch : 1; + } height = Rows; width = Columns; p_lines = Rows; @@ -7609,8 +7652,9 @@ void win_new_shellsize(void) static long old_Columns = 0; if (old_Rows != Rows) { - // if 'window' uses the whole screen, keep it using that */ - if (p_window == old_Rows - 1 || old_Rows == 0) { + // If 'window' uses the whole screen, keep it using that. + // Don't change it when set with "-w size" on the command line. + if (p_window == old_Rows - 1 || (old_Rows == 0 && p_window == 0)) { p_window = Rows - 1; } old_Rows = Rows; diff --git a/src/nvim/search.c b/src/nvim/search.c index 84b71d56a0..82fc0f9d8e 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -46,38 +46,36 @@ #include "nvim/window.h" #include "nvim/os/time.h" - #ifdef INCLUDE_GENERATED_DECLARATIONS # include "search.c.generated.h" #endif -/* - * This file contains various searching-related routines. These fall into - * three groups: - * 1. string searches (for /, ?, n, and N) - * 2. character searches within a single line (for f, F, t, T, etc) - * 3. "other" kinds of searches like the '%' command, and 'word' searches. - */ -/* - * String searches - * - * The string search functions are divided into two levels: - * lowest: searchit(); uses a pos_T for starting position and found match. - * Highest: do_search(); uses curwin->w_cursor; calls searchit(). - * - * The last search pattern is remembered for repeating the same search. - * This pattern is shared between the :g, :s, ? and / commands. - * This is in search_regcomp(). - * - * The actual string matching is done using a heavily modified version of - * Henry Spencer's regular expression library. See regexp.c. - */ +// This file contains various searching-related routines. These fall into +// three groups: +// 1. string searches (for /, ?, n, and N) +// 2. character searches within a single line (for f, F, t, T, etc) +// 3. "other" kinds of searches like the '%' command, and 'word' searches. +// +// +// String searches +// +// The string search functions are divided into two levels: +// lowest: searchit(); uses a pos_T for starting position and found match. +// Highest: do_search(); uses curwin->w_cursor; calls searchit(). +// +// The last search pattern is remembered for repeating the same search. +// This pattern is shared between the :g, :s, ? and / commands. +// This is in search_regcomp(). +// +// The actual string matching is done using a heavily modified version of +// Henry Spencer's regular expression library. See regexp.c. +// +// +// +// Two search patterns are remembered: One for the :substitute command and +// one for other searches. last_idx points to the one that was used the last +// time. -/* - * Two search patterns are remembered: One for the :substitute command and - * one for other searches. last_idx points to the one that was used the last - * time. - */ static struct spat spats[2] = { // Last used search pattern @@ -1002,7 +1000,7 @@ static int first_submatch(regmmatch_T *rp) /* * Highest level string search function. * Search for the 'count'th occurrence of pattern 'pat' in direction 'dirc' - * If 'dirc' is 0: use previous dir. + * If 'dirc' is 0: use previous dir. * If 'pat' is NULL or empty : use previous string. * If 'options & SEARCH_REV' : go in reverse of previous dir. * If 'options & SEARCH_ECHO': echo the search command and handle options @@ -1021,8 +1019,9 @@ static int first_submatch(regmmatch_T *rp) * Return 0 for failure, 1 for found, 2 for found and line offset added. */ int do_search( - oparg_T *oap, /* can be NULL */ - int dirc, /* '/' or '?' */ + oparg_T *oap, // can be NULL + int dirc, // '/' or '?' + int search_delim, // delimiter for search, e.g. '%' in s%regex%replacement char_u *pat, long count, int options, @@ -1041,7 +1040,6 @@ int do_search( char_u *msgbuf = NULL; size_t len; bool has_offset = false; -#define SEARCH_STAT_BUF_LEN 12 /* * A line offset is not remembered, this is vi compatible. @@ -1101,8 +1099,8 @@ int do_search( searchstr = pat; dircp = NULL; - /* use previous pattern */ - if (pat == NULL || *pat == NUL || *pat == dirc) { + // use previous pattern + if (pat == NULL || *pat == NUL || *pat == search_delim) { if (spats[RE_SEARCH].pat == NULL) { // no previous pattern searchstr = spats[RE_SUBST].pat; if (searchstr == NULL) { @@ -1122,15 +1120,15 @@ int do_search( * If there is a matching '/' or '?', toss it. */ ps = strcopy; - p = skip_regexp(pat, dirc, p_magic, &strcopy); + p = skip_regexp(pat, search_delim, p_magic, &strcopy); if (strcopy != ps) { /* made a copy of "pat" to change "\?" to "?" */ searchcmdlen += (int)(STRLEN(pat) - STRLEN(strcopy)); pat = strcopy; searchstr = strcopy; } - if (*p == dirc) { - dircp = p; /* remember where we put the NUL */ + if (*p == search_delim) { + dircp = p; // remember where we put the NUL *p++ = NUL; } spats[0].off.line = FALSE; @@ -1320,7 +1318,7 @@ int do_search( RE_LAST, sia); if (dircp != NULL) { - *dircp = dirc; // restore second '/' or '?' for normal_cmd() + *dircp = search_delim; // restore second '/' or '?' for normal_cmd() } if (!shortmess(SHM_SEARCH) @@ -1382,11 +1380,14 @@ int do_search( && c != FAIL && !shortmess(SHM_SEARCHCOUNT) && msgbuf != NULL) { - search_stat(dirc, &pos, show_top_bot_msg, msgbuf, - (count != 1 - || has_offset - || (!(fdo_flags & FDO_SEARCH) - && hasFolding(curwin->w_cursor.lnum, NULL, NULL)))); + cmdline_search_stat(dirc, &pos, &curwin->w_cursor, + show_top_bot_msg, msgbuf, + (count != 1 || has_offset + || (!(fdo_flags & FDO_SEARCH) + && hasFolding(curwin->w_cursor.lnum, NULL, + NULL))), + SEARCH_STAT_DEF_MAX_COUNT, + SEARCH_STAT_DEF_TIMEOUT); } // The search command can be followed by a ';' to do another search. @@ -1400,6 +1401,7 @@ int do_search( } dirc = *++pat; + search_delim = dirc; if (dirc != '?' && dirc != '/') { retval = 0; EMSG(_("E386: Expected '?' or '/' after ';'")); @@ -1713,10 +1715,10 @@ static void find_mps_values(int *initc, int *findc, bool *backwards, * '#' look for preprocessor directives * 'R' look for raw string start: R"delim(text)delim" (only backwards) * - * flags: FM_BACKWARD search backwards (when initc is '/', '*' or '#') - * FM_FORWARD search forwards (when initc is '/', '*' or '#') - * FM_BLOCKSTOP stop at start/end of block ({ or } in column 0) - * FM_SKIPCOMM skip comments (not implemented yet!) + * flags: FM_BACKWARD search backwards (when initc is '/', '*' or '#') + * FM_FORWARD search forwards (when initc is '/', '*' or '#') + * FM_BLOCKSTOP stop at start/end of block ({ or } in column 0) + * FM_SKIPCOMM skip comments (not implemented yet!) * * "oap" is only used to set oap->motion_type for a linewise motion, it can be * NULL @@ -2326,6 +2328,9 @@ showmatch( return; } } + if (*p == NUL) { + return; + } if ((lpos = findmatch(NULL, NUL)) == NULL) { // no match, so beep vim_beep(BO_MATCH); @@ -2368,10 +2373,11 @@ showmatch( * brief pause, unless 'm' is present in 'cpo' and a character is * available. */ - if (vim_strchr(p_cpo, CPO_SHOWMATCH) != NULL) - os_delay(p_mat * 100L, true); - else if (!char_avail()) - os_delay(p_mat * 100L, false); + if (vim_strchr(p_cpo, CPO_SHOWMATCH) != NULL) { + os_delay(p_mat * 100L + 8, true); + } else if (!char_avail()) { + os_delay(p_mat * 100L + 9, false); + } curwin->w_cursor = save_cursor; // restore cursor position *so = save_so; *siso = save_siso; @@ -2997,7 +3003,7 @@ current_word( /* * If the start is on white space, and white space should be included - * (" word"), or start is not on white space, and white space should + * (" word"), or start is not on white space, and white space should * not be included ("word"), find end of word. */ if ((cls() == 0) == include) { @@ -3006,8 +3012,8 @@ current_word( } else { /* * If the start is not on white space, and white space should be - * included ("word "), or start is on white space and white - * space should not be included (" "), find start of word. + * included ("word "), or start is on white space and white + * space should not be included (" "), find start of word. * If we end up in the first column of the next line (single char * word) back up to end of the line. */ @@ -4341,121 +4347,287 @@ int linewhite(linenr_T lnum) } // Add the search count "[3/19]" to "msgbuf". -// When "recompute" is true Always recompute the numbers. -static void search_stat(int dirc, pos_T *pos, - bool show_top_bot_msg, char_u *msgbuf, bool recompute) +// See update_search_stat() for other arguments. +static void cmdline_search_stat(int dirc, pos_T *pos, pos_T *cursor_pos, + bool show_top_bot_msg, char_u *msgbuf, + bool recompute, int maxcount, long timeout) +{ + searchstat_T stat; + + update_search_stat(dirc, pos, cursor_pos, &stat, recompute, maxcount, + timeout); + if (stat.cur > 0) { + char t[SEARCH_STAT_BUF_LEN]; + + if (curwin->w_p_rl && *curwin->w_p_rlc == 's') { + if (stat.incomplete == 1) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[?/??]"); + } else if (stat.cnt > maxcount && stat.cur > maxcount) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>%d/>%d]", + maxcount, maxcount); + } else if (stat.cnt > maxcount) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>%d/%d]", + maxcount, stat.cur); + } else { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/%d]", + stat.cnt, stat.cur); + } + } else { + if (stat.incomplete == 1) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[?/??]"); + } else if (stat.cnt > maxcount && stat.cur > maxcount) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>%d/>%d]", + maxcount, maxcount); + } else if (stat.cnt > maxcount) { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/>%d]", + stat.cur, maxcount); + } else { + vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/%d]", + stat.cur, stat.cnt); + } + } + + size_t len = strlen(t); + if (show_top_bot_msg && len + 2 < SEARCH_STAT_BUF_LEN) { + memmove(t + 2, t, len); + t[0] = 'W'; + t[1] = ' '; + len += 2; + } + + memmove(msgbuf + STRLEN(msgbuf) - len, t, len); + if (dirc == '?' && stat.cur == maxcount + 1) { + stat.cur = -1; + } + + // keep the message even after redraw, but don't put in history + msg_hist_off = true; + msg_ext_set_kind("search_count"); + give_warning(msgbuf, false); + msg_hist_off = false; + } +} + +// Add the search count information to "stat". +// "stat" must not be NULL. +// When "recompute" is true always recompute the numbers. +// dirc == 0: don't find the next/previous match (only set the result to "stat") +// dirc == '/': find the next match +// dirc == '?': find the previous match +static void update_search_stat(int dirc, pos_T *pos, pos_T *cursor_pos, + searchstat_T *stat, bool recompute, int maxcount, + long timeout) { - int save_ws = p_ws; - int wraparound = false; - pos_T p = (*pos); - static pos_T lastpos = { 0, 0, 0 }; + int save_ws = p_ws; + bool wraparound = false; + pos_T p = (*pos); + static pos_T lastpos = { 0, 0, 0 }; static int cur = 0; static int cnt = 0; + static bool exact_match = false; + static int incomplete = 0; + static int last_maxcount = SEARCH_STAT_DEF_MAX_COUNT; static int chgtick = 0; static char_u *lastpat = NULL; static buf_T *lbuf = NULL; - proftime_T start; -#define OUT_OF_TIME 999 + proftime_T start; + + memset(stat, 0, sizeof(searchstat_T)); + if (dirc == 0 && !recompute && !EMPTY_POS(lastpos)) { + stat->cur = cur; + stat->cnt = cnt; + stat->exact_match = exact_match; + stat->incomplete = incomplete; + stat->last_maxcount = last_maxcount; + return; + } + last_maxcount = maxcount; wraparound = ((dirc == '?' && lt(lastpos, p)) || (dirc == '/' && lt(p, lastpos))); // If anything relevant changed the count has to be recomputed. // STRNICMP ignores case, but we should not ignore case. // Unfortunately, there is no STRNICMP function. + // XXX: above comment should be "no MB_STRCMP function" ? if (!(chgtick == buf_get_changedtick(curbuf) && lastpat != NULL // supress clang/NULL passed as nonnull parameter && STRNICMP(lastpat, spats[last_idx].pat, STRLEN(lastpat)) == 0 && STRLEN(lastpat) == STRLEN(spats[last_idx].pat) - && equalpos(lastpos, curwin->w_cursor) + && equalpos(lastpos, *cursor_pos) && lbuf == curbuf) - || wraparound || cur < 0 || cur > 99 || recompute) { + || wraparound || cur < 0 || (maxcount > 0 && cur > maxcount) + || recompute) { cur = 0; cnt = 0; + exact_match = false; + incomplete = 0; clearpos(&lastpos); lbuf = curbuf; } - if (equalpos(lastpos, curwin->w_cursor) && !wraparound - && (dirc == '/' ? cur < cnt : cur > 0)) { - cur += dirc == '/' ? 1 : -1; + if (equalpos(lastpos, *cursor_pos) && !wraparound + && (dirc == 0 || dirc == '/' ? cur < cnt : cur > 0)) { + cur += dirc == 0 ? 0 : dirc == '/' ? 1 : -1; } else { + bool done_search = false; + pos_T endpos = { 0, 0, 0 }; p_ws = false; - start = profile_setlimit(20L); - while (!got_int && searchit(curwin, curbuf, &lastpos, NULL, + if (timeout > 0) { + start = profile_setlimit(timeout); + } + while (!got_int && searchit(curwin, curbuf, &lastpos, &endpos, FORWARD, NULL, 1, SEARCH_KEEP, RE_LAST, NULL) != FAIL) { + done_search = true; // Stop after passing the time limit. - if (profile_passed_limit(start)) { - cnt = OUT_OF_TIME; - cur = OUT_OF_TIME; + if (timeout > 0 && profile_passed_limit(start)) { + incomplete = 1; break; } cnt++; if (ltoreq(lastpos, p)) { - cur++; + cur = cnt; + if (lt(p, endpos)) { + exact_match = true; + } } fast_breakcheck(); - if (cnt > 99) { + if (maxcount > 0 && cnt > maxcount) { + incomplete = 2; // max count exceeded break; } } if (got_int) { cur = -1; // abort } + if (done_search) { + xfree(lastpat); + lastpat = vim_strsave(spats[last_idx].pat); + chgtick = buf_get_changedtick(curbuf); + lbuf = curbuf; + lastpos = p; + } } - if (cur > 0) { - char t[SEARCH_STAT_BUF_LEN] = ""; - int len; + stat->cur = cur; + stat->cnt = cnt; + stat->exact_match = exact_match; + stat->incomplete = incomplete; + stat->last_maxcount = last_maxcount; + p_ws = save_ws; +} - if (curwin->w_p_rl && *curwin->w_p_rlc == 's') { - if (cur == OUT_OF_TIME) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[?\?/?]"); - } else if (cnt > 99 && cur > 99) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>99/>99]"); - } else if (cnt > 99) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>99/%d]", cur); - } else { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/%d]", cnt, cur); +// "searchcount()" function +void f_searchcount(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + pos_T pos = curwin->w_cursor; + char_u *pattern = NULL; + int maxcount = SEARCH_STAT_DEF_MAX_COUNT; + long timeout = SEARCH_STAT_DEF_TIMEOUT; + bool recompute = true; + searchstat_T stat; + + tv_dict_alloc_ret(rettv); + + if (shortmess(SHM_SEARCHCOUNT)) { // 'shortmess' contains 'S' flag + recompute = true; + } + + if (argvars[0].v_type != VAR_UNKNOWN) { + dict_T *dict; + dictitem_T *di; + listitem_T *li; + bool error = false; + + if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL) { + EMSG(_(e_dictreq)); + return; + } + dict = argvars[0].vval.v_dict; + di = tv_dict_find(dict, (const char *)"timeout", -1); + if (di != NULL) { + timeout = (long)tv_get_number_chk(&di->di_tv, &error); + if (error) { + return; } - } else { - if (cur == OUT_OF_TIME) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[?/??]"); - } else if (cnt > 99 && cur > 99) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[>99/>99]"); - } else if (cnt > 99) { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/>99]", cur); - } else { - vim_snprintf(t, SEARCH_STAT_BUF_LEN, "[%d/%d]", cur, cnt); + } + di = tv_dict_find(dict, (const char *)"maxcount", -1); + if (di != NULL) { + maxcount = (int)tv_get_number_chk(&di->di_tv, &error); + if (error) { + return; } } - - len = STRLEN(t); - if (show_top_bot_msg && len + 2 < SEARCH_STAT_BUF_LEN) { - memmove(t + 2, t, len); - t[0] = 'W'; - t[1] = ' '; - len += 2; + di = tv_dict_find(dict, (const char *)"recompute", -1); + if (di != NULL) { + recompute = tv_get_number_chk(&di->di_tv, &error); + if (error) { + return; + } } + di = tv_dict_find(dict, (const char *)"pattern", -1); + if (di != NULL) { + pattern = (char_u *)tv_get_string_chk(&di->di_tv); + if (pattern == NULL) { + return; + } + } + di = tv_dict_find(dict, (const char *)"pos", -1); + if (di != NULL) { + if (di->di_tv.v_type != VAR_LIST) { + EMSG2(_(e_invarg2), "pos"); + return; + } + if (tv_list_len(di->di_tv.vval.v_list) != 3) { + EMSG2(_(e_invarg2), "List format should be [lnum, col, off]"); + return; + } + li = tv_list_find(di->di_tv.vval.v_list, 0L); + if (li != NULL) { + pos.lnum = tv_get_number_chk(TV_LIST_ITEM_TV(li), &error); + if (error) { + return; + } + } + li = tv_list_find(di->di_tv.vval.v_list, 1L); + if (li != NULL) { + pos.col = tv_get_number_chk(TV_LIST_ITEM_TV(li), &error) - 1; + if (error) { + return; + } + } + li = tv_list_find(di->di_tv.vval.v_list, 2L); + if (li != NULL) { + pos.coladd = tv_get_number_chk(TV_LIST_ITEM_TV(li), &error); + if (error) { + return; + } + } + } + } - memmove(msgbuf + STRLEN(msgbuf) - len, t, len); - if (dirc == '?' && cur == 100) { - cur = -1; + save_last_search_pattern(); + if (pattern != NULL) { + if (*pattern == NUL) { + goto the_end; } + xfree(spats[last_idx].pat); + spats[last_idx].pat = vim_strsave(pattern); + } + if (spats[last_idx].pat == NULL || *spats[last_idx].pat == NUL) { + goto the_end; // the previous pattern was never defined + } - xfree(lastpat); - lastpat = vim_strsave(spats[last_idx].pat); - chgtick = buf_get_changedtick(curbuf); - lbuf = curbuf; - lastpos = p; + update_search_stat(0, &pos, &pos, &stat, recompute, maxcount, timeout); - // keep the message even after redraw, but don't put in history - msg_hist_off = true; - msg_ext_set_kind("search_count"); - give_warning(msgbuf, false); - msg_hist_off = false; - } - p_ws = save_ws; + tv_dict_add_nr(rettv->vval.v_dict, S_LEN("current"), stat.cur); + tv_dict_add_nr(rettv->vval.v_dict, S_LEN("total"), stat.cnt); + tv_dict_add_nr(rettv->vval.v_dict, S_LEN("exact_match"), stat.exact_match); + tv_dict_add_nr(rettv->vval.v_dict, S_LEN("incomplete"), stat.incomplete); + tv_dict_add_nr(rettv->vval.v_dict, S_LEN("maxcount"), stat.last_maxcount); + +the_end: + restore_last_search_pattern(); } /* diff --git a/src/nvim/search.h b/src/nvim/search.h index 0366aee8a1..98ddaa5eeb 100644 --- a/src/nvim/search.h +++ b/src/nvim/search.h @@ -6,6 +6,7 @@ #include "nvim/vim.h" #include "nvim/buffer_defs.h" +#include "nvim/eval/funcs.h" #include "nvim/eval/typval.h" #include "nvim/normal.h" #include "nvim/os/time.h" @@ -49,6 +50,11 @@ #define RE_BOTH 2 /* save pat in both patterns */ #define RE_LAST 2 /* use last used pattern if "pat" is NULL */ +// Values for searchcount() +#define SEARCH_STAT_DEF_TIMEOUT 40L +#define SEARCH_STAT_DEF_MAX_COUNT 99 +#define SEARCH_STAT_BUF_LEN 12 + /// Structure containing offset definition for the last search pattern /// /// @note Only offset for the last search pattern is used, not for the last @@ -78,6 +84,16 @@ typedef struct { int sa_wrapped; ///< search wrapped around } searchit_arg_T; +typedef struct searchstat +{ + int cur; // current position of found words + int cnt; // total count of found words + int exact_match; // TRUE if matched exactly on specified position + int incomplete; // 0: search was fully completed + // 1: recomputing was timed out + // 2: max count exceeded + int last_maxcount; // the max count of the last search +} searchstat_T; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "search.h.generated.h" diff --git a/src/nvim/sign.c b/src/nvim/sign.c index fc9f53c192..97e64c6c4c 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -18,6 +18,7 @@ #include "nvim/move.h" #include "nvim/screen.h" #include "nvim/syntax.h" +#include "nvim/option.h" /// Struct to hold the sign properties. typedef struct sign sign_T; @@ -83,13 +84,13 @@ static signgroup_T * sign_group_ref(const char_u *groupname) group = xmalloc((unsigned)(sizeof(signgroup_T) + STRLEN(groupname))); STRCPY(group->sg_name, groupname); - group->refcount = 1; - group->next_sign_id = 1; + group->sg_refcount = 1; + group->sg_next_sign_id = 1; hash_add_item(&sg_table, hi, group->sg_name, hash); } else { // existing group group = HI2SG(hi); - group->refcount++; + group->sg_refcount++; } return group; @@ -105,8 +106,8 @@ static void sign_group_unref(char_u *groupname) hi = hash_find(&sg_table, groupname); if (!HASHITEM_EMPTY(hi)) { group = HI2SG(hi); - group->refcount--; - if (group->refcount == 0) { + group->sg_refcount--; + if (group->sg_refcount == 0) { // All the signs in this group are removed hash_remove(&sg_table, hi); xfree(group); @@ -117,12 +118,12 @@ static void sign_group_unref(char_u *groupname) /// Returns TRUE if 'sign' is in 'group'. /// A sign can either be in the global group (sign->group == NULL) /// or in a named group. If 'group' is '*', then the sign is part of the group. -int sign_in_group(signlist_T *sign, const char_u *group) +int sign_in_group(sign_entry_T *sign, const char_u *group) { return ((group != NULL && STRCMP(group, "*") == 0) - || (group == NULL && sign->group == NULL) - || (group != NULL && sign->group != NULL - && STRCMP(group, sign->group->sg_name) == 0)); + || (group == NULL && sign->se_group == NULL) + || (group != NULL && sign->se_group != NULL + && STRCMP(group, sign->se_group->sg_name) == 0)); } /// Get the next free sign identifier in the specified group @@ -130,7 +131,7 @@ int sign_group_get_next_signid(buf_T *buf, const char_u *groupname) { int id = 1; signgroup_T *group = NULL; - signlist_T *sign; + sign_entry_T *sign; hashitem_T *hi; int found = false; @@ -147,13 +148,13 @@ int sign_group_get_next_signid(buf_T *buf, const char_u *groupname) if (group == NULL) { id = next_sign_id++; // global group } else { - id = group->next_sign_id++; + id = group->sg_next_sign_id++; } // Check whether this sign is already placed in the buffer found = true; FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (id == sign->id && sign_in_group(sign, groupname)) { + if (id == sign->se_id && sign_in_group(sign, groupname)) { found = false; // sign identifier is in use break; } @@ -167,8 +168,8 @@ int sign_group_get_next_signid(buf_T *buf, const char_u *groupname) /// 'next' signs. static void insert_sign( buf_T *buf, // buffer to store sign in - signlist_T *prev, // previous sign entry - signlist_T *next, // next sign entry + sign_entry_T *prev, // previous sign entry + sign_entry_T *next, // next sign entry int id, // sign ID const char_u *group, // sign group; NULL for global group int prio, // sign priority @@ -177,21 +178,21 @@ static void insert_sign( bool has_text_or_icon // sign has text or icon ) { - signlist_T *newsign = xmalloc(sizeof(signlist_T)); - newsign->id = id; - newsign->lnum = lnum; - newsign->typenr = typenr; - newsign->has_text_or_icon = has_text_or_icon; + sign_entry_T *newsign = xmalloc(sizeof(sign_entry_T)); + newsign->se_id = id; + newsign->se_lnum = lnum; + newsign->se_typenr = typenr; + newsign->se_has_text_or_icon = has_text_or_icon; if (group != NULL) { - newsign->group = sign_group_ref(group); + newsign->se_group = sign_group_ref(group); } else { - newsign->group = NULL; + newsign->se_group = NULL; } - newsign->priority = prio; - newsign->next = next; - newsign->prev = prev; + newsign->se_priority = prio; + newsign->se_next = next; + newsign->se_prev = prev; if (next != NULL) { - next->prev = newsign; + next->se_prev = newsign; } buf->b_signcols_max = -1; @@ -206,14 +207,14 @@ static void insert_sign( // first sign in signlist buf->b_signlist = newsign; } else { - prev->next = newsign; + prev->se_next = newsign; } } /// Insert a new sign sorted by line number and sign priority. static void insert_sign_by_lnum_prio( buf_T *buf, // buffer to store sign in - signlist_T *prev, // previous sign entry + sign_entry_T *prev, // previous sign entry int id, // sign ID const char_u *group, // sign group; NULL for global group int prio, // sign priority @@ -222,19 +223,19 @@ static void insert_sign_by_lnum_prio( bool has_text_or_icon // sign has text or icon ) { - signlist_T *sign; + sign_entry_T *sign; // keep signs sorted by lnum, priority and id: insert new sign at // the proper position in the list for this lnum. - while (prev != NULL && prev->lnum == lnum - && (prev->priority < prio - || (prev->priority == prio && prev->id <= id))) { - prev = prev->prev; + while (prev != NULL && prev->se_lnum == lnum + && (prev->se_priority < prio + || (prev->se_priority == prio && prev->se_id <= id))) { + prev = prev->se_prev; } if (prev == NULL) { sign = buf->b_signlist; } else { - sign = prev->next; + sign = prev->se_next; } insert_sign(buf, prev, sign, id, group, prio, lnum, typenr, has_text_or_icon); @@ -254,16 +255,16 @@ char_u * sign_typenr2name(int typenr) } /// Return information about a sign in a Dict -dict_T * sign_get_info(signlist_T *sign) +dict_T * sign_get_info(sign_entry_T *sign) { dict_T *d = tv_dict_alloc(); - tv_dict_add_nr(d, S_LEN("id"), sign->id); - tv_dict_add_str(d, S_LEN("group"), ((sign->group == NULL) + tv_dict_add_nr(d, S_LEN("id"), sign->se_id); + tv_dict_add_str(d, S_LEN("group"), ((sign->se_group == NULL) ? (char *)"" - : (char *)sign->group->sg_name)); - tv_dict_add_nr(d, S_LEN("lnum"), sign->lnum); - tv_dict_add_str(d, S_LEN("name"), (char *)sign_typenr2name(sign->typenr)); - tv_dict_add_nr(d, S_LEN("priority"), sign->priority); + : (char *)sign->se_group->sg_name)); + tv_dict_add_nr(d, S_LEN("lnum"), sign->se_lnum); + tv_dict_add_str(d, S_LEN("name"), (char *)sign_typenr2name(sign->se_typenr)); + tv_dict_add_nr(d, S_LEN("priority"), sign->se_priority); return d; } @@ -271,17 +272,17 @@ dict_T * sign_get_info(signlist_T *sign) // Sort the signs placed on the same line as "sign" by priority. Invoked after // changing the priority of an already placed sign. Assumes the signs in the // buffer are sorted by line number and priority. -static void sign_sort_by_prio_on_line(buf_T *buf, signlist_T *sign) +static void sign_sort_by_prio_on_line(buf_T *buf, sign_entry_T *sign) FUNC_ATTR_NONNULL_ALL { // If there is only one sign in the buffer or only one sign on the line or // the sign is already sorted by priority, then return. - if ((sign->prev == NULL - || sign->prev->lnum != sign->lnum - || sign->prev->priority > sign->priority) - && (sign->next == NULL - || sign->next->lnum != sign->lnum - || sign->next->priority < sign->priority)) { + if ((sign->se_prev == NULL + || sign->se_prev->se_lnum != sign->se_lnum + || sign->se_prev->se_priority > sign->se_priority) + && (sign->se_next == NULL + || sign->se_next->se_lnum != sign->se_lnum + || sign->se_next->se_priority < sign->se_priority)) { return; } @@ -289,55 +290,55 @@ static void sign_sort_by_prio_on_line(buf_T *buf, signlist_T *sign) // Find a sign after which 'sign' should be inserted // First search backward for a sign with higher priority on the same line - signlist_T *p = sign; - while (p->prev != NULL - && p->prev->lnum == sign->lnum - && p->prev->priority <= sign->priority) { - p = p->prev; + sign_entry_T *p = sign; + while (p->se_prev != NULL + && p->se_prev->se_lnum == sign->se_lnum + && p->se_prev->se_priority <= sign->se_priority) { + p = p->se_prev; } if (p == sign) { // Sign not found. Search forward for a sign with priority just before // 'sign'. - p = sign->next; - while (p->next != NULL - && p->next->lnum == sign->lnum - && p->next->priority > sign->priority) { - p = p->next; + p = sign->se_next; + while (p->se_next != NULL + && p->se_next->se_lnum == sign->se_lnum + && p->se_next->se_priority > sign->se_priority) { + p = p->se_next; } } // Remove 'sign' from the list if (buf->b_signlist == sign) { - buf->b_signlist = sign->next; + buf->b_signlist = sign->se_next; } - if (sign->prev != NULL) { - sign->prev->next = sign->next; + if (sign->se_prev != NULL) { + sign->se_prev->se_next = sign->se_next; } - if (sign->next != NULL) { - sign->next->prev = sign->prev; + if (sign->se_next != NULL) { + sign->se_next->se_prev = sign->se_prev; } - sign->prev = NULL; - sign->next = NULL; + sign->se_prev = NULL; + sign->se_next = NULL; // Re-insert 'sign' at the right place - if (p->priority <= sign->priority) { + if (p->se_priority <= sign->se_priority) { // 'sign' has a higher priority and should be inserted before 'p' - sign->prev = p->prev; - sign->next = p; - p->prev = sign; - if (sign->prev != NULL) { - sign->prev->next = sign; + sign->se_prev = p->se_prev; + sign->se_next = p; + p->se_prev = sign; + if (sign->se_prev != NULL) { + sign->se_prev->se_next = sign; } if (buf->b_signlist == p) { buf->b_signlist = sign; } } else { // 'sign' has a lower priority and should be inserted after 'p' - sign->prev = p; - sign->next = p->next; - p->next = sign; - if (sign->next != NULL) { - sign->next->prev = sign; + sign->se_prev = p; + sign->se_next = p->se_next; + p->se_next = sign; + if (sign->se_next != NULL) { + sign->se_next->se_prev = sign; } } } @@ -354,19 +355,19 @@ void buf_addsign( bool has_text_or_icon // sign has text or icon ) { - signlist_T *sign; // a sign in the signlist - signlist_T *prev; // the previous sign + sign_entry_T *sign; // a sign in the signlist + sign_entry_T *prev; // the previous sign prev = NULL; FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (lnum == sign->lnum && id == sign->id + if (lnum == sign->se_lnum && id == sign->se_id && sign_in_group(sign, groupname)) { // Update an existing sign - sign->typenr = typenr; - sign->priority = prio; + sign->se_typenr = typenr; + sign->se_priority = prio; sign_sort_by_prio_on_line(buf, sign); return; - } else if (lnum < sign->lnum) { + } else if (lnum < sign->se_lnum) { insert_sign_by_lnum_prio( buf, prev, @@ -398,69 +399,119 @@ linenr_T buf_change_sign_type( buf_T *buf, // buffer to store sign in int markId, // sign ID const char_u *group, // sign group - int typenr // typenr of sign we are adding + int typenr, // typenr of sign we are adding + int prio // sign priority ) { - signlist_T *sign; // a sign in the signlist + sign_entry_T *sign; // a sign in the signlist FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (sign->id == markId && sign_in_group(sign, group)) { - sign->typenr = typenr; - return sign->lnum; + if (sign->se_id == markId && sign_in_group(sign, group)) { + sign->se_typenr = typenr; + sign->se_priority = prio; + sign_sort_by_prio_on_line(buf, sign); + return sign->se_lnum; } } return (linenr_T)0; } -/// Gets a sign from a given line. -/// -/// Return the type number of the sign at line number 'lnum' in buffer 'buf' -/// which has the attribute specified by 'type'. Returns 0 if a sign is not -/// found at the line number or it doesn't have the specified attribute. -/// @param buf Buffer in which to search -/// @param lnum Line in which to search +/// Return the sign attrs which has the attribute specified by 'type'. Returns +/// NULL if a sign is not found with the specified attribute. /// @param type Type of sign to look for +/// @param sattrs Sign attrs to search through /// @param idx if there multiple signs, this index will pick the n-th -// out of the most `max_signs` sorted ascending by Id. +/// out of the most `max_signs` sorted ascending by Id. /// @param max_signs the number of signs, with priority for the ones -// with the highest Ids. -/// @return Identifier of the matching sign, or 0 -int buf_getsigntype(buf_T *buf, linenr_T lnum, SignType type, - int idx, int max_signs) +/// with the highest Ids. +/// @return Attrs of the matching sign, or NULL +sign_attrs_T * sign_get_attr(SignType type, sign_attrs_T sattrs[], + int idx, int max_signs) { - signlist_T *sign; // a sign in a b_signlist - signlist_T *matches[9]; + sign_attrs_T *matches[SIGN_SHOW_MAX]; int nr_matches = 0; - FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (sign->lnum == lnum - && (type == SIGN_ANY - || (type == SIGN_TEXT - && sign_get_text(sign->typenr) != NULL) - || (type == SIGN_LINEHL - && sign_get_attr(sign->typenr, SIGN_LINEHL) != 0) - || (type == SIGN_NUMHL - && sign_get_attr(sign->typenr, SIGN_NUMHL) != 0))) { - matches[nr_matches] = sign; + for (int i = 0; i < SIGN_SHOW_MAX; i++) { + if ( (type == SIGN_TEXT && sattrs[i].sat_text != NULL) + || (type == SIGN_LINEHL && sattrs[i].sat_linehl != 0) + || (type == SIGN_NUMHL && sattrs[i].sat_numhl != 0)) { + matches[nr_matches] = &sattrs[i]; nr_matches++; - // signlist is sorted with most important (priority, id), thus we + // attr list is sorted with most important (priority, id), thus we // may stop as soon as we have max_signs matches - if (nr_matches == ARRAY_SIZE(matches) || nr_matches >= max_signs) { + if (nr_matches >= max_signs) { break; } } } - if (nr_matches > 0) { - if (idx >= nr_matches) { - return 0; - } + if (nr_matches > idx) { + return matches[nr_matches - idx - 1]; + } + + return NULL; +} + +/// Lookup a sign by typenr. Returns NULL if sign is not found. +static sign_T * find_sign_by_typenr(int typenr) +{ + sign_T *sp; - return matches[nr_matches - idx -1]->typenr; + for (sp = first_sign; sp != NULL; sp = sp->sn_next) { + if (sp->sn_typenr == typenr) { + return sp; + } } + return NULL; +} - return 0; +/// Return the attributes of all the signs placed on line 'lnum' in buffer +/// 'buf'. Used when refreshing the screen. Returns the number of signs. +/// @param buf Buffer in which to search +/// @param lnum Line in which to search +/// @param sattrs Output array for attrs +/// @return Number of signs of which attrs were found +int buf_get_signattrs(buf_T *buf, linenr_T lnum, sign_attrs_T sattrs[]) +{ + sign_entry_T *sign; + sign_T *sp; + + int nr_matches = 0; + + FOR_ALL_SIGNS_IN_BUF(buf, sign) { + if (sign->se_lnum > lnum) { + // Signs are sorted by line number in the buffer. No need to check + // for signs after the specified line number 'lnum'. + break; + } + + if (sign->se_lnum == lnum) { + sign_attrs_T sattr; + memset(&sattr, 0, sizeof(sattr)); + sattr.sat_typenr = sign->se_typenr; + sp = find_sign_by_typenr(sign->se_typenr); + if (sp != NULL) { + sattr.sat_text = sp->sn_text; + if (sattr.sat_text != NULL && sp->sn_text_hl != 0) { + sattr.sat_texthl = syn_id2attr(sp->sn_text_hl); + } + if (sp->sn_line_hl != 0) { + sattr.sat_linehl = syn_id2attr(sp->sn_line_hl); + } + if (sp->sn_num_hl != 0) { + sattr.sat_numhl = syn_id2attr(sp->sn_num_hl); + } + } + + sattrs[nr_matches] = sattr; + nr_matches++; + if (nr_matches == SIGN_SHOW_MAX) { + break; + } + } + } + return nr_matches; } /// Delete sign 'id' in group 'group' from buffer 'buf'. @@ -478,26 +529,26 @@ linenr_T buf_delsign( char_u *group // sign group ) { - signlist_T **lastp; // pointer to pointer to current sign - signlist_T *sign; // a sign in a b_signlist - signlist_T *next; // the next sign in a b_signlist + sign_entry_T **lastp; // pointer to pointer to current sign + sign_entry_T *sign; // a sign in a b_signlist + sign_entry_T *next; // the next sign in a b_signlist linenr_T lnum; // line number whose sign was deleted buf->b_signcols_max = -1; lastp = &buf->b_signlist; lnum = 0; for (sign = buf->b_signlist; sign != NULL; sign = next) { - next = sign->next; - if ((id == 0 || sign->id == id) - && (atlnum == 0 || sign->lnum == atlnum) + next = sign->se_next; + if ((id == 0 || sign->se_id == id) + && (atlnum == 0 || sign->se_lnum == atlnum) && sign_in_group(sign, group)) { *lastp = next; if (next != NULL) { - next->prev = sign->prev; + next->se_prev = sign->se_prev; } - lnum = sign->lnum; - if (sign->group != NULL) { - sign_group_unref(sign->group->sg_name); + lnum = sign->se_lnum; + if (sign->se_group != NULL) { + sign_group_unref(sign->se_group->sg_name); } xfree(sign); redraw_buf_line_later(buf, lnum); @@ -511,7 +562,7 @@ linenr_T buf_delsign( break; } } else { - lastp = &sign->next; + lastp = &sign->se_next; } } @@ -535,11 +586,11 @@ int buf_findsign( char_u *group // sign group ) { - signlist_T *sign; // a sign in the signlist + sign_entry_T *sign; // a sign in the signlist FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (sign->id == id && sign_in_group(sign, group)) { - return (int)sign->lnum; + if (sign->se_id == id && sign_in_group(sign, group)) { + return (int)sign->se_lnum; } } @@ -548,16 +599,22 @@ int buf_findsign( /// Return the sign at line 'lnum' in buffer 'buf'. Returns NULL if a sign is /// not found at the line. If 'groupname' is NULL, searches in the global group. -static signlist_T * buf_getsign_at_line( +static sign_entry_T * buf_getsign_at_line( buf_T *buf, // buffer whose sign we are searching for linenr_T lnum, // line number of sign char_u *groupname // sign group name ) { - signlist_T *sign; // a sign in the signlist + sign_entry_T *sign; // a sign in the signlist FOR_ALL_SIGNS_IN_BUF(buf, sign) { - if (sign->lnum == lnum && sign_in_group(sign, groupname)) { + if (sign->se_lnum > lnum) { + // Signs are sorted by line number in the buffer. No need to check + // for signs after the specified line number 'lnum'. + break; + } + + if (sign->se_lnum == lnum && sign_in_group(sign, groupname)) { return sign; } } @@ -572,11 +629,11 @@ int buf_findsign_id( char_u *groupname // sign group name ) { - signlist_T *sign; // a sign in the signlist + sign_entry_T *sign; // a sign in the signlist sign = buf_getsign_at_line(buf, lnum, groupname); if (sign != NULL) { - return sign->id; + return sign->se_id; } return 0; @@ -585,9 +642,9 @@ int buf_findsign_id( /// Delete signs in buffer "buf". void buf_delete_signs(buf_T *buf, char_u *group) { - signlist_T *sign; - signlist_T **lastp; // pointer to pointer to current sign - signlist_T *next; + sign_entry_T *sign; + sign_entry_T **lastp; // pointer to pointer to current sign + sign_entry_T *next; // When deleting the last sign need to redraw the windows to remove the // sign column. Not when curwin is NULL (this means we're exiting). @@ -597,18 +654,18 @@ void buf_delete_signs(buf_T *buf, char_u *group) lastp = &buf->b_signlist; for (sign = buf->b_signlist; sign != NULL; sign = next) { - next = sign->next; + next = sign->se_next; if (sign_in_group(sign, group)) { *lastp = next; if (next != NULL) { - next->prev = sign->prev; + next->se_prev = sign->se_prev; } - if (sign->group != NULL) { - sign_group_unref(sign->group->sg_name); + if (sign->se_group != NULL) { + sign_group_unref(sign->se_group->sg_name); } xfree(sign); } else { - lastp = &sign->next; + lastp = &sign->se_next; } } buf->b_signcols_max = -1; @@ -618,7 +675,7 @@ void buf_delete_signs(buf_T *buf, char_u *group) void sign_list_placed(buf_T *rbuf, char_u *sign_group) { buf_T *buf; - signlist_T *sign; + sign_entry_T *sign; char lbuf[MSG_BUF_LEN]; char group[MSG_BUF_LEN]; @@ -642,16 +699,16 @@ void sign_list_placed(buf_T *rbuf, char_u *sign_group) if (!sign_in_group(sign, sign_group)) { continue; } - if (sign->group != NULL) { + if (sign->se_group != NULL) { vim_snprintf(group, MSG_BUF_LEN, _(" group=%s"), - sign->group->sg_name); + sign->se_group->sg_name); } else { group[0] = '\0'; } vim_snprintf(lbuf, MSG_BUF_LEN, _(" line=%ld id=%d%s name=%s priority=%d"), - (long)sign->lnum, sign->id, group, - sign_typenr2name(sign->typenr), sign->priority); + (long)sign->se_lnum, sign->se_id, group, + sign_typenr2name(sign->se_typenr), sign->se_priority); MSG_PUTS(lbuf); msg_putchar('\n'); } @@ -670,26 +727,43 @@ void sign_mark_adjust( long amount_after ) { - signlist_T *sign; // a sign in a b_signlist - linenr_T new_lnum; // new line number to assign to sign + sign_entry_T *sign; // a sign in a b_signlist + sign_entry_T *next; // the next sign in a b_signlist + sign_entry_T *last = NULL; // pointer to pointer to current sign + sign_entry_T **lastp = NULL; // pointer to pointer to current sign + linenr_T new_lnum; // new line number to assign to sign + int is_fixed = 0; + int signcol = win_signcol_configured(curwin, &is_fixed); curbuf->b_signcols_max = -1; + lastp = &curbuf->b_signlist; - FOR_ALL_SIGNS_IN_BUF(curbuf, sign) { - new_lnum = sign->lnum; - if (sign->lnum >= line1 && sign->lnum <= line2) { + for (sign = curbuf->b_signlist; sign != NULL; sign = next) { + next = sign->se_next; + new_lnum = sign->se_lnum; + if (sign->se_lnum >= line1 && sign->se_lnum <= line2) { if (amount != MAXLNUM) { new_lnum += amount; + } else if (!is_fixed || signcol >= 2) { + *lastp = next; + if (next) { + next->se_prev = last; + } + xfree(sign); + continue; } - } else if (sign->lnum > line2) { + } else if (sign->se_lnum > line2) { new_lnum += amount_after; } // If the new sign line number is past the last line in the buffer, // then don't adjust the line number. Otherwise, it will always be past // the last line and will not be visible. - if (sign->lnum >= line1 && new_lnum <= curbuf->b_ml.ml_line_count) { - sign->lnum = new_lnum; + if (sign->se_lnum >= line1 && new_lnum <= curbuf->b_ml.ml_line_count) { + sign->se_lnum = new_lnum; } + + last = sign; + lastp = &sign->se_next; } } @@ -973,8 +1047,8 @@ int sign_place( sp->sn_typenr, has_text_or_icon); } else { - // ":sign place {id} file={fname}": change sign type - lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr); + // ":sign place {id} file={fname}": change sign type and/or priority + lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr, prio); } if (lnum > 0) { redraw_buf_line_later(buf, lnum); @@ -1488,7 +1562,7 @@ void sign_getlist(const char_u *name, list_T *retlist) list_T *get_buffer_signs(buf_T *buf) FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT { - signlist_T *sign; + sign_entry_T *sign; dict_T *d; list_T *const l = tv_list_alloc(kListLenMayKnow); @@ -1509,7 +1583,7 @@ static void sign_get_placed_in_buf( { dict_T *d; list_T *l; - signlist_T *sign; + sign_entry_T *sign; d = tv_dict_alloc(); tv_list_append_dict(retlist, d); @@ -1524,9 +1598,9 @@ static void sign_get_placed_in_buf( continue; } if ((lnum == 0 && sign_id == 0) - || (sign_id == 0 && lnum == sign->lnum) - || (lnum == 0 && sign_id == sign->id) - || (lnum == sign->lnum && sign_id == sign->id)) { + || (sign_id == 0 && lnum == sign->se_lnum) + || (lnum == 0 && sign_id == sign->se_id) + || (lnum == sign->se_lnum && sign_id == sign->se_id)) { tv_list_append_dict(l, sign_get_info(sign)); } } @@ -1613,50 +1687,6 @@ static void sign_undefine(sign_T *sp, sign_T *sp_prev) xfree(sp); } -/// Gets highlighting attribute for sign "typenr" corresponding to "type". -int sign_get_attr(int typenr, SignType type) -{ - sign_T *sp; - int sign_hl = 0; - - for (sp = first_sign; sp != NULL; sp = sp->sn_next) { - if (sp->sn_typenr == typenr) { - switch (type) { - case SIGN_TEXT: - sign_hl = sp->sn_text_hl; - break; - case SIGN_LINEHL: - sign_hl = sp->sn_line_hl; - break; - case SIGN_NUMHL: - sign_hl = sp->sn_num_hl; - break; - default: - abort(); - } - if (sign_hl > 0) { - return syn_id2attr(sign_hl); - } - break; - } - } - return 0; -} - -/// Get text mark for sign "typenr". -/// Returns NULL if there isn't one. -char_u * sign_get_text(int typenr) -{ - sign_T *sp; - - for (sp = first_sign; sp != NULL; sp = sp->sn_next) { - if (sp->sn_typenr == typenr) { - return sp->sn_text; - } - } - return NULL; -} - /// Undefine/free all signs. void free_signs(void) { @@ -1860,3 +1890,267 @@ void set_context_in_sign_cmd(expand_T *xp, char_u *arg) } } +/// Define a sign using the attributes in 'dict'. Returns 0 on success and -1 on +/// failure. +int sign_define_from_dict(const char *name_arg, dict_T *dict) +{ + char *name = NULL; + char *icon = NULL; + char *linehl = NULL; + char *text = NULL; + char *texthl = NULL; + char *numhl = NULL; + int retval = -1; + + if (name_arg == NULL) { + if (dict == NULL) { + return -1; + } + name = tv_dict_get_string(dict, "name", true); + } else { + name = xstrdup(name_arg); + } + if (name == NULL || name[0] == NUL) { + goto cleanup; + } + if (dict != NULL) { + icon = tv_dict_get_string(dict, "icon" , true); + linehl = tv_dict_get_string(dict, "linehl", true); + text = tv_dict_get_string(dict, "text" , true); + texthl = tv_dict_get_string(dict, "texthl", true); + numhl = tv_dict_get_string(dict, "numhl" , true); + } + + if (sign_define_by_name((char_u *)name, (char_u *)icon, (char_u *)linehl, + (char_u *)text, (char_u *)texthl, (char_u *)numhl) + == OK) { + retval = 0; + } + +cleanup: + xfree(name); + xfree(icon); + xfree(linehl); + xfree(text); + xfree(texthl); + xfree(numhl); + + return retval; +} + +/// Define multiple signs using attributes from list 'l' and store the return +/// values in 'retlist'. +void sign_define_multiple(list_T *l, list_T *retlist) +{ + int retval; + + TV_LIST_ITER_CONST(l, li, { + retval = -1; + if (TV_LIST_ITEM_TV(li)->v_type == VAR_DICT) { + retval = sign_define_from_dict(NULL, TV_LIST_ITEM_TV(li)->vval.v_dict); + } else { + EMSG(_(e_dictreq)); + } + tv_list_append_number(retlist, retval); + }); +} + +/// Place a new sign using the values specified in dict 'dict'. Returns the sign +/// identifier if successfully placed, otherwise returns 0. +int sign_place_from_dict( + typval_T *id_tv, + typval_T *group_tv, + typval_T *name_tv, + typval_T *buf_tv, + dict_T *dict) +{ + int sign_id = 0; + char_u *group = NULL; + char_u *sign_name = NULL; + buf_T *buf = NULL; + dictitem_T *di; + linenr_T lnum = 0; + int prio = SIGN_DEF_PRIO; + bool notanum = false; + int ret_sign_id = -1; + + // sign identifier + if (id_tv == NULL) { + di = tv_dict_find(dict, "id", -1); + if (di != NULL) { + id_tv = &di->di_tv; + } + } + if (id_tv == NULL) { + sign_id = 0; + } else { + sign_id = (int)tv_get_number_chk(id_tv, ¬anum); + if (notanum) { + return -1; + } + if (sign_id < 0) { + EMSG(_(e_invarg)); + return -1; + } + } + + // sign group + if (group_tv == NULL) { + di = tv_dict_find(dict, "group", -1); + if (di != NULL) { + group_tv = &di->di_tv; + } + } + if (group_tv == NULL) { + group = NULL; // global group + } else { + group = (char_u *)tv_get_string_chk(group_tv); + if (group == NULL) { + goto cleanup; + } + if (group[0] == '\0') { // global sign group + group = NULL; + } else { + group = vim_strsave(group); + if (group == NULL) { + return -1; + } + } + } + + // sign name + if (name_tv == NULL) { + di = tv_dict_find(dict, "name", -1); + if (di != NULL) { + name_tv = &di->di_tv; + } + } + if (name_tv == NULL) { + goto cleanup; + } + sign_name = (char_u *)tv_get_string_chk(name_tv); + if (sign_name == NULL) { + goto cleanup; + } + + // buffer to place the sign + if (buf_tv == NULL) { + di = tv_dict_find(dict, "buffer", -1); + if (di != NULL) { + buf_tv = &di->di_tv; + } + } + if (buf_tv == NULL) { + goto cleanup; + } + buf = get_buf_arg(buf_tv); + if (buf == NULL) { + goto cleanup; + } + + // line number of the sign + di = tv_dict_find(dict, "lnum", -1); + if (di != NULL) { + lnum = tv_get_lnum(&di->di_tv); + if (lnum <= 0) { + EMSG(_(e_invarg)); + goto cleanup; + } + } + + // sign priority + di = tv_dict_find(dict, "priority", -1); + if (di != NULL) { + prio = (int)tv_get_number_chk(&di->di_tv, ¬anum); + if (notanum) { + goto cleanup; + } + } + + if (sign_place(&sign_id, group, sign_name, buf, lnum, prio) == OK) { + ret_sign_id = sign_id; + } + +cleanup: + xfree(group); + + return ret_sign_id; +} + +/// Undefine multiple signs +void sign_undefine_multiple(list_T *l, list_T *retlist) +{ + char_u *name; + int retval; + + TV_LIST_ITER_CONST(l, li, { + retval = -1; + name = (char_u *)tv_get_string_chk(TV_LIST_ITEM_TV(li)); + if (name != NULL && (sign_undefine_by_name(name) == OK)) { + retval = 0; + } + tv_list_append_number(retlist, retval); + }); +} + +/// Unplace the sign with attributes specified in 'dict'. Returns 0 on success +/// and -1 on failure. +int sign_unplace_from_dict(typval_T *group_tv, dict_T *dict) +{ + dictitem_T *di; + int sign_id = 0; + buf_T *buf = NULL; + char_u *group = NULL; + int retval = -1; + + // sign group + if (group_tv != NULL) { + group = (char_u *)tv_get_string(group_tv); + } else { + group = (char_u *)tv_dict_get_string(dict, "group", false); + } + if (group != NULL) { + if (group[0] == '\0') { // global sign group + group = NULL; + } else { + group = vim_strsave(group); + if (group == NULL) { + return -1; + } + } + } + + if (dict != NULL) { + if ((di = tv_dict_find(dict, "buffer", -1)) != NULL) { + buf = get_buf_arg(&di->di_tv); + if (buf == NULL) { + goto cleanup; + } + } + if (tv_dict_find(dict, "id", -1) != NULL) { + sign_id = (int)tv_dict_get_number(dict, "id"); + if (sign_id <= 0) { + EMSG(_(e_invarg)); + goto cleanup; + } + } + } + + if (buf == NULL) { + // Delete the sign in all the buffers + retval = 0; + FOR_ALL_BUFFERS(buf2) { + if (sign_unplace(sign_id, group, buf2, 0) != OK) { + retval = -1; + } + } + } else if (sign_unplace(sign_id, group, buf, 0) == OK) { + retval = 0; + } + +cleanup: + xfree(group); + + return retval; +} + diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h index 19c0263cf1..721b2db25b 100644 --- a/src/nvim/sign_defs.h +++ b/src/nvim/sign_defs.h @@ -10,39 +10,47 @@ // Sign group typedef struct signgroup_S { - uint16_t refcount; // number of signs in this group - int next_sign_id; // next sign id for this group - char_u sg_name[1]; // sign group name + uint16_t sg_refcount; // number of signs in this group + int sg_next_sign_id; // next sign id for this group + char_u sg_name[1]; // sign group name } signgroup_T; // Macros to get the sign group structure from the group name #define SGN_KEY_OFF offsetof(signgroup_T, sg_name) #define HI2SG(hi) ((signgroup_T *)((hi)->hi_key - SGN_KEY_OFF)) -typedef struct signlist signlist_T; - -struct signlist -{ - int id; // unique identifier for each placed sign - int typenr; // typenr of sign - int priority; // priority for highlighting - bool has_text_or_icon; // has text or icon - linenr_T lnum; // line number which has this sign - signgroup_T *group; // sign group - signlist_T *next; // next signlist entry - signlist_T *prev; // previous entry -- for easy reordering +typedef struct sign_entry sign_entry_T; + +struct sign_entry { + int se_id; // unique identifier for each placed sign + int se_typenr; // typenr of sign + int se_priority; // priority for highlighting + bool se_has_text_or_icon; // has text or icon + linenr_T se_lnum; // line number which has this sign + signgroup_T *se_group; // sign group + sign_entry_T *se_next; // next entry in a list of signs + sign_entry_T *se_prev; // previous entry -- for easy reordering }; +/// Sign attributes. Used by the screen refresh routines. +typedef struct sign_attrs_S { + int sat_typenr; + char_u *sat_text; + int sat_texthl; + int sat_linehl; + int sat_numhl; +} sign_attrs_T; + +#define SIGN_SHOW_MAX 9 + // Default sign priority for highlighting #define SIGN_DEF_PRIO 10 -// type argument for buf_getsigntype() and sign_get_attr() +// type argument for sign_get_attr() typedef enum { - SIGN_ANY, SIGN_LINEHL, - SIGN_ICON, - SIGN_TEXT, SIGN_NUMHL, + SIGN_TEXT, } SignType; diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 55f9594de2..d1428b0117 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -1677,6 +1677,7 @@ static void int_wordlist_spl(char_u *fname) // Allocate a new slang_T for language "lang". "lang" can be NULL. // Caller must fill "sl_next". slang_T *slang_alloc(char_u *lang) + FUNC_ATTR_NONNULL_RET { slang_T *lp = xcalloc(1, sizeof(slang_T)); @@ -3035,7 +3036,7 @@ void ex_spellrepall(exarg_T *eap) sub_nlines = 0; curwin->w_cursor.lnum = 0; while (!got_int) { - if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0 + if (do_search(NULL, '/', '/', frompat, 1L, SEARCH_KEEP, NULL) == 0 || u_save_cursor() == FAIL) { break; } diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index f1eb7879b0..ed886ab7f9 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -3469,13 +3469,13 @@ static void syn_cmd_onoff(exarg_T *eap, char *name) } } -void syn_maybe_on(void) +void syn_maybe_enable(void) { if (!did_syntax_onoff) { exarg_T ea; ea.arg = (char_u *)""; ea.skip = false; - syn_cmd_onoff(&ea, "syntax"); + syn_cmd_enable(&ea, false); } } @@ -5306,13 +5306,17 @@ get_id_list( xfree(name); break; } - if (name[1] == 'A') - id = SYNID_ALLBUT; - else if (name[1] == 'T') - id = SYNID_TOP; - else - id = SYNID_CONTAINED; - id += current_syn_inc_tag; + if (name[1] == 'A') { + id = SYNID_ALLBUT + current_syn_inc_tag; + } else if (name[1] == 'T') { + if (curwin->w_s->b_syn_topgrp >= SYNID_CLUSTER) { + id = curwin->w_s->b_syn_topgrp; + } else { + id = SYNID_TOP + current_syn_inc_tag; + } + } else { + id = SYNID_CONTAINED + current_syn_inc_tag; + } } else if (name[1] == '@') { if (skip) { id = -1; @@ -6047,6 +6051,8 @@ static const char *highlight_init_both[] = { "default link MsgSeparator StatusLine", "default link NormalFloat Pmenu", "default link FloatBorder VertSplit", + "default FloatShadow blend=80 guibg=Black", + "default FloatShadowThrough blend=100 guibg=Black", "RedrawDebugNormal cterm=reverse gui=reverse", "RedrawDebugClear ctermbg=Yellow guibg=Yellow", "RedrawDebugComposed ctermbg=Green guibg=Green", diff --git a/src/nvim/syntax.h b/src/nvim/syntax.h index 9fbad74f64..38f848f178 100644 --- a/src/nvim/syntax.h +++ b/src/nvim/syntax.h @@ -27,6 +27,8 @@ #define HL_CONCEAL 0x20000 /* can be concealed */ #define HL_CONCEALENDS 0x40000 /* can be concealed */ +#define SYN_GROUP_STATIC(s) syn_check_group((char_u *)S_LEN(s)) + typedef struct { char *name; RgbValue color; diff --git a/src/nvim/tag.c b/src/nvim/tag.c index 6b8f393572..ab35c936ca 100644 --- a/src/nvim/tag.c +++ b/src/nvim/tag.c @@ -625,7 +625,7 @@ do_tag( } if (ic && !msg_scrolled && msg_silent == 0) { ui_flush(); - os_delay(1000L, true); + os_delay(1007L, true); } } @@ -1143,7 +1143,6 @@ static int find_tagfunc_tags( typval_T args[4]; typval_T rettv; char_u flagString[4]; - dict_T *d; taggy_T *tag = &curwin->w_tagstack[curwin->w_tagstackidx]; if (*curbuf->b_p_tfu == NUL) { @@ -1156,7 +1155,7 @@ static int find_tagfunc_tags( args[1].vval.v_string = flagString; // create 'info' dict argument - d = tv_dict_alloc(); + dict_T *const d = tv_dict_alloc_lock(VAR_FIXED); if (tag->user_data != NULL) { tv_dict_add_str(d, S_LEN("user_data"), (const char *)tag->user_data); } @@ -2811,7 +2810,7 @@ static int jumpto_tag( // start search before first line curwin->w_cursor.lnum = 0; } - if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, + if (do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1, search_options, NULL)) { retval = OK; } else { @@ -2821,8 +2820,8 @@ static int jumpto_tag( /* * try again, ignore case now */ - p_ic = TRUE; - if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, + p_ic = true; + if (!do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1, search_options, NULL)) { // Failed to find pattern, take a guess: "^func (" found = 2; @@ -2830,11 +2829,12 @@ static int jumpto_tag( cc = *tagp.tagname_end; *tagp.tagname_end = NUL; snprintf((char *)pbuf, LSIZE, "^%s\\s\\*(", tagp.tagname); - if (!do_search(NULL, '/', pbuf, (long)1, search_options, NULL)) { + if (!do_search(NULL, '/', '/', pbuf, (long)1, search_options, NULL)) { // Guess again: "^char * \<func (" snprintf((char *)pbuf, LSIZE, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(", tagp.tagname); - if (!do_search(NULL, '/', pbuf, (long)1, search_options, NULL)) { + if (!do_search(NULL, '/', '/', pbuf, (long)1, + search_options, NULL)) { found = 0; } } @@ -2852,7 +2852,7 @@ static int jumpto_tag( MSG(_("E435: Couldn't find tag, just guessing!")); if (!msg_scrolled && msg_silent == 0) { ui_flush(); - os_delay(1000L, true); + os_delay(1010L, true); } } retval = OK; @@ -3010,7 +3010,7 @@ static int find_extra(char_u **pp) // Repeat for addresses separated with ';' for (;; ) { if (ascii_isdigit(*str)) { - str = skipdigits(str); + str = skipdigits(str + 1); } else if (*str == '/' || *str == '?') { str = skip_regexp(str + 1, *str, false, NULL); if (*str != first_char) { diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index 913ef3baed..c07a956dde 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -450,6 +450,7 @@ static int terminal_execute(VimState *state, int key) case K_LEFTMOUSE: case K_LEFTDRAG: case K_LEFTRELEASE: + case K_MOUSEMOVE: case K_MIDDLEMOUSE: case K_MIDDLEDRAG: case K_MIDDLERELEASE: @@ -580,6 +581,9 @@ static bool is_filter_char(int c) void terminal_paste(long count, char_u **y_array, size_t y_size) { + if (y_size == 0) { + return; + } vterm_keyboard_start_paste(curbuf->terminal->vt); terminal_flush_output(curbuf->terminal); size_t buff_len = STRLEN(y_array[0]); @@ -1095,6 +1099,7 @@ static bool send_mouse_event(Terminal *term, int c) switch (c) { case K_LEFTDRAG: drag = true; FALLTHROUGH; case K_LEFTMOUSE: button = 1; break; + case K_MOUSEMOVE: drag = true; button = 0; break; case K_MIDDLEDRAG: drag = true; FALLTHROUGH; case K_MIDDLEMOUSE: button = 2; break; case K_RIGHTDRAG: drag = true; FALLTHROUGH; diff --git a/src/nvim/testdir/runtest.vim b/src/nvim/testdir/runtest.vim index 2d94b637e0..49993c03aa 100644 --- a/src/nvim/testdir/runtest.vim +++ b/src/nvim/testdir/runtest.vim @@ -13,6 +13,9 @@ " For csh: " setenv TEST_FILTER Test_channel " +" While working on a test you can make $TEST_NO_RETRY non-empty to not retry: +" export TEST_NO_RETRY=yes +" " To ignore failure for tests that are known to fail in a certain environment, " set $TEST_MAY_FAIL to a comma separated list of function names. E.g. for " sh/bash: @@ -413,9 +416,11 @@ for s:test in sort(s:tests) call RunTheTest(s:test) " Repeat a flaky test. Give up when: + " - $TEST_NO_RETRY is not empty " - it fails again with the same message " - it fails five times (with a different message) if len(v:errors) > 0 + \ && $TEST_NO_RETRY == '' \ && (index(s:flaky_tests, s:test) >= 0 \ || g:test_is_flaky) while 1 diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim index a47d20a265..b5c50b5894 100644 --- a/src/nvim/testdir/test_alot.vim +++ b/src/nvim/testdir/test_alot.vim @@ -10,6 +10,7 @@ source test_cursor_func.vim source test_ex_equal.vim source test_ex_undo.vim source test_ex_z.vim +source test_ex_mode.vim source test_execute_func.vim source test_expand_func.vim source test_feedkeys.vim @@ -33,7 +34,9 @@ source test_move.vim source test_partial.vim source test_popup.vim source test_put.vim +source test_rename.vim source test_scroll_opt.vim +source test_shift.vim source test_sort.vim source test_sha256.vim source test_suspend.vim diff --git a/src/nvim/testdir/test_alot_utf8.vim b/src/nvim/testdir/test_alot_utf8.vim index be0bd01413..70f14320a6 100644 --- a/src/nvim/testdir/test_alot_utf8.vim +++ b/src/nvim/testdir/test_alot_utf8.vim @@ -6,7 +6,6 @@ source test_charsearch_utf8.vim source test_expr_utf8.vim -source test_listlbr_utf8.vim source test_matchadd_conceal_utf8.vim source test_mksession_utf8.vim source test_regexp_utf8.vim diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index 5e99edf233..bb84fa498e 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -190,7 +190,6 @@ func Test_autocmd_bufunload_avoiding_SEGV_02() normal! i1 call assert_fails('edit a.txt', 'E517:') - call feedkeys("\<CR>") autocmd! test_autocmd_bufunload augroup! test_autocmd_bufunload @@ -276,28 +275,28 @@ func Test_augroup_warning() augroup TheWarning au VimEnter * echo 'entering' augroup END - call assert_true(match(execute('au VimEnter'), "TheWarning.*VimEnter") >= 0) + call assert_match("TheWarning.*VimEnter", execute('au VimEnter')) redir => res augroup! TheWarning redir END - call assert_true(match(res, "W19:") >= 0) - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("W19:", res) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) " check "Another" does not take the pace of the deleted entry augroup Another augroup END - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) augroup! Another " no warning for postpone aucmd delete augroup StartOK au VimEnter * call RemoveGroup() augroup END - call assert_true(match(execute('au VimEnter'), "StartOK.*VimEnter") >= 0) + call assert_match("StartOK.*VimEnter", execute('au VimEnter')) redir => res doautocmd VimEnter redir END - call assert_true(match(res, "W19:") < 0) + call assert_notmatch("W19:", res) au! VimEnter endfunc @@ -325,7 +324,7 @@ func Test_augroup_deleted() au VimEnter * echo augroup end augroup! x - call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0) + call assert_match("-Deleted-.*VimEnter", execute('au VimEnter')) au! VimEnter endfunc @@ -452,6 +451,27 @@ func Test_autocmd_bufwipe_in_SessLoadPost() endfor endfunc +" Using :blast and :ball for many events caused a crash, because b_nwindows was +" not incremented correctly. +func Test_autocmd_blast_badd() + let content =<< trim [CODE] + au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* blast + edit foo1 + au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* ball + edit foo2 + call writefile(['OK'], 'Xerrors') + qall + [CODE] + + call writefile(content, 'XblastBall') + call system(GetVimCommand() .. ' --clean -S XblastBall') + " call assert_match('OK', readfile('Xerrors')->join()) + call assert_match('OK', join(readfile('Xerrors'))) + + call delete('XblastBall') + call delete('Xerrors') +endfunc + " SEGV occurs in older versions. func Test_autocmd_bufwipe_in_SessLoadPost2() tabnew @@ -1949,6 +1969,26 @@ func Test_autocmd_window() %bw! endfunc +" Test for trying to close the tab that has the temporary window for exeucing +" an autocmd. +func Test_close_autocmd_tab() + edit one.txt + tabnew two.txt + augroup aucmd_win_test + au! + au BufEnter * if expand('<afile>') == 'one.txt' | tabfirst | tabonly | endif + augroup END + + call assert_fails('doautoall BufEnter', 'E813:') + + tabonly + augroup aucmd_win_test + au! + augroup END + augroup! aucmd_win_test + %bwipe! +endfunc + func Test_autocmd_closes_window() au BufNew,BufWinLeave * e %e file yyy @@ -1960,4 +2000,13 @@ func Test_autocmd_closes_window() au! BufWinLeave endfunc +func Test_autocmd_closing_cmdwin() + au BufWinLeave * nested q + call assert_fails("norm 7q?\n", 'E855:') + + au! BufWinLeave + new + only +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_backspace_opt.vim b/src/nvim/testdir/test_backspace_opt.vim index d680b442db..11459991ea 100644 --- a/src/nvim/testdir/test_backspace_opt.vim +++ b/src/nvim/testdir/test_backspace_opt.vim @@ -1,15 +1,5 @@ " Tests for 'backspace' settings -func Exec(expr) - let str='' - try - exec a:expr - catch /.*/ - let str=v:exception - endtry - return str -endfunc - func Test_backspace_option() set backspace= call assert_equal('', &backspace) @@ -41,10 +31,10 @@ func Test_backspace_option() set backspace-=eol call assert_equal('', &backspace) " Check the error - call assert_equal(0, match(Exec('set backspace=ABC'), '.*E474')) - call assert_equal(0, match(Exec('set backspace+=def'), '.*E474')) + call assert_fails('set backspace=ABC', 'E474:') + call assert_fails('set backspace+=def', 'E474:') " NOTE: Vim doesn't check following error... - "call assert_equal(0, match(Exec('set backspace-=ghi'), '.*E474')) + "call assert_fails('set backspace-=ghi', 'E474:') " Check backwards compatibility with version 5.4 and earlier set backspace=0 @@ -55,8 +45,8 @@ func Test_backspace_option() call assert_equal('2', &backspace) set backspace=3 call assert_equal('3', &backspace) - call assert_false(match(Exec('set backspace=4'), '.*E474')) - call assert_false(match(Exec('set backspace=10'), '.*E474')) + call assert_fails('set backspace=4', 'E474:') + call assert_fails('set backspace=10', 'E474:') " Cleared when 'compatible' is set " set compatible diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 489b2477e6..34126b49fa 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -477,7 +477,7 @@ func Test_expand_star_star() call delete('a', 'rf') endfunc -func Test_paste_in_cmdline() +func Test_cmdline_paste() let @a = "def" call feedkeys(":abc \<C-R>a ghi\<C-B>\"\<CR>", 'tx') call assert_equal('"abc def ghi', @:) @@ -517,18 +517,38 @@ func Test_paste_in_cmdline() bwipe! endfunc -func Test_remove_char_in_cmdline() - call feedkeys(":abc def\<S-Left>\<Del>\<C-B>\"\<CR>", 'tx') - call assert_equal('"abc ef', @:) +func Test_cmdline_remove_char() + let encoding_save = &encoding + + " for e in ['utf8', 'latin1'] + for e in ['utf8'] + exe 'set encoding=' . e + + call feedkeys(":abc def\<S-Left>\<Del>\<C-B>\"\<CR>", 'tx') + call assert_equal('"abc ef', @:, e) + + call feedkeys(":abc def\<S-Left>\<BS>\<C-B>\"\<CR>", 'tx') + call assert_equal('"abcdef', @:) + + call feedkeys(":abc def ghi\<S-Left>\<C-W>\<C-B>\"\<CR>", 'tx') + call assert_equal('"abc ghi', @:, e) + + call feedkeys(":abc def\<S-Left>\<C-U>\<C-B>\"\<CR>", 'tx') + call assert_equal('"def', @:, e) + endfor - call feedkeys(":abc def\<S-Left>\<BS>\<C-B>\"\<CR>", 'tx') - call assert_equal('"abcdef', @:) + let &encoding = encoding_save +endfunc - call feedkeys(":abc def ghi\<S-Left>\<C-W>\<C-B>\"\<CR>", 'tx') - call assert_equal('"abc ghi', @:) +func Test_cmdline_keymap_ctrl_hat() + if !has('keymap') + return + endif - call feedkeys(":abc def\<S-Left>\<C-U>\<C-B>\"\<CR>", 'tx') - call assert_equal('"def', @:) + set keymap=esperanto + call feedkeys(":\"Jxauxdo \<C-^>Jxauxdo \<C-^>Jxauxdo\<CR>", 'tx') + call assert_equal('"Jxauxdo Ĵaŭdo Jxauxdo', @:) + set keymap= endfunc func Test_illegal_address1() @@ -615,10 +635,20 @@ func Test_cmdline_complete_bang() endfunc funct Test_cmdline_complete_languages() + let lang = substitute(execute('language time'), '.*"\(.*\)"$', '\1', '') + call assert_equal(lang, v:lc_time) + + let lang = substitute(execute('language ctype'), '.*"\(.*\)"$', '\1', '') + call assert_equal(lang, v:ctype) + + let lang = substitute(execute('language collate'), '.*"\(.*\)"$', '\1', '') + call assert_equal(lang, v:collate) + let lang = substitute(execute('language messages'), '.*"\(.*\)"$', '\1', '') + call assert_equal(lang, v:lang) call feedkeys(":language \<c-a>\<c-b>\"\<cr>", 'tx') - call assert_match('^"language .*\<ctype\>.*\<messages\>.*\<time\>', @:) + call assert_match('^"language .*\<collate\>.*\<ctype\>.*\<messages\>.*\<time\>', @:) if has('unix') " TODO: these tests don't work on Windows. lang appears to be 'C' @@ -633,6 +663,9 @@ funct Test_cmdline_complete_languages() call feedkeys(":language time \<c-a>\<c-b>\"\<cr>", 'tx') call assert_match('^"language .*\<' . lang . '\>', @:) + + call feedkeys(":language collate \<c-a>\<c-b>\"\<cr>", 'tx') + call assert_match('^"language .*\<' . lang . '\>', @:) endif endfunc @@ -850,20 +883,20 @@ func Test_cmdline_overstrike() " Test overstrike in the middle of the command line. call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt') - call assert_equal('"0ab1cd4', @:) + call assert_equal('"0ab1cd4', @:, e) " Test overstrike going beyond end of command line. call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cdefgh\<enter>", 'xt') - call assert_equal('"0ab1cdefgh', @:) + call assert_equal('"0ab1cdefgh', @:, e) " Test toggling insert/overstrike a few times. call feedkeys(":\"01234\<home>\<right>ab\<right>\<insert>cd\<right>\<insert>ef\<enter>", 'xt') - call assert_equal('"ab0cd3ef4', @:) + call assert_equal('"ab0cd3ef4', @:, e) endfor " Test overstrike with multi-byte characters. call feedkeys(":\"テキストエディタ\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt') - call assert_equal('"テabキcdエディタ', @:) + call assert_equal('"テabキcdエディタ', @:, e) let &encoding = encoding_save endfunc @@ -972,6 +1005,25 @@ func Test_buffers_lastused() bwipeout bufc endfunc +" Test for CmdwinEnter autocmd +func Test_cmdwin_autocmd() + CheckFeature cmdwin + + augroup CmdWin + au! + autocmd BufLeave * if &buftype == '' | update | endif + autocmd CmdwinEnter * startinsert + augroup END + + call assert_fails('call feedkeys("q:xyz\<CR>", "xt")', 'E492:') + call assert_equal('xyz', @:) + + augroup CmdWin + au! + augroup END + augroup! CmdWin +endfunc + func Test_cmdlineclear_tabenter() " See test/functional/legacy/cmdline_spec.lua CheckScreendump @@ -1020,4 +1072,52 @@ func Test_read_shellcmd() endif endfunc +" Test for recalling newer or older cmdline from history with <Up>, <Down>, +" <S-Up>, <S-Down>, <PageUp>, <PageDown>, <C-p>, or <C-n>. +func Test_recalling_cmdline() + CheckFeature cmdline_hist + + let g:cmdlines = [] + cnoremap <Plug>(save-cmdline) <Cmd>let g:cmdlines += [getcmdline()]<CR> + + let histories = [ + \ {'name': 'cmd', 'enter': ':', 'exit': "\<Esc>"}, + \ {'name': 'search', 'enter': '/', 'exit': "\<Esc>"}, + \ {'name': 'expr', 'enter': ":\<C-r>=", 'exit': "\<Esc>\<Esc>"}, + \ {'name': 'input', 'enter': ":call input('')\<CR>", 'exit': "\<CR>"}, + "\ TODO: {'name': 'debug', ...} + \] + let keypairs = [ + \ {'older': "\<Up>", 'newer': "\<Down>", 'prefixmatch': v:true}, + \ {'older': "\<S-Up>", 'newer': "\<S-Down>", 'prefixmatch': v:false}, + \ {'older': "\<PageUp>", 'newer': "\<PageDown>", 'prefixmatch': v:false}, + \ {'older': "\<C-p>", 'newer': "\<C-n>", 'prefixmatch': v:false}, + \] + let prefix = 'vi' + for h in histories + call histadd(h.name, 'vim') + call histadd(h.name, 'virtue') + call histadd(h.name, 'Virgo') + call histadd(h.name, 'vogue') + call histadd(h.name, 'emacs') + for k in keypairs + let g:cmdlines = [] + let keyseqs = h.enter + \ .. prefix + \ .. repeat(k.older .. "\<Plug>(save-cmdline)", 2) + \ .. repeat(k.newer .. "\<Plug>(save-cmdline)", 2) + \ .. h.exit + call feedkeys(keyseqs, 'xt') + call histdel(h.name, -1) " delete the history added by feedkeys above + let expect = k.prefixmatch + \ ? ['virtue', 'vim', 'virtue', prefix] + \ : ['emacs', 'vogue', 'emacs', prefix] + call assert_equal(expect, g:cmdlines) + endfor + endfor + + unlet g:cmdlines + cunmap <Plug>(save-cmdline) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_compiler.vim b/src/nvim/testdir/test_compiler.vim index d361205baa..c3de7d0050 100644 --- a/src/nvim/testdir/test_compiler.vim +++ b/src/nvim/testdir/test_compiler.vim @@ -60,10 +60,10 @@ func Test_compiler_completion() call assert_match('^"compiler ' .. clist .. '$', @:) call feedkeys(":compiler p\<C-A>\<C-B>\"\<CR>", 'tx') - call assert_equal('"compiler pbx perl php pylint pyunit', @:) + call assert_match('"compiler pbx perl\( p[a-z]\+\)\+ pylint pyunit', @:) call feedkeys(":compiler! p\<C-A>\<C-B>\"\<CR>", 'tx') - call assert_equal('"compiler! pbx perl php pylint pyunit', @:) + call assert_match('"compiler! pbx perl\( p[a-z]\+\)\+ pylint pyunit', @:) endfunc func Test_compiler_error() diff --git a/src/nvim/testdir/test_debugger.vim b/src/nvim/testdir/test_debugger.vim index 59d51b855b..d1464e9d3b 100644 --- a/src/nvim/testdir/test_debugger.vim +++ b/src/nvim/testdir/test_debugger.vim @@ -2,6 +2,31 @@ source shared.vim source screendump.vim +source check.vim + +func CheckCWD() + " Check that the longer lines don't wrap due to the length of the script name + " in cwd + let script_len = len( getcwd() .. '/Xtest1.vim' ) + let longest_line = len( 'Breakpoint in "" line 1' ) + if script_len > ( 75 - longest_line ) + throw 'Skipped: Your CWD has too many characters' + endif +endfunc +command! -nargs=0 -bar CheckCWD call CheckCWD() + +func CheckDbgOutput(buf, lines, options = {}) + " Verify the expected output + let lnum = 20 - len(a:lines) + for l in a:lines + if get(a:options, 'match', 'equal') ==# 'pattern' + call WaitForAssert({-> assert_match(l, term_getline(a:buf, lnum))}, 200) + else + call WaitForAssert({-> assert_equal(l, term_getline(a:buf, lnum))}, 200) + endif + let lnum += 1 + endfor +endfunc " Run a Vim debugger command " If the expected output argument is supplied, then check for it. @@ -10,20 +35,17 @@ func RunDbgCmd(buf, cmd, ...) call term_wait(a:buf) if a:0 != 0 - " Verify the expected output - let lnum = 20 - len(a:1) - for l in a:1 - call WaitForAssert({-> assert_equal(l, term_getline(a:buf, lnum))}) - let lnum += 1 - endfor + let options = #{match: 'equal'} + if a:0 > 1 + call extend(options, a:2) + endif + call CheckDbgOutput(a:buf, a:1, options) endif endfunc " Debugger tests func Test_Debugger() - if !CanRunVimInTerminal() - throw 'Skipped: cannot run Vim in a terminal window' - endif + CheckRunVimInTerminal " Create a Vim script with some functions let lines =<< trim END @@ -317,6 +339,785 @@ func Test_Debugger() call delete('Xtest.vim') endfunc +func Test_Backtrace_Through_Source() + CheckRunVimInTerminal + CheckCWD + let file1 =<< trim END + func SourceAnotherFile() + source Xtest2.vim + endfunc + + func CallAFunction() + call SourceAnotherFile() + call File2Function() + endfunc + + func GlobalFunction() + call CallAFunction() + endfunc + END + call writefile(file1, 'Xtest1.vim') + + let file2 =<< trim END + func DoAThing() + echo "DoAThing" + endfunc + + func File2Function() + call DoAThing() + endfunc + + call File2Function() + END + call writefile(file2, 'Xtest2.vim') + + let buf = RunVimInTerminal('-S Xtest1.vim', {}) + + call RunDbgCmd(buf, + \ ':debug call GlobalFunction()', + \ ['cmd: call GlobalFunction()']) + call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) + + call RunDbgCmd(buf, 'backtrace', ['>backtrace', + \ '->0 function GlobalFunction', + \ 'line 1: call CallAFunction()']) + + call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) + call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) + + call RunDbgCmd(buf, 'backtrace', ['>backtrace', + \ ' 2 function GlobalFunction[1]', + \ ' 1 CallAFunction[1]', + \ '->0 SourceAnotherFile', + \ 'line 1: source Xtest2.vim']) + + " Step into the 'source' command. Note that we print the full trace all the + " way though the source command. + call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()']) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ '->1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ '->2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ '->3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up', [ 'frame at highest level: 3' ] ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ '->3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ '->2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ '->1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) + + " step until we have another meaninfgul trace + call RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) + call RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 9: call File2Function()']) + + call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) + call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 5 function GlobalFunction[1]', + \ ' 4 CallAFunction[1]', + \ ' 3 SourceAnotherFile[1]', + \ ' 2 script ' .. getcwd() .. '/Xtest2.vim[9]', + \ ' 1 function File2Function[1]', + \ '->0 DoAThing', + \ 'line 1: echo "DoAThing"']) + + " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 1 function GlobalFunction[1]', + \ '->0 CallAFunction', + \ 'line 2: call File2Function()']) + + call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 2 function GlobalFunction[1]', + \ ' 1 CallAFunction[2]', + \ '->0 File2Function', + \ 'line 1: call DoAThing()']) + + call StopVimInTerminal(buf) + call delete('Xtest1.vim') + call delete('Xtest2.vim') +endfunc + +func Test_Backtrace_Autocmd() + CheckRunVimInTerminal + CheckCWD + let file1 =<< trim END + func SourceAnotherFile() + source Xtest2.vim + endfunc + + func CallAFunction() + call SourceAnotherFile() + call File2Function() + endfunc + + func GlobalFunction() + call CallAFunction() + endfunc + + au User TestGlobalFunction :call GlobalFunction() | echo "Done" + END + call writefile(file1, 'Xtest1.vim') + + let file2 =<< trim END + func DoAThing() + echo "DoAThing" + endfunc + + func File2Function() + call DoAThing() + endfunc + + call File2Function() + END + call writefile(file2, 'Xtest2.vim') + + let buf = RunVimInTerminal('-S Xtest1.vim', {}) + + call RunDbgCmd(buf, + \ ':debug doautocmd User TestGlobalFunction', + \ ['cmd: doautocmd User TestGlobalFunction']) + call RunDbgCmd(buf, 'step', ['cmd: call GlobalFunction() | echo "Done"']) + + " At this point the ontly thing in the stack is the autocommand + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ '->0 User Autocommands for "TestGlobalFunction"', + \ 'cmd: call GlobalFunction() | echo "Done"']) + + " And now we're back into the call stack + call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 1 User Autocommands for "TestGlobalFunction"', + \ '->0 function GlobalFunction', + \ 'line 1: call CallAFunction()']) + + call RunDbgCmd(buf, 'step', ['line 1: call SourceAnotherFile()']) + call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) + + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 User Autocommands for "TestGlobalFunction"', + \ ' 2 function GlobalFunction[1]', + \ ' 1 CallAFunction[1]', + \ '->0 SourceAnotherFile', + \ 'line 1: source Xtest2.vim']) + + " Step into the 'source' command. Note that we print the full trace all the + " way though the source command. + call RunDbgCmd(buf, 'step', ['line 1: func DoAThing()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()']) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ '->1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ '->2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ '->3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ '->4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'up', [ 'frame at highest level: 4' ] ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ '->4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ '->3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ '->2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ '->1 SourceAnotherFile[1]', + \ ' 0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down' ) + call RunDbgCmd( buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 1: func DoAThing()' ] ) + + call RunDbgCmd( buf, 'down', [ 'frame is zero' ] ) + + " step until we have another meaninfgul trace + call RunDbgCmd(buf, 'step', ['line 5: func File2Function()']) + call RunDbgCmd(buf, 'step', ['line 9: call File2Function()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 4 User Autocommands for "TestGlobalFunction"', + \ ' 3 function GlobalFunction[1]', + \ ' 2 CallAFunction[1]', + \ ' 1 SourceAnotherFile[1]', + \ '->0 script ' .. getcwd() .. '/Xtest2.vim', + \ 'line 9: call File2Function()']) + + call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) + call RunDbgCmd(buf, 'step', ['line 1: echo "DoAThing"']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 6 User Autocommands for "TestGlobalFunction"', + \ ' 5 function GlobalFunction[1]', + \ ' 4 CallAFunction[1]', + \ ' 3 SourceAnotherFile[1]', + \ ' 2 script ' .. getcwd() .. '/Xtest2.vim[9]', + \ ' 1 function File2Function[1]', + \ '->0 DoAThing', + \ 'line 1: echo "DoAThing"']) + + " Now, step (back to Xfile1.vim), and call the function _in_ Xfile2.vim + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 10: End of sourced file']) + call RunDbgCmd(buf, 'step', ['line 1: End of function']) + call RunDbgCmd(buf, 'step', ['line 2: call File2Function()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 2 User Autocommands for "TestGlobalFunction"', + \ ' 1 function GlobalFunction[1]', + \ '->0 CallAFunction', + \ 'line 2: call File2Function()']) + + call RunDbgCmd(buf, 'step', ['line 1: call DoAThing()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 User Autocommands for "TestGlobalFunction"', + \ ' 2 function GlobalFunction[1]', + \ ' 1 CallAFunction[2]', + \ '->0 File2Function', + \ 'line 1: call DoAThing()']) + + + " Now unwind so that we get back to the original autocommand (and the second + " cmd echo "Done") + call RunDbgCmd(buf, 'finish', ['line 1: End of function']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 3 User Autocommands for "TestGlobalFunction"', + \ ' 2 function GlobalFunction[1]', + \ ' 1 CallAFunction[2]', + \ '->0 File2Function', + \ 'line 1: End of function']) + + call RunDbgCmd(buf, 'finish', ['line 2: End of function']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 2 User Autocommands for "TestGlobalFunction"', + \ ' 1 function GlobalFunction[1]', + \ '->0 CallAFunction', + \ 'line 2: End of function']) + + call RunDbgCmd(buf, 'finish', ['line 1: End of function']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 1 User Autocommands for "TestGlobalFunction"', + \ '->0 function GlobalFunction', + \ 'line 1: End of function']) + + call RunDbgCmd(buf, 'step', ['cmd: echo "Done"']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ '->0 User Autocommands for "TestGlobalFunction"', + \ 'cmd: echo "Done"']) + + call StopVimInTerminal(buf) + call delete('Xtest1.vim') + call delete('Xtest2.vim') +endfunc + +func Test_Backtrace_CmdLine() + CheckRunVimInTerminal + CheckCWD + let file1 =<< trim END + func SourceAnotherFile() + source Xtest2.vim + endfunc + + func CallAFunction() + call SourceAnotherFile() + call File2Function() + endfunc + + func GlobalFunction() + call CallAFunction() + endfunc + + au User TestGlobalFunction :call GlobalFunction() | echo "Done" + END + call writefile(file1, 'Xtest1.vim') + + let file2 =<< trim END + func DoAThing() + echo "DoAThing" + endfunc + + func File2Function() + call DoAThing() + endfunc + + call File2Function() + END + call writefile(file2, 'Xtest2.vim') + + let buf = RunVimInTerminal( + \ '-S Xtest1.vim -c "debug call GlobalFunction()"', + \ {'wait_for_ruler': 0}) + + " Need to wait for the vim-in-terminal to be ready + call CheckDbgOutput(buf, ['command line', + \ 'cmd: call GlobalFunction()']) + + " At this point the ontly thing in the stack is the cmdline + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ '->0 command line', + \ 'cmd: call GlobalFunction()']) + + " And now we're back into the call stack + call RunDbgCmd(buf, 'step', ['line 1: call CallAFunction()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '>backtrace', + \ ' 1 command line', + \ '->0 function GlobalFunction', + \ 'line 1: call CallAFunction()']) + + call StopVimInTerminal(buf) + call delete('Xtest1.vim') + call delete('Xtest2.vim') +endfunc + +func Test_Backtrace_DefFunction() + CheckRunVimInTerminal + CheckCWD + let file1 =<< trim END + vim9script + import File2Function from './Xtest2.vim' + + def SourceAnotherFile() + source Xtest2.vim + enddef + + def CallAFunction() + SourceAnotherFile() + File2Function() + enddef + + def g:GlobalFunction() + CallAFunction() + enddef + + defcompile + END + call writefile(file1, 'Xtest1.vim') + + let file2 =<< trim END + vim9script + + def DoAThing(): number + var a = 100 * 2 + a += 3 + return a + enddef + + export def File2Function() + DoAThing() + enddef + + defcompile + File2Function() + END + call writefile(file2, 'Xtest2.vim') + + let buf = RunVimInTerminal('-S Xtest1.vim', {}) + + call RunDbgCmd(buf, + \ ':debug call GlobalFunction()', + \ ['cmd: call GlobalFunction()']) + + " FIXME: Vim9 lines are not debugged! + call RunDbgCmd(buf, 'step', ['line 1: source Xtest2.vim']) + + " But they do appear in the backtrace + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 2 function GlobalFunction[1]', + \ '\V 1 <SNR>\.\*_CallAFunction[1]', + \ '\V->0 <SNR>\.\*_SourceAnotherFile', + \ '\Vline 1: source Xtest2.vim'], + \ #{match: 'pattern'}) + + + call RunDbgCmd(buf, 'step', ['line 1: vim9script']) + call RunDbgCmd(buf, 'step', ['line 3: def DoAThing(): number']) + call RunDbgCmd(buf, 'step', ['line 9: export def File2Function()']) + call RunDbgCmd(buf, 'step', ['line 9: def File2Function()']) + call RunDbgCmd(buf, 'step', ['line 13: defcompile']) + call RunDbgCmd(buf, 'step', ['line 14: File2Function()']) + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 3 function GlobalFunction[1]', + \ '\V 2 <SNR>\.\*_CallAFunction[1]', + \ '\V 1 <SNR>\.\*_SourceAnotherFile[1]', + \ '\V->0 script ' .. getcwd() .. '/Xtest2.vim', + \ '\Vline 14: File2Function()'], + \ #{match: 'pattern'}) + + " Don't step into compiled functions... + call RunDbgCmd(buf, 'step', ['line 15: End of sourced file']) + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 3 function GlobalFunction[1]', + \ '\V 2 <SNR>\.\*_CallAFunction[1]', + \ '\V 1 <SNR>\.\*_SourceAnotherFile[1]', + \ '\V->0 script ' .. getcwd() .. '/Xtest2.vim', + \ '\Vline 15: End of sourced file'], + \ #{match: 'pattern'}) + + + call StopVimInTerminal(buf) + call delete('Xtest1.vim') + call delete('Xtest2.vim') +endfunc + +func Test_debug_backtrace_level() + CheckRunVimInTerminal + CheckCWD + let lines =<< trim END + let s:file1_var = 'file1' + let g:global_var = 'global' + + func s:File1Func( arg ) + let s:file1_var .= a:arg + let local_var = s:file1_var .. ' test1' + let g:global_var .= local_var + source Xtest2.vim + endfunc + + call s:File1Func( 'arg1' ) + END + call writefile(lines, 'Xtest1.vim') + + let lines =<< trim END + let s:file2_var = 'file2' + + func s:File2Func( arg ) + let s:file2_var .= a:arg + let local_var = s:file2_var .. ' test2' + let g:global_var .= local_var + endfunc + + call s:File2Func( 'arg2' ) + END + call writefile(lines, 'Xtest2.vim') + + let file1 = getcwd() .. '/Xtest1.vim' + let file2 = getcwd() .. '/Xtest2.vim' + + " set a breakpoint and source file1.vim + let buf = RunVimInTerminal( + \ '-c "breakadd file 1 Xtest1.vim" -S Xtest1.vim', + \ #{ wait_for_ruler: 0 } ) + + call CheckDbgOutput(buf, [ + \ 'Breakpoint in "' .. file1 .. '" line 1', + \ 'Entering Debug mode. Type "cont" to continue.', + \ 'command line..script ' .. file1, + \ 'line 1: let s:file1_var = ''file1''' + \ ]) + + " step throught the initial declarations + call RunDbgCmd(buf, 'step', [ 'line 2: let g:global_var = ''global''' ] ) + call RunDbgCmd(buf, 'step', [ 'line 4: func s:File1Func( arg )' ] ) + call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) + call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) + call RunDbgCmd(buf, 'echo global_var', [ 'global' ] ) + + " step in to the first function + call RunDbgCmd(buf, 'step', [ 'line 11: call s:File1Func( ''arg1'' )' ] ) + call RunDbgCmd(buf, 'step', [ 'line 1: let s:file1_var .= a:arg' ] ) + call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) + call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) + call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) + call RunDbgCmd(buf, + \'echo global_var', + \[ 'E121: Undefined variable: global_var' ] ) + call RunDbgCmd(buf, + \'echo local_var', + \[ 'E121: Undefined variable: local_var' ] ) + call RunDbgCmd(buf, + \'echo l:local_var', + \[ 'E121: Undefined variable: l:local_var' ] ) + + " backtrace up + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 2 command line', + \ '\V 1 script ' .. file1 .. '[11]', + \ '\V->0 function <SNR>\.\*_File1Func', + \ '\Vline 1: let s:file1_var .= a:arg', + \ ], + \ #{ match: 'pattern' } ) + call RunDbgCmd(buf, 'up', [ '>up' ] ) + + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 2 command line', + \ '\V->1 script ' .. file1 .. '[11]', + \ '\V 0 function <SNR>\.\*_File1Func', + \ '\Vline 1: let s:file1_var .= a:arg', + \ ], + \ #{ match: 'pattern' } ) + + " Expression evaluation in the script frame (not the function frame) + " FIXME: Unexpected in this scope (a: should not be visibnle) + call RunDbgCmd(buf, 'echo a:arg', [ 'arg1' ] ) + call RunDbgCmd(buf, 'echo s:file1_var', [ 'file1' ] ) + call RunDbgCmd(buf, 'echo g:global_var', [ 'global' ] ) + " FIXME: Unexpected in this scope (global should be found) + call RunDbgCmd(buf, + \'echo global_var', + \[ 'E121: Undefined variable: global_var' ] ) + call RunDbgCmd(buf, + \'echo local_var', + \[ 'E121: Undefined variable: local_var' ] ) + call RunDbgCmd(buf, + \'echo l:local_var', + \[ 'E121: Undefined variable: l:local_var' ] ) + + + " step while backtraced jumps to the latest frame + call RunDbgCmd(buf, 'step', [ + \ 'line 2: let local_var = s:file1_var .. '' test1''' ] ) + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 2 command line', + \ '\V 1 script ' .. file1 .. '[11]', + \ '\V->0 function <SNR>\.\*_File1Func', + \ '\Vline 2: let local_var = s:file1_var .. '' test1''', + \ ], + \ #{ match: 'pattern' } ) + + call RunDbgCmd(buf, 'step', [ 'line 3: let g:global_var .= local_var' ] ) + call RunDbgCmd(buf, 'echo local_var', [ 'file1arg1 test1' ] ) + call RunDbgCmd(buf, 'echo l:local_var', [ 'file1arg1 test1' ] ) + + call RunDbgCmd(buf, 'step', [ 'line 4: source Xtest2.vim' ] ) + call RunDbgCmd(buf, 'step', [ 'line 1: let s:file2_var = ''file2''' ] ) + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 3 command line', + \ '\V 2 script ' .. file1 .. '[11]', + \ '\V 1 function <SNR>\.\*_File1Func[4]', + \ '\V->0 script ' .. file2, + \ '\Vline 1: let s:file2_var = ''file2''', + \ ], + \ #{ match: 'pattern' } ) + + " Expression evaluation in the script frame file2 (not the function frame) + call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) + call RunDbgCmd(buf, + \ 'echo s:file1_var', + \ [ 'E121: Undefined variable: s:file1_var' ] ) + call RunDbgCmd(buf, 'echo g:global_var', [ 'globalfile1arg1 test1' ] ) + call RunDbgCmd(buf, 'echo global_var', [ 'globalfile1arg1 test1' ] ) + call RunDbgCmd(buf, + \'echo local_var', + \[ 'E121: Undefined variable: local_var' ] ) + call RunDbgCmd(buf, + \'echo l:local_var', + \[ 'E121: Undefined variable: l:local_var' ] ) + call RunDbgCmd(buf, + \ 'echo s:file2_var', + \ [ 'E121: Undefined variable: s:file2_var' ] ) + + call RunDbgCmd(buf, 'step', [ 'line 3: func s:File2Func( arg )' ] ) + call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) + + " Up the stack to the other script context + call RunDbgCmd(buf, 'up') + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 3 command line', + \ '\V 2 script ' .. file1 .. '[11]', + \ '\V->1 function <SNR>\.\*_File1Func[4]', + \ '\V 0 script ' .. file2, + \ '\Vline 3: func s:File2Func( arg )', + \ ], + \ #{ match: 'pattern' } ) + " FIXME: Unexpected. Should see the a: and l: dicts from File1Func + call RunDbgCmd(buf, 'echo a:arg', [ 'E121: Undefined variable: a:arg' ] ) + call RunDbgCmd(buf, + \ 'echo l:local_var', + \ [ 'E121: Undefined variable: l:local_var' ] ) + + call RunDbgCmd(buf, 'up') + call RunDbgCmd(buf, 'backtrace', [ + \ '\V>backtrace', + \ '\V 3 command line', + \ '\V->2 script ' .. file1 .. '[11]', + \ '\V 1 function <SNR>\.\*_File1Func[4]', + \ '\V 0 script ' .. file2, + \ '\Vline 3: func s:File2Func( arg )', + \ ], + \ #{ match: 'pattern' } ) + + " FIXME: Unexpected (wrong script vars are used) + call RunDbgCmd(buf, + \ 'echo s:file1_var', + \ [ 'E121: Undefined variable: s:file1_var' ] ) + call RunDbgCmd(buf, 'echo s:file2_var', [ 'file2' ] ) + + call StopVimInTerminal(buf) + call delete('Xtest1.vim') + call delete('Xtest2.vim') +endfunc + " Test for setting a breakpoint on a :endif where the :if condition is false " and then quit the script. This should generate an interrupt. func Test_breakpt_endif_intr() diff --git a/src/nvim/testdir/test_diffmode.vim b/src/nvim/testdir/test_diffmode.vim index 21c1f98283..1ade11a8ed 100644 --- a/src/nvim/testdir/test_diffmode.vim +++ b/src/nvim/testdir/test_diffmode.vim @@ -781,17 +781,66 @@ func Test_diff_lastline() bwipe! endfunc +func WriteDiffFiles(buf, list1, list2) + call writefile(a:list1, 'Xfile1') + call writefile(a:list2, 'Xfile2') + if a:buf + call term_sendkeys(a:buf, ":checktime\<CR>") + endif +endfunc +" Verify a screendump with both the internal and external diff. +func VerifyBoth(buf, dumpfile, extra) + " trailing : for leaving the cursor on the command line + for cmd in [":set diffopt=filler" . a:extra . "\<CR>:", ":set diffopt+=internal\<CR>:"] + call term_sendkeys(a:buf, cmd) + if VerifyScreenDump(a:buf, a:dumpfile, {}, cmd =~ 'internal' ? 'internal' : 'external') + break " don't let the next iteration overwrite the "failed" file. + " don't let the next iteration overwrite the "failed" file. + return + endif + endfor + + " also test unified diff + call term_sendkeys(a:buf, ":call SetupUnified()\<CR>:") + call VerifyScreenDump(a:buf, a:dumpfile, {}, 'unified') + call term_sendkeys(a:buf, ":call StopUnified()\<CR>:") +endfunc + +" Verify a screendump with the internal diff only. +func VerifyInternal(buf, dumpfile, extra) + call term_sendkeys(a:buf, ":diffupdate!\<CR>") + " trailing : for leaving the cursor on the command line + call term_sendkeys(a:buf, ":set diffopt=internal,filler" . a:extra . "\<CR>:") + call TermWait(a:buf) + call VerifyScreenDump(a:buf, a:dumpfile, {}) +endfunc + func Test_diff_screen() CheckScreendump CheckFeature menu + let lines =<< trim END + func UnifiedDiffExpr() + " Prepend some text to check diff type detection + call writefile(['warning', ' message'], v:fname_out) + silent exe '!diff -u ' .. v:fname_in .. ' ' .. v:fname_new .. '>>' .. v:fname_out + endfunc + func SetupUnified() + set diffexpr=UnifiedDiffExpr() + endfunc + func StopUnified() + set diffexpr= + endfunc + END + call writefile(lines, 'XdiffSetup') + " 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', {}) + let buf = RunVimInTerminal('-d -S XdiffSetup 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") @@ -911,6 +960,7 @@ func Test_diff_screen() call StopVimInTerminal(buf) call delete('Xfile1') call delete('Xfile2') + call delete('XdiffSetup') endfunc func Test_diff_with_cursorline() diff --git a/src/nvim/testdir/test_eval_stuff.vim b/src/nvim/testdir/test_eval_stuff.vim index 73b57f302e..4870b9a60a 100644 --- a/src/nvim/testdir/test_eval_stuff.vim +++ b/src/nvim/testdir/test_eval_stuff.vim @@ -120,6 +120,15 @@ func Test_skip_after_throw() endtry endfunc +func Test_number_max_min_size() + " This will fail on systems without 64 bit number support or when not + " configured correctly. + call assert_equal(64, v:numbersize) + + call assert_true(v:numbermin < -9999999) + call assert_true(v:numbermax > 9999999) +endfunc + func Test_curly_assignment() let s:svar = 'svar' let g:gvar = 'gvar' diff --git a/src/nvim/testdir/test_ex_mode.vim b/src/nvim/testdir/test_ex_mode.vim new file mode 100644 index 0000000000..f70cb261e0 --- /dev/null +++ b/src/nvim/testdir/test_ex_mode.vim @@ -0,0 +1,82 @@ +" Test editing line in Ex mode (see :help Q and :help gQ). + +" Helper function to test editing line in Q Ex mode +func Ex_Q(cmd) + " Is there a simpler way to test editing Ex line? + call feedkeys("Q" + \ .. "let s:test_ex =<< END\<CR>" + \ .. a:cmd .. "\<CR>" + \ .. "END\<CR>" + \ .. "visual\<CR>", 'tx') + return s:test_ex[0] +endfunc + +" Helper function to test editing line in gQ Ex mode +func Ex_gQ(cmd) + call feedkeys("gQ" .. a:cmd .. "\<C-b>\"\<CR>", 'tx') + let ret = @:[1:] " Remove leading quote. + call feedkeys("visual\<CR>", 'tx') + return ret +endfunc + +" Helper function to test editing line with both Q and gQ Ex mode. +func Ex(cmd) + return [Ex_Q(a:cmd), Ex_gQ(a:cmd)] +endfunc + +" Test editing line in Ex mode (both Q and gQ) +func Test_ex_mode() + throw 'skipped: TODO: ' + let encoding_save = &encoding + set sw=2 + + " for e in ['utf8', 'latin1'] + for e in ['utf8'] + exe 'set encoding=' . e + + call assert_equal(['bar', 'bar'], Ex("foo bar\<C-u>bar"), e) + call assert_equal(["1\<C-u>2", "1\<C-u>2"], Ex("1\<C-v>\<C-u>2"), e) + call assert_equal(["1\<C-b>2\<C-e>3", '213'], Ex("1\<C-b>2\<C-e>3"), e) + call assert_equal(['0123', '2013'], Ex("01\<Home>2\<End>3"), e) + call assert_equal(['0123', '0213'], Ex("01\<Left>2\<Right>3"), e) + call assert_equal(['01234', '0342'], Ex("012\<Left>\<Left>\<Insert>3\<Insert>4"), e) + call assert_equal(["foo bar\<C-w>", 'foo '], Ex("foo bar\<C-w>"), e) + call assert_equal(['foo', 'foo'], Ex("fooba\<Del>\<Del>"), e) + call assert_equal(["foo\tbar", 'foobar'], Ex("foo\<Tab>bar"), e) + call assert_equal(["abbrev\t", 'abbreviate'], Ex("abbrev\<Tab>"), e) + call assert_equal([' 1', "1\<C-t>\<C-t>"], Ex("1\<C-t>\<C-t>"), e) + call assert_equal([' 1', "1\<C-t>\<C-t>"], Ex("1\<C-t>\<C-t>\<C-d>"), e) + call assert_equal([' foo', ' foo'], Ex(" foo\<C-d>"), e) + call assert_equal(['foo', ' foo0'], Ex(" foo0\<C-d>"), e) + call assert_equal(['foo', ' foo^'], Ex(" foo^\<C-d>"), e) + endfor + + set sw& + let &encoding = encoding_save +endfunc + +func Test_ex_mode_errors() + " Not allowed to enter ex mode when text is locked + au InsertCharPre <buffer> normal! gQ<CR> + let caught_e523 = 0 + try + call feedkeys("ix\<esc>", 'xt') + catch /^Vim\%((\a\+)\)\=:E523/ " catch E523 + let caught_e523 = 1 + endtry + call assert_equal(1, caught_e523) + au! InsertCharPre + + new + au CmdLineEnter * call ExEnterFunc() + func ExEnterFunc() + + endfunc + call feedkeys("gQvi\r", 'xt') + + au! CmdLineEnter + delfunc ExEnterFunc + quit +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_excmd.vim b/src/nvim/testdir/test_excmd.vim index 98a3e60368..ed2bb2c06b 100644 --- a/src/nvim/testdir/test_excmd.vim +++ b/src/nvim/testdir/test_excmd.vim @@ -47,13 +47,139 @@ func Test_buffers_lastused() endfor call assert_equal(['bufb', 'bufa', 'bufc'], names) - call assert_match('[0-2] seconds ago', bufs[1][1]) + call assert_match('[0-2] seconds\= ago', bufs[1][1]) bwipeout bufa bwipeout bufb bwipeout bufc endfunc +" Test for the :copy command +func Test_copy() + new + + call setline(1, ['L1', 'L2', 'L3', 'L4']) + " copy lines in a range to inside the range + 1,3copy 2 + call assert_equal(['L1', 'L2', 'L1', 'L2', 'L3', 'L3', 'L4'], getline(1, 7)) + + close! +endfunc + +" Test for the :file command +func Test_file_cmd() + call assert_fails('3file', 'E474:') + call assert_fails('0,0file', 'E474:') + call assert_fails('0file abc', 'E474:') +endfunc + +" Test for the :drop command +func Test_drop_cmd() + call writefile(['L1', 'L2'], 'Xfile') + enew | only + drop Xfile + call assert_equal('L2', getline(2)) + " Test for switching to an existing window + below new + drop Xfile + call assert_equal(1, winnr()) + " Test for splitting the current window + enew | only + set modified + drop Xfile + call assert_equal(2, winnr('$')) + " Check for setting the argument list + call assert_equal(['Xfile'], argv()) + enew | only! + call delete('Xfile') +endfunc + +" Test for the :append command +func Test_append_cmd() + new + call setline(1, [' L1']) + call feedkeys(":append\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) + %delete _ + " append after a specific line + call setline(1, [' L1', ' L2', ' L3']) + call feedkeys(":2append\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L2', ' L4', ' L5', ' L3'], getline(1, '$')) + %delete _ + " append with toggling 'autoindent' + call setline(1, [' L1']) + call feedkeys(":append!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) + call assert_false(&autoindent) + %delete _ + " append with 'autoindent' set and toggling 'autoindent' + set autoindent + call setline(1, [' L1']) + call feedkeys(":append!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L2', ' L3'], getline(1, '$')) + call assert_true(&autoindent) + set autoindent& + close! +endfunc + +" Test for the :insert command +func Test_insert_cmd() + set noautoindent " test assumes noautoindent, but it's on by default in Nvim + new + call setline(1, [' L1']) + call feedkeys(":insert\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) + %delete _ + " insert before a specific line + call setline(1, [' L1', ' L2', ' L3']) + call feedkeys(":2insert\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L4', ' L5', ' L2', ' L3'], getline(1, '$')) + %delete _ + " insert with toggling 'autoindent' + call setline(1, [' L1']) + call feedkeys(":insert!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) + call assert_false(&autoindent) + %delete _ + " insert with 'autoindent' set and toggling 'autoindent' + set autoindent + call setline(1, [' L1']) + call feedkeys(":insert!\<CR> L2\<CR> L3\<CR>.\<CR>", 'xt') + call assert_equal([' L2', ' L3', ' L1'], getline(1, '$')) + call assert_true(&autoindent) + set autoindent& + close! +endfunc + +" Test for the :change command +func Test_change_cmd() + set noautoindent " test assumes noautoindent, but it's on by default in Nvim + new + call setline(1, [' L1', 'L2', 'L3']) + call feedkeys(":change\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) + %delete _ + " change a specific line + call setline(1, [' L1', ' L2', ' L3']) + call feedkeys(":2change\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L1', ' L4', ' L5', ' L3'], getline(1, '$')) + %delete _ + " change with toggling 'autoindent' + call setline(1, [' L1', 'L2', 'L3']) + call feedkeys(":change!\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) + call assert_false(&autoindent) + %delete _ + " change with 'autoindent' set and toggling 'autoindent' + set autoindent + call setline(1, [' L1', 'L2', 'L3']) + call feedkeys(":change!\<CR> L4\<CR> L5\<CR>.\<CR>", 'xt') + call assert_equal([' L4', ' L5', 'L2', 'L3'], getline(1, '$')) + call assert_true(&autoindent) + set autoindent& + close! +endfunc + " Test for the :confirm command dialog func Test_confirm_cmd() CheckNotGui @@ -132,6 +258,61 @@ func Test_confirm_cmd_cancel() call StopVimInTerminal(buf) endfunc +func Test_confirm_write_ro() + CheckNotGui + CheckRunVimInTerminal + + call writefile(['foo'], 'Xconfirm_write_ro') + let lines =<< trim END + set nobackup ff=unix cmdheight=2 + edit Xconfirm_write_ro + norm Abar + END + call writefile(lines, 'Xscript') + let buf = RunVimInTerminal('-S Xscript', {'rows': 20}) + + " Try to write with 'ro' option. + call term_sendkeys(buf, ":set ro | confirm w\n") + call WaitForAssert({-> assert_match("^'readonly' option is set for \"Xconfirm_write_ro\"\. *$", + \ term_getline(buf, 18))}, 1000) + call WaitForAssert({-> assert_match('^Do you wish to write anyway? *$', + \ term_getline(buf, 19))}, 1000) + call WaitForAssert({-> assert_match('^(Y)es, \[N\]o: *$', term_getline(buf, 20))}, 1000) + call term_sendkeys(buf, 'N') + call WaitForAssert({-> assert_match('^ *$', term_getline(buf, 19))}, 1000) + call WaitForAssert({-> assert_match('.* All$', term_getline(buf, 20))}, 1000) + call assert_equal(['foo'], readfile('Xconfirm_write_ro')) + + call term_sendkeys(buf, ":confirm w\n") + call WaitForAssert({-> assert_match("^'readonly' option is set for \"Xconfirm_write_ro\"\. *$", + \ term_getline(buf, 18))}, 1000) + call WaitForAssert({-> assert_match('^Do you wish to write anyway? *$', + \ term_getline(buf, 19))}, 1000) + call WaitForAssert({-> assert_match('^(Y)es, \[N\]o: *$', term_getline(buf, 20))}, 1000) + call term_sendkeys(buf, 'Y') + call WaitForAssert({-> assert_match('^"Xconfirm_write_ro" 1L, 7B written$', + \ term_getline(buf, 19))}, 1000) + call assert_equal(['foobar'], readfile('Xconfirm_write_ro')) + + " Try to write with read-only file permissions. + call setfperm('Xconfirm_write_ro', 'r--r--r--') + call term_sendkeys(buf, ":set noro | undo | confirm w\n") + call WaitForAssert({-> assert_match("^File permissions of \"Xconfirm_write_ro\" are read-only\. *$", + \ term_getline(buf, 17))}, 1000) + call WaitForAssert({-> assert_match('^It may still be possible to write it\. *$', + \ term_getline(buf, 18))}, 1000) + call WaitForAssert({-> assert_match('^Do you wish to try? *$', term_getline(buf, 19))}, 1000) + call WaitForAssert({-> assert_match('^(Y)es, \[N\]o: *$', term_getline(buf, 20))}, 1000) + call term_sendkeys(buf, 'Y') + call WaitForAssert({-> assert_match('^"Xconfirm_write_ro" 1L, 4B written$', + \ term_getline(buf, 19))}, 1000) + call assert_equal(['foo'], readfile('Xconfirm_write_ro')) + + call StopVimInTerminal(buf) + call delete('Xscript') + call delete('Xconfirm_write_ro') +endfunc + " Test for the :winsize command func Test_winsize_cmd() call assert_fails('winsize 1', 'E465:') diff --git a/src/nvim/testdir/test_exec_while_if.vim b/src/nvim/testdir/test_exec_while_if.vim index d6afabff45..3da2784d77 100644 --- a/src/nvim/testdir/test_exec_while_if.vim +++ b/src/nvim/testdir/test_exec_while_if.vim @@ -1,6 +1,6 @@ -" Test for :execute, :while and :if +" Test for :execute, :while, :for and :if -function Test_exec_while_if() +func Test_exec_while_if() new let i = 0 @@ -50,4 +50,6 @@ function Test_exec_while_if() \ "7x999999999888888887777777666666555554444333221", \ "8", \ "9x"], getline(1, 10)) -endfunction +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_execute_func.vim b/src/nvim/testdir/test_execute_func.vim index eb84a6739d..15ba894dbe 100644 --- a/src/nvim/testdir/test_execute_func.vim +++ b/src/nvim/testdir/test_execute_func.vim @@ -1,5 +1,7 @@ " test execute() +source view_util.vim + func NestedEval() let nested = execute('echo "nested\nlines"') echo 'got: "' . nested . '"' @@ -82,3 +84,54 @@ func Test_execute_not_silent() endfor call assert_equal('xyz ', text2) endfunc + +func Test_win_execute() + let thiswin = win_getid() + new + let otherwin = win_getid() + call setline(1, 'the new window') + call win_gotoid(thiswin) + let line = win_execute(otherwin, 'echo getline(1)') + call assert_match('the new window', line) + let line = win_execute(134343, 'echo getline(1)') + call assert_equal('', line) + + if has('textprop') + let popupwin = popup_create('the popup win', {'line': 2, 'col': 3}) + redraw + let line = win_execute(popupwin, 'echo getline(1)') + call assert_match('the popup win', line) + + call popup_close(popupwin) + endif + + call win_gotoid(otherwin) + bwipe! +endfunc + +func Test_win_execute_update_ruler() + enew + call setline(1, range(500)) + 20 + split + let winid = win_getid() + set ruler + wincmd w + let height = winheight(winid) + redraw + call assert_match('20,1', Screenline(height + 1)) + let line = win_execute(winid, 'call cursor(100, 1)') + redraw + call assert_match('100,1', Screenline(height + 1)) + + bwipe! +endfunc + +func Test_win_execute_other_tab() + let thiswin = win_getid() + tabnew + call win_execute(thiswin, 'let xyz = 1') + call assert_equal(1, xyz) + tabclose + unlet xyz +endfunc diff --git a/src/nvim/testdir/test_expr.vim b/src/nvim/testdir/test_expr.vim index 09d79979ce..0b41a1127a 100644 --- a/src/nvim/testdir/test_expr.vim +++ b/src/nvim/testdir/test_expr.vim @@ -501,3 +501,12 @@ func Test_empty_concatenate() call assert_equal('b', 'a'[4:0] . 'b') call assert_equal('b', 'b' . 'a'[4:0]) endfunc + +func Test_eval_after_if() + let s:val = '' + func SetVal(x) + let s:val ..= a:x + endfunc + if 0 | eval SetVal('a') | endif | call SetVal('b') + call assert_equal('b', s:val) +endfunc diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim index 44b8479621..056b953d0b 100644 --- a/src/nvim/testdir/test_filetype.vim +++ b/src/nvim/testdir/test_filetype.vim @@ -45,7 +45,7 @@ endfunc " Filetypes detected just from matching the file name. let s:filename_checks = { \ '8th': ['file.8th'], - \ 'a2ps': ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc'], + \ 'a2ps': ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc', 'any/etc/a2ps.cfg', 'any/etc/a2ps/file.cfg'], \ 'a65': ['file.a65'], \ 'aap': ['file.aap'], \ 'abap': ['file.abap'], @@ -55,23 +55,24 @@ let s:filename_checks = { \ 'ada': ['file.adb', 'file.ads', 'file.ada', 'file.gpr'], \ 'ahdl': ['file.tdf'], \ 'aidl': ['file.aidl'], - \ 'alsaconf': ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf'], + \ 'alsaconf': ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf', 'any/etc/asound.conf', 'any/usr/share/alsa/alsa.conf'], \ 'aml': ['file.aml'], \ 'ampl': ['file.run'], \ 'ant': ['build.xml'], - \ 'apache': ['.htaccess', '/etc/httpd/file.conf', '/etc/apache2/sites-2/file.com', '/etc/apache2/some.config', '/etc/apache2/conf.file/conf', '/etc/apache2/mods-some/file', '/etc/apache2/sites-some/file', '/etc/httpd/conf.d/file.config'], - \ 'apachestyle': ['/etc/proftpd/file.config,/etc/proftpd/conf.file/file'], + \ 'apache': ['.htaccess', '/etc/httpd/file.conf', '/etc/apache2/sites-2/file.com', '/etc/apache2/some.config', '/etc/apache2/conf.file/conf', '/etc/apache2/mods-some/file', '/etc/apache2/sites-some/file', '/etc/httpd/conf.d/file.config', '/etc/apache2/conf.file/file', '/etc/apache2/file.conf', '/etc/apache2/file.conf-file', '/etc/apache2/mods-file/file', '/etc/apache2/sites-file/file', '/etc/apache2/sites-file/file.com', '/etc/httpd/conf.d/file.conf', '/etc/httpd/conf.d/file.conf-file', 'access.conf', 'access.conf-file', 'any/etc/apache2/conf.file/file', 'any/etc/apache2/file.conf', 'any/etc/apache2/file.conf-file', 'any/etc/apache2/mods-file/file', 'any/etc/apache2/sites-file/file', 'any/etc/apache2/sites-file/file.com', 'any/etc/httpd/conf.d/file.conf', 'any/etc/httpd/conf.d/file.conf-file', 'any/etc/httpd/file.conf', 'apache.conf', 'apache.conf-file', 'apache2.conf', 'apache2.conf-file', 'httpd.conf', 'httpd.conf-file', 'srm.conf', 'srm.conf-file'], + \ 'apachestyle': ['/etc/proftpd/file.config,/etc/proftpd/conf.file/file', '/etc/proftpd/conf.file/file', '/etc/proftpd/file.conf', '/etc/proftpd/file.conf-file', 'any/etc/proftpd/conf.file/file', 'any/etc/proftpd/file.conf', 'any/etc/proftpd/file.conf-file', 'proftpd.conf', 'proftpd.conf-file'], \ 'applescript': ['file.scpt'], - \ 'aptconf': ['apt.conf', '/.aptitude/config'], - \ 'arch': ['.arch-inventory'], + \ 'aptconf': ['apt.conf', '/.aptitude/config', 'any/.aptitude/config'], + \ 'arch': ['.arch-inventory', '=tagging-method'], \ 'arduino': ['file.ino', 'file.pde'], \ 'art': ['file.art'], \ 'asciidoc': ['file.asciidoc', 'file.adoc'], \ 'asn': ['file.asn', 'file.asn1'], + \ 'asterisk': ['asterisk/file.conf', 'asterisk/file.conf-file', 'some-asterisk/file.conf', 'some-asterisk/file.conf-file'], \ 'atlas': ['file.atl', 'file.as'], \ 'autohotkey': ['file.ahk'], \ 'autoit': ['file.au3'], - \ 'automake': ['GNUmakefile.am'], + \ 'automake': ['GNUmakefile.am', 'makefile.am', 'Makefile.am'], \ 'ave': ['file.ave'], \ 'awk': ['file.awk', 'file.gawk'], \ 'b': ['file.mch', 'file.ref', 'file.imp'], @@ -80,23 +81,23 @@ let s:filename_checks = { \ 'bdf': ['file.bdf'], \ 'bib': ['file.bib'], \ 'beancount': ['file.beancount'], - \ 'bindzone': ['named.root'], + \ 'bindzone': ['named.root', '/bind/db.file', '/named/db.file', 'any/bind/db.file', 'any/named/db.file'], \ 'blank': ['file.bl'], - \ 'bsdl': ['file.bsd', 'file.bsdl'], + \ 'bsdl': ['file.bsd', 'file.bsdl', 'bsd', 'some-bsd'], \ 'bst': ['file.bst'], - \ 'bzr': ['bzr_log.any'], - \ 'c': ['enlightenment/file.cfg', 'file.qc', 'file.c'], + \ 'bzr': ['bzr_log.any', 'bzr_log.file'], + \ 'c': ['enlightenment/file.cfg', 'file.qc', 'file.c', 'some-enlightenment/file.cfg'], \ 'cabal': ['file.cabal'], \ 'cabalconfig': ['cabal.config'], \ 'cabalproject': ['cabal.project', 'cabal.project.local'], - \ 'calendar': ['calendar'], - \ 'catalog': ['catalog', 'sgml.catalogfile'], + \ 'calendar': ['calendar', '/.calendar/file', '/share/calendar/any/calendar.file', '/share/calendar/calendar.file', 'any/share/calendar/any/calendar.file', 'any/share/calendar/calendar.file'], + \ 'catalog': ['catalog', 'sgml.catalogfile', 'sgml.catalog', 'sgml.catalog-file'], \ 'cdl': ['file.cdl'], - \ 'cdrdaoconf': ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao'], + \ 'cdrdaoconf': ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao', 'any/etc/cdrdao.conf', 'any/etc/default/cdrdao', 'any/etc/defaults/cdrdao'], \ 'cdrtoc': ['file.toc'], \ 'cf': ['file.cfm', 'file.cfi', 'file.cfc'], \ 'cfengine': ['cfengine.conf'], - \ 'cfg': ['file.cfg', 'file.hgrc', 'filehgrc'], + \ 'cfg': ['file.cfg', 'file.hgrc', 'filehgrc', 'hgrc', 'some-hgrc'], \ 'ch': ['file.chf'], \ 'chaiscript': ['file.chai'], \ 'chaskell': ['file.chs'], @@ -106,15 +107,16 @@ let s:filename_checks = { \ 'clean': ['file.dcl', 'file.icl'], \ 'clojure': ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'], \ 'cmake': ['CMakeLists.txt', 'file.cmake', 'file.cmake.in'], - \ 'cmusrc': ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme'], + \ 'cmusrc': ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme', '/.cmus/autosave', '/.cmus/command-history', '/.cmus/file.theme', '/.cmus/rc', '/cmus/file.theme', '/cmus/rc'], \ 'cobol': ['file.cbl', 'file.cob', 'file.lib'], \ 'coco': ['file.atg'], \ 'conaryrecipe': ['file.recipe'], \ 'conf': ['auto.master'], - \ 'config': ['configure.in', 'configure.ac', 'Pipfile'], + \ 'config': ['configure.in', 'configure.ac', 'Pipfile', '/etc/hostname.file'], \ 'context': ['tex/context/any/file.tex', 'file.mkii', 'file.mkiv', 'file.mkvi', 'file.mkxl', 'file.mklx'], \ 'cpp': ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh'], \ 'crm': ['file.crm'], + \ 'crontab': ['crontab', 'crontab.file', '/etc/cron.d/file', 'any/etc/cron.d/file'], \ 'cs': ['file.cs'], \ 'csc': ['file.csc'], \ 'csdl': ['file.csdl'], @@ -122,7 +124,7 @@ let s:filename_checks = { \ 'css': ['file.css'], \ 'cterm': ['file.con'], \ 'cucumber': ['file.feature'], - \ 'cuda': ['file.cu'], + \ 'cuda': ['file.cu', 'file.cuh'], \ 'cupl': ['file.pld'], \ 'cuplsim': ['file.si'], \ 'cvs': ['cvs123'], @@ -132,8 +134,9 @@ let s:filename_checks = { \ 'datascript': ['file.ds'], \ 'dcd': ['file.dcd'], \ 'debchangelog': ['changelog.Debian', 'changelog.dch', 'NEWS.Debian', 'NEWS.dch', '/debian/changelog'], - \ 'debcontrol': ['/debian/control'], - \ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list'], + \ 'debcontrol': ['/debian/control', 'any/debian/control'], + \ 'debcopyright': ['/debian/copyright', 'any/debian/copyright'], + \ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list', 'any/etc/apt/sources.list', 'any/etc/apt/sources.list.d/file.list'], \ 'def': ['file.def'], \ 'denyhosts': ['denyhosts.conf'], \ 'desc': ['file.desc'], @@ -141,13 +144,13 @@ let s:filename_checks = { \ 'dictconf': ['dict.conf', '.dictrc'], \ 'dictdconf': ['dictd.conf'], \ 'diff': ['file.diff', 'file.rej'], - \ 'dircolors': ['.dir_colors', '.dircolors', '/etc/DIR_COLORS'], - \ 'dnsmasq': ['/etc/dnsmasq.conf'], - \ 'dockerfile': ['Dockerfile', 'file.Dockerfile'], + \ 'dircolors': ['.dir_colors', '.dircolors', '/etc/DIR_COLORS', 'any/etc/DIR_COLORS'], + \ 'dnsmasq': ['/etc/dnsmasq.conf', '/etc/dnsmasq.d/file', 'any/etc/dnsmasq.conf', 'any/etc/dnsmasq.d/file'], + \ 'dockerfile': ['Containerfile', 'Dockerfile', 'file.Dockerfile'], \ 'dosbatch': ['file.bat', 'file.sys'], - \ 'dosini': ['.editorconfig', '/etc/pacman.conf', '/etc/yum.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5'], + \ 'dosini': ['.editorconfig', '/etc/pacman.conf', '/etc/yum.conf', 'file.ini', 'npmrc', '.npmrc', 'php.ini', 'php.ini-5', 'php.ini-file', '/etc/yum.repos.d/file', 'any/etc/pacman.conf', 'any/etc/yum.conf', 'any/etc/yum.repos.d/file', 'file.wrap'], \ 'dot': ['file.dot', 'file.gv'], - \ 'dracula': ['file.drac', 'file.drc', 'filelvs', 'filelpe'], + \ 'dracula': ['file.drac', 'file.drc', 'filelvs', 'filelpe', 'drac.file', 'lpe', 'lvs', 'some-lpe', 'some-lvs'], \ 'dsl': ['file.dsl'], \ 'dtd': ['file.dtd'], \ 'dts': ['file.dts', 'file.dtsi'], @@ -163,10 +166,10 @@ let s:filename_checks = { \ 'epuppet': ['file.epp'], \ 'erlang': ['file.erl', 'file.hrl', 'file.yaws'], \ 'eruby': ['file.erb', 'file.rhtml'], - \ 'esmtprc': ['anyesmtprc'], + \ 'esmtprc': ['anyesmtprc', 'esmtprc', 'some-esmtprc'], \ 'esqlc': ['file.ec', 'file.EC'], \ 'esterel': ['file.strl'], - \ 'eterm': ['anyEterm/file.cfg'], + \ 'eterm': ['anyEterm/file.cfg', 'Eterm/file.cfg', 'some-Eterm/file.cfg'], \ 'exim': ['exim.conf'], \ 'expect': ['file.exp'], \ 'exports': ['exports'], @@ -179,16 +182,18 @@ let s:filename_checks = { \ 'focexec': ['file.fex', 'file.focexec'], \ 'forth': ['file.fs', 'file.ft', 'file.fth'], \ 'fortran': ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'], + \ 'fpcmake': ['file.fpc'], \ 'framescript': ['file.fsl'], \ 'freebasic': ['file.fb', 'file.bi'], \ 'fstab': ['fstab', 'mtab'], + \ 'fvwm': ['/.fvwm/file', 'any/.fvwm/file'], \ 'gdb': ['.gdbinit'], \ 'gdmo': ['file.mo', 'file.gdmo'], - \ 'gedcom': ['file.ged', 'lltxxxxx.txt'], + \ 'gedcom': ['file.ged', 'lltxxxxx.txt', '/tmp/lltmp', '/tmp/lltmp-file', 'any/tmp/lltmp', 'any/tmp/lltmp-file'], \ 'gift': ['file.gift'], \ 'gitcommit': ['COMMIT_EDITMSG', 'MERGE_MSG', 'TAG_EDITMSG'], - \ 'gitconfig': ['file.git/config', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config', '/etc/gitconfig'], - \ 'gitolite': ['gitolite.conf'], + \ 'gitconfig': ['file.git/config', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config', '/etc/gitconfig', '/etc/gitconfig.d/file', '/.gitconfig.d/file', 'any/.config/git/config', 'any/.gitconfig.d/file', 'some.git/config', 'some.git/modules/any/config'], + \ 'gitolite': ['gitolite.conf', '/gitolite-admin/conf/file', 'any/gitolite-admin/conf/file'], \ 'gitrebase': ['git-rebase-todo'], \ 'gitsendemail': ['.gitsendemail.msg.xxxxxx'], \ 'gkrellmrc': ['gkrellmrc', 'gkrellmrc_x'], @@ -196,14 +201,14 @@ let s:filename_checks = { \ 'gnuplot': ['file.gpi'], \ 'go': ['file.go'], \ 'gp': ['file.gp', '.gprc'], - \ 'gpg': ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel'], + \ 'gpg': ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel', 'any/.gnupg/gpg.conf', 'any/.gnupg/options', 'any/usr/any/gnupg/options.skel'], \ 'grads': ['file.gs'], \ 'gretl': ['file.gretl'], \ 'groovy': ['file.gradle', 'file.groovy'], - \ 'group': ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak'], - \ 'grub': ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf'], + \ 'group': ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak', '/etc/group', '/etc/group-', '/etc/group.edit', '/etc/gshadow', '/etc/gshadow-', '/etc/gshadow.edit', '/var/backups/group.bak', '/var/backups/gshadow.bak'], + \ 'grub': ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf', 'any/boot/grub/grub.conf', 'any/boot/grub/menu.lst', 'any/etc/grub.conf'], \ 'gsp': ['file.gsp'], - \ 'gtkrc': ['.gtkrc', 'gtkrc'], + \ 'gtkrc': ['.gtkrc', 'gtkrc', '.gtkrc-file', 'gtkrc-file'], \ 'haml': ['file.haml'], \ 'hamster': ['file.hsm'], \ 'haskell': ['file.hs', 'file.hsc', 'file.hs-boot'], @@ -215,24 +220,35 @@ let s:filename_checks = { \ 'hgcommit': ['hg-editor-file.txt'], \ 'hog': ['file.hog', 'snort.conf', 'vision.conf'], \ 'hollywood': ['file.hws'], - \ 'hostconf': ['/etc/host.conf'], - \ 'hostsaccess': ['/etc/hosts.allow', '/etc/hosts.deny'], + \ 'hostconf': ['/etc/host.conf', 'any/etc/host.conf'], + \ 'hostsaccess': ['/etc/hosts.allow', '/etc/hosts.deny', 'any/etc/hosts.allow', 'any/etc/hosts.deny'], + \ 'logcheck': ['/etc/logcheck/file.d-some/file', '/etc/logcheck/file.d/file', 'any/etc/logcheck/file.d-some/file', 'any/etc/logcheck/file.d/file'], + \ 'modula3': ['file.m3', 'file.mg', 'file.i3', 'file.ig'], + \ 'natural': ['file.NSA', 'file.NSC', 'file.NSG', 'file.NSL', 'file.NSM', 'file.NSN', 'file.NSP', 'file.NSS'], + \ 'neomuttrc': ['Neomuttrc', '.neomuttrc', '.neomuttrc-file', '/.neomutt/neomuttrc', '/.neomutt/neomuttrc-file', 'Neomuttrc', 'Neomuttrc-file', 'any/.neomutt/neomuttrc', 'any/.neomutt/neomuttrc-file', 'neomuttrc', 'neomuttrc-file'], + \ 'opl': ['file.OPL', 'file.OPl', 'file.OpL', 'file.Opl', 'file.oPL', 'file.oPl', 'file.opL', 'file.opl'], + \ 'pcmk': ['file.pcmk'], + \ 'r': ['file.r'], + \ 'rhelp': ['file.rd'], + \ 'rmd': ['file.rmd', 'file.smd'], + \ 'rnoweb': ['file.rnw', 'file.snw'], + \ 'rrst': ['file.rrst', 'file.srst'], \ 'template': ['file.tmpl'], \ 'htmlm4': ['file.html.m4'], \ 'httest': ['file.htt', 'file.htb'], \ 'ibasic': ['file.iba', 'file.ibi'], - \ 'icemenu': ['/.icewm/menu'], + \ 'icemenu': ['/.icewm/menu', 'any/.icewm/menu'], \ 'icon': ['file.icn'], \ 'indent': ['.indent.pro', 'indentrc'], \ 'inform': ['file.inf', 'file.INF'], - \ 'initng': ['/etc/initng/any/file.i', 'file.ii'], + \ 'initng': ['/etc/initng/any/file.i', 'file.ii', 'any/etc/initng/any/file.i'], \ 'inittab': ['inittab'], \ 'ipfilter': ['ipf.conf', 'ipf6.conf', 'ipf.rules'], \ 'iss': ['file.iss'], \ 'ist': ['file.ist', 'file.mst'], \ 'j': ['file.ijs'], \ 'jal': ['file.jal', 'file.JAL'], - \ 'jam': ['file.jpl', 'file.jpr'], + \ 'jam': ['file.jpl', 'file.jpr', 'JAM-file.file', 'JAM.file', 'Prl-file.file', 'Prl.file'], \ 'java': ['file.java', 'file.jav'], \ 'javacc': ['file.jj', 'file.jjt'], \ 'javascript': ['file.js', 'file.javascript', 'file.es', 'file.mjs', 'file.cjs'], @@ -240,10 +256,10 @@ let s:filename_checks = { \ 'jess': ['file.clp'], \ 'jgraph': ['file.jgr'], \ 'jovial': ['file.jov', 'file.j73', 'file.jovial'], - \ 'jproperties': ['file.properties', 'file.properties_xx', 'file.properties_xx_xx'], + \ 'jproperties': ['file.properties', 'file.properties_xx', 'file.properties_xx_xx', 'some.properties_xx_xx_file'], \ 'json': ['file.json', 'file.jsonp', 'file.webmanifest', 'Pipfile.lock'], \ 'jsp': ['file.jsp'], - \ 'kconfig': ['Kconfig', 'Kconfig.debug'], + \ 'kconfig': ['Kconfig', 'Kconfig.debug', 'Kconfig.file'], \ 'kivy': ['file.kv'], \ 'kix': ['file.kix'], \ 'kotlin': ['file.kt', 'file.ktm', 'file.kts'], @@ -255,18 +271,18 @@ let s:filename_checks = { \ 'ldif': ['file.ldif'], \ 'less': ['file.less'], \ 'lex': ['file.lex', 'file.l', 'file.lxx', 'file.l++'], - \ 'lftp': ['lftp.conf', '.lftprc', 'anylftp/rc'], + \ 'lftp': ['lftp.conf', '.lftprc', 'anylftp/rc', 'lftp/rc', 'some-lftp/rc'], \ 'lhaskell': ['file.lhs'], - \ 'libao': ['/etc/libao.conf', '/.libao'], + \ 'libao': ['/etc/libao.conf', '/.libao', 'any/.libao', 'any/etc/libao.conf'], \ 'lifelines': ['file.ll'], - \ 'lilo': ['lilo.conf'], - \ 'limits': ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf'], + \ 'lilo': ['lilo.conf', 'lilo.conf-file'], + \ 'limits': ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf', '/etc/limits.conf', '/etc/limits.d/file.conf', '/etc/some-limits.conf', '/etc/some-limits.d/file.conf', 'any/etc/limits', 'any/etc/limits.conf', 'any/etc/limits.d/file.conf', 'any/etc/some-limits.conf', 'any/etc/some-limits.d/file.conf'], \ 'liquid': ['file.liquid'], \ 'lisp': ['file.lsp', 'file.lisp', 'file.el', 'file.cl', '.emacs', '.sawfishrc', 'sbclrc', '.sbclrc'], \ 'lite': ['file.lite', 'file.lt'], - \ 'litestep': ['/LiteStep/any/file.rc'], - \ 'loginaccess': ['/etc/login.access'], - \ 'logindefs': ['/etc/login.defs'], + \ 'litestep': ['/LiteStep/any/file.rc', 'any/LiteStep/any/file.rc'], + \ 'loginaccess': ['/etc/login.access', 'any/etc/login.access'], + \ 'logindefs': ['/etc/login.defs', 'any/etc/login.defs'], \ 'logtalk': ['file.lgt'], \ 'lotos': ['file.lot', 'file.lotos'], \ 'lout': ['file.lou', 'file.lout'], @@ -275,13 +291,15 @@ let s:filename_checks = { \ 'lss': ['file.lss'], \ 'lua': ['file.lua', 'file.rockspec', 'file.nse'], \ 'lynx': ['lynx.cfg'], + \ 'm3build': ['m3makefile', 'm3overrides'], + \ 'm3quake': ['file.quake', 'cm3.cfg'], \ 'm4': ['file.at'], - \ 'mail': ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml'], - \ 'mailaliases': ['/etc/mail/aliases', '/etc/aliases'], + \ 'mail': ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml', 'reportbug-file'], + \ 'mailaliases': ['/etc/mail/aliases', '/etc/aliases', 'any/etc/aliases', 'any/etc/mail/aliases'], \ 'mailcap': ['.mailcap', 'mailcap'], - \ 'make': ['file.mk', 'file.mak', 'file.dsp'], + \ 'make': ['file.mk', 'file.mak', 'file.dsp', 'makefile', 'Makefile', 'makefile-file', 'Makefile-file', 'some-makefile', 'some-Makefile'], \ 'mallard': ['file.page'], - \ 'manconf': ['/etc/man.conf', 'man.config'], + \ 'manconf': ['/etc/man.conf', 'man.config', 'any/etc/man.conf'], \ 'map': ['file.map'], \ 'maple': ['file.mv', 'file.mpl', 'file.mws'], \ 'markdown': ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'], @@ -303,27 +321,27 @@ let s:filename_checks = { \ 'mix': ['file.mix', 'file.mixal'], \ 'mma': ['file.nb'], \ 'mmp': ['file.mmp'], - \ 'modconf': ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules'], + \ 'modconf': ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules', '/etc/modprobe.file', 'any/etc/conf.modules', 'any/etc/modprobe.file', 'any/etc/modules', 'any/etc/modules.conf'], \ 'modula2': ['file.m2', 'file.mi'], \ 'monk': ['file.isc', 'file.monk', 'file.ssc', 'file.tsc'], \ 'moo': ['file.moo'], \ 'mp': ['file.mp'], - \ 'mplayerconf': ['mplayer.conf', '/.mplayer/config'], + \ 'mplayerconf': ['mplayer.conf', '/.mplayer/config', 'any/.mplayer/config'], \ 'mrxvtrc': ['mrxvtrc', '.mrxvtrc'], \ 'msidl': ['file.odl', 'file.mof'], \ 'msql': ['file.msql'], \ 'mupad': ['file.mu'], \ 'mush': ['file.mush'], - \ 'muttrc': ['Muttngrc', 'Muttrc'], + \ 'muttrc': ['Muttngrc', 'Muttrc', '.muttngrc', '.muttngrc-file', '.muttrc', '.muttrc-file', '/.mutt/muttngrc', '/.mutt/muttngrc-file', '/.mutt/muttrc', '/.mutt/muttrc-file', '/.muttng/muttngrc', '/.muttng/muttngrc-file', '/.muttng/muttrc', '/.muttng/muttrc-file', '/etc/Muttrc.d/file', 'Muttngrc-file', 'Muttrc-file', 'any/.mutt/muttngrc', 'any/.mutt/muttngrc-file', 'any/.mutt/muttrc', 'any/.mutt/muttrc-file', 'any/.muttng/muttngrc', 'any/.muttng/muttngrc-file', 'any/.muttng/muttrc', 'any/.muttng/muttrc-file', 'any/etc/Muttrc.d/file', 'muttngrc', 'muttngrc-file', 'muttrc', 'muttrc-file'], \ 'mysql': ['file.mysql'], \ 'n1ql': ['file.n1ql', 'file.nql'], - \ 'named': ['namedfile.conf', 'rndcfile.conf'], - \ 'nanorc': ['/etc/nanorc', 'file.nanorc'], + \ 'named': ['namedfile.conf', 'rndcfile.conf', 'named-file.conf', 'named.conf', 'rndc-file.conf', 'rndc-file.key', 'rndc.conf', 'rndc.key'], + \ 'nanorc': ['/etc/nanorc', 'file.nanorc', 'any/etc/nanorc'], \ 'ncf': ['file.ncf'], \ 'netrc': ['.netrc'], \ 'ninja': ['file.ninja'], \ 'nqc': ['file.nqc'], - \ 'nroff': ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom'], + \ 'nroff': ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom', 'tmac.file'], \ 'nsis': ['file.nsi', 'file.nsh'], \ 'obj': ['file.obj'], \ 'ocaml': ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit', 'file.mlt', 'file.mlp', 'file.mlip', 'file.mli.cppo', 'file.ml.cppo'], @@ -332,16 +350,15 @@ let s:filename_checks = { \ 'opam': ['opam', 'file.opam', 'file.opam.template'], \ 'openroad': ['file.or'], \ 'ora': ['file.ora'], - \ 'pamconf': ['/etc/pam.conf'], - \ 'pamenv': ['/etc/security/pam_env.conf', '/home/user/.pam_environment'], + \ 'pamconf': ['/etc/pam.conf', '/etc/pam.d/file', 'any/etc/pam.conf', 'any/etc/pam.d/file'], + \ 'pamenv': ['/etc/security/pam_env.conf', '/home/user/.pam_environment', '.pam_environment', 'pam_env.conf'], \ 'papp': ['file.papp', 'file.pxml', 'file.pxsl'], \ 'pascal': ['file.pas', 'file.dpr', 'file.lpr'], - \ 'passwd': ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak'], + \ 'passwd': ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak', '/etc/passwd', '/etc/passwd-', '/etc/passwd.edit', '/etc/shadow', '/etc/shadow-', '/etc/shadow.edit', '/var/backups/passwd.bak', '/var/backups/shadow.bak'], \ 'pbtxt': ['file.pbtxt'], \ 'pccts': ['file.g'], \ 'pdf': ['file.pdf'], \ 'perl': ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc'], - \ 'perl6': ['file.p6', 'file.pm6', 'file.pl6', 'file.raku', 'file.rakumod'], \ 'pf': ['pf.conf'], \ 'pfmain': ['main.cf'], \ 'php': ['file.php', 'file.php9', 'file.phtml', 'file.ctp'], @@ -350,14 +367,13 @@ let s:filename_checks = { \ 'cmod': ['file.cmod'], \ 'pilrc': ['file.rcp'], \ 'pine': ['.pinerc', 'pinerc', '.pinercex', 'pinercex'], - \ 'pinfo': ['/etc/pinforc', '/.pinforc'], + \ 'pinfo': ['/etc/pinforc', '/.pinforc', 'any/.pinforc', 'any/etc/pinforc'], \ 'pli': ['file.pli', 'file.pl1'], \ 'plm': ['file.plm', 'file.p36', 'file.pac'], \ 'plp': ['file.plp'], \ 'plsql': ['file.pls', 'file.plsql'], \ 'po': ['file.po', 'file.pot'], \ 'pod': ['file.pod'], - \ 'pod6': ['file.pod6'], \ 'poke': ['file.pk'], \ 'postscr': ['file.ps', 'file.pfa', 'file.afm', 'file.eps', 'file.epsf', 'file.epsi', 'file.ai'], \ 'pov': ['file.pov'], @@ -370,19 +386,23 @@ let s:filename_checks = { \ 'prolog': ['file.pdb'], \ 'promela': ['file.pml'], \ 'proto': ['file.proto'], - \ 'protocols': ['/etc/protocols'], + \ 'protocols': ['/etc/protocols', 'any/etc/protocols'], + \ 'ps1': ['file.ps1', 'file.psd1', 'file.psm1', 'file.pssc'], + \ 'ps1xml': ['file.ps1xml'], \ 'psf': ['file.psf'], + \ 'psl': ['file.psl'], \ 'puppet': ['file.pp'], \ 'pyrex': ['file.pyx', 'file.pxd'], \ 'python': ['file.py', 'file.pyw', '.pythonstartup', '.pythonrc', 'file.ptl', 'file.pyi', 'SConstruct'], - \ 'quake': ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg'], + \ 'quake': ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg', 'baseq2/file.cfg', 'id1/file.cfg', 'quake1/file.cfg', 'some-baseq2/file.cfg', 'some-id1/file.cfg', 'some-quake1/file.cfg'], \ 'radiance': ['file.rad', 'file.mat'], + \ 'raku': ['file.pm6', 'file.p6', 'file.t6', 'file.pod6', 'file.raku', 'file.rakumod', 'file.rakudoc', 'file.rakutest'], \ 'ratpoison': ['.ratpoisonrc', 'ratpoisonrc'], \ 'rbs': ['file.rbs'], \ 'rc': ['file.rc', 'file.rch'], \ 'rcs': ['file,v'], \ 'readline': ['.inputrc', 'inputrc'], - \ 'remind': ['.reminders', 'file.remind', 'file.rem'], + \ 'remind': ['.reminders', 'file.remind', 'file.rem', '.reminders-file'], \ 'rego': ['file.rego'], \ 'resolv': ['resolv.conf'], \ 'reva': ['file.frt'], @@ -412,10 +432,10 @@ let s:filename_checks = { \ 'sdc': ['file.sdc'], \ 'sdl': ['file.sdl', 'file.pr'], \ 'sed': ['file.sed'], - \ 'sensors': ['/etc/sensors.conf', '/etc/sensors3.conf'], - \ 'services': ['/etc/services'], - \ 'setserial': ['/etc/serial.conf'], - \ 'sh': ['/etc/udev/cdsymlinks.conf'], + \ 'sensors': ['/etc/sensors.conf', '/etc/sensors3.conf', 'any/etc/sensors.conf', 'any/etc/sensors3.conf'], + \ 'services': ['/etc/services', 'any/etc/services'], + \ 'setserial': ['/etc/serial.conf', 'any/etc/serial.conf'], + \ 'sh': ['.bashrc', 'file.bash', '/usr/share/doc/bash-completion/filter.sh','/etc/udev/cdsymlinks.conf', 'any/etc/udev/cdsymlinks.conf'], \ 'sieve': ['file.siv', 'file.sieve'], \ 'simula': ['file.sim'], \ 'sinda': ['file.sin', 'file.s85'], @@ -423,9 +443,9 @@ let s:filename_checks = { \ 'skill': ['file.il', 'file.ils', 'file.cdf'], \ 'slang': ['file.sl'], \ 'slice': ['file.ice'], - \ 'slpconf': ['/etc/slp.conf'], - \ 'slpreg': ['/etc/slp.reg'], - \ 'slpspi': ['/etc/slp.spi'], + \ 'slpconf': ['/etc/slp.conf', 'any/etc/slp.conf'], + \ 'slpreg': ['/etc/slp.reg', 'any/etc/slp.reg'], + \ 'slpspi': ['/etc/slp.spi', 'any/etc/slp.spi'], \ 'slrnrc': ['.slrnrc'], \ 'slrnsc': ['file.score'], \ 'sm': ['sendmail.cf'], @@ -445,19 +465,19 @@ let s:filename_checks = { \ 'sqr': ['file.sqr', 'file.sqi'], \ 'squid': ['squid.conf'], \ 'srec': ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'], - \ 'sshconfig': ['ssh_config', '/.ssh/config', '/etc/ssh/ssh_config.d/file.conf', 'any/etc/ssh/ssh_config.d/file.conf'], + \ 'sshconfig': ['ssh_config', '/.ssh/config', '/etc/ssh/ssh_config.d/file.conf', 'any/etc/ssh/ssh_config.d/file.conf', 'any/.ssh/config'], \ 'sshdconfig': ['sshd_config', '/etc/ssh/sshd_config.d/file.conf', 'any/etc/ssh/sshd_config.d/file.conf'], \ 'st': ['file.st'], \ 'stata': ['file.ado', 'file.do', 'file.imata', 'file.mata'], \ 'stp': ['file.stp'], - \ 'sudoers': ['any/etc/sudoers', 'sudoers.tmp'], + \ 'sudoers': ['any/etc/sudoers', 'sudoers.tmp', '/etc/sudoers'], \ 'svg': ['file.svg'], - \ 'svn': ['svn-commitfile.tmp'], + \ 'svn': ['svn-commitfile.tmp', 'svn-commit-file.tmp', 'svn-commit.tmp'], \ 'swift': ['file.swift'], \ 'swiftgyb': ['file.swift.gyb'], \ 'sil': ['file.sil'], - \ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf'], - \ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.dnssd', 'any/systemd/file.link', 'any/systemd/file.mount', 'any/systemd/file.netdev', 'any/systemd/file.network', 'any/systemd/file.nspawn', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.slice', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer', '/etc/systemd/some.conf.d/file.conf', '/etc/systemd/system/some.d/file.conf', '/etc/systemd/system/some.d/.#file', '/etc/systemd/system/.#otherfile', '/home/user/.config/systemd/user/some.d/mine.conf', '/home/user/.config/systemd/user/some.d/.#file', '/home/user/.config/systemd/user/.#otherfile'], + \ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf', 'any/etc/sysctl.conf', 'any/etc/sysctl.d/file.conf'], + \ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.dnssd', 'any/systemd/file.link', 'any/systemd/file.mount', 'any/systemd/file.netdev', 'any/systemd/file.network', 'any/systemd/file.nspawn', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.slice', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer', '/etc/systemd/some.conf.d/file.conf', '/etc/systemd/system/some.d/file.conf', '/etc/systemd/system/some.d/.#file', '/etc/systemd/system/.#otherfile', '/home/user/.config/systemd/user/some.d/mine.conf', '/home/user/.config/systemd/user/some.d/.#file', '/home/user/.config/systemd/user/.#otherfile', '/.config/systemd/user/.#', '/.config/systemd/user/.#-file', '/.config/systemd/user/file.d/.#', '/.config/systemd/user/file.d/.#-file', '/.config/systemd/user/file.d/file.conf', '/etc/systemd/file.conf.d/file.conf', '/etc/systemd/system/.#', '/etc/systemd/system/.#-file', '/etc/systemd/system/file.d/.#', '/etc/systemd/system/file.d/.#-file', '/etc/systemd/system/file.d/file.conf', '/systemd/file.automount', '/systemd/file.dnssd', '/systemd/file.link', '/systemd/file.mount', '/systemd/file.netdev', '/systemd/file.network', '/systemd/file.nspawn', '/systemd/file.path', '/systemd/file.service', '/systemd/file.slice', '/systemd/file.socket', '/systemd/file.swap', '/systemd/file.target', '/systemd/file.timer', 'any/.config/systemd/user/.#', 'any/.config/systemd/user/.#-file', 'any/.config/systemd/user/file.d/.#', 'any/.config/systemd/user/file.d/.#-file', 'any/.config/systemd/user/file.d/file.conf', 'any/etc/systemd/file.conf.d/file.conf', 'any/etc/systemd/system/.#', 'any/etc/systemd/system/.#-file', 'any/etc/systemd/system/file.d/.#', 'any/etc/systemd/system/file.d/.#-file', 'any/etc/systemd/system/file.d/file.conf'], \ 'systemverilog': ['file.sv', 'file.svh'], \ 'tags': ['tags'], \ 'tak': ['file.tak'], @@ -469,12 +489,12 @@ let s:filename_checks = { \ 'tex': ['file.latex', 'file.sty', 'file.dtx', 'file.ltx', 'file.bbl'], \ 'texinfo': ['file.texinfo', 'file.texi', 'file.txi'], \ 'texmf': ['texmf.cnf'], - \ 'text': ['file.text', 'README'], + \ 'text': ['file.text', 'README', '/usr/share/doc/bash-completion/AUTHORS'], \ 'tf': ['file.tf', '.tfrc', 'tfrc'], \ 'tidy': ['.tidyrc', 'tidyrc', 'tidy.conf'], \ 'tilde': ['file.t.html'], \ 'tli': ['file.tli'], - \ 'tmux': ['tmuxfile.conf', '.tmuxfile.conf'], + \ 'tmux': ['tmuxfile.conf', '.tmuxfile.conf', '.tmux-file.conf', '.tmux.conf', 'tmux-file.conf', 'tmux.conf'], \ 'toml': ['file.toml'], \ 'tpp': ['file.tpp'], \ 'treetop': ['file.treetop'], @@ -486,12 +506,12 @@ let s:filename_checks = { \ 'twig': ['file.twig'], \ 'typescriptreact': ['file.tsx'], \ 'uc': ['file.uc'], - \ 'udevconf': ['/etc/udev/udev.conf'], - \ 'udevperm': ['/etc/udev/permissions.d/file.permissions'], + \ 'udevconf': ['/etc/udev/udev.conf', 'any/etc/udev/udev.conf'], + \ 'udevperm': ['/etc/udev/permissions.d/file.permissions', 'any/etc/udev/permissions.d/file.permissions'], \ 'udevrules': ['/etc/udev/rules.d/file.rules', '/usr/lib/udev/rules.d/file.rules', '/lib/udev/rules.d/file.rules'], \ 'uil': ['file.uit', 'file.uil'], - \ 'updatedb': ['/etc/updatedb.conf'], - \ 'upstart': ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override'], + \ 'updatedb': ['/etc/updatedb.conf', 'any/etc/updatedb.conf'], + \ 'upstart': ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override', 'any/.config/upstart/file.conf', 'any/.config/upstart/file.override', 'any/.init/file.conf', 'any/.init/file.override', 'any/etc/init/file.conf', 'any/etc/init/file.override', 'any/usr/share/upstart/file.conf', 'any/usr/share/upstart/file.override'], \ 'upstreamdat': ['upstream.dat', 'UPSTREAM.DAT', 'upstream.file.dat', 'UPSTREAM.FILE.DAT', 'file.upstream.dat', 'FILE.UPSTREAM.DAT'], \ 'upstreaminstalllog': ['upstreaminstall.log', 'UPSTREAMINSTALL.LOG', 'upstreaminstall.file.log', 'UPSTREAMINSTALL.FILE.LOG', 'file.upstreaminstall.log', 'FILE.UPSTREAMINSTALL.LOG'], \ 'upstreamlog': ['fdrupstream.log', 'upstream.log', 'UPSTREAM.LOG', 'upstream.file.log', 'UPSTREAM.FILE.LOG', 'file.upstream.log', 'FILE.UPSTREAM.LOG', 'UPSTREAM-file.log', 'UPSTREAM-FILE.LOG'], @@ -502,8 +522,8 @@ let s:filename_checks = { \ 'verilog': ['file.v'], \ 'verilogams': ['file.va', 'file.vams'], \ 'vgrindefs': ['vgrindefs'], - \ 'vhdl': ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst', 'file.vhdl_123', 'file.vho'], - \ 'vim': ['file.vim', 'file.vba', '.exrc', '_exrc'], + \ 'vhdl': ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst', 'file.vhdl_123', 'file.vho', 'some.vhdl_1', 'some.vhdl_1-file'], + \ 'vim': ['file.vim', 'file.vba', '.exrc', '_exrc', 'some-vimrc', 'some-vimrc-file', 'vimrc', 'vimrc-file'], \ 'viminfo': ['.viminfo', '_viminfo'], \ 'vmasm': ['file.mar'], \ 'voscm': ['file.cm'], @@ -515,14 +535,15 @@ let s:filename_checks = { \ 'wget': ['.wgetrc', 'wgetrc'], \ 'winbatch': ['file.wbt'], \ 'wml': ['file.wml'], + \ 'wsh': ['file.wsf', 'file.wsc'], \ 'wsml': ['file.wsml'], \ 'wvdial': ['wvdial.conf', '.wvdialrc'], - \ 'xdefaults': ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad'], + \ 'xdefaults': ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad', '/Xresources/file', '/app-defaults/file', 'Xresources', 'Xresources-file', 'any/Xresources/file', 'any/app-defaults/file'], \ 'xhtml': ['file.xhtml', 'file.xht'], - \ 'xinetd': ['/etc/xinetd.conf'], + \ 'xinetd': ['/etc/xinetd.conf', '/etc/xinetd.d/file', 'any/etc/xinetd.conf', 'any/etc/xinetd.d/file'], \ 'xmath': ['file.msc', 'file.msf'], - \ 'xml': ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul', 'file.wsdl', 'file.wpl', 'any/etc/blkid.tab', 'any/etc/blkid.tab.old', 'any/etc/xdg/menus/file.menu', 'file.atom', 'file.rss'], - \ 'xmodmap': ['anyXmodmap'], + \ 'xml': ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul', 'file.wsdl', 'file.wpl', 'any/etc/blkid.tab', 'any/etc/blkid.tab.old', 'any/etc/xdg/menus/file.menu'], + \ 'xmodmap': ['anyXmodmap', 'Xmodmap', 'some-Xmodmap', 'some-xmodmap', 'some-xmodmap-file', 'xmodmap', 'xmodmap-file'], \ 'xf86conf': ['xorg.conf', 'xorg.conf-4'], \ 'xpm2': ['file.xpm2'], \ 'xquery': ['file.xq', 'file.xql', 'file.xqm', 'file.xquery', 'file.xqy'], @@ -535,7 +556,7 @@ let s:filename_checks = { \ 'z8a': ['file.z8a'], \ 'zimbu': ['file.zu'], \ 'zimbutempl': ['file.zut'], - \ 'zsh': ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh'], + \ 'zsh': ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh', '.zcompdump', '.zlogin', '.zlogout', '.zshenv', '.zshrc', '.zcompdump-file', '.zlog', '.zlog-file', '.zsh', '.zsh-file', 'any/etc/zprofile', 'zlog', 'zlog-file', 'zsh', 'zsh-file'], \ \ 'help': [$VIMRUNTIME . '/doc/help.txt'], \ 'xpm': ['file.xpm'], @@ -602,7 +623,7 @@ let s:script_checks = { \ ['#!/path/pike0'], \ ['#!/path/pike9']], \ 'lua': [['#!/path/lua']], - \ 'perl6': [['#!/path/perl6']], + \ 'raku': [['#!/path/raku']], \ 'perl': [['#!/path/perl']], \ 'php': [['#!/path/php']], \ 'python': [['#!/path/python'], diff --git a/src/nvim/testdir/test_fnameescape.vim b/src/nvim/testdir/test_fnameescape.vim index 5382b89aa6..0bafdc29fb 100644 --- a/src/nvim/testdir/test_fnameescape.vim +++ b/src/nvim/testdir/test_fnameescape.vim @@ -18,4 +18,10 @@ func Test_fnameescape() endtry call assert_true(status, "ExclamationMark") call delete(fname) + + call assert_equal('\-', fnameescape('-')) + call assert_equal('\+', fnameescape('+')) + call assert_equal('\>', fnameescape('>')) endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_fold.vim b/src/nvim/testdir/test_fold.vim index 2d058e8e32..fcdf888b96 100644 --- a/src/nvim/testdir/test_fold.vim +++ b/src/nvim/testdir/test_fold.vim @@ -823,31 +823,36 @@ func Test_fold_create_delete() endfunc func Test_fold_relative_move() - enew! + new set fdm=indent sw=2 wrap tw=80 - let content = [ ' foo', ' bar', ' baz', - \ repeat('x', &columns + 1), - \ ' foo', ' bar', ' baz' + let longtext = repeat('x', &columns + 1) + let content = [ ' foo', ' ' .. longtext, ' baz', + \ longtext, + \ ' foo', ' ' .. longtext, ' baz' \ ] call append(0, content) normal zM - call cursor(3, 1) - call assert_true(foldclosed(line('.'))) - normal gj - call assert_equal(2, winline()) + for lnum in range(1, 3) + call cursor(lnum, 1) + call assert_true(foldclosed(line('.'))) + normal gj + call assert_equal(2, winline()) + endfor call cursor(2, 1) call assert_true(foldclosed(line('.'))) normal 2gj call assert_equal(3, winline()) - call cursor(5, 1) - call assert_true(foldclosed(line('.'))) - normal gk - call assert_equal(3, winline()) + for lnum in range(5, 7) + call cursor(lnum, 1) + call assert_true(foldclosed(line('.'))) + normal gk + call assert_equal(3, winline()) + endfor call cursor(6, 1) call assert_true(foldclosed(line('.'))) diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 555f549743..85d1bc7076 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -319,19 +319,19 @@ func Test_setbufvar_options() let prev_id = win_getid() wincmd j - let wh = winheight('.') + let wh = winheight(0) let dummy_buf = bufnr('dummy_buf1', v:true) call setbufvar(dummy_buf, '&buftype', 'nofile') execute 'belowright vertical split #' . dummy_buf - call assert_equal(wh, winheight('.')) + call assert_equal(wh, winheight(0)) let dum1_id = win_getid() wincmd h - let wh = winheight('.') + let wh = winheight(0) let dummy_buf = bufnr('dummy_buf2', v:true) call setbufvar(dummy_buf, '&buftype', 'nofile') execute 'belowright vertical split #' . dummy_buf - call assert_equal(wh, winheight('.')) + call assert_equal(wh, winheight(0)) bwipe! call win_gotoid(prev_id) @@ -1067,14 +1067,30 @@ func Test_inputlist() call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>3\<cr>", 'tx') call assert_equal(3, c) + " CR to cancel + call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<cr>", 'tx') + call assert_equal(0, c) + + " Esc to cancel + call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>\<Esc>", 'tx') + call assert_equal(0, c) + + " q to cancel + call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>q", 'tx') + call assert_equal(0, c) + + " Cancel after inputting a number + call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\<cr>5q", 'tx') + call assert_equal(0, c) + call assert_fails('call inputlist("")', 'E686:') endfunc func Test_balloon_show() - if has('balloon_eval') - " This won't do anything but must not crash either. - call balloon_show('hi!') - endif + CheckFeature balloon_eval + + " This won't do anything but must not crash either. + call balloon_show('hi!') endfunc func Test_shellescape() @@ -1448,4 +1464,12 @@ func Test_nr2char() call assert_equal("\x80\xfc\b\xfd\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX", eval('"\<M-' .. nr2char(0x40000000) .. '>"')) endfunc +func HasDefault(msg = 'msg') + return a:msg +endfunc + +func Test_default_arg_value() + call assert_equal('msg', HasDefault()) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_ga.vim b/src/nvim/testdir/test_ga.vim index 87f1382342..ce31edfc7a 100644 --- a/src/nvim/testdir/test_ga.vim +++ b/src/nvim/testdir/test_ga.vim @@ -18,6 +18,7 @@ func Test_ga_command() call assert_equal("\nNUL", Do_ga('')) call assert_equal("\n<^A> 1, Hex 01, Oct 001, Digr SH", Do_ga("\x01")) call assert_equal("\n<^I> 9, Hex 09, Oct 011, Digr HT", Do_ga("\t")) + call assert_equal("\n<^@> 0, Hex 00, Octal 000", Do_ga("\n")) call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e')) @@ -30,5 +31,13 @@ func Test_ga_command() call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401", Do_ga("e\u0301")) call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461", Do_ga("e\u0301\u0331")) call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461 < ̸> 824, Hex 0338, Octal 1470", Do_ga("e\u0301\u0331\u0338")) + + " When using Mac fileformat, CR instead of NL is used for line termination + enew! + set fileformat=mac + call assert_equal("\n<^J> 10, Hex 0a, Oct 012, Digr NU", Do_ga("\r")) + bwipe! endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_global.vim b/src/nvim/testdir/test_global.vim index 7ccf2812ff..2de2c412de 100644 --- a/src/nvim/testdir/test_global.vim +++ b/src/nvim/testdir/test_global.vim @@ -29,3 +29,11 @@ func Test_nested_global() call assert_equal(['nothing', '++found', 'found bad', 'bad'], getline(1, 4)) bwipe! endfunc + +func Test_global_error() + call assert_fails('g\\a', 'E10:') + call assert_fails('g', 'E148:') + call assert_fails('g/\(/y', 'E476:') +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_increment.vim b/src/nvim/testdir/test_increment.vim index f81f8edbde..6d08cd40a8 100644 --- a/src/nvim/testdir/test_increment.vim +++ b/src/nvim/testdir/test_increment.vim @@ -1,4 +1,4 @@ -" Tests for using Ctrl-A/Ctrl-X on visual selections +" Tests for using Ctrl-A/Ctrl-X func SetUp() new dummy @@ -779,6 +779,50 @@ func Test_increment_empty_line() bwipe! endfunc +" Try incrementing/decrementing a number when nrformats contains unsigned +func Test_increment_unsigned() + set nrformats+=unsigned + + call setline(1, '0') + exec "norm! gg0\<C-X>" + call assert_equal('0', getline(1)) + + call setline(1, '3') + exec "norm! gg010\<C-X>" + call assert_equal('0', getline(1)) + + call setline(1, '-0') + exec "norm! gg0\<C-X>" + call assert_equal("-0", getline(1)) + + call setline(1, '-11') + exec "norm! gg08\<C-X>" + call assert_equal('-3', getline(1)) + + " NOTE: 18446744073709551615 == 2^64 - 1 + call setline(1, '18446744073709551615') + exec "norm! gg0\<C-A>" + call assert_equal('18446744073709551615', getline(1)) + + call setline(1, '-18446744073709551615') + exec "norm! gg0\<C-A>" + call assert_equal('-18446744073709551615', getline(1)) + + call setline(1, '-18446744073709551614') + exec "norm! gg08\<C-A>" + call assert_equal('-18446744073709551615', getline(1)) + + call setline(1, '-1') + exec "norm! gg0\<C-A>" + call assert_equal('-2', getline(1)) + + call setline(1, '-3') + exec "norm! gg08\<C-A>" + call assert_equal('-11', getline(1)) + + set nrformats-=unsigned +endfunc + func Test_normal_increment_with_virtualedit() set virtualedit=all diff --git a/src/nvim/testdir/test_listdict.vim b/src/nvim/testdir/test_listdict.vim index 8e2a987e74..affb141a26 100644 --- a/src/nvim/testdir/test_listdict.vim +++ b/src/nvim/testdir/test_listdict.vim @@ -506,6 +506,15 @@ func Test_dict_lock_extend() call assert_equal({'a': 99, 'b': 100}, d) endfunc +" Cannot use += with a locked dict +func Test_dict_lock_operator() + unlet! d + let d = {} + lockvar d + call assert_fails("let d += {'k' : 10}", 'E741:') + unlockvar d +endfunc + " No remove() of write-protected scope-level variable func! Tfunc(this_is_a_long_parameter_name) call assert_fails("call remove(a:, 'this_is_a_long_parameter_name')", 'E742') @@ -709,6 +718,23 @@ func Test_listdict_extend() call assert_fails("call extend([1, 2], 1)", 'E712:') call assert_fails("call extend([1, 2], {})", 'E712:') + + " Extend g: dictionary with an invalid variable name + call assert_fails("call extend(g:, {'-!' : 10})", 'E461:') + + " Extend a list with itself. + let l = [1, 5, 7] + call extend(l, l, 0) + call assert_equal([1, 5, 7, 1, 5, 7], l) + let l = [1, 5, 7] + call extend(l, l, 1) + call assert_equal([1, 1, 5, 7, 5, 7], l) + let l = [1, 5, 7] + call extend(l, l, 2) + call assert_equal([1, 5, 1, 5, 7, 7], l) + let l = [1, 5, 7] + call extend(l, l, 3) + call assert_equal([1, 5, 7, 1, 5, 7], l) endfunc func s:check_scope_dict(x, fixed) @@ -782,3 +808,40 @@ func Test_scope_dict() " Test for v: call s:check_scope_dict('v', v:true) endfunc + +" Test for a null list +func Test_null_list() + let l = v:_null_list + call assert_equal('', join(l)) + call assert_equal(0, len(l)) + call assert_equal(1, empty(l)) + call assert_fails('let s = join([1, 2], [])', 'E730:') + call assert_equal([], split(v:_null_string)) + call assert_equal([], l[:2]) + call assert_true([] == l) + call assert_equal('[]', string(l)) + " call assert_equal(0, sort(l)) + " call assert_equal(0, sort(l)) + " call assert_equal(0, uniq(l)) + let k = [] + l + call assert_equal([], k) + let k = l + [] + call assert_equal([], k) + call assert_equal(0, len(copy(l))) + call assert_equal(0, count(l, 5)) + call assert_equal([], deepcopy(l)) + call assert_equal(5, get(l, 2, 5)) + call assert_equal(-1, index(l, 2, 5)) + " call assert_equal(0, insert(l, 2, -1)) + call assert_equal(0, min(l)) + call assert_equal(0, max(l)) + " call assert_equal(0, remove(l, 0, 2)) + call assert_equal([], repeat(l, 2)) + " call assert_equal(0, reverse(l)) + " call assert_equal(0, sort(l)) + call assert_equal('[]', string(l)) + " call assert_equal(0, extend(l, l, 0)) + lockvar l + call assert_equal(1, islocked('l')) + unlockvar l +endfunc diff --git a/src/nvim/testdir/test_mapping.vim b/src/nvim/testdir/test_mapping.vim index 0191dbf33e..f88e8cf843 100644 --- a/src/nvim/testdir/test_mapping.vim +++ b/src/nvim/testdir/test_mapping.vim @@ -559,4 +559,13 @@ func Test_map_cmdkey_redo() ounmap i- endfunc +func Test_abbreviate_multi_byte() + new + iabbrev foo bar + call feedkeys("ifoo…\<Esc>", 'xt') + call assert_equal("bar…", getline(1)) + iunabbrev foo + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_menu.vim b/src/nvim/testdir/test_menu.vim index 055d944b15..de6d4aa359 100644 --- a/src/nvim/testdir/test_menu.vim +++ b/src/nvim/testdir/test_menu.vim @@ -11,7 +11,13 @@ func Test_load_menu() call assert_report('error while loading menus: ' . v:exception) endtry call assert_match('browse confirm w', execute(':menu File.Save')) + + let v:errmsg = '' + doautocmd LoadBufferMenu VimEnter + call assert_equal('', v:errmsg) + source $VIMRUNTIME/delmenu.vim + call assert_equal('', v:errmsg) endfunc func Test_translate_menu() diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim index 8486f3ff68..4e46dbac16 100644 --- a/src/nvim/testdir/test_mksession.vim +++ b/src/nvim/testdir/test_mksession.vim @@ -149,6 +149,21 @@ func Test_mksession_large_winheight() call delete('Xtest_mks_winheight.out') endfunc +func Test_mksession_zero_winheight() + set winminheight=0 + edit SomeFile + split + wincmd _ + mksession! Xtest_mks_zero + set winminheight& + " let text = readfile('Xtest_mks_zero')->join() + let text = join(readfile('Xtest_mks_zero')) + call delete('Xtest_mks_zero') + close + " check there is no divide by zero + call assert_notmatch('/ 0[^0-9]', text) +endfunc + func Test_mksession_rtp() if has('win32') " TODO: fix problem with backslashes @@ -680,6 +695,24 @@ func Test_mksession_winpos() set sessionoptions& endfunc +" Test for mksession without options restores winminheight +func Test_mksession_winminheight() + set sessionoptions-=options + split + mksession! Xtest_mks.out + let found_restore = 0 + let lines = readfile('Xtest_mks.out') + for line in lines + if line =~ '= s:save_winmin\(width\|height\)' + let found_restore += 1 + endif + endfor + call assert_equal(2, found_restore) + call delete('Xtest_mks.out') + close + set sessionoptions& +endfunc + " Test for mksession with 'compatible' option func Test_mksession_compatible() throw 'skipped: Nvim does not support "compatible" option' diff --git a/src/nvim/testdir/test_move.vim b/src/nvim/testdir/test_move.vim index d774c93dbd..f666a904b0 100644 --- a/src/nvim/testdir/test_move.vim +++ b/src/nvim/testdir/test_move.vim @@ -35,6 +35,11 @@ func Test_move() call assert_fails('1,2move 1', 'E134') call assert_fails('2,3move 2', 'E134') + call assert_fails("move -100", 'E16:') + call assert_fails("move +100", 'E16:') + call assert_fails('move', 'E16:') %bwipeout! endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index 5aef33cb09..8796af7a20 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -629,6 +629,25 @@ func Test_visualbell() set belloff=all endfunc +" Test for the 'write' option +func Test_write() + new + call setline(1, ['L1']) + set nowrite + call assert_fails('write Xfile', 'E142:') + set write + close! +endfunc + +" Test for 'buftype' option +func Test_buftype() + new + call setline(1, ['L1']) + set buftype=nowrite + call assert_fails('write', 'E382:') + close! +endfunc + " Test for setting option values using v:false and v:true func Test_opt_boolean() set number& diff --git a/src/nvim/testdir/test_prompt_buffer.vim b/src/nvim/testdir/test_prompt_buffer.vim new file mode 100644 index 0000000000..6fc5850be3 --- /dev/null +++ b/src/nvim/testdir/test_prompt_buffer.vim @@ -0,0 +1,195 @@ +" Tests for setting 'buftype' to "prompt" + +source check.vim +" Nvim's channel implementation differs from Vim's +" CheckFeature channel + +source shared.vim +source screendump.vim + +func CanTestPromptBuffer() + " We need to use a terminal window to be able to feed keys without leaving + " Insert mode. + " Nvim's terminal implementation differs from Vim's + " CheckFeature terminal + + " TODO: make the tests work on MS-Windows + CheckNotMSWindows +endfunc + +func WriteScript(name) + call writefile([ + \ 'func TextEntered(text)', + \ ' if a:text == "exit"', + \ ' " Reset &modified to allow the buffer to be closed.', + \ ' set nomodified', + \ ' stopinsert', + \ ' close', + \ ' else', + \ ' " Add the output above the current prompt.', + \ ' call append(line("$") - 1, "Command: \"" . a:text . "\"")', + \ ' " Reset &modified to allow the buffer to be closed.', + \ ' set nomodified', + \ ' call timer_start(20, {id -> TimerFunc(a:text)})', + \ ' endif', + \ 'endfunc', + \ '', + \ 'func TimerFunc(text)', + \ ' " Add the output above the current prompt.', + \ ' call append(line("$") - 1, "Result: \"" . a:text . "\"")', + \ ' " Reset &modified to allow the buffer to be closed.', + \ ' set nomodified', + \ 'endfunc', + \ '', + \ 'call setline(1, "other buffer")', + \ 'set nomodified', + \ 'new', + \ 'set buftype=prompt', + \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))', + \ 'eval bufnr("")->prompt_setprompt("cmd: ")', + \ 'startinsert', + \ ], a:name) +endfunc + +func Test_prompt_basic() + throw 'skipped: TODO' + call CanTestPromptBuffer() + let scriptName = 'XpromptscriptBasic' + call WriteScript(scriptName) + + let buf = RunVimInTerminal('-S ' . scriptName, {}) + call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))}) + + call term_sendkeys(buf, "hello\<CR>") + call WaitForAssert({-> assert_equal('cmd: hello', term_getline(buf, 1))}) + call WaitForAssert({-> assert_equal('Command: "hello"', term_getline(buf, 2))}) + call WaitForAssert({-> assert_equal('Result: "hello"', term_getline(buf, 3))}) + + call term_sendkeys(buf, "exit\<CR>") + call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))}) + + call StopVimInTerminal(buf) + call delete(scriptName) +endfunc + +func Test_prompt_editing() + throw 'skipped: TODO' + call CanTestPromptBuffer() + let scriptName = 'XpromptscriptEditing' + call WriteScript(scriptName) + + let buf = RunVimInTerminal('-S ' . scriptName, {}) + call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))}) + + let bs = "\<BS>" + call term_sendkeys(buf, "hello" . bs . bs) + call WaitForAssert({-> assert_equal('cmd: hel', term_getline(buf, 1))}) + + let left = "\<Left>" + call term_sendkeys(buf, left . left . left . bs . '-') + call WaitForAssert({-> assert_equal('cmd: -hel', term_getline(buf, 1))}) + + let end = "\<End>" + call term_sendkeys(buf, end . "x") + call WaitForAssert({-> assert_equal('cmd: -helx', term_getline(buf, 1))}) + + call term_sendkeys(buf, "\<C-U>exit\<CR>") + call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))}) + + call StopVimInTerminal(buf) + call delete(scriptName) +endfunc + +func Test_prompt_garbage_collect() + func MyPromptCallback(x, text) + " NOP + endfunc + func MyPromptInterrupt(x) + " NOP + endfunc + + new + set buftype=prompt + " Nvim doesn't support method call syntax yet. + " eval bufnr('')->prompt_setcallback(function('MyPromptCallback', [{}])) + " eval bufnr('')->prompt_setinterrupt(function('MyPromptInterrupt', [{}])) + eval prompt_setcallback(bufnr(''), function('MyPromptCallback', [{}])) + eval prompt_setinterrupt(bufnr(''), function('MyPromptInterrupt', [{}])) + call test_garbagecollect_now() + " Must not crash + call feedkeys("\<CR>\<C-C>", 'xt') + call assert_true(v:true) + + call assert_fails("call prompt_setcallback(bufnr(), [])", 'E921:') + call assert_equal(0, prompt_setcallback({}, '')) + call assert_fails("call prompt_setinterrupt(bufnr(), [])", 'E921:') + call assert_equal(0, prompt_setinterrupt({}, '')) + + delfunc MyPromptCallback + bwipe! +endfunc + +" Test for editing the prompt buffer +func Test_prompt_buffer_edit() + new + set buftype=prompt + normal! i + call assert_beeps('normal! dd') + call assert_beeps('normal! ~') + call assert_beeps('normal! o') + call assert_beeps('normal! O') + call assert_beeps('normal! p') + call assert_beeps('normal! P') + call assert_beeps('normal! u') + call assert_beeps('normal! ra') + call assert_beeps('normal! s') + call assert_beeps('normal! S') + call assert_beeps("normal! \<C-A>") + call assert_beeps("normal! \<C-X>") + " pressing CTRL-W in the prompt buffer should trigger the window commands + call assert_equal(1, winnr()) + " In Nvim, CTRL-W commands aren't usable from insert mode in a prompt buffer + " exe "normal A\<C-W>\<C-W>" + " call assert_equal(2, winnr()) + " wincmd w + close! + call assert_equal(0, prompt_setprompt([], '')) +endfunc + +func Test_prompt_buffer_getbufinfo() + new + call assert_equal('', prompt_getprompt('%')) + call assert_equal('', prompt_getprompt(bufnr('%'))) + let another_buffer = bufnr('%') + + set buftype=prompt + call assert_equal('% ', prompt_getprompt('%')) + call prompt_setprompt( bufnr( '%' ), 'This is a test: ' ) + call assert_equal('This is a test: ', prompt_getprompt('%')) + + call prompt_setprompt( bufnr( '%' ), '' ) + " Nvim doesn't support method call syntax yet. + " call assert_equal('', '%'->prompt_getprompt()) + call assert_equal('', prompt_getprompt('%')) + + call prompt_setprompt( bufnr( '%' ), 'Another: ' ) + call assert_equal('Another: ', prompt_getprompt('%')) + let another = bufnr('%') + + new + + call assert_equal('', prompt_getprompt('%')) + call assert_equal('Another: ', prompt_getprompt(another)) + + " Doesn't exist + let buffers_before = len( getbufinfo() ) + call assert_equal('', prompt_getprompt( bufnr('$') + 1)) + call assert_equal(buffers_before, len( getbufinfo())) + + " invalid type + call assert_fails('call prompt_getprompt({})', 'E728:') + + %bwipe! +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index da949f5940..bf15f7f52b 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -14,7 +14,7 @@ func s:setup_commands(cchar) command! -nargs=* Xaddexpr <mods>caddexpr <args> command! -nargs=* -count Xolder <mods><count>colder <args> command! -nargs=* Xnewer <mods>cnewer <args> - command! -nargs=* Xopen <mods>copen <args> + command! -nargs=* Xopen <mods> copen <args> command! -nargs=* Xwindow <mods>cwindow <args> command! -nargs=* Xbottom <mods>cbottom <args> command! -nargs=* Xclose <mods>cclose <args> @@ -32,8 +32,8 @@ func s:setup_commands(cchar) command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args> command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args> command! -nargs=* Xexpr <mods>cexpr <args> - command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args> - command! -nargs=* Xvimgrepadd <mods>vimgrepadd <args> + command! -count -nargs=* Xvimgrep <mods> <count>vimgrep <args> + command! -nargs=* Xvimgrepadd <mods> vimgrepadd <args> command! -nargs=* Xgrep <mods> grep <args> command! -nargs=* Xgrepadd <mods> grepadd <args> command! -nargs=* Xhelpgrep helpgrep <args> @@ -51,7 +51,7 @@ func s:setup_commands(cchar) command! -nargs=* Xaddexpr <mods>laddexpr <args> command! -nargs=* -count Xolder <mods><count>lolder <args> command! -nargs=* Xnewer <mods>lnewer <args> - command! -nargs=* Xopen <mods>lopen <args> + command! -nargs=* Xopen <mods> lopen <args> command! -nargs=* Xwindow <mods>lwindow <args> command! -nargs=* Xbottom <mods>lbottom <args> command! -nargs=* Xclose <mods>lclose <args> @@ -69,8 +69,8 @@ func s:setup_commands(cchar) command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args> command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args> command! -nargs=* Xexpr <mods>lexpr <args> - command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args> - command! -nargs=* Xvimgrepadd <mods>lvimgrepadd <args> + command! -count -nargs=* Xvimgrep <mods> <count>lvimgrep <args> + command! -nargs=* Xvimgrepadd <mods> lvimgrepadd <args> command! -nargs=* Xgrep <mods> lgrep <args> command! -nargs=* Xgrepadd <mods> lgrepadd <args> command! -nargs=* Xhelpgrep lhelpgrep <args> @@ -157,6 +157,12 @@ func XlistTests(cchar) \ ' 2 Data.Text:20 col 10 warning 22: ModuleWarning', \ ' 3 Data/Text.hs:30 col 15 warning 33: FileWarning'], l) + " For help entries in the quickfix list, only the filename without directory + " should be displayed + Xhelpgrep setqflist() + let l = split(execute('Xlist 1', ''), "\n") + call assert_match('^ 1 [^\\/]\{-}:', l[0]) + " Error cases call assert_fails('Xlist abc', 'E488:') endfunc @@ -255,13 +261,13 @@ func XwindowTests(cchar) " Open the window Xopen 5 call assert_true(winnr('$') == 2 && getline('.') ==# '|| non-error 1' - \ && winheight('.') == 5) + \ && winheight(0) == 5) " Opening the window again, should move the cursor to that window wincmd t Xopen 7 call assert_true(winnr('$') == 2 && winnr() == 2 && - \ winheight('.') == 7 && + \ winheight(0) == 7 && \ getline('.') ==# '|| non-error 1') " :cnext in quickfix window should move to the next entry @@ -272,6 +278,14 @@ func XwindowTests(cchar) Xwindow call assert_true(winnr('$') == 1) + " Specifying the width should adjust the width for a vertically split + " quickfix window. + vert Xopen + call assert_equal(10, winwidth(0)) + vert Xopen 12 + call assert_equal(12, winwidth(0)) + Xclose + if a:cchar == 'c' " Opening the quickfix window in multiple tab pages should reuse the " quickfix buffer @@ -352,6 +366,13 @@ func XfileTests(cchar) \ l[0].lnum == 222 && l[0].col == 77 && l[0].text ==# 'Line 222' && \ l[1].lnum == 333 && l[1].col == 88 && l[1].text ==# 'Line 333') + " Test for a file with a long line and without a newline at the end + let text = repeat('x', 1024) + let t = 'a.txt:18:' . text + call writefile([t], 'Xqftestfile1', 'b') + silent! Xfile Xqftestfile1 + call assert_equal(text, g:Xgetlist()[0].text) + call delete('Xqftestfile1') endfunc @@ -475,6 +496,12 @@ func Xtest_browse(cchar) call assert_equal(5, g:Xgetlist({'idx':0}).idx) 2Xcc call assert_equal(2, g:Xgetlist({'idx':0}).idx) + if a:cchar == 'c' + cc + else + ll + endif + call assert_equal(2, g:Xgetlist({'idx':0}).idx) 10Xcc call assert_equal(6, g:Xgetlist({'idx':0}).idx) Xlast @@ -483,6 +510,14 @@ func Xtest_browse(cchar) call assert_equal(11, line('.')) call assert_fails('Xnext', 'E553') call assert_fails('Xnfile', 'E553') + " To process the range using quickfix list entries, directly use the + " quickfix commands (don't use the user defined commands) + if a:cchar == 'c' + $cc + else + $ll + endif + call assert_equal(6, g:Xgetlist({'idx':0}).idx) Xrewind call assert_equal('Xqftestfile1', bufname('%')) call assert_equal(5, line('.')) @@ -1095,6 +1130,10 @@ func Xinvalid_efm_Tests(cchar) set efm=%f:%l:%m,%f:%l:%m:%R call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E377:') + " Invalid regular expression + set efm=%\\%%k + call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E867:') + set efm= call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:') @@ -1125,6 +1164,11 @@ func Test_efm2() let l = split(execute('clist', ''), "\n") call assert_equal([' 1 Xtestfile:^\VLine search text\$: '], l) + " Test for a long line + cexpr 'Xtestfile:' . repeat('a', 1026) + let l = getqflist() + call assert_equal('^\V' . repeat('a', 1019) . '\$', l[0].pattern) + " Test for %P, %Q and %t format specifiers let lines =<< trim [DATA] [Xtestfile1] @@ -1162,6 +1206,14 @@ func Test_efm2() call delete('Xtestfile2') call delete('Xtestfile3') + " Test for %P, %Q with non-existing files + cexpr lines + let l = getqflist() + call assert_equal(14, len(l)) + call assert_equal('[Xtestfile1]', l[0].text) + call assert_equal('[Xtestfile2]', l[6].text) + call assert_equal('[Xtestfile3]', l[9].text) + " Tests for %E, %C and %Z format specifiers let lines =<< trim [DATA] Error 275 @@ -1203,18 +1255,19 @@ func Test_efm2() File "/usr/lib/python2.2/unittest.py", line 286, in failUnlessEqual raise self.failureException, \\ - AssertionError: 34 != 33 + W:AssertionError: 34 != 33 -------------------------------------------------------------- Ran 27 tests in 0.063s [DATA] - set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m + set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%t:%m cgetexpr lines let l = getqflist() call assert_equal(8, len(l)) call assert_equal(89, l[4].lnum) call assert_equal(1, l[4].valid) call assert_equal(expand('unittests/dbfacadeTest.py'), bufname(l[4].bufnr)) + call assert_equal('W', l[4].type) " Test for %o set efm=%f(%o):%l\ %m @@ -1231,6 +1284,14 @@ func Test_efm2() bd call delete("Xotestfile") + " Test for a long module name + cexpr 'Xtest(' . repeat('m', 1026) . '):15 message' + let l = getqflist() + " call assert_equal(repeat('m', 1024), l[0].module) + call assert_equal(repeat('m', 1023), l[0].module) + call assert_equal(15, l[0].lnum) + call assert_equal('message', l[0].text) + " The following sequence of commands used to crash Vim set efm=%W%m cgetexpr ['msg1'] @@ -1716,9 +1777,11 @@ func Test_switchbuf() call assert_equal(winid, win_getid()) 2cnext call assert_equal(winid, win_getid()) - enew + " Test for 'switchbuf' set to search for files in windows in the current + " tabpage and jump to an existing window (if present) set switchbuf=useopen + enew cfirst | cnext call assert_equal(file1_winid, win_getid()) 2cnext @@ -1726,6 +1789,8 @@ func Test_switchbuf() 2cnext call assert_equal(file2_winid, win_getid()) + " Test for 'switchbuf' set to search for files in tabpages and jump to an + " existing tabpage (if present) enew | only set switchbuf=usetab tabedit Xqftestfile1 @@ -1744,6 +1809,7 @@ func Test_switchbuf() call assert_equal(4, tabpagenr()) tabfirst | tabonly | enew + " Test for 'switchbuf' set to open a new window for every file set switchbuf=split cfirst | cnext call assert_equal(1, winnr('$')) @@ -1751,9 +1817,10 @@ func Test_switchbuf() call assert_equal(2, winnr('$')) cnext | cnext call assert_equal(3, winnr('$')) - enew | only + " Test for 'switchbuf' set to open a new tabpage for every file set switchbuf=newtab + enew | only cfirst | cnext call assert_equal(1, tabpagenr('$')) cnext | cnext @@ -1770,6 +1837,8 @@ func Test_switchbuf() call assert_equal(last_winid, win_getid()) enew | only + " With an empty 'switchbuf', jumping to a quickfix entry should open the + " file in an existing window (if present) set switchbuf= edit Xqftestfile1 let file1_winid = win_getid() @@ -1799,6 +1868,32 @@ func Test_switchbuf() call assert_equal(4, tabpagenr()) tabfirst | tabonly | enew | only + " Jumping to a file that is not present in any of the tabpages and the + " current tabpage doesn't have any usable windows, should open it in a new + " window in the current tabpage. + copen | only + cfirst + call assert_equal(1, tabpagenr()) + call assert_equal('Xqftestfile1', bufname('')) + + " If opening a file changes 'switchbuf', then the new value should be + " retained. + call writefile(["vim: switchbuf=split"], 'Xqftestfile1') + enew | only + set switchbuf&vim + cexpr "Xqftestfile1:1:10" + call assert_equal('split', &switchbuf) + call writefile(["vim: switchbuf=usetab"], 'Xqftestfile1') + enew | only + set switchbuf=useopen + cexpr "Xqftestfile1:1:10" + call assert_equal('usetab', &switchbuf) + call writefile(["vim: switchbuf&vim"], 'Xqftestfile1') + enew | only + set switchbuf=useopen + cexpr "Xqftestfile1:1:10" + call assert_equal('', &switchbuf) + call delete('Xqftestfile1') call delete('Xqftestfile2') call delete('Xqftestfile3') @@ -1825,11 +1920,16 @@ func Xadjust_qflnum(cchar) call append(6, ['Buffer', 'Window']) let l = g:Xgetlist() - call assert_equal(5, l[0].lnum) call assert_equal(6, l[2].lnum) call assert_equal(13, l[3].lnum) + " If a file doesn't have any quickfix entries, then deleting lines in the + " file should not update the quickfix list + call g:Xsetlist([], 'f') + 1,2delete + call assert_equal([], g:Xgetlist()) + enew! call delete(fname) endfunc @@ -2617,7 +2717,7 @@ func XvimgrepTests(cchar) call assert_equal(2, len(l)) call assert_equal('Editor:Notepad NOTEPAD', l[0].text) - Xvimgrep #\cvim#g Xtestfile? + 10Xvimgrep #\cvim#g Xtestfile? let l = g:Xgetlist() call assert_equal(2, len(l)) call assert_equal(8, l[0].col) @@ -3690,6 +3790,41 @@ func Test_vimgrep_autocmd() call setqflist([], 'f') endfunc +" Test for an autocmd changing the current directory when running vimgrep +func Xvimgrep_autocmd_cd(cchar) + call s:setup_commands(a:cchar) + + %bwipe + let save_cwd = getcwd() + + augroup QF_Test + au! + autocmd BufRead * silent cd %:p:h + augroup END + + 10Xvimgrep /vim/ Xdir/** + let l = g:Xgetlist() + call assert_equal('f1.txt', bufname(l[0].bufnr)) + call assert_equal('f2.txt', fnamemodify(bufname(l[2].bufnr), ':t')) + + augroup QF_Test + au! + augroup END + + exe 'cd ' . save_cwd +endfunc + +func Test_vimgrep_autocmd_cd() + call mkdir('Xdir/a', 'p') + call mkdir('Xdir/b', 'p') + call writefile(['a_L1_vim', 'a_L2_vim'], 'Xdir/a/f1.txt') + call writefile(['b_L1_vim', 'b_L2_vim'], 'Xdir/b/f2.txt') + call Xvimgrep_autocmd_cd('c') + call Xvimgrep_autocmd_cd('l') + %bwipe + call delete('Xdir', 'rf') +endfunc + " The following test used to crash Vim func Test_lhelpgrep_autocmd() lhelpgrep quickfix @@ -4786,4 +4921,148 @@ func Test_qfbuf_update() call Xqfbuf_update('l') endfunc +" Test for getting a specific item from a quickfix list +func Xtest_getqflist_by_idx(cchar) + call s:setup_commands(a:cchar) + " Empty list + call assert_equal([], g:Xgetlist({'idx' : 1, 'items' : 0}).items) + Xexpr ['F1:10:L10', 'F1:20:L20'] + let l = g:Xgetlist({'idx' : 2, 'items' : 0}).items + call assert_equal(bufnr('F1'), l[0].bufnr) + call assert_equal(20, l[0].lnum) + call assert_equal('L20', l[0].text) + call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items) + call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items) + %bwipe! +endfunc + +func Test_getqflist_by_idx() + call Xtest_getqflist_by_idx('c') + call Xtest_getqflist_by_idx('l') +endfunc + +" Test for the 'quickfixtextfunc' setting +func Tqfexpr(info) + if a:info.quickfix + let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items + else + let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items + endif + + + let l = [] + for idx in range(a:info.start_idx - 1, a:info.end_idx - 1) + let e = qfl[idx] + let s = '' + if e.bufnr != 0 + let bname = bufname(e.bufnr) + let s ..= fnamemodify(bname, ':.') + endif + let s ..= '-' + let s ..= 'L' .. string(e.lnum) .. 'C' .. string(e.col) .. '-' + let s ..= e.text + call add(l, s) + endfor + + return l +endfunc + +func Xtest_qftextfunc(cchar) + call s:setup_commands(a:cchar) + + set efm=%f:%l:%c:%m + set quickfixtextfunc=Tqfexpr + Xexpr ['F1:10:2:green', 'F1:20:4:blue'] + Xwindow + call assert_equal('F1-L10C2-green', getline(1)) + call assert_equal('F1-L20C4-blue', getline(2)) + Xclose + set quickfixtextfunc&vim + Xwindow + call assert_equal('F1|10 col 2| green', getline(1)) + call assert_equal('F1|20 col 4| blue', getline(2)) + Xclose + set efm& + set quickfixtextfunc& + + " Test for per list 'quickfixtextfunc' setting + func PerQfText(info) + if a:info.quickfix + let qfl = getqflist({'id' : a:info.id, 'items' : 1}).items + else + let qfl = getloclist(a:info.winid, {'id' : a:info.id, 'items' : 1}).items + endif + if empty(qfl) + return [] + endif + let l = [] + for idx in range(a:info.start_idx - 1, a:info.end_idx - 1) + call add(l, 'Line ' .. qfl[idx].lnum .. ', Col ' .. qfl[idx].col) + endfor + return l + endfunc + set quickfixtextfunc=Tqfexpr + call g:Xsetlist([], ' ', {'quickfixtextfunc' : "PerQfText"}) + Xaddexpr ['F1:10:2:green', 'F1:20:4:blue'] + Xwindow + call assert_equal('Line 10, Col 2', getline(1)) + call assert_equal('Line 20, Col 4', getline(2)) + Xclose + " Add entries to the list when the quickfix buffer is hidden + Xaddexpr ['F1:30:6:red'] + Xwindow + call assert_equal('Line 30, Col 6', getline(3)) + Xclose + call g:Xsetlist([], 'r', {'quickfixtextfunc' : ''}) + set quickfixtextfunc& + delfunc PerQfText + + " Non-existing function + set quickfixtextfunc=Tabc + " call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:') + Xexpr ['F1:10:2:green', 'F1:20:4:blue']" + call assert_fails("Xwindow", 'E117:') + Xclose + set quickfixtextfunc& + + " set option to a non-function + set quickfixtextfunc=[10,\ 20] + " call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E117:') + Xexpr ['F1:10:2:green', 'F1:20:4:blue']" + call assert_fails("Xwindow", 'E117:') + Xclose + set quickfixtextfunc& + + " set option to a function with different set of arguments + func Xqftext(a, b, c) + return a:a .. a:b .. a:c + endfunc + set quickfixtextfunc=Xqftext + " call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue']", 'E119:') + Xexpr ['F1:10:2:green', 'F1:20:4:blue']" + call assert_fails("Xwindow", 'E119:') + Xclose + + " set option to a function that returns a list with non-strings + func Xqftext2(d) + return ['one', [], 'two'] + endfunc + set quickfixtextfunc=Xqftext2 + " call assert_fails("Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red']", + " \ 'E730:') + Xexpr ['F1:10:2:green', 'F1:20:4:blue', 'F1:30:6:red'] + call assert_fails('Xwindow', 'E730:') + call assert_equal(['one', 'F1|20 col 4| blue', 'two'], getline(1, '$')) + Xclose + + set quickfixtextfunc& + delfunc Xqftext + delfunc Xqftext2 +endfunc + +func Test_qftextfunc() + call Xtest_qftextfunc('c') + call Xtest_qftextfunc('l') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_rename.vim b/src/nvim/testdir/test_rename.vim new file mode 100644 index 0000000000..e4228188bd --- /dev/null +++ b/src/nvim/testdir/test_rename.vim @@ -0,0 +1,119 @@ +" Test rename() + +func Test_rename_file_to_file() + call writefile(['foo'], 'Xrename1') + + call assert_equal(0, rename('Xrename1', 'Xrename2')) + + call assert_equal('', glob('Xrename1')) + call assert_equal(['foo'], readfile('Xrename2')) + + " When the destination file already exists, it should be overwritten. + call writefile(['foo'], 'Xrename1') + call writefile(['bar'], 'Xrename2') + + call assert_equal(0, rename('Xrename1', 'Xrename2')) + call assert_equal('', glob('Xrename1')) + call assert_equal(['foo'], readfile('Xrename2')) + + call delete('Xrename2') +endfunc + +func Test_rename_file_ignore_case() + " With 'fileignorecase', renaming file will go through a temp file + " when the source and destination file only differ by case. + set fileignorecase + call writefile(['foo'], 'Xrename') + + call assert_equal(0, rename('Xrename', 'XRENAME')) + + call assert_equal(['foo'], readfile('XRENAME')) + + set fileignorecase& + call delete('XRENAME') +endfunc + +func Test_rename_same_file() + call writefile(['foo'], 'Xrename') + + " When the source and destination are the same file, nothing + " should be done. The source file should not be deleted. + call assert_equal(0, rename('Xrename', 'Xrename')) + call assert_equal(['foo'], readfile('Xrename')) + + call assert_equal(0, rename('./Xrename', 'Xrename')) + call assert_equal(['foo'], readfile('Xrename')) + + call delete('Xrename') +endfunc + +func Test_rename_dir_to_dir() + call mkdir('Xrenamedir1') + call writefile(['foo'], 'Xrenamedir1/Xrenamefile') + + call assert_equal(0, rename('Xrenamedir1', 'Xrenamedir2')) + + call assert_equal('', glob('Xrenamedir1')) + call assert_equal(['foo'], readfile('Xrenamedir2/Xrenamefile')) + + call delete('Xrenamedir2/Xrenamefile') + call delete('Xrenamedir2', 'd') +endfunc + +func Test_rename_same_dir() + call mkdir('Xrenamedir') + call writefile(['foo'], 'Xrenamedir/Xrenamefile') + + call assert_equal(0, rename('Xrenamedir', 'Xrenamedir')) + + call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile')) + + call delete('Xrenamedir/Xrenamefile') + call delete('Xrenamedir', 'd') +endfunc + +func Test_rename_copy() + " Check that when original file can't be deleted, rename() + " still succeeds but copies the file. + call mkdir('Xrenamedir') + call writefile(['foo'], 'Xrenamedir/Xrenamefile') + call setfperm('Xrenamedir', 'r-xr-xr-x') + + call assert_equal(0, rename('Xrenamedir/Xrenamefile', 'Xrenamefile')) + + if !has('win32') + " On Windows, the source file is removed despite + " its directory being made not writable. + call assert_equal(['foo'], readfile('Xrenamedir/Xrenamefile')) + endif + call assert_equal(['foo'], readfile('Xrenamefile')) + + call setfperm('Xrenamedir', 'rwxrwxrwx') + call delete('Xrenamedir/Xrenamefile') + call delete('Xrenamedir', 'd') + call delete('Xrenamefile') +endfunc + +func Test_rename_fails() + throw 'skipped: TODO: ' + call writefile(['foo'], 'Xrenamefile') + + " Can't rename into a non-existing directory. + call assert_notequal(0, rename('Xrenamefile', 'Xdoesnotexist/Xrenamefile')) + + " Can't rename a non-existing file. + call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile2')) + call assert_equal('', glob('Xrenamefile2')) + + " When rename() fails, the destination file should not be deleted. + call assert_notequal(0, rename('Xdoesnotexist', 'Xrenamefile')) + call assert_equal(['foo'], readfile('Xrenamefile')) + + " Can't rename to en empty file name. + call assert_notequal(0, rename('Xrenamefile', '')) + + call assert_fails('call rename("Xrenamefile", [])', 'E730') + call assert_fails('call rename(0z, "Xrenamefile")', 'E976') + + call delete('Xrenamefile') +endfunc diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index d4d529e4b9..75d42b986b 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -7,9 +7,8 @@ source check.vim " See test/functional/legacy/search_spec.lua func Test_search_cmdline() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + " need to disable char_avail, " so that expansion of commandline works call test_override("char_avail", 1) @@ -206,9 +205,8 @@ endfunc " See test/functional/legacy/search_spec.lua func Test_search_cmdline2() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + " need to disable char_avail, " so that expansion of commandline works call test_override("char_avail", 1) @@ -369,9 +367,8 @@ func Incsearch_cleanup() endfunc func Test_search_cmdline3() - if !exists('+incsearch') - return - endif + CheckOption incsearch + call Cmdline3_prep() 1 " first match @@ -382,9 +379,8 @@ func Test_search_cmdline3() endfunc func Test_search_cmdline3s() - if !exists('+incsearch') - return - endif + CheckOption incsearch + call Cmdline3_prep() 1 call feedkeys(":%s/the\<c-l>/xxx\<cr>", 'tx') @@ -408,9 +404,8 @@ func Test_search_cmdline3s() endfunc func Test_search_cmdline3g() - if !exists('+incsearch') - return - endif + CheckOption incsearch + call Cmdline3_prep() 1 call feedkeys(":g/the\<c-l>/d\<cr>", 'tx') @@ -431,9 +426,8 @@ func Test_search_cmdline3g() endfunc func Test_search_cmdline3v() - if !exists('+incsearch') - return - endif + CheckOption incsearch + call Cmdline3_prep() 1 call feedkeys(":v/the\<c-l>/d\<cr>", 'tx') @@ -450,9 +444,8 @@ endfunc " See test/functional/legacy/search_spec.lua func Test_search_cmdline4() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + " need to disable char_avail, " so that expansion of commandline works call test_override("char_avail", 1) @@ -484,9 +477,8 @@ func Test_search_cmdline4() endfunc func Test_search_cmdline5() - if !exists('+incsearch') - return - endif + CheckOption incsearch + " Do not call test_override("char_avail", 1) so that <C-g> and <C-t> work " regardless char_avail. new @@ -503,6 +495,46 @@ func Test_search_cmdline5() bw! endfunc +func Test_search_cmdline6() + " Test that consecutive matches + " are caught by <c-g>/<c-t> + CheckFunction test_override + CheckOption incsearch + + " need to disable char_avail, + " so that expansion of commandline works + call test_override("char_avail", 1) + new + call setline(1, [' bbvimb', '']) + set incsearch + " first match + norm! gg0 + call feedkeys("/b\<cr>", 'tx') + call assert_equal([0,1,2,0], getpos('.')) + " second match + norm! gg0 + call feedkeys("/b\<c-g>\<cr>", 'tx') + call assert_equal([0,1,3,0], getpos('.')) + " third match + norm! gg0 + call feedkeys("/b\<c-g>\<c-g>\<cr>", 'tx') + call assert_equal([0,1,7,0], getpos('.')) + " first match again + norm! gg0 + call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx') + call assert_equal([0,1,2,0], getpos('.')) + set nowrapscan + " last match + norm! gg0 + call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx') + call assert_equal([0,1,7,0], getpos('.')) + " clean up + set wrapscan&vim + set noincsearch + call test_override("char_avail", 0) + bw! +endfunc + func Test_search_cmdline7() CheckFunction test_override " Test that pressing <c-g> in an empty command line @@ -598,26 +630,226 @@ func Test_search_regexp() enew! endfunc -" Test for search('multi-byte char', 'bce') -func Test_search_multibyte() - let save_enc = &encoding - set encoding=utf8 - enew! - call append('$', 'A') - call cursor(2, 1) - call assert_equal(2, search('A', 'bce', line('.'))) - enew! - let &encoding = save_enc +func Test_search_cmdline_incsearch_highlight() + CheckFunction test_override + CheckOption incsearch + + set incsearch hlsearch + " need to disable char_avail, + " so that expansion of commandline works + call test_override("char_avail", 1) + new + call setline(1, ['aaa 1 the first', ' 2 the second', ' 3 the third']) + + 1 + call feedkeys("/second\<cr>", 'tx') + call assert_equal('second', @/) + call assert_equal(' 2 the second', getline('.')) + + " Canceling search won't change @/ + 1 + let @/ = 'last pattern' + call feedkeys("/third\<C-c>", 'tx') + call assert_equal('last pattern', @/) + call feedkeys("/third\<Esc>", 'tx') + call assert_equal('last pattern', @/) + call feedkeys("/3\<bs>\<bs>", 'tx') + call assert_equal('last pattern', @/) + call feedkeys("/third\<c-g>\<c-t>\<Esc>", 'tx') + call assert_equal('last pattern', @/) + + " clean up + set noincsearch nohlsearch + bw! endfunc -" Similar to Test_incsearch_substitute() but with a screendump halfway. -func Test_incsearch_substitute_dump() - if !exists('+incsearch') +func Test_search_cmdline_incsearch_highlight_attr() + CheckOption incsearch + CheckFeature terminal + CheckNotGui + + let h = winheight(0) + if h < 3 return endif + + " Prepare buffer text + let lines = ['abb vim vim vi', 'vimvivim'] + call writefile(lines, 'Xsearch.txt') + let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3}) + + call WaitForAssert({-> assert_equal(lines, [term_getline(buf, 1), term_getline(buf, 2)])}) + " wait for vim to complete initialization + call term_wait(buf) + + " Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight + call term_sendkeys(buf, ":set incsearch hlsearch\<cr>") + call term_sendkeys(buf, '/b') + call term_wait(buf, 200) + let screen_line1 = term_scrape(buf, 1) + call assert_true(len(screen_line1) > 2) + " a0: attr_normal + let a0 = screen_line1[0].attr + " a1: attr_incsearch + let a1 = screen_line1[1].attr + " a2: attr_hlsearch + let a2 = screen_line1[2].attr + call assert_notequal(a0, a1) + call assert_notequal(a0, a2) + call assert_notequal(a1, a2) + call term_sendkeys(buf, "\<cr>gg0") + + " Test incremental highlight search + call term_sendkeys(buf, "/vim") + call term_wait(buf, 200) + " Buffer: + " abb vim vim vi + " vimvivim + " Search: /vim + let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a2,a2,a2,a0,a0,a0] + let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + + " Test <C-g> + call term_sendkeys(buf, "\<C-g>\<C-g>") + call term_wait(buf, 200) + let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] + let attr_line2 = [a1,a1,a1,a0,a0,a2,a2,a2] + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + + " Test <C-t> + call term_sendkeys(buf, "\<C-t>") + call term_wait(buf, 200) + let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a1,a1,a1,a0,a0,a0] + let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + + " Type Enter and a1(incsearch highlight) should become a2(hlsearch highlight) + call term_sendkeys(buf, "\<cr>") + call term_wait(buf, 200) + let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0] + let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2] + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + + " Test nohlsearch. a2(hlsearch highlight) should become a0(normal highlight) + call term_sendkeys(buf, ":1\<cr>") + call term_sendkeys(buf, ":set nohlsearch\<cr>") + call term_sendkeys(buf, "/vim") + call term_wait(buf, 200) + let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a0,a0,a0,a0,a0,a0] + let attr_line2 = [a0,a0,a0,a0,a0,a0,a0,a0] + call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr')) + call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr')) + call delete('Xsearch.txt') + + call delete('Xsearch.txt') + bwipe! +endfunc + +func Test_incsearch_cmdline_modifier() + CheckFunction test_override + CheckOption incsearch + + call test_override("char_avail", 1) + new + call setline(1, ['foo']) + set incsearch + " Test that error E14 does not occur in parsing command modifier. + call feedkeys("V:tab", 'tx') + + call Incsearch_cleanup() +endfunc + +func Test_incsearch_scrolling() if !CanRunVimInTerminal() throw 'Skipped: cannot make screendumps' endif + call assert_equal(0, &scrolloff) + call writefile([ + \ 'let dots = repeat(".", 120)', + \ 'set incsearch cmdheight=2 scrolloff=0', + \ 'call setline(1, [dots, dots, dots, "", "target", dots, dots])', + \ 'normal gg', + \ 'redraw', + \ ], 'Xscript') + let buf = RunVimInTerminal('-S Xscript', {'rows': 9, 'cols': 70}) + " Need to send one key at a time to force a redraw + call term_sendkeys(buf, '/') + sleep 100m + call term_sendkeys(buf, 't') + sleep 100m + call term_sendkeys(buf, 'a') + sleep 100m + call term_sendkeys(buf, 'r') + sleep 100m + call term_sendkeys(buf, 'g') + call VerifyScreenDump(buf, 'Test_incsearch_scrolling_01', {}) + + call term_sendkeys(buf, "\<Esc>") + call StopVimInTerminal(buf) + call delete('Xscript') +endfunc + +func Test_incsearch_search_dump() + CheckOption incsearch + CheckScreendump + + call writefile([ + \ 'set incsearch hlsearch scrolloff=0', + \ 'for n in range(1, 8)', + \ ' call setline(n, "foo " . n)', + \ 'endfor', + \ '3', + \ ], 'Xis_search_script') + let buf = RunVimInTerminal('-S Xis_search_script', {'rows': 9, 'cols': 70}) + " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by + " the 'ambiwidth' check. + sleep 100m + + " Need to send one key at a time to force a redraw. + call term_sendkeys(buf, '/fo') + call VerifyScreenDump(buf, 'Test_incsearch_search_01', {}) + call term_sendkeys(buf, "\<Esc>") + sleep 100m + + call term_sendkeys(buf, '/\v') + call VerifyScreenDump(buf, 'Test_incsearch_search_02', {}) + call term_sendkeys(buf, "\<Esc>") + + call StopVimInTerminal(buf) + call delete('Xis_search_script') +endfunc + +func Test_incsearch_substitute() + CheckFunction test_override + CheckOption incsearch + + call test_override("char_avail", 1) + new + set incsearch + for n in range(1, 10) + call setline(n, 'foo ' . n) + endfor + 4 + call feedkeys(":.,.+2s/foo\<BS>o\<BS>o/xxx\<cr>", 'tx') + call assert_equal('foo 3', getline(3)) + call assert_equal('xxx 4', getline(4)) + call assert_equal('xxx 5', getline(5)) + call assert_equal('xxx 6', getline(6)) + call assert_equal('foo 7', getline(7)) + + call Incsearch_cleanup() +endfunc + +" Similar to Test_incsearch_substitute() but with a screendump halfway. +func Test_incsearch_substitute_dump() + CheckOption incsearch + CheckScreendump + call writefile([ \ 'set incsearch hlsearch scrolloff=0', \ 'for n in range(1, 10)', @@ -723,14 +955,58 @@ func Test_incsearch_substitute_dump() call delete('Xis_subst_script') endfunc +func Test_incsearch_highlighting() + CheckOption incsearch + CheckScreendump + + call writefile([ + \ 'set incsearch hlsearch', + \ 'call setline(1, "hello/there")', + \ ], 'Xis_subst_hl_script') + let buf = RunVimInTerminal('-S Xis_subst_hl_script', {'rows': 4, 'cols': 20}) + " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by + " the 'ambiwidth' check. + sleep 300m + + " Using a different search delimiter should still highlight matches + " that contain a '/'. + call term_sendkeys(buf, ":%s;ello/the") + call VerifyScreenDump(buf, 'Test_incsearch_substitute_15', {}) + call term_sendkeys(buf, "<Esc>") + + call StopVimInTerminal(buf) + call delete('Xis_subst_hl_script') +endfunc + +func Test_incsearch_with_change() + CheckFeature timers + CheckOption incsearch + CheckScreendump + + call writefile([ + \ 'set incsearch hlsearch scrolloff=0', + \ 'call setline(1, ["one", "two ------ X", "three"])', + \ 'call timer_start(200, { _ -> setline(2, "x")})', + \ ], 'Xis_change_script') + let buf = RunVimInTerminal('-S Xis_change_script', {'rows': 9, 'cols': 70}) + " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by + " the 'ambiwidth' check. + sleep 300m + + " Highlight X, it will be deleted by the timer callback. + call term_sendkeys(buf, ':%s/X') + call VerifyScreenDump(buf, 'Test_incsearch_change_01', {}) + call term_sendkeys(buf, "\<Esc>") + + call StopVimInTerminal(buf) + call delete('Xis_change_script') +endfunc + " Similar to Test_incsearch_substitute_dump() for :sort func Test_incsearch_sort_dump() - if !exists('+incsearch') - return - endif - if !CanRunVimInTerminal() - throw 'Skipped: cannot make screendumps' - endif + CheckOption incsearch + CheckScreendump + call writefile([ \ 'set incsearch hlsearch scrolloff=0', \ 'call setline(1, ["another one 2", "that one 3", "the one 1"])', @@ -754,12 +1030,9 @@ endfunc " Similar to Test_incsearch_substitute_dump() for :vimgrep famiry func Test_incsearch_vimgrep_dump() - if !exists('+incsearch') - return - endif - if !CanRunVimInTerminal() - throw 'Skipped: cannot make screendumps' - endif + CheckOption incsearch + CheckScreendump + call writefile([ \ 'set incsearch hlsearch scrolloff=0', \ 'call setline(1, ["another one 2", "that one 3", "the one 1"])', @@ -796,9 +1069,8 @@ endfunc func Test_keep_last_search_pattern() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + new call setline(1, ['foo', 'foo', 'foo']) set incsearch @@ -818,9 +1090,8 @@ endfunc func Test_word_under_cursor_after_match() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + new call setline(1, 'foo bar') set incsearch @@ -838,9 +1109,8 @@ endfunc func Test_subst_word_under_cursor() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + new call setline(1, ['int SomeLongName;', 'for (xxx = 1; xxx < len; ++xxx)']) set incsearch @@ -854,130 +1124,6 @@ func Test_subst_word_under_cursor() set noincsearch endfunc -func Test_incsearch_with_change() - if !has('timers') || !exists('+incsearch') || !CanRunVimInTerminal() - throw 'Skipped: cannot make screendumps and/or timers feature and/or incsearch option missing' - endif - - call writefile([ - \ 'set incsearch hlsearch scrolloff=0', - \ 'call setline(1, ["one", "two ------ X", "three"])', - \ 'call timer_start(200, { _ -> setline(2, "x")})', - \ ], 'Xis_change_script') - let buf = RunVimInTerminal('-S Xis_change_script', {'rows': 9, 'cols': 70}) - " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by - " the 'ambiwidth' check. - sleep 300m - - " Highlight X, it will be deleted by the timer callback. - call term_sendkeys(buf, ':%s/X') - call VerifyScreenDump(buf, 'Test_incsearch_change_01', {}) - call term_sendkeys(buf, "\<Esc>") - - call StopVimInTerminal(buf) - call delete('Xis_change_script') -endfunc - -func Test_incsearch_cmdline_modifier() - CheckFunction test_override - if !exists('+incsearch') - return - endif - call test_override("char_avail", 1) - new - call setline(1, ['foo']) - set incsearch - " Test that error E14 does not occur in parsing command modifier. - call feedkeys("V:tab", 'tx') - - call Incsearch_cleanup() -endfunc - -func Test_incsearch_scrolling() - if !CanRunVimInTerminal() - return - endif - call assert_equal(0, &scrolloff) - call writefile([ - \ 'let dots = repeat(".", 120)', - \ 'set incsearch cmdheight=2 scrolloff=0', - \ 'call setline(1, [dots, dots, dots, "", "target", dots, dots])', - \ 'normal gg', - \ 'redraw', - \ ], 'Xscript') - let buf = RunVimInTerminal('-S Xscript', {'rows': 9, 'cols': 70}) - " Need to send one key at a time to force a redraw - call term_sendkeys(buf, '/') - sleep 100m - call term_sendkeys(buf, 't') - sleep 100m - call term_sendkeys(buf, 'a') - sleep 100m - call term_sendkeys(buf, 'r') - sleep 100m - call term_sendkeys(buf, 'g') - call VerifyScreenDump(buf, 'Test_incsearch_scrolling_01', {}) - - call term_sendkeys(buf, "\<Esc>") - call StopVimInTerminal(buf) - call delete('Xscript') -endfunc - -func Test_incsearch_search_dump() - if !exists('+incsearch') - return - endif - if !CanRunVimInTerminal() - return - endif - call writefile([ - \ 'set incsearch hlsearch scrolloff=0', - \ 'for n in range(1, 8)', - \ ' call setline(n, "foo " . n)', - \ 'endfor', - \ '3', - \ ], 'Xis_search_script') - let buf = RunVimInTerminal('-S Xis_search_script', {'rows': 9, 'cols': 70}) - " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by - " the 'ambiwidth' check. - sleep 100m - - " Need to send one key at a time to force a redraw. - call term_sendkeys(buf, '/fo') - call VerifyScreenDump(buf, 'Test_incsearch_search_01', {}) - call term_sendkeys(buf, "\<Esc>") - sleep 100m - - call term_sendkeys(buf, '/\v') - call VerifyScreenDump(buf, 'Test_incsearch_search_02', {}) - call term_sendkeys(buf, "\<Esc>") - - call StopVimInTerminal(buf) - call delete('Xis_search_script') -endfunc - -func Test_incsearch_substitute() - CheckFunction test_override - if !exists('+incsearch') - return - endif - call test_override("char_avail", 1) - new - set incsearch - for n in range(1, 10) - call setline(n, 'foo ' . n) - endfor - 4 - call feedkeys(":.,.+2s/foo\<BS>o\<BS>o/xxx\<cr>", 'tx') - call assert_equal('foo 3', getline(3)) - call assert_equal('xxx 4', getline(4)) - call assert_equal('xxx 5', getline(5)) - call assert_equal('xxx 6', getline(6)) - call assert_equal('foo 7', getline(7)) - - call Incsearch_cleanup() -endfunc - func Test_incsearch_substitute_long_line() CheckFunction test_override new @@ -994,9 +1140,8 @@ func Test_incsearch_substitute_long_line() endfunc func Test_search_undefined_behaviour() - if !has("terminal") - return - endif + CheckFeature terminal + let h = winheight(0) if h < 3 return @@ -1012,6 +1157,18 @@ func Test_search_undefined_behaviour2() call search("\%UC0000000") endfunc +" Test for search('multi-byte char', 'bce') +func Test_search_multibyte() + let save_enc = &encoding + set encoding=utf8 + enew! + call append('$', 'A') + call cursor(2, 1) + call assert_equal(2, search('A', 'bce', line('.'))) + enew! + let &encoding = save_enc +endfunc + " This was causing E874. Also causes an invalid read? func Test_look_behind() new @@ -1050,9 +1207,8 @@ func Test_search_Ctrl_L_combining() " ' ̇' U+0307 Dec:775 COMBINING DOT ABOVE ̇ /\%u307\Z "\u0307" " ' ̣' U+0323 Dec:803 COMBINING DOT BELOW ̣ /\%u323 "\u0323" " Those should also appear on the commandline - if !exists('+incsearch') - return - endif + CheckOption incsearch + call Cmdline3_prep() 1 let bufcontent = ['', 'Miạ̀́̇m'] @@ -1102,9 +1258,8 @@ endfunc func Test_incsearch_add_char_under_cursor() CheckFunction test_override - if !exists('+incsearch') - return - endif + CheckOption incsearch + set incsearch new call setline(1, ['find match', 'anything']) @@ -1189,7 +1344,7 @@ func Test_search_smartcase_utf8() close! endfunc -func Test_zzzz_incsearch_highlighting_newline() +func Test_incsearch_highlighting_newline() CheckRunVimInTerminal CheckOption incsearch CheckScreendump @@ -1202,20 +1357,16 @@ func Test_zzzz_incsearch_highlighting_newline() [CODE] call writefile(commands, 'Xincsearch_nl') let buf = RunVimInTerminal('-S Xincsearch_nl', {'rows': 5, 'cols': 10}) - " Need to send one key at a time to force a redraw call term_sendkeys(buf, '/test') - sleep 100m call VerifyScreenDump(buf, 'Test_incsearch_newline1', {}) + " Need to send one key at a time to force a redraw call term_sendkeys(buf, '\n') - sleep 100m call VerifyScreenDump(buf, 'Test_incsearch_newline2', {}) call term_sendkeys(buf, 'x') - sleep 100m call VerifyScreenDump(buf, 'Test_incsearch_newline3', {}) call term_sendkeys(buf, 'x') call VerifyScreenDump(buf, 'Test_incsearch_newline4', {}) call term_sendkeys(buf, "\<CR>") - sleep 100m call VerifyScreenDump(buf, 'Test_incsearch_newline5', {}) call StopVimInTerminal(buf) diff --git a/src/nvim/testdir/test_search_stat.vim b/src/nvim/testdir/test_search_stat.vim index 11c6489ca2..335a51268d 100644 --- a/src/nvim/testdir/test_search_stat.vim +++ b/src/nvim/testdir/test_search_stat.vim @@ -8,6 +8,41 @@ func Test_search_stat() set shortmess-=S " Append 50 lines with text to search for, "foobar" appears 20 times call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10)) + call nvim_win_set_cursor(0, [1, 0]) + + " searchcount() returns an empty dictionary when previous pattern was not set + call assert_equal({}, searchcount(#{pattern: ''})) + " but setting @/ should also work (even 'n' nor 'N' was executed) + " recompute the count when the last position is different. + call assert_equal( + \ #{current: 1, exact_match: 1, total: 40, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'foo'})) + call assert_equal( + \ #{current: 0, exact_match: 0, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar'})) + call assert_equal( + \ #{current: 0, exact_match: 0, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar', pos: [2, 1, 0]})) + call assert_equal( + \ #{current: 1, exact_match: 1, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar', pos: [3, 1, 0]})) + " on last char of match + call assert_equal( + \ #{current: 1, exact_match: 1, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar', pos: [3, 9, 0]})) + " on char after match + call assert_equal( + \ #{current: 1, exact_match: 0, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar', pos: [3, 10, 0]})) + call assert_equal( + \ #{current: 1, exact_match: 0, total: 10, incomplete: 0, maxcount: 99}, + \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0]})) + call assert_equal( + \ #{current: 1, exact_match: 0, total: 2, incomplete: 2, maxcount: 1}, + \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0], maxcount: 1})) + call assert_equal( + \ #{current: 0, exact_match: 0, total: 2, incomplete: 2, maxcount: 1}, + \ searchcount(#{pattern: 'fooooobar', maxcount: 1})) " match at second line call cursor(1, 1) @@ -17,6 +52,9 @@ func Test_search_stat() let stat = '\[2/50\]' let pat = escape(@/, '()*?'). '\s\+' call assert_match(pat .. stat, g:a) + call assert_equal( + \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99}, + \ searchcount(#{recompute: 0})) " didn't get added to message history call assert_equal(messages_before, execute('messages')) @@ -25,6 +63,9 @@ func Test_search_stat() let g:a = execute(':unsilent :norm! n') let stat = '\[50/50\]' call assert_match(pat .. stat, g:a) + call assert_equal( + \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99}, + \ searchcount(#{recompute: 0})) " No search stat set shortmess+=S @@ -32,6 +73,14 @@ func Test_search_stat() let stat = '\[2/50\]' let g:a = execute(':unsilent :norm! n') call assert_notmatch(pat .. stat, g:a) + call writefile(getline(1, '$'), 'sample.txt') + " n does not update search stat + call assert_equal( + \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99}, + \ searchcount(#{recompute: 0})) + call assert_equal( + \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99}, + \ searchcount(#{recompute: v:true})) set shortmess-=S " Many matches @@ -41,10 +90,28 @@ func Test_search_stat() let g:a = execute(':unsilent :norm! n') let stat = '\[>99/>99\]' call assert_match(pat .. stat, g:a) + call assert_equal( + \ #{current: 100, exact_match: 0, total: 100, incomplete: 2, maxcount: 99}, + \ searchcount(#{recompute: 0})) + call assert_equal( + \ #{current: 272, exact_match: 1, total: 280, incomplete: 0, maxcount: 0}, + \ searchcount(#{recompute: v:true, maxcount: 0, timeout: 200})) + call assert_equal( + \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0}, + \ searchcount(#{recompute: 1, maxcount: 0, pos: [1, 1, 0], timeout: 200})) call cursor(line('$'), 1) let g:a = execute(':unsilent :norm! n') let stat = 'W \[1/>99\]' call assert_match(pat .. stat, g:a) + call assert_equal( + \ #{current: 1, exact_match: 1, total: 100, incomplete: 2, maxcount: 99}, + \ searchcount(#{recompute: 0})) + call assert_equal( + \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0}, + \ searchcount(#{recompute: 1, maxcount: 0, timeout: 200})) + call assert_equal( + \ #{current: 271, exact_match: 1, total: 280, incomplete: 0, maxcount: 0}, + \ searchcount(#{recompute: 1, maxcount: 0, pos: [line('$')-2, 1, 0], timeout: 200})) " Many matches call cursor(1, 1) @@ -180,12 +247,22 @@ func Test_search_stat() call assert_match('^\s\+' .. stat, g:b) unmap n + " Time out + %delete _ + call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 100000)) + call cursor(1, 1) + call assert_equal(1, searchcount(#{pattern: 'foo', maxcount: 0, timeout: 1}).incomplete) + " Clean up set shortmess+=S " close the window bwipe! endfunc +func Test_searchcount_fails() + call assert_fails('echo searchcount("boo!")', 'E715:') +endfunc + func Test_search_stat_foldopen() CheckScreendump @@ -252,9 +329,9 @@ func Test_searchcount_in_statusline() function TestSearchCount() abort let search_count = searchcount() if !empty(search_count) - return '[' . search_count.current . '/' . search_count.total . ']' + return '[' . search_count.current . '/' . search_count.total . ']' else - return '' + return '' endif endfunction set hlsearch diff --git a/src/nvim/testdir/test_shift.vim b/src/nvim/testdir/test_shift.vim new file mode 100644 index 0000000000..ec357dac88 --- /dev/null +++ b/src/nvim/testdir/test_shift.vim @@ -0,0 +1,117 @@ +" Test shifting lines with :> and :< + +source check.vim + +func Test_ex_shift_right() + set shiftwidth=2 + + " shift right current line. + call setline(1, range(1, 5)) + 2 + > + 3 + >> + call assert_equal(['1', + \ ' 2', + \ ' 3', + \ '4', + \ '5'], getline(1, '$')) + + " shift right with range. + call setline(1, range(1, 4)) + 2,3>> + call assert_equal(['1', + \ ' 2', + \ ' 3', + \ '4', + \ '5'], getline(1, '$')) + + " shift right with range and count. + call setline(1, range(1, 4)) + 2>3 + call assert_equal(['1', + \ ' 2', + \ ' 3', + \ ' 4', + \ '5'], getline(1, '$')) + + bw! + set shiftwidth& +endfunc + +func Test_ex_shift_left() + set shiftwidth=2 + + call setline(1, range(1, 5)) + %>>> + + " left shift current line. + 2< + 3<< + 4<<<<< + call assert_equal([' 1', + \ ' 2', + \ ' 3', + \ '4', + \ ' 5'], getline(1, '$')) + + " shift right with range. + call setline(1, range(1, 5)) + %>>> + 2,3<< + call assert_equal([' 1', + \ ' 2', + \ ' 3', + \ ' 4', + \ ' 5'], getline(1, '$')) + + " shift right with range and count. + call setline(1, range(1, 5)) + %>>> + 2<<3 + call assert_equal([' 1', + \ ' 2', + \ ' 3', + \ ' 4', + \ ' 5'], getline(1, '$')) + + bw! + set shiftwidth& +endfunc + +func Test_ex_shift_rightleft() + CheckFeature rightleft + + set shiftwidth=2 rightleft + + call setline(1, range(1, 4)) + 2,3<< + call assert_equal(['1', + \ ' 2', + \ ' 3', + \ '4'], getline(1, '$')) + + 3,4> + call assert_equal(['1', + \ ' 2', + \ ' 3', + \ '4'], getline(1, '$')) + + bw! + set rightleft& shiftwidth& +endfunc + +func Test_ex_shift_errors() + call assert_fails('><', 'E488:') + call assert_fails('<>', 'E488:') + + call assert_fails('>!', 'E477:') + call assert_fails('<!', 'E477:') + + " call assert_fails('2,1>', 'E493:') + call assert_fails('execute "2,1>"', 'E493:') + " call assert_fails('2,1<', 'E493:') + call assert_fails('execute "2,1<"', 'E493:') +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_signs.vim b/src/nvim/testdir/test_signs.vim index 9c3a5636ce..9753100375 100644 --- a/src/nvim/testdir/test_signs.vim +++ b/src/nvim/testdir/test_signs.vim @@ -134,7 +134,7 @@ func Test_sign() sign define Sign5 text=X\ linehl=Comment sign undefine Sign5 - sign define Sign5 linehl=Comment text=X\ + sign define Sign5 linehl=Comment text=X\ sign undefine Sign5 " define sign with backslash @@ -415,7 +415,7 @@ func Test_sign_funcs() " Tests for invalid arguments to sign_define() call assert_fails('call sign_define("sign4", {"text" : "===>"})', 'E239:') " call assert_fails('call sign_define("sign5", {"text" : ""})', 'E239:') - call assert_fails('call sign_define([])', 'E730:') + call assert_fails('call sign_define({})', 'E731:') call assert_fails('call sign_define("sign6", [])', 'E715:') " Tests for sign_getdefined() @@ -444,7 +444,7 @@ func Test_sign_funcs() call assert_fails('call sign_place([], "", "mySign", 1)', 'E745:') call assert_fails('call sign_place(5, "", "mySign", -1)', 'E158:') call assert_fails('call sign_place(-1, "", "sign1", "Xsign", [])', - \ 'E474:') + \ 'E715:') call assert_fails('call sign_place(-1, "", "sign1", "Xsign", \ {"lnum" : 30})', 'E474:') call assert_fails('call sign_place(10, "", "xsign1x", "Xsign", @@ -460,11 +460,11 @@ func Test_sign_funcs() call assert_fails('call sign_place(5, "", "sign1", [], {"lnum" : 10})', \ 'E158:') call assert_fails('call sign_place(21, "", "sign1", "Xsign", - \ {"lnum" : -1})', 'E885:') + \ {"lnum" : -1})', 'E474:') call assert_fails('call sign_place(22, "", "sign1", "Xsign", - \ {"lnum" : 0})', 'E885:') + \ {"lnum" : 0})', 'E474:') call assert_fails('call sign_place(22, "", "sign1", "Xsign", - \ {"lnum" : []})', 'E745:') + \ {"lnum" : []})', 'E474:') call assert_equal(-1, sign_place(1, "*", "sign1", "Xsign", {"lnum" : 10})) " Tests for sign_getplaced() @@ -504,11 +504,21 @@ func Test_sign_funcs() \ {'id' : 20, 'buffer' : 200})", 'E158:') call assert_fails("call sign_unplace('g1', 'mySign')", 'E715:') + call sign_unplace('*') + + " Test for modifying a placed sign + call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign', {'lnum' : 20})) + call assert_equal(15, sign_place(15, '', 'sign2', 'Xsign')) + call assert_equal([{'bufnr' : bufnr(''), 'signs' : + \ [{'id' : 15, 'group' : '', 'lnum' : 20, 'name' : 'sign2', + \ 'priority' : 10}]}], + \ sign_getplaced()) + " Tests for sign_undefine() call assert_equal(0, sign_undefine("sign1")) call assert_equal([], sign_getdefined("sign1")) call assert_fails('call sign_undefine("none")', 'E155:') - call assert_fails('call sign_undefine([])', 'E730:') + call assert_fails('call sign_undefine({})', 'E731:') " Test for using '.' as the line number for sign_place() call Sign_define_ignore_error("sign1", attr) @@ -644,7 +654,7 @@ func Test_sign_group() call assert_equal([], sign_getplaced(bnum, {'group' : '*'})[0].signs) " Error case - call assert_fails("call sign_unplace([])", 'E474:') + call assert_fails("call sign_unplace({})", 'E474:') " Place a sign in the global group and try to delete it using a group call assert_equal(5, sign_place(5, '', 'sign1', bnum, {'lnum' : 10})) @@ -1131,7 +1141,7 @@ func Test_sign_unplace() endfunc " Tests for auto-generating the sign identifier -func Test_sign_id_autogen() +func Test_aaa_sign_id_autogen() enew | only call sign_unplace('*') call sign_undefine() @@ -1618,26 +1628,7 @@ func Test_sign_lnum_adjust() " Delete the line with the sign call deletebufline('', 4) let l = sign_getplaced(bufnr('')) - call assert_equal(4, l[0].signs[0].lnum) - - " Undo the delete operation - undo - let l = sign_getplaced(bufnr('')) - call assert_equal(5, l[0].signs[0].lnum) - - " Break the undo - let &undolevels=&undolevels - - " Delete few lines at the end of the buffer including the line with the sign - " Sign line number should not change (as it is placed outside of the buffer) - call deletebufline('', 3, 6) - let l = sign_getplaced(bufnr('')) - call assert_equal(5, l[0].signs[0].lnum) - - " Undo the delete operation. Sign should be restored to the previous line - undo - let l = sign_getplaced(bufnr('')) - call assert_equal(5, l[0].signs[0].lnum) + call assert_equal(0, len(l[0].signs)) sign unplace * group=* sign undefine sign1 @@ -1868,3 +1859,121 @@ func Test_sign_numcol() set number& enew! | close endfunc + +" Test for managing multiple signs using the sign functions +func Test_sign_funcs_multi() + call writefile(repeat(["Sun is shining"], 30), "Xsign") + edit Xsign + let bnum = bufnr('') + + " Define multiple signs at once + call assert_equal([0, 0, 0, 0], sign_define([ + \ {'name' : 'sign1', 'text' : '=>', 'linehl' : 'Search', + \ 'texthl' : 'Search'}, + \ {'name' : 'sign2', 'text' : '=>', 'linehl' : 'Search', + \ 'texthl' : 'Search'}, + \ {'name' : 'sign3', 'text' : '=>', 'linehl' : 'Search', + \ 'texthl' : 'Search'}, + \ {'name' : 'sign4', 'text' : '=>', 'linehl' : 'Search', + \ 'texthl' : 'Search'}])) + + " Negative cases for sign_define() + call assert_equal([], sign_define([])) + call assert_equal([-1], sign_define([{}])) + call assert_fails('call sign_define([6])', 'E715:') + call assert_fails('call sign_define(["abc"])', 'E715:') + call assert_fails('call sign_define([[]])', 'E715:') + + " Place multiple signs at once with specific sign identifier + let l = sign_placelist([{'id' : 1, 'group' : 'g1', 'name' : 'sign1', + \ 'buffer' : 'Xsign', 'lnum' : 11, 'priority' : 50}, + \ {'id' : 2, 'group' : 'g2', 'name' : 'sign2', + \ 'buffer' : 'Xsign', 'lnum' : 11, 'priority' : 100}, + \ {'id' : 3, 'group' : '', 'name' : 'sign3', + \ 'buffer' : 'Xsign', 'lnum' : 11}]) + call assert_equal([1, 2, 3], l) + let s = sign_getplaced('Xsign', {'group' : '*'}) + call assert_equal([ + \ {'id' : 2, 'name' : 'sign2', 'lnum' : 11, + \ 'group' : 'g2', 'priority' : 100}, + \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, + \ 'group' : 'g1', 'priority' : 50}, + \ {'id' : 3, 'name' : 'sign3', 'lnum' : 11, + \ 'group' : '', 'priority' : 10}], s[0].signs) + + call sign_unplace('*') + + " Place multiple signs at once with auto-generated sign identifier + call assert_equal([1, 1, 5], sign_placelist([ + \ {'group' : 'g1', 'name' : 'sign1', + \ 'buffer' : 'Xsign', 'lnum' : 11}, + \ {'group' : 'g2', 'name' : 'sign2', + \ 'buffer' : 'Xsign', 'lnum' : 11}, + \ {'group' : '', 'name' : 'sign3', + \ 'buffer' : 'Xsign', 'lnum' : 11}])) + let s = sign_getplaced('Xsign', {'group' : '*'}) + call assert_equal([ + \ {'id' : 5, 'name' : 'sign3', 'lnum' : 11, + \ 'group' : '', 'priority' : 10}, + \ {'id' : 1, 'name' : 'sign2', 'lnum' : 11, + \ 'group' : 'g2', 'priority' : 10}, + \ {'id' : 1, 'name' : 'sign1', 'lnum' : 11, + \ 'group' : 'g1', 'priority' : 10}], s[0].signs) + + " Change an existing sign without specifying the group + call assert_equal([5], sign_placelist([ + \ {'id' : 5, 'name' : 'sign1', 'buffer' : 'Xsign'}])) + let s = sign_getplaced('Xsign', {'id' : 5, 'group' : ''}) + call assert_equal([{'id' : 5, 'name' : 'sign1', 'lnum' : 11, + \ 'group' : '', 'priority' : 10}], s[0].signs) + + " Place a sign using '.' as the line number + call cursor(23, 1) + call assert_equal([7], sign_placelist([ + \ {'id' : 7, 'name' : 'sign1', 'buffer' : '%', 'lnum' : '.'}])) + let s = sign_getplaced('%', {'lnum' : '.'}) + call assert_equal([{'id' : 7, 'name' : 'sign1', 'lnum' : 23, + \ 'group' : '', 'priority' : 10}], s[0].signs) + + " Place sign without a sign name + call assert_equal([-1], sign_placelist([{'id' : 10, 'buffer' : 'Xsign', + \ 'lnum' : 12, 'group' : ''}])) + + " Place sign without a buffer + call assert_equal([-1], sign_placelist([{'id' : 10, 'name' : 'sign1', + \ 'lnum' : 12, 'group' : ''}])) + + " Invalid arguments + call assert_equal([], sign_placelist([])) + call assert_fails('call sign_placelist({})', "E714:") + call assert_fails('call sign_placelist([[]])', "E715:") + call assert_fails('call sign_placelist(["abc"])', "E715:") + call assert_fails('call sign_placelist([100])', "E715:") + + " Unplace multiple signs + call assert_equal([0, 0, 0], sign_unplacelist([{'id' : 5}, + \ {'id' : 1, 'group' : 'g1'}, {'id' : 1, 'group' : 'g2'}])) + + " Invalid arguments + call assert_equal([], sign_unplacelist([])) + call assert_fails('call sign_unplacelist({})', "E714:") + call assert_fails('call sign_unplacelist([[]])', "E715:") + call assert_fails('call sign_unplacelist(["abc"])', "E715:") + call assert_fails('call sign_unplacelist([100])', "E715:") + call assert_fails("call sign_unplacelist([{'id' : -1}])", 'E474') + + call assert_equal([0, 0, 0, 0], + \ sign_undefine(['sign1', 'sign2', 'sign3', 'sign4'])) + call assert_equal([], sign_getdefined()) + + " Invalid arguments + call assert_equal([], sign_undefine([])) + call assert_fails('call sign_undefine([[]])', 'E730:') + call assert_fails('call sign_undefine([{}])', 'E731:') + call assert_fails('call sign_undefine(["1abc2"])', 'E155:') + + call sign_unplace('*') + call sign_undefine() + enew! + call delete("Xsign") +endfunc diff --git a/src/nvim/testdir/test_sort.vim b/src/nvim/testdir/test_sort.vim index 7533eaf2e8..6d55889641 100644 --- a/src/nvim/testdir/test_sort.vim +++ b/src/nvim/testdir/test_sort.vim @@ -13,6 +13,37 @@ func Test_sort_strings() " numbers compared as strings call assert_equal([1, 2, 3], sort([3, 2, 1])) call assert_equal([13, 28, 3], sort([3, 28, 13])) + + call assert_equal(['A', 'O', 'P', 'a', 'o', 'p', 'Ä', 'Ô', 'ä', 'ô', 'Œ', 'œ'], + \ sort(['A', 'O', 'P', 'a', 'o', 'p', 'Ä', 'Ô', 'ä', 'ô', 'œ', 'Œ'])) + + call assert_equal(['A', 'a', 'o', 'O', 'p', 'P', 'Ä', 'Ô', 'ä', 'ô', 'Œ', 'œ'], + \ sort(['A', 'a', 'o', 'O', 'œ', 'Œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'i')) + + " This does not appear to work correctly on Mac. + if !has('mac') + if v:collate =~? '^\(en\|fr\)_ca.utf-\?8$' + " with Canadian English capitals come before lower case. + " 'Œ' is omitted because it can sort before or after 'œ' + call assert_equal(['A', 'a', 'Ä', 'ä', 'O', 'o', 'Ô', 'ô', 'œ', 'P', 'p'], + \ sort(['A', 'a', 'o', 'O', 'œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l')) + elseif v:collate =~? '^\(en\|es\|de\|fr\|it\|nl\).*\.utf-\?8$' + " With the following locales, the accentuated letters are ordered + " similarly to the non-accentuated letters... + call assert_equal(['a', 'A', 'ä', 'Ä', 'o', 'O', 'ô', 'Ô', 'œ', 'Œ', 'p', 'P'], + \ sort(['A', 'a', 'o', 'O', 'œ', 'Œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l')) + elseif v:collate =~? '^sv.*utf-\?8$' + " ... whereas with a Swedish locale, the accentuated letters are ordered + " after Z. + call assert_equal(['a', 'A', 'o', 'O', 'p', 'P', 'ä', 'Ä', 'œ', 'œ', 'ô', 'Ô'], + \ sort(['A', 'a', 'o', 'O', 'œ', 'œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l')) + endif + endif +endfunc + +func Test_sort_null_string() + " null strings are sorted as empty strings. + call assert_equal(['', 'a', 'b'], sort(['b', v:_null_string, 'a'])) endfunc func Test_sort_numeric() @@ -1150,7 +1181,7 @@ func Test_sort_cmd() \ 'input' : [ \ '1.234', \ '0.88', - \ '123.456', + \ ' + 123.456', \ '1.15e-6', \ '-1.1e3', \ '-1.01e3', @@ -1165,7 +1196,7 @@ func Test_sort_cmd() \ '1.15e-6', \ '0.88', \ '1.234', - \ '123.456' + \ ' + 123.456' \ ] \ }, \ { @@ -1197,8 +1228,133 @@ func Test_sort_cmd() \ 'cc', \ ] \ }, + \ { + \ 'name' : 'sort one line buffer', + \ 'cmd' : 'sort', + \ 'input' : [ + \ 'single line' + \ ], + \ 'expected' : [ + \ 'single line' + \ ] + \ }, + \ { + \ 'name' : 'sort ignoring case', + \ 'cmd' : '%sort i', + \ 'input' : [ + \ 'BB', + \ 'Cc', + \ 'aa' + \ ], + \ 'expected' : [ + \ 'aa', + \ 'BB', + \ 'Cc' + \ ] + \ }, \ ] + " This does not appear to work correctly on Mac. + if !has('mac') + if v:collate =~? '^\(en\|fr\)_ca.utf-\?8$' + " en_CA.utf-8 sorts capitals before lower case + " 'Œ' is omitted because it can sort before or after 'œ' + let tests += [ + \ { + \ 'name' : 'sort with locale ' .. v:collate, + \ 'cmd' : '%sort l', + \ 'input' : [ + \ 'A', + \ 'E', + \ 'O', + \ 'À', + \ 'È', + \ 'É', + \ 'Ô', + \ 'Z', + \ 'a', + \ 'e', + \ 'o', + \ 'à', + \ 'è', + \ 'é', + \ 'ô', + \ 'œ', + \ 'z' + \ ], + \ 'expected' : [ + \ 'A', + \ 'a', + \ 'À', + \ 'à', + \ 'E', + \ 'e', + \ 'É', + \ 'é', + \ 'È', + \ 'è', + \ 'O', + \ 'o', + \ 'Ô', + \ 'ô', + \ 'œ', + \ 'Z', + \ 'z' + \ ] + \ }, + \ ] + elseif v:collate =~? '^\(en\|es\|de\|fr\|it\|nl\).*\.utf-\?8$' + " With these locales, the accentuated letters are ordered + " similarly to the non-accentuated letters. + let tests += [ + \ { + \ 'name' : 'sort with locale ' .. v:collate, + \ 'cmd' : '%sort l', + \ 'input' : [ + \ 'A', + \ 'E', + \ 'O', + \ 'À', + \ 'È', + \ 'É', + \ 'Ô', + \ 'Œ', + \ 'Z', + \ 'a', + \ 'e', + \ 'o', + \ 'à', + \ 'è', + \ 'é', + \ 'ô', + \ 'œ', + \ 'z' + \ ], + \ 'expected' : [ + \ 'a', + \ 'A', + \ 'à', + \ 'À', + \ 'e', + \ 'E', + \ 'é', + \ 'É', + \ 'è', + \ 'È', + \ 'o', + \ 'O', + \ 'ô', + \ 'Ô', + \ 'œ', + \ 'Œ', + \ 'z', + \ 'Z' + \ ] + \ }, + \ ] + endif + endif + for t in tests enew! call append(0, t.input) @@ -1217,7 +1373,11 @@ func Test_sort_cmd() endif endfor - call assert_fails('sort no', 'E474') + " Needs atleast two lines for this test + call setline(1, ['line1', 'line2']) + call assert_fails('sort no', 'E474:') + call assert_fails('sort c', 'E475:') + call assert_fails('sort #pat%', 'E682:') enew! endfunc @@ -1319,4 +1479,46 @@ func Test_sort_cmd_report() " the output comes from the :g command, not from the :sort call assert_match("6 fewer lines", res) enew! - endfunc +endfunc + +" Test for a :sort command followed by another command +func Test_sort_followed_by_cmd() + new + let var = '' + call setline(1, ['cc', 'aa', 'bb']) + %sort | let var = "sortcmdtest" + call assert_equal(var, "sortcmdtest") + call assert_equal(['aa', 'bb', 'cc'], getline(1, '$')) + " Test for :sort followed by a comment + call setline(1, ['3b', '1c', '2a']) + %sort /\d\+/ " sort alphabetically + call assert_equal(['2a', '3b', '1c'], getline(1, '$')) + close! +endfunc + +" Test for :sort using last search pattern +func Test_sort_last_search_pat() + new + let @/ = '\d\+' + call setline(1, ['3b', '1c', '2a']) + sort // + call assert_equal(['2a', '3b', '1c'], getline(1, '$')) + close! +endfunc + +" Test for retaining marks across a :sort +func Test_sort_with_marks() + new + call setline(1, ['cc', 'aa', 'bb']) + call setpos("'c", [0, 1, 0, 0]) + call setpos("'a", [0, 2, 0, 0]) + call setpos("'b", [0, 3, 0, 0]) + %sort + call assert_equal(['aa', 'bb', 'cc'], getline(1, '$')) + call assert_equal(2, line("'a")) + call assert_equal(3, line("'b")) + call assert_equal(1, line("'c")) + close! +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim index eb9378194f..e0dc0e0075 100644 --- a/src/nvim/testdir/test_startup.vim +++ b/src/nvim/testdir/test_startup.vim @@ -814,6 +814,34 @@ func Test_v_argv() call assert_equal(['arg1', '--cmd', 'echo v:argv', '--cmd', 'q'']'], list[idx:]) endfunc +" Test for the '-t' option to jump to a tag +func Test_t_arg() + let before =<< trim [CODE] + set tags=Xtags + [CODE] + let after =<< trim [CODE] + let s = bufname('') .. ':L' .. line('.') .. 'C' .. col('.') + call writefile([s], "Xtestout") + qall + [CODE] + call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", + \ "first\tXfile1\t/^ \\zsfirst$/", + \ "second\tXfile1\t/^ \\zssecond$/", + \ "third\tXfile1\t/^ \\zsthird$/"], + \ 'Xtags') + call writefile([' first', ' second', ' third'], 'Xfile1') + + for t_arg in ['-t second', '-tsecond'] + if RunVim(before, after, '-t second') + call assert_equal(['Xfile1:L2C5'], readfile('Xtestout'), t_arg) + call delete('Xtestout') + endif + endfor + + call delete('Xtags') + call delete('Xfile1') +endfunc + " Test the '-T' argument which sets the 'term' option. func Test_T_arg() throw 'skipped: Nvim does not support "-T" argument' @@ -890,6 +918,38 @@ func Test_not_a_term() endfunc +" Test for the "-w scriptout" argument +func Test_w_arg() + " Can't catch the output of gvim. + CheckNotGui + + call writefile(["iVim Editor\<Esc>:q!\<CR>"], 'Xscriptin', 'b') + if RunVim([], [], '-s Xscriptin -w Xscriptout') + call assert_equal(["iVim Editor\e:q!\r"], readfile('Xscriptout')) + call delete('Xscriptout') + endif + call delete('Xscriptin') + + " Test for failing to open the script output file. This test works only when + " the language is English. + if !has('win32') && (v:lang == "C" || v:lang =~ '^[Ee]n') + call mkdir("Xdir") + let m = system(GetVimCommand() .. " -w Xdir") + call assert_equal("Cannot open for script output: \"Xdir\"\n", m) + call delete("Xdir", 'rf') + endif + + " A number argument sets the 'window' option + call writefile(["iwindow \<C-R>=&window\<CR>\<Esc>:wq! Xresult\<CR>"], 'Xscriptin', 'b') + for w_arg in ['-w 17', '-w17'] + if RunVim([], [], '-s Xscriptin ' .. w_arg) + call assert_equal(["window 17"], readfile('Xresult'), w_arg) + call delete('Xresult') + endif + endfor + call delete('Xscriptin') +endfunc + " Test starting vim with various names: vim, ex, view, evim, etc. func Test_progname() CheckUnix diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim index ce2ef4dcd8..a3e4dcdd25 100644 --- a/src/nvim/testdir/test_statusline.vim +++ b/src/nvim/testdir/test_statusline.vim @@ -241,6 +241,26 @@ func Test_statusline() call assert_match('^vimLineComment\s*$', s:get_statusline()) syntax off + "%{%expr%}: evaluates enxpressions present in result of expr + func! Inner_eval() + return '%n some other text' + endfunc + func! Outer_eval() + return 'some text %{%Inner_eval()%}' + endfunc + set statusline=%{%Outer_eval()%} + call assert_match('^some text ' . bufnr() . ' some other text\s*$', s:get_statusline()) + delfunc Inner_eval + delfunc Outer_eval + + "%{%expr%}: Doesn't get stuck in recursion + func! Recurse_eval() + return '%{%Recurse_eval()%}' + endfunc + set statusline=%{%Recurse_eval()%} + call assert_match('^%{%Recurse_eval()%}\s*$', s:get_statusline()) + delfunc Recurse_eval + "%(: Start of item group. set statusline=ab%(cd%q%)de call assert_match('^abde\s*$', s:get_statusline()) @@ -440,6 +460,28 @@ func Test_statusline_removed_group() call delete('XTest_statusline') endfunc +func Test_statusline_using_mode() + CheckScreendump + + let lines =<< trim END + setlocal statusline=-%{mode()}- + split + setlocal statusline=+%{mode()}+ + END + call writefile(lines, 'XTest_statusline') + + let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 7, 'cols': 50}) + call VerifyScreenDump(buf, 'Test_statusline_mode_1', {}) + + call term_sendkeys(buf, ":") + call VerifyScreenDump(buf, 'Test_statusline_mode_2', {}) + + " clean up + call term_sendkeys(buf, "close\<CR>") + call StopVimInTerminal(buf) + call delete('XTest_statusline') +endfunc + func Test_statusline_after_split_vsplit() only diff --git a/src/nvim/testdir/test_substitute.vim b/src/nvim/testdir/test_substitute.vim index cc3bfe9f7f..e7f9bb76f2 100644 --- a/src/nvim/testdir/test_substitute.vim +++ b/src/nvim/testdir/test_substitute.vim @@ -426,6 +426,8 @@ func Test_substitute_errors() call assert_fails('s/FOO/bar/', 'E486:') call assert_fails('s/foo/bar/@', 'E488:') call assert_fails('s/\(/bar/', 'E476:') + call assert_fails('s afooabara', 'E146:') + call assert_fails('s\\a', 'E10:') setl nomodifiable call assert_fails('s/foo/bar/', 'E21:') @@ -754,4 +756,13 @@ func Test_submatch_list_concatenate() call assert_equal(substitute('A1', pat, Rep, ''), "[['A1'], ['1']]") endfunc +func Test_substitute_skipped_range() + new + if 0 + /1/5/2/2/\n + endif + call assert_equal([0, 1, 1, 0, 1], getcurpos()) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim index 66cb0bbe22..875e23894f 100644 --- a/src/nvim/testdir/test_syntax.vim +++ b/src/nvim/testdir/test_syntax.vim @@ -24,6 +24,32 @@ func GetSyntaxItem(pat) return c endfunc +func AssertHighlightGroups(lnum, startcol, expected, trans = 1, msg = "") + " Assert that the characters starting at a given (line, col) + " sequentially match the expected highlight groups. + " If groups are provided as a string, each character is assumed to be a + " group and spaces represent no group, useful for visually describing tests. + let l:expectedGroups = type(a:expected) == v:t_string + "\ ? a:expected->split('\zs')->map({_, v -> trim(v)}) + \ ? map(split(a:expected, '\zs'), {_, v -> trim(v)}) + \ : a:expected + let l:errors = 0 + " let l:msg = (a:msg->empty() ? "" : a:msg .. ": ") + let l:msg = (empty(a:msg) ? "" : a:msg .. ": ") + \ .. "Wrong highlight group at " .. a:lnum .. "," + + " for l:i in range(a:startcol, a:startcol + l:expectedGroups->len() - 1) + " let l:errors += synID(a:lnum, l:i, a:trans) + " \ ->synIDattr("name") + " \ ->assert_equal(l:expectedGroups[l:i - 1], + for l:i in range(a:startcol, a:startcol + len(l:expectedGroups) - 1) + let l:errors += + \ assert_equal(synIDattr(synID(a:lnum, l:i, a:trans), "name"), + \ l:expectedGroups[l:i - 1], + \ l:msg .. l:i) + endfor +endfunc + func Test_syn_iskeyword() new call setline(1, [ @@ -707,3 +733,22 @@ func Test_syntax_foldlevel() quit! endfunc + +func Test_syn_include_contains_TOP() + let l:case = "TOP in included syntax means its group list name" + new + syntax include @INCLUDED syntax/c.vim + syntax region FencedCodeBlockC start=/```c/ end=/```/ contains=@INCLUDED + + call setline(1, ['```c', '#if 0', 'int', '#else', 'int', '#endif', '```' ]) + let l:expected = ["cCppOutIf2"] + eval AssertHighlightGroups(3, 1, l:expected, 1) + " cCppOutElse has contains=TOP + let l:expected = ["cType"] + eval AssertHighlightGroups(5, 1, l:expected, 1, l:case) + syntax clear + bw! +endfunc + + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/testdir/test_textformat.vim b/src/nvim/testdir/test_textformat.vim index 4af52b536c..29f0433954 100644 --- a/src/nvim/testdir/test_textformat.vim +++ b/src/nvim/testdir/test_textformat.vim @@ -891,6 +891,14 @@ func Test_mps() bwipe! endfunc +func Test_empty_matchpairs() + split + set matchpairs= showmatch + call assert_nobeep('call feedkeys("ax\tx\t\<Esc>", "xt")') + set matchpairs& noshowmatch + bwipe! +endfunc + " Test for ra on multi-byte characters func Test_ra_multibyte() new diff --git a/src/nvim/testdir/test_utf8.vim b/src/nvim/testdir/test_utf8.vim index e8161f8fcb..c51fb3a759 100644 --- a/src/nvim/testdir/test_utf8.vim +++ b/src/nvim/testdir/test_utf8.vim @@ -84,7 +84,7 @@ func Test_list2str_str2list_utf8() " Null list is the same as an empty list call assert_equal('', list2str([])) - " call assert_equal('', list2str(test_null_list())) + call assert_equal('', list2str(v:_null_list)) endfunc func Test_list2str_str2list_latin1() diff --git a/src/nvim/testdir/test_winbuf_close.vim b/src/nvim/testdir/test_winbuf_close.vim index ee43540fdd..7f5b80e8d3 100644 --- a/src/nvim/testdir/test_winbuf_close.vim +++ b/src/nvim/testdir/test_winbuf_close.vim @@ -160,7 +160,7 @@ func Test_winfixwidth_on_close() endfunction " Test that 'winfixheight' will be respected even there is non-leaf frame -fun! Test_winfixheight_non_leaf_frame() +func Test_winfixheight_non_leaf_frame() vsplit botright 11new let l:wid = win_getid() @@ -173,7 +173,7 @@ fun! Test_winfixheight_non_leaf_frame() endf " Test that 'winfixwidth' will be respected even there is non-leaf frame -fun! Test_winfixwidth_non_leaf_frame() +func Test_winfixwidth_non_leaf_frame() split topleft 11vnew let l:wid = win_getid() @@ -184,3 +184,13 @@ fun! Test_winfixwidth_non_leaf_frame() call assert_equal(11, winwidth(l:wid)) %bwipe! endf + +func Test_tabwin_close() + enew + let l:wid = win_getid() + tabedit + call win_execute(l:wid, 'close') + " Should not crash. + call assert_true(v:true) + %bwipe! +endfunc diff --git a/src/nvim/testdir/test_writefile.vim b/src/nvim/testdir/test_writefile.vim index 56031662a3..c7710ff198 100644 --- a/src/nvim/testdir/test_writefile.vim +++ b/src/nvim/testdir/test_writefile.vim @@ -1,5 +1,8 @@ " Tests for the writefile() function and some :write commands. +source check.vim +source term_util.vim + func Test_writefile() let f = tempname() call writefile(["over","written"], f, "b") @@ -161,6 +164,69 @@ func Test_writefile_autowrite_nowrite() set noautowrite endfunc +" Test for ':w !<cmd>' to pipe lines from the current buffer to an external +" command. +func Test_write_pipe_to_cmd() + if !has('unix') + return + endif + new + call setline(1, ['L1', 'L2', 'L3', 'L4']) + 2,3w !cat > Xfile + call assert_equal(['L2', 'L3'], readfile('Xfile')) + close! + call delete('Xfile') +endfunc + +" Test for :saveas +func Test_saveas() + call assert_fails('saveas', 'E471:') + call writefile(['L1'], 'Xfile') + new Xfile + new + call setline(1, ['L1']) + call assert_fails('saveas Xfile', 'E139:') + close! + enew | only + call delete('Xfile') +endfunc + +func Test_write_errors() + " Test for writing partial buffer + call writefile(['L1', 'L2', 'L3'], 'Xfile') + new Xfile + call assert_fails('1,2write', 'E140:') + close! + + " Try to overwrite a directory + if has('unix') + call mkdir('Xdir1') + call assert_fails('write Xdir1', 'E17:') + call delete('Xdir1', 'd') + endif + + " Test for :wall for a buffer with no name + enew | only + call setline(1, ['L1']) + call assert_fails('wall', 'E141:') + enew! + + " Test for writing a 'readonly' file + new Xfile + set readonly + call assert_fails('write', 'E45:') + close + + " Test for writing to a read-only file + new Xfile + call setfperm('Xfile', 'r--r--r--') + call assert_fails('write', 'E505:') + call setfperm('Xfile', 'rw-rw-rw-') + close + + call delete('Xfile') +endfunc + func Test_writefile_sync_dev_stdout() if !has('unix') return @@ -179,3 +245,120 @@ func Test_writefile_sync_arg() call writefile(['two'], 'Xtest', 'S') call delete('Xtest') endfunc + +" Tests for reading and writing files with conversion for Win32. +func Test_write_file_encoding() + CheckMSWindows + throw 'skipped: Nvim does not support :w ++enc=cp1251' + let save_encoding = &encoding + let save_fileencodings = &fileencodings + set encoding& fileencodings& + let text =<< trim END + 1 utf-8 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 2 cp1251 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 3 cp866 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + END + call writefile(text, 'Xfile') + edit Xfile + + " write tests: + " combine three values for 'encoding' with three values for 'fileencoding' + " also write files for read tests + call cursor(1, 1) + set encoding=utf-8 + .w! ++enc=utf-8 Xtest + .w ++enc=cp1251 >> Xtest + .w ++enc=cp866 >> Xtest + .w! ++enc=utf-8 Xutf8 + let expected =<< trim END + 1 utf-8 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 1 utf-8 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 1 utf-8 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + call cursor(2, 1) + set encoding=cp1251 + .w! ++enc=utf-8 Xtest + .w ++enc=cp1251 >> Xtest + .w ++enc=cp866 >> Xtest + .w! ++enc=cp1251 Xcp1251 + let expected =<< trim END + 2 cp1251 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 2 cp1251 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 2 cp1251 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + call cursor(3, 1) + set encoding=cp866 + .w! ++enc=utf-8 Xtest + .w ++enc=cp1251 >> Xtest + .w ++enc=cp866 >> Xtest + .w! ++enc=cp866 Xcp866 + let expected =<< trim END + 3 cp866 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 3 cp866 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 3 cp866 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + " read three 'fileencoding's with utf-8 'encoding' + set encoding=utf-8 fencs=utf-8,cp1251 + e Xutf8 + .w! ++enc=utf-8 Xtest + e Xcp1251 + .w ++enc=utf-8 >> Xtest + set fencs=utf-8,cp866 + e Xcp866 + .w ++enc=utf-8 >> Xtest + let expected =<< trim END + 1 utf-8 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 2 cp1251 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + 3 cp866 text: ÐÐ»Ñ Vim version 6.2. ÐоÑледнее изменение: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + " read three 'fileencoding's with cp1251 'encoding' + set encoding=utf-8 fencs=utf-8,cp1251 + e Xutf8 + .w! ++enc=cp1251 Xtest + e Xcp1251 + .w ++enc=cp1251 >> Xtest + set fencs=utf-8,cp866 + e Xcp866 + .w ++enc=cp1251 >> Xtest + let expected =<< trim END + 1 utf-8 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 2 cp1251 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + 3 cp866 text: Äëÿ Vim version 6.2. Ïîñëåäíåå èçìåíåíèå: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + " read three 'fileencoding's with cp866 'encoding' + set encoding=cp866 fencs=utf-8,cp1251 + e Xutf8 + .w! ++enc=cp866 Xtest + e Xcp1251 + .w ++enc=cp866 >> Xtest + set fencs=utf-8,cp866 + e Xcp866 + .w ++enc=cp866 >> Xtest + let expected =<< trim END + 1 utf-8 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + 2 cp1251 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + 3 cp866 text: «ï Vim version 6.2. ®á«¥¤¥¥ ¨§¬¥¥¨¥: 1970 Jan 01 + END + call assert_equal(expected, readfile('Xtest')) + + call delete('Xfile') + call delete('Xtest') + call delete('Xutf8') + call delete('Xcp1251') + call delete('Xcp866') + let &encoding = save_encoding + let &fileencodings = save_fileencodings + %bw! +endfunc + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index 62d7dc8b18..fd83681aed 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -55,7 +55,11 @@ #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) + ? DCS_STR "tmux;\x1b" 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 LINUXSET0C "\x1b[?0c" #define LINUXSET1C "\x1b[?1c" @@ -297,6 +301,12 @@ static void terminfo_start(UI *ui) data->invis, sizeof data->invis); // Set 't_Co' from the result of unibilium & fix_terminfo. t_colors = unibi_get_num(data->ut, unibi_max_colors); + // Ask the terminal to send us the background color. + // If get_bg is sent at the same time after enter_ca_mode, tmux will not send + // get_bg to the host terminal. To avoid this, send get_bg before + // enter_ca_mode. + data->input.waiting_for_bg_response = 5; + unibi_out_ext(ui, data->unibi_ext.get_bg); // Enter alternate screen, save title, and clear. // NOTE: Do this *before* changing terminal settings. #6433 unibi_out(ui, unibi_enter_ca_mode); @@ -304,9 +314,6 @@ static void terminfo_start(UI *ui) unibi_out_ext(ui, data->unibi_ext.save_title); unibi_out(ui, unibi_keypad_xmit); unibi_out(ui, unibi_clear_screen); - // Ask the terminal to send us the background color. - data->input.waiting_for_bg_response = 5; - unibi_out_ext(ui, data->unibi_ext.get_bg); // Enable bracketed paste unibi_out_ext(ui, data->unibi_ext.enable_bracketed_paste); @@ -328,6 +335,7 @@ static void terminfo_start(UI *ui) uv_pipe_init(&data->write_loop, &data->output_handle.pipe, 0); uv_pipe_open(&data->output_handle.pipe, data->out_fd); } + flush_buf(ui); } @@ -1772,8 +1780,10 @@ 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", - "\x1b]11;?\x07"); + data->unibi_ext.get_bg = + (int)unibi_add_ext_str(ut, "ext.get_bg", + SCREEN_TMUX_WRAP((screen && !tmux), tmux, + "\x1b]11;?\x07")); // Terminals with 256-colour SGR support despite what terminfo says. if (unibi_get_num(ut, unibi_max_colors) < 256) { @@ -1999,9 +2009,9 @@ static void augment_terminfo(TUIData *data, const char *term, } data->unibi_ext.save_title = (int)unibi_add_ext_str( - ut, "ext.save_title", "\x1b[22;0;0t"); + ut, "ext.save_title", "\x1b[22;0t"); data->unibi_ext.restore_title = (int)unibi_add_ext_str( - ut, "ext.restore_title", "\x1b[23;0;0t"); + ut, "ext.restore_title", "\x1b[23;0t"); /// Terminals usually ignore unrecognized private modes, and there is no /// known ambiguity with these. So we just set them unconditionally. diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c index a2e9266fbb..1ec5189795 100644 --- a/src/nvim/ui_compositor.c +++ b/src/nvim/ui_compositor.c @@ -165,22 +165,14 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width, } #endif - // TODO(bfredl): this is pretty ad-hoc, add a proper z-order/priority - // scheme. For now: - // - msg_grid is always on top. - // - pum_grid is on top of all windows but not msg_grid. Except for when - // wildoptions=pum, and completing the cmdline with scrolled messages, - // then the pum has to be drawn over the scrolled messages. size_t insert_at = kv_size(layers); - bool cmd_completion = (grid == &pum_grid && (State & CMDLINE) - && (wop_flags & WOP_PUM)); - if (kv_A(layers, insert_at-1) == &msg_grid && !cmd_completion) { + while (insert_at > 0 && kv_A(layers, insert_at-1)->zindex > grid->zindex) { insert_at--; } - if (kv_A(layers, insert_at-1) == &pum_grid && (grid != &msg_grid)) { - insert_at--; - } - if (insert_at > 1 && !on_top) { + + if (curwin && kv_A(layers, insert_at-1) == &curwin->w_grid_alloc + && kv_A(layers, insert_at-1)->zindex == grid->zindex + && !on_top) { insert_at--; } // not found: new grid @@ -278,12 +270,11 @@ static void ui_comp_grid_cursor_goto(UI *ui, Integer grid_handle, // should configure all grids before entering win_update() if (curgrid != &default_grid) { size_t new_index = kv_size(layers)-1; - if (kv_A(layers, new_index) == &msg_grid) { - new_index--; - } - if (kv_A(layers, new_index) == &pum_grid) { + + while (new_index > 1 && kv_A(layers, new_index)->zindex > curgrid->zindex) { new_index--; } + if (curgrid->comp_index < new_index) { ui_comp_raise_grid(curgrid, new_index); } diff --git a/src/nvim/window.c b/src/nvim/window.c index 859f4353b3..936bfa8c5b 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -668,13 +668,25 @@ void win_config_float(win_T *wp, FloatConfig fconfig) } bool change_external = fconfig.external != wp->w_float_config.external; - bool change_border = fconfig.border != wp->w_float_config.border; + bool change_border = (fconfig.border != wp->w_float_config.border + || memcmp(fconfig.border_hl_ids, + wp->w_float_config.border_hl_ids, + sizeof fconfig.border_hl_ids)); + wp->w_float_config = fconfig; + bool has_border = wp->w_floating && wp->w_float_config.border; + for (int i = 0; i < 4; i++) { + wp->w_border_adj[i] = + has_border && wp->w_float_config.border_chars[2 * i+1][0]; + } + if (!ui_has(kUIMultigrid)) { - wp->w_height = MIN(wp->w_height, Rows-1); - wp->w_width = MIN(wp->w_width, Columns); + wp->w_height = MIN(wp->w_height, + Rows - 1 - (wp->w_border_adj[0] + wp->w_border_adj[2])); + wp->w_width = MIN(wp->w_width, + Columns - (wp->w_border_adj[1] + wp->w_border_adj[3])); } win_set_inner_size(wp); @@ -751,10 +763,13 @@ void ui_ext_win_position(win_T *wp) } api_clear_error(&dummy); } + + wp->w_grid_alloc.zindex = wp->w_float_config.zindex; if (ui_has(kUIMultigrid)) { String anchor = cstr_to_string(float_anchor_str[c.anchor]); ui_call_win_float_pos(wp->w_grid_alloc.handle, wp->handle, anchor, - grid->handle, row, col, c.focusable); + grid->handle, row, col, c.focusable, + wp->w_grid_alloc.zindex); } else { // TODO(bfredl): ideally, compositor should work like any multigrid UI // and use standard win_pos events. @@ -763,14 +778,13 @@ void ui_ext_win_position(win_T *wp) int comp_row = (int)row - (south ? wp->w_height : 0); int comp_col = (int)col - (east ? wp->w_width : 0); - comp_row = MAX(MIN(comp_row, Rows-wp->w_height-1), 0); - comp_col = MAX(MIN(comp_col, Columns-wp->w_width), 0); + comp_row = MAX(MIN(comp_row, Rows-wp->w_height_outer-1), 0); + comp_col = MAX(MIN(comp_col, Columns-wp->w_width_outer), 0); wp->w_winrow = comp_row; wp->w_wincol = comp_col; bool valid = (wp->w_redr_type == 0); - bool on_top = (curwin == wp) || !curwin->w_floating; ui_comp_put_grid(&wp->w_grid_alloc, comp_row, comp_col, - wp->w_height_outer, wp->w_width_outer, valid, on_top); + wp->w_height_outer, wp->w_width_outer, valid, false); ui_check_cursor_grid(wp->w_grid_alloc.handle); wp->w_grid_alloc.focusable = wp->w_float_config.focusable; if (!valid) { @@ -2188,7 +2202,7 @@ bool one_nonfloat(void) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT /// always false for a floating window bool last_nonfloat(win_T *wp) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { - return firstwin == wp && !(wp->w_next && !wp->w_floating); + return wp != NULL && firstwin == wp && !(wp->w_next && !wp->w_floating); } /// Close the possibly last window in a tab page. @@ -2275,7 +2289,7 @@ int win_close(win_T *win, bool free_buf) return FAIL; // window is already being closed } if (win == aucmd_win) { - EMSG(_("E813: Cannot close autocmd window")); + EMSG(_(e_autocmd_close)); return FAIL; } if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) { @@ -3455,6 +3469,9 @@ int win_alloc_first(void) first_tabpage = alloc_tabpage(); first_tabpage->tp_topframe = topframe; curtab = first_tabpage; + curtab->tp_firstwin = firstwin; + curtab->tp_lastwin = lastwin; + curtab->tp_curwin = curwin; return OK; } @@ -3623,6 +3640,8 @@ int win_new_tabpage(int after, char_u *filename) newtp->tp_next = tp->tp_next; tp->tp_next = newtp; } + newtp->tp_firstwin = newtp->tp_lastwin = newtp->tp_curwin = curwin; + win_init_size(); firstwin->w_winrow = tabline_height(); win_comp_scroll(curwin); @@ -5731,9 +5750,10 @@ void win_set_inner_size(win_T *wp) terminal_check_size(wp->w_buffer->terminal); } - wp->w_border_adj = wp->w_floating && wp->w_float_config.border ? 1 : 0; - wp->w_height_outer = wp->w_height_inner + 2 * wp->w_border_adj; - wp->w_width_outer = wp->w_width_inner + 2 * wp->w_border_adj; + wp->w_height_outer = (wp->w_height_inner + + wp->w_border_adj[0] + wp->w_border_adj[2]); + wp->w_width_outer = (wp->w_width_inner + + wp->w_border_adj[1] + wp->w_border_adj[3]); } /// Set the width of a window. @@ -6324,6 +6344,13 @@ static win_T *get_snapshot_focus(int idx) int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage_T *tp, int no_display) { block_autocmds(); + return switch_win_noblock(save_curwin, save_curtab, win, tp, no_display); +} + +// As switch_win() but without blocking autocommands. +int switch_win_noblock(win_T **save_curwin, tabpage_T **save_curtab, + win_T *win, tabpage_T *tp, int no_display) +{ *save_curwin = curwin; if (tp != NULL) { *save_curtab = curtab; @@ -6349,6 +6376,14 @@ int switch_win(win_T **save_curwin, tabpage_T **save_curtab, win_T *win, tabpage // triggered. void restore_win(win_T *save_curwin, tabpage_T *save_curtab, bool no_display) { + restore_win_noblock(save_curwin, save_curtab, no_display); + unblock_autocmds(); +} + +// As restore_win() but without unblocking autocommands. +void restore_win_noblock(win_T *save_curwin, tabpage_T *save_curtab, + bool no_display) +{ if (save_curtab != NULL && valid_tabpage(save_curtab)) { if (no_display) { curtab->tp_firstwin = firstwin; @@ -6363,7 +6398,6 @@ void restore_win(win_T *save_curwin, tabpage_T *save_curtab, bool no_display) curwin = save_curwin; curbuf = curwin->w_buffer; } - unblock_autocmds(); } /// Make "buf" the current buffer. @@ -6796,10 +6830,19 @@ void win_id2tabwin(typval_T *const argvars, typval_T *const rettv) win_T * win_id2wp(typval_T *argvars) { + return win_id2wp_tp(argvars, NULL); +} + +// Return the window and tab pointer of window "id". +win_T * win_id2wp_tp(typval_T *argvars, tabpage_T **tpp) +{ int id = tv_get_number(&argvars[0]); FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->handle == id) { + if (tpp != NULL) { + *tpp = tp; + } return wp; } } |