aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/CMakeLists.txt2
-rw-r--r--src/nvim/api/buffer.c60
-rw-r--r--src/nvim/api/private/helpers.c61
-rw-r--r--src/nvim/api/vim.c40
-rw-r--r--src/nvim/api/window.c35
-rw-r--r--src/nvim/ascii.h2
-rw-r--r--src/nvim/autocmd.c12
-rw-r--r--src/nvim/buffer.c26
-rw-r--r--src/nvim/buffer_defs.h13
-rw-r--r--src/nvim/buffer_updates.c13
-rw-r--r--src/nvim/change.c44
-rw-r--r--src/nvim/channel.c32
-rw-r--r--src/nvim/charset.c11
-rw-r--r--src/nvim/decoration.c124
-rw-r--r--src/nvim/decoration.h22
-rw-r--r--src/nvim/edit.c143
-rw-r--r--src/nvim/edit.h1
-rw-r--r--src/nvim/eval.c566
-rw-r--r--src/nvim/eval.h20
-rw-r--r--src/nvim/eval.lua10
-rw-r--r--src/nvim/eval/funcs.c519
-rw-r--r--src/nvim/eval/typval.c39
-rw-r--r--src/nvim/eval/typval.h1
-rw-r--r--src/nvim/eval/userfunc.c13
-rw-r--r--src/nvim/event/libuv_process.c2
-rw-r--r--src/nvim/event/multiqueue.c6
-rw-r--r--src/nvim/ex_cmds.c113
-rw-r--r--src/nvim/ex_cmds.lua6
-rw-r--r--src/nvim/ex_cmds2.c160
-rw-r--r--src/nvim/ex_docmd.c8
-rw-r--r--src/nvim/ex_eval.c9
-rw-r--r--src/nvim/ex_getln.c49
-rw-r--r--src/nvim/ex_session.c91
-rw-r--r--src/nvim/extmark.c1
-rw-r--r--src/nvim/fileio.c128
-rw-r--r--src/nvim/getchar.c519
-rw-r--r--src/nvim/globals.h4
-rw-r--r--src/nvim/hardcopy.c7
-rw-r--r--src/nvim/highlight.c13
-rw-r--r--src/nvim/indent.c102
-rw-r--r--src/nvim/indent_c.c628
-rw-r--r--src/nvim/keymap.c49
-rw-r--r--src/nvim/keymap.h3
-rw-r--r--src/nvim/lib/queue.h16
-rw-r--r--src/nvim/lua/converter.c2
-rw-r--r--src/nvim/lua/converter.h1
-rw-r--r--src/nvim/lua/executor.c207
-rw-r--r--src/nvim/lua/executor.h2
-rw-r--r--src/nvim/lua/treesitter.c12
-rw-r--r--src/nvim/lua/vim.lua22
-rw-r--r--src/nvim/main.c2
-rw-r--r--src/nvim/memory.c6
-rw-r--r--src/nvim/message.c52
-rw-r--r--src/nvim/misc1.c1
-rw-r--r--src/nvim/mouse.c2
-rw-r--r--src/nvim/msgpack_rpc/channel.c2
-rw-r--r--src/nvim/normal.c41
-rw-r--r--src/nvim/ops.c184
-rw-r--r--src/nvim/ops.h1
-rw-r--r--src/nvim/option.c568
-rw-r--r--src/nvim/option_defs.h6
-rw-r--r--src/nvim/options.lua17
-rw-r--r--src/nvim/os/fs.c2
-rw-r--r--src/nvim/os/pty_process_unix.c4
-rw-r--r--src/nvim/os/pty_process_unix.h1
-rw-r--r--src/nvim/os/pty_process_win.c24
-rw-r--r--src/nvim/os/pty_process_win.h1
-rw-r--r--src/nvim/os/shell.c8
-rw-r--r--src/nvim/os/time.c17
-rw-r--r--src/nvim/po/CMakeLists.txt1
-rw-r--r--src/nvim/po/af.po2
-rw-r--r--src/nvim/po/da.po37
-rw-r--r--src/nvim/po/eo.po536
-rw-r--r--src/nvim/po/fi.po2
-rw-r--r--src/nvim/po/fr.po2550
-rw-r--r--src/nvim/po/ga.po37
-rw-r--r--src/nvim/po/ja.euc-jp.po841
-rw-r--r--src/nvim/po/ja.po841
-rw-r--r--src/nvim/po/sr.po1633
-rw-r--r--src/nvim/po/tr.po9370
-rw-r--r--src/nvim/popupmnu.c14
-rw-r--r--src/nvim/quickfix.c11
-rw-r--r--src/nvim/regexp.c12
-rw-r--r--src/nvim/regexp_nfa.c6
-rw-r--r--src/nvim/screen.c258
-rw-r--r--src/nvim/search.c30
-rw-r--r--src/nvim/sign.c712
-rw-r--r--src/nvim/sign_defs.h46
-rw-r--r--src/nvim/spell.c2
-rw-r--r--src/nvim/syntax.c24
-rw-r--r--src/nvim/syntax.h2
-rw-r--r--src/nvim/tag.c15
-rw-r--r--src/nvim/terminal.c5
-rw-r--r--src/nvim/testdir/Makefile11
-rw-r--r--src/nvim/testdir/runtest.vim5
-rw-r--r--src/nvim/testdir/test_alot.vim2
-rw-r--r--src/nvim/testdir/test_alot_latin.vim3
-rw-r--r--src/nvim/testdir/test_alot_utf8.vim1
-rw-r--r--src/nvim/testdir/test_arglist.vim18
-rw-r--r--src/nvim/testdir/test_assert.vim31
-rw-r--r--src/nvim/testdir/test_autochdir.vim8
-rw-r--r--src/nvim/testdir/test_autocmd.vim28
-rw-r--r--src/nvim/testdir/test_backspace_opt.vim20
-rw-r--r--src/nvim/testdir/test_breakindent.vim609
-rw-r--r--src/nvim/testdir/test_cmdline.vim15
-rw-r--r--src/nvim/testdir/test_command_count.vim2
-rw-r--r--src/nvim/testdir/test_compiler.vim4
-rw-r--r--src/nvim/testdir/test_debugger.vim819
-rw-r--r--src/nvim/testdir/test_eval_stuff.vim11
-rw-r--r--src/nvim/testdir/test_excmd.vim183
-rw-r--r--src/nvim/testdir/test_exec_while_if.vim8
-rw-r--r--src/nvim/testdir/test_execute_func.vim53
-rw-r--r--src/nvim/testdir/test_expr.vim9
-rw-r--r--src/nvim/testdir/test_filetype.vim207
-rw-r--r--src/nvim/testdir/test_fnameescape.vim6
-rw-r--r--src/nvim/testdir/test_fold.vim29
-rw-r--r--src/nvim/testdir/test_functions.vim69
-rw-r--r--src/nvim/testdir/test_ga.vim9
-rw-r--r--src/nvim/testdir/test_global.vim8
-rw-r--r--src/nvim/testdir/test_gn.vim4
-rw-r--r--src/nvim/testdir/test_increment.vim46
-rw-r--r--src/nvim/testdir/test_listchars.vim29
-rw-r--r--src/nvim/testdir/test_listdict.vim63
-rw-r--r--src/nvim/testdir/test_listlbr.vim6
-rw-r--r--src/nvim/testdir/test_mapping.vim33
-rw-r--r--src/nvim/testdir/test_menu.vim6
-rw-r--r--src/nvim/testdir/test_messages.vim3
-rw-r--r--src/nvim/testdir/test_mksession.vim33
-rw-r--r--src/nvim/testdir/test_move.vim5
-rw-r--r--src/nvim/testdir/test_options.vim49
-rw-r--r--src/nvim/testdir/test_popup.vim2
-rw-r--r--src/nvim/testdir/test_prompt_buffer.vim195
-rw-r--r--src/nvim/testdir/test_quickfix.vim12
-rw-r--r--src/nvim/testdir/test_quotestar.vim2
-rw-r--r--src/nvim/testdir/test_regexp_latin.vim16
-rw-r--r--src/nvim/testdir/test_registers.vim5
-rw-r--r--src/nvim/testdir/test_rename.vim119
-rw-r--r--src/nvim/testdir/test_search.vim602
-rw-r--r--src/nvim/testdir/test_shift.vim117
-rw-r--r--src/nvim/testdir/test_signs.vim174
-rw-r--r--src/nvim/testdir/test_sort.vim210
-rw-r--r--src/nvim/testdir/test_startup.vim88
-rw-r--r--src/nvim/testdir/test_statusline.vim22
-rw-r--r--src/nvim/testdir/test_substitute.vim20
-rw-r--r--src/nvim/testdir/test_syntax.vim49
-rw-r--r--src/nvim/testdir/test_system.vim4
-rw-r--r--src/nvim/testdir/test_tab.vim45
-rw-r--r--src/nvim/testdir/test_tabpage.vim3
-rw-r--r--src/nvim/testdir/test_textformat.vim8
-rw-r--r--src/nvim/testdir/test_timers.vim4
-rw-r--r--src/nvim/testdir/test_undo.vim6
-rw-r--r--src/nvim/testdir/test_utf8.vim2
-rw-r--r--src/nvim/testdir/test_vartabs.vim381
-rw-r--r--src/nvim/testdir/test_visual.vim2
-rw-r--r--src/nvim/testdir/test_winbuf_close.vim14
-rw-r--r--src/nvim/testdir/test_writefile.vim183
-rw-r--r--src/nvim/tui/tui.c22
-rw-r--r--src/nvim/ui_compositor.c3
-rw-r--r--src/nvim/window.c68
159 files changed, 20472 insertions, 6246 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 2c9d655a15..8b422b3abe 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -506,11 +506,9 @@ if(WIN32)
"file(MAKE_DIRECTORY \"${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms\")")
foreach(DEP_FILE IN ITEMS
ca-bundle.crt
- cat.exe
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..ebc9aeb75f 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 += 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 += 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..24ba6110c4 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -1708,33 +1708,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 +1760,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 +1810,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 +1828,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 +1845,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;
}
}
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index d93be55ee8..e0eebd079f 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)) {
@@ -1269,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)
{
@@ -1339,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);
}
@@ -1427,6 +1433,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
@@ -1437,6 +1444,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"} ]
@@ -2714,6 +2724,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;
}
@@ -2886,19 +2897,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
@@ -2943,8 +2941,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?
@@ -2966,7 +2964,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,
@@ -2987,5 +2985,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 f4af1632ec..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;
}
@@ -492,6 +492,35 @@ Dictionary nvim_win_get_config(Window window, Error *err)
return rv;
}
+/// Closes the window and hide the buffer it contains (like |:hide| with a
+/// |window-ID|).
+///
+/// Like |:hide| the buffer becomes hidden unless another window is editing it,
+/// or 'bufhidden' is `unload`, `delete` or `wipe` as opposed to |:close| or
+/// |nvim_win_close|, which will close the buffer.
+///
+/// @param window Window handle, or 0 for current window
+/// @param[out] err Error details, if any
+void nvim_win_hide(Window window, Error *err)
+ FUNC_API_SINCE(7)
+ FUNC_API_CHECK_TEXTLOCK
+{
+ win_T *win = find_window_by_handle(window, err);
+ if (!win) {
+ return;
+ }
+
+ tabpage_T *tabpage = win_find_tabpage(win);
+ TryState tstate;
+ try_enter(&tstate);
+ if (tabpage == curtab) {
+ win_close(win, false);
+ } else {
+ win_close_othertab(win, false, tabpage);
+ }
+ vim_ignored = try_leave(&tstate, err);
+}
+
/// Closes the window (like |:close| with a |window-ID|).
///
/// @param window Window handle, or 0 for current window
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 c42a0e2dad..ce4163fccf 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -282,7 +282,7 @@ int open_buffer(
// Set/reset the Changed flag first, autocmds may change the buffer.
// Apply the automatic commands, before processing the modelines.
- // So the modelines have priority over auto commands.
+ // So the modelines have priority over autocommands.
// When reading stdin, the buffer contents always needs writing, so set
// the changed flag. Unless in readonly mode: "ls | nvim -R -".
@@ -1844,7 +1844,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;
}
@@ -1946,6 +1946,13 @@ void free_buf_options(buf_T *buf, int free_p_ff)
clear_string_option(&buf->b_p_fo);
clear_string_option(&buf->b_p_flp);
clear_string_option(&buf->b_p_isk);
+ clear_string_option(&buf->b_p_vsts);
+ xfree(buf->b_p_vsts_nopaste);
+ buf->b_p_vsts_nopaste = NULL;
+ xfree(buf->b_p_vsts_array);
+ buf->b_p_vsts_array = NULL;
+ clear_string_option(&buf->b_p_vts);
+ XFREE_CLEAR(buf->b_p_vts_array);
clear_string_option(&buf->b_p_keymap);
keymap_ga_clear(&buf->b_kmap_ga);
ga_clear(&buf->b_kmap_ga);
@@ -5375,8 +5382,8 @@ bool bt_terminal(const buf_T *const buf)
return buf != NULL && buf->b_p_bt[0] == 't';
}
-// Return true if "buf" is a "nofile", "acwrite" or "terminal" buffer.
-// This means the buffer name is not a file name.
+// Return true if "buf" is a "nofile", "acwrite", "terminal" or "prompt"
+// buffer. This means the buffer name is not a file name.
bool bt_nofile(const buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
@@ -5386,7 +5393,8 @@ bool bt_nofile(const buf_T *const buf)
|| buf->b_p_bt[0] == 'p');
}
-// Return true if "buf" is a "nowrite", "nofile" or "terminal" buffer.
+// Return true if "buf" is a "nowrite", "nofile", "terminal" or "prompt"
+// buffer.
bool bt_dontwrite(const buf_T *const buf)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
@@ -5481,20 +5489,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 e8038e7281..dd24db910e 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
@@ -743,6 +743,11 @@ struct file_buffer {
long b_p_wm; ///< 'wrapmargin'
long b_p_wm_nobin; ///< b_p_wm saved for binary mode
long b_p_wm_nopaste; ///< b_p_wm saved for paste mode
+ char_u *b_p_vsts; ///< 'varsofttabstop'
+ long *b_p_vsts_array; ///< 'varsofttabstop' in internal format
+ char_u *b_p_vsts_nopaste; ///< b_p_vsts saved for paste mode
+ char_u *b_p_vts; ///< 'vartabstop'
+ long *b_p_vts_array; ///< 'vartabstop' in internal format
char_u *b_p_keymap; ///< 'keymap'
// local values for options which are normally global
@@ -843,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
@@ -1080,6 +1085,7 @@ typedef struct {
bool focusable;
WinStyle style;
bool border;
+ bool shadow;
schar_T border_chars[8];
int border_hl_ids[8];
int border_attr[8];
@@ -1196,6 +1202,7 @@ struct window_S {
int tab1; ///< first tab character
int tab2; ///< second tab character
int tab3; ///< third tab character
+ int lead;
int trail;
int conceal;
} w_p_lcs_chars;
@@ -1260,7 +1267,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 0f5081c94c..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 {
@@ -828,6 +828,7 @@ int copy_indent(int size, char_u *src)
int tab_pad;
int ind_done;
int round;
+ int ind_col;
// Round 1: compute the number of characters needed for the indent
// Round 2: copy the characters.
@@ -835,13 +836,15 @@ int copy_indent(int size, char_u *src)
todo = size;
ind_len = 0;
ind_done = 0;
+ ind_col = 0;
s = src;
// Count/copy the usable portion of the source line.
while (todo > 0 && ascii_iswhite(*s)) {
if (*s == TAB) {
- tab_pad = (int)curbuf->b_p_ts
- - (ind_done % (int)curbuf->b_p_ts);
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
// Stop if this tab will overshoot the target.
if (todo < tab_pad) {
@@ -849,9 +852,11 @@ int copy_indent(int size, char_u *src)
}
todo -= tab_pad;
ind_done += tab_pad;
+ ind_col += tab_pad;
} else {
todo--;
ind_done++;
+ ind_col++;
}
ind_len++;
@@ -862,11 +867,12 @@ int copy_indent(int size, char_u *src)
}
// Fill to next tabstop with a tab, if possible.
- tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
+ tab_pad = tabstop_padding(ind_done, curbuf->b_p_ts, curbuf->b_p_vts_array);
if ((todo >= tab_pad) && !curbuf->b_p_et) {
todo -= tab_pad;
ind_len++;
+ ind_col += tab_pad;
if (p != NULL) {
*p++ = TAB;
@@ -874,12 +880,20 @@ int copy_indent(int size, char_u *src)
}
// Add tabs required for indent.
- while (todo >= (int)curbuf->b_p_ts && !curbuf->b_p_et) {
- todo -= (int)curbuf->b_p_ts;
- ind_len++;
-
- if (p != NULL) {
- *p++ = TAB;
+ if (!curbuf->b_p_et) {
+ for (;;) {
+ tab_pad = tabstop_padding(ind_col,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
+ if (todo < tab_pad) {
+ break;
+ }
+ todo -= tab_pad;
+ ind_len++;
+ ind_col += tab_pad;
+ if (p != NULL) {
+ *p++ = TAB;
+ }
}
}
@@ -1029,7 +1043,9 @@ int open_line(
|| do_si
) {
// count white space on current line
- newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts, false);
+ newindent = get_indent_str_vtab(saved_line,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array, false);
if (newindent == 0 && !(flags & OPENLINE_COM_LIST)) {
newindent = second_line_indent; // for ^^D command in insert mode
}
@@ -1453,7 +1469,9 @@ int open_line(
if (curbuf->b_p_ai
|| do_si
) {
- newindent = get_indent_str(leader, (int)curbuf->b_p_ts, false);
+ newindent = get_indent_str_vtab(leader,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array, false);
}
// Add the indent offset
diff --git a/src/nvim/channel.c b/src/nvim/channel.c
index 7a08ba58d0..22eb31513d 100644
--- a/src/nvim/channel.c
+++ b/src/nvim/channel.c
@@ -499,48 +499,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/charset.c b/src/nvim/charset.c
index 5ad1fe0dfd..e2d844a351 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -744,8 +744,7 @@ int vim_strnsize(char_u *s, int len)
/// @return Number of characters.
#define RET_WIN_BUF_CHARTABSIZE(wp, buf, p, col) \
if (*(p) == TAB && (!(wp)->w_p_list || wp->w_p_lcs_chars.tab1)) { \
- const int ts = (int)(buf)->b_p_ts; \
- return (ts - (int)(col % ts)); \
+ return tabstop_padding(col, (buf)->b_p_ts, (buf)->b_p_vts_array); \
} else { \
return ptr2cells(p); \
}
@@ -1143,8 +1142,9 @@ static int win_nolbr_chartabsize(win_T *wp, char_u *s, colnr_T col, int *headp)
int n;
if ((*s == TAB) && (!wp->w_p_list || wp->w_p_lcs_chars.tab1)) {
- n = (int)wp->w_buffer->b_p_ts;
- return n - (col % n);
+ return tabstop_padding(col,
+ wp->w_buffer->b_p_ts,
+ wp->w_buffer->b_p_vts_array);
}
n = ptr2cells(s);
@@ -1211,6 +1211,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
char_u *line; // start of the line
int incr;
int head;
+ long *vts = wp->w_buffer->b_p_vts_array;
int ts = (int)wp->w_buffer->b_p_ts;
int c;
@@ -1251,7 +1252,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor,
// A tab gets expanded, depending on the current column
if (c == TAB) {
- incr = ts - (vcol % ts);
+ incr = tabstop_padding(vcol, ts, vts);
} else {
// For utf-8, if the byte is >= 0x80, need to look at
// further bytes to find the cell width.
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 b5d5d67e90..56b563cba0 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -597,7 +597,10 @@ static int insert_check(VimState *state)
s->mincol = curwin->w_wcol;
validate_cursor_col();
- if (curwin->w_wcol < s->mincol - curbuf->b_p_ts
+ if (
+ curwin->w_wcol < s->mincol - tabstop_at(get_nolist_virtcol(),
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array)
&& curwin->w_wrow == curwin->w_winrow
+ curwin->w_height_inner - 1 - get_scrolloff_value(curwin)
&& (curwin->w_cursor.lnum != curwin->w_topline
@@ -989,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:
@@ -1601,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.
@@ -2055,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;
}
@@ -2316,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) { \
@@ -2520,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;
}
@@ -2595,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;
}
@@ -3315,8 +3331,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;
@@ -3931,7 +3947,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) {
@@ -3970,17 +3986,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;
@@ -7266,7 +7283,6 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
char_u *p;
char_u *line;
int icase;
- int i;
if (keytyped == NUL) {
// Can happen with CTRL-Y and CTRL-E on a short line.
@@ -7351,8 +7367,9 @@ bool in_cinkeys(int keytyped, int when, bool line_is_empty)
&& p[curwin->w_cursor.col - 1] == ':'
&& p[curwin->w_cursor.col - 2] == ':') {
p[curwin->w_cursor.col - 1] = ' ';
- i = (cin_iscase(p, FALSE) || cin_isscopedecl(p)
- || cin_islabel());
+ const bool i = cin_iscase(p, false)
+ || cin_isscopedecl(p)
+ || cin_islabel();
p = get_cursor_line_ptr();
p[curwin->w_cursor.col - 1] = ':';
if (i) {
@@ -8178,24 +8195,20 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
/*
* Handle deleting one 'shiftwidth' or 'softtabstop'.
*/
- if ( mode == BACKSPACE_CHAR
- && ((p_sta && in_indent)
- || (get_sts_value() != 0
- && curwin->w_cursor.col > 0
- && (*(get_cursor_pos_ptr() - 1) == TAB
- || (*(get_cursor_pos_ptr() - 1) == ' '
- && (!*inserted_space_p
- || arrow_used)))))) {
+ if (mode == BACKSPACE_CHAR
+ && ((p_sta && in_indent)
+ || ((get_sts_value() != 0
+ || tabstop_count(curbuf->b_p_vsts_array))
+ && curwin->w_cursor.col > 0
+ && (*(get_cursor_pos_ptr() - 1) == TAB
+ || (*(get_cursor_pos_ptr() - 1) == ' '
+ && (!*inserted_space_p || arrow_used)))))) {
int ts;
colnr_T vcol;
colnr_T want_vcol;
colnr_T start_vcol;
- *inserted_space_p = FALSE;
- if (p_sta && in_indent)
- ts = get_sw_value(curbuf);
- else
- ts = get_sts_value();
+ *inserted_space_p = false;
// Compute the virtual column where we want to be. Since
// 'showbreak' may get in the way, need to get the last column of
// the previous character.
@@ -8204,7 +8217,14 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
dec_cursor();
getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol);
inc_cursor();
- want_vcol = (want_vcol / ts) * ts;
+ if (p_sta && in_indent) {
+ ts = (int)get_sw_value(curbuf);
+ want_vcol = (want_vcol / ts) * ts;
+ } else {
+ want_vcol = tabstop_start(want_vcol,
+ get_sts_value(),
+ curbuf->b_p_vsts_array);
+ }
// delete characters until we are at or before want_vcol
while (vcol > want_vcol
@@ -8669,10 +8689,19 @@ static bool ins_tab(void)
can_cindent = false;
}
- // When nothing special, insert TAB like a normal character
+ // When nothing special, insert TAB like a normal character.
if (!curbuf->b_p_et
- && !(p_sta && ind && curbuf->b_p_ts != get_sw_value(curbuf))
- && get_sts_value() == 0) {
+ && !(
+ p_sta
+ && ind
+ // These five lines mean 'tabstop' != 'shiftwidth'
+ && ((tabstop_count(curbuf->b_p_vts_array) > 1)
+ || (tabstop_count(curbuf->b_p_vts_array) == 1
+ && tabstop_first(curbuf->b_p_vts_array)
+ != get_sw_value(curbuf))
+ || (tabstop_count(curbuf->b_p_vts_array) == 0
+ && curbuf->b_p_ts != get_sw_value(curbuf))))
+ && tabstop_count(curbuf->b_p_vsts_array) == 0 && get_sts_value() == 0) {
return true;
}
@@ -8686,16 +8715,22 @@ static bool ins_tab(void)
can_si_back = false;
AppendToRedobuff("\t");
- if (p_sta && ind) { // insert tab in indent, use "shiftwidth"
- temp = get_sw_value(curbuf);
- } else if (curbuf->b_p_sts != 0) { // use "softtabstop" when set
- temp = get_sts_value();
- } else { // otherwise use "tabstop"
- temp = (int)curbuf->b_p_ts;
+ if (p_sta && ind) { // insert tab in indent, use 'shiftwidth'
+ temp = (int)get_sw_value(curbuf);
+ temp -= get_nolist_virtcol() % temp;
+ } else if (tabstop_count(curbuf->b_p_vsts_array) > 0
+ || curbuf->b_p_sts != 0) {
+ // use 'softtabstop' when set
+ temp = tabstop_padding(get_nolist_virtcol(),
+ get_sts_value(),
+ curbuf->b_p_vsts_array);
+ } else {
+ // otherwise use 'tabstop'
+ temp = tabstop_padding(get_nolist_virtcol(),
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
}
- temp -= get_nolist_virtcol() % temp;
-
/*
* Insert the first space with ins_char(). It will delete one char in
* replace mode. Insert the rest with ins_str(); it will not delete any
@@ -8716,7 +8751,9 @@ static bool ins_tab(void)
/*
* When 'expandtab' not set: Replace spaces by TABs where possible.
*/
- if (!curbuf->b_p_et && (get_sts_value() || (p_sta && ind))) {
+ if (!curbuf->b_p_et && (tabstop_count(curbuf->b_p_vsts_array) > 0
+ || get_sts_value() > 0
+ || (p_sta && ind))) {
char_u *ptr;
char_u *saved_line = NULL; // init for GCC
pos_T pos;
@@ -8764,10 +8801,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)) {
@@ -8818,8 +8851,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);
}
}
@@ -9133,10 +9166,16 @@ static void ins_try_si(int c)
* Get the value that w_virtcol would have when 'list' is off.
* Unless 'cpo' contains the 'L' flag.
*/
-static colnr_T get_nolist_virtcol(void)
+colnr_T get_nolist_virtcol(void)
{
- if (curwin->w_p_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL)
+ // check validity of cursor in current buffer
+ if (curwin->w_buffer == NULL || curwin->w_buffer->b_ml.ml_mfp == NULL
+ || curwin->w_cursor.lnum > curwin->w_buffer->b_ml.ml_line_count) {
+ return 0;
+ }
+ if (curwin->w_p_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) {
return getvcol_nolist(&curwin->w_cursor);
+ }
validate_virtcol();
return curwin->w_virtcol;
}
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 e1fcbdce25..d67db94339 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),
@@ -393,6 +398,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 +924,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 +1576,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;
@@ -3129,21 +3148,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 +3424,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 +3436,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 +3480,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 +3498,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;
}
}
@@ -5289,10 +5135,10 @@ bool set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack,
QUEUE *w = NULL;
DictWatcher *watcher = NULL;
- QUEUE_FOREACH(w, &dd->watchers) {
+ QUEUE_FOREACH(w, &dd->watchers, {
watcher = tv_dict_watcher_node_data(w);
set_ref_in_callback(&watcher->callback, copyID, ht_stack, list_stack);
- }
+ })
}
break;
}
@@ -5867,26 +5713,53 @@ int assert_inrange(typval_T *argvars)
FUNC_ATTR_NONNULL_ALL
{
bool error = false;
- const varnumber_T lower = tv_get_number_chk(&argvars[0], &error);
- const varnumber_T upper = tv_get_number_chk(&argvars[1], &error);
- const varnumber_T actual = tv_get_number_chk(&argvars[2], &error);
- if (error) {
- return 0;
- }
- if (actual < lower || actual > upper) {
- garray_T ga;
- prepare_assert_error(&ga);
+ if (argvars[0].v_type == VAR_FLOAT
+ || argvars[1].v_type == VAR_FLOAT
+ || argvars[2].v_type == VAR_FLOAT) {
+ const float_T flower = tv_get_float(&argvars[0]);
+ const float_T fupper = tv_get_float(&argvars[1]);
+ const float_T factual = tv_get_float(&argvars[2]);
- char msg[55];
- vim_snprintf(msg, sizeof(msg),
- "range %" PRIdVARNUMBER " - %" PRIdVARNUMBER ",",
- lower, upper);
- fill_assert_error(&ga, &argvars[3], (char_u *)msg, NULL, &argvars[2],
- ASSERT_INRANGE);
- assert_error(&ga);
- ga_clear(&ga);
- return 1;
+ if (factual < flower || factual > fupper) {
+ garray_T ga;
+ prepare_assert_error(&ga);
+ if (argvars[3].v_type != VAR_UNKNOWN) {
+ char_u *const tofree = (char_u *)encode_tv2string(&argvars[3], NULL);
+ ga_concat(&ga, tofree);
+ xfree(tofree);
+ } else {
+ char msg[80];
+ vim_snprintf(msg, sizeof(msg), "Expected range %g - %g, but got %g",
+ flower, fupper, factual);
+ ga_concat(&ga, (char_u *)msg);
+ }
+ assert_error(&ga);
+ ga_clear(&ga);
+ return 1;
+ }
+ } else {
+ const varnumber_T lower = tv_get_number_chk(&argvars[0], &error);
+ const varnumber_T upper = tv_get_number_chk(&argvars[1], &error);
+ const varnumber_T actual = tv_get_number_chk(&argvars[2], &error);
+
+ if (error) {
+ return 0;
+ }
+ if (actual < lower || actual > upper) {
+ garray_T ga;
+ prepare_assert_error(&ga);
+
+ char msg[55];
+ vim_snprintf(msg, sizeof(msg),
+ "range %" PRIdVARNUMBER " - %" PRIdVARNUMBER ",",
+ lower, upper);
+ fill_assert_error(&ga, &argvars[3], (char_u *)msg, NULL, &argvars[2],
+ ASSERT_INRANGE);
+ assert_error(&ga);
+ ga_clear(&ga);
+ return 1;
+ }
}
return 0;
}
@@ -5954,6 +5827,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
{
@@ -6207,6 +6109,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]);
@@ -7306,7 +7209,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 {
@@ -7944,8 +7846,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;
@@ -8430,10 +8332,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"
@@ -10690,3 +10590,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 e94d7831b0..148804e54c 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},
@@ -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}},
@@ -309,14 +311,16 @@ return {
setwinvar={args=3},
sha256={args=1},
shellescape={args={1, 2}},
- shiftwidth={},
+ shiftwidth={args={0, 1}},
sign_define={args={1, 2}},
sign_getdefined={args={0, 1}},
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"},
@@ -341,6 +345,7 @@ return {
string={args=1},
strlen={args=1},
strpart={args={2, 4}},
+ strptime={args=2},
strridx={args={2, 3}},
strtrans={args=1},
strwidth={args=1},
@@ -385,6 +390,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 01d23654de..911b3c2c2f 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);
}
/*
@@ -1958,8 +1953,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 +1968,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 +1997,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 +2032,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 +2086,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 +2116,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;
@@ -2829,13 +2834,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 +2906,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 +3049,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;
@@ -4312,6 +4310,7 @@ static void f_has(typval_T *argvars, typval_T *rettv, FunPtr fptr)
"title",
"user-commands", // was accidentally included in 5.4
"user_commands",
+ "vartabs",
"vertsplit",
"virtualedit",
"visual",
@@ -6528,6 +6527,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)
@@ -6642,37 +6661,6 @@ static void f_range(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
-// Evaluate "expr" for readdir().
-static varnumber_T readdir_checkitem(typval_T *expr, const char *name)
-{
- typval_T save_val;
- typval_T rettv;
- typval_T argv[2];
- varnumber_T retval = 0;
- bool error = false;
-
- prepare_vimvar(VV_VAL, &save_val);
- set_vim_var_string(VV_VAL, name, -1);
- argv[0].v_type = VAR_STRING;
- argv[0].vval.v_string = (char_u *)name;
-
- if (eval_expr_typval(expr, argv, 1, &rettv) == FAIL) {
- goto theend;
- }
-
- retval = tv_get_number_chk(&rettv, &error);
- if (error) {
- retval = -1;
- }
-
- tv_clear(&rettv);
-
-theend:
- set_vim_var_string(VV_VAL, NULL, 0);
- restore_vimvar(VV_VAL, &save_val);
- return retval;
-}
-
// "readdir()" function
static void f_readdir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
@@ -6684,43 +6672,14 @@ static void f_readdir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
tv_list_alloc_ret(rettv, kListLenUnknown);
path = tv_get_string(&argvars[0]);
expr = &argvars[1];
- ga_init(&ga, (int)sizeof(char *), 20);
if (!os_scandir(&dir, path)) {
smsg(_(e_notopen), path);
} else {
- for (;;) {
- bool ignore;
-
- path = os_scandir_next(&dir);
- if (path == NULL) {
- break;
- }
-
- ignore = (path[0] == '.'
- && (path[1] == NUL || (path[1] == '.' && path[2] == NUL)));
- if (!ignore && expr->v_type != VAR_UNKNOWN) {
- varnumber_T r = readdir_checkitem(expr, path);
-
- if (r < 0) {
- break;
- }
- if (r == 0) {
- ignore = true;
- }
- }
-
- if (!ignore) {
- ga_grow(&ga, 1);
- ((char **)ga.ga_data)[ga.ga_len++] = xstrdup(path);
- }
- }
-
- os_closedir(&dir);
+ readdir_core(&ga, &dir, expr, true);
}
if (rettv->vval.v_list != NULL && ga.ga_len > 0) {
- sort_strings((char_u **)ga.ga_data, ga.ga_len);
for (int i = 0; i < ga.ga_len; i++) {
path = ((const char **)ga.ga_data)[i];
tv_list_append_string(rettv->vval.v_list, path, -1);
@@ -8848,6 +8807,18 @@ static void f_shellescape(typval_T *argvars, typval_T *rettv, FunPtr fptr)
*/
static void f_shiftwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
+ rettv->vval.v_number = 0;
+
+ if (argvars[0].v_type != VAR_UNKNOWN) {
+ long col;
+
+ col = (long)tv_get_number_chk(argvars, NULL);
+ if (col < 0) {
+ return; // type error; errmsg already given
+ }
+ rettv->vval.v_number = get_sw_value_col(curbuf, col);
+ return;
+ }
rettv->vval.v_number = get_sw_value(curbuf);
}
@@ -8855,56 +8826,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
@@ -8989,7 +8934,7 @@ static void f_sign_jump(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = -1;
- // Sign identifer
+ // Sign identifier
sign_id = (int)tv_get_number_chk(&argvars[0], &notanum);
if (notanum) {
return;
@@ -9025,83 +8970,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 identifer
- sign_id = (int)tv_get_number_chk(&argvars[0], &notanum);
- 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, &notanum);
- 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, &notanum);
- 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
@@ -9109,6 +9015,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) {
@@ -9131,11 +9045,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;
@@ -9144,46 +9054,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);
+ });
}
/*
@@ -9252,6 +9154,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;
@@ -9326,10 +9229,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;
@@ -9464,6 +9367,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;
@@ -9508,6 +9412,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;
}
}
}
@@ -10189,6 +10096,38 @@ static void f_strpart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_string = (char_u *)xmemdupz(p + n, (size_t)len);
}
+// "strptime({format}, {timestring})" function
+static void f_strptime(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ char fmt_buf[NUMBUFLEN];
+ char str_buf[NUMBUFLEN];
+
+ struct tm tmval = {
+ .tm_isdst = -1,
+ };
+ char *fmt = (char *)tv_get_string_buf(&argvars[0], fmt_buf);
+ char *str = (char *)tv_get_string_buf(&argvars[1], str_buf);
+
+ vimconv_T conv = {
+ .vc_type = CONV_NONE,
+ };
+ char_u *enc = enc_locale();
+ convert_setup(&conv, p_enc, enc);
+ if (conv.vc_type != CONV_NONE) {
+ fmt = (char *)string_convert(&conv, (char_u *)fmt, NULL);
+ }
+ if (fmt == NULL
+ || os_strptime(str, fmt, &tmval) == NULL
+ || (rettv->vval.v_number = mktime(&tmval)) == -1) {
+ rettv->vval.v_number = 0;
+ }
+ if (conv.vc_type != CONV_NONE) {
+ xfree(fmt);
+ }
+ convert_setup(&conv, NULL, NULL);
+ xfree(enc);
+}
+
/*
* "strridx()" function
*/
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index 9be487f4fd..71e4edc667 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);
}
@@ -1109,6 +1110,7 @@ void tv_dict_watcher_add(dict_T *const dict, const char *const key_pattern,
watcher->key_pattern_len = key_pattern_len;
watcher->callback = callback;
watcher->busy = false;
+ watcher->needs_free = false;
QUEUE_INSERT_TAIL(&dict->watchers, &watcher->node);
}
@@ -1182,22 +1184,30 @@ bool tv_dict_watcher_remove(dict_T *const dict, const char *const key_pattern,
QUEUE *w = NULL;
DictWatcher *watcher = NULL;
bool matched = false;
- QUEUE_FOREACH(w, &dict->watchers) {
+ bool queue_is_busy = false;
+ QUEUE_FOREACH(w, &dict->watchers, {
watcher = tv_dict_watcher_node_data(w);
+ if (watcher->busy) {
+ queue_is_busy = true;
+ }
if (tv_callback_equal(&watcher->callback, &callback)
&& watcher->key_pattern_len == key_pattern_len
&& memcmp(watcher->key_pattern, key_pattern, key_pattern_len) == 0) {
matched = true;
break;
}
- }
+ })
if (!matched) {
return false;
}
- QUEUE_REMOVE(w);
- tv_dict_watcher_free(watcher);
+ if (queue_is_busy) {
+ watcher->needs_free = true;
+ } else {
+ QUEUE_REMOVE(w);
+ tv_dict_watcher_free(watcher);
+ }
return true;
}
@@ -1258,9 +1268,10 @@ void tv_dict_watcher_notify(dict_T *const dict, const char *const key,
typval_T rettv;
+ bool any_needs_free = false;
dict->dv_refcount++;
QUEUE *w;
- QUEUE_FOREACH(w, &dict->watchers) {
+ QUEUE_FOREACH(w, &dict->watchers, {
DictWatcher *watcher = tv_dict_watcher_node_data(w);
if (!watcher->busy && tv_dict_watcher_matches(watcher, key)) {
rettv = TV_INITIAL_VALUE;
@@ -1268,7 +1279,19 @@ void tv_dict_watcher_notify(dict_T *const dict, const char *const key,
callback_call(&watcher->callback, 3, argv, &rettv);
watcher->busy = false;
tv_clear(&rettv);
+ if (watcher->needs_free) {
+ any_needs_free = true;
+ }
}
+ })
+ if (any_needs_free) {
+ QUEUE_FOREACH(w, &dict->watchers, {
+ DictWatcher *watcher = tv_dict_watcher_node_data(w);
+ if (watcher->needs_free) {
+ QUEUE_REMOVE(w);
+ tv_dict_watcher_free(watcher);
+ }
+ })
}
tv_dict_unref(dict);
@@ -1382,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;
}
@@ -1432,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);
}
diff --git a/src/nvim/eval/typval.h b/src/nvim/eval/typval.h
index 531b17cb59..2b4612016b 100644
--- a/src/nvim/eval/typval.h
+++ b/src/nvim/eval/typval.h
@@ -89,6 +89,7 @@ typedef struct dict_watcher {
size_t key_pattern_len;
QUEUE node;
bool busy; // prevent recursion if the dict is changed in the callback
+ bool needs_free;
} DictWatcher;
/// Bool variable values
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/event/multiqueue.c b/src/nvim/event/multiqueue.c
index c9aa3acc4d..1e6d62135c 100644
--- a/src/nvim/event/multiqueue.c
+++ b/src/nvim/event/multiqueue.c
@@ -119,8 +119,8 @@ static MultiQueue *multiqueue_new(MultiQueue *parent, put_callback put_cb,
void multiqueue_free(MultiQueue *this)
{
assert(this);
- while (!QUEUE_EMPTY(&this->headtail)) {
- QUEUE *q = QUEUE_HEAD(&this->headtail);
+ QUEUE *q;
+ QUEUE_FOREACH(q, &this->headtail, {
MultiQueueItem *item = multiqueue_node_data(q);
if (this->parent) {
QUEUE_REMOVE(&item->data.item.parent_item->node);
@@ -128,7 +128,7 @@ void multiqueue_free(MultiQueue *this)
}
QUEUE_REMOVE(q);
xfree(item);
- }
+ })
xfree(this);
}
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 854faf5377..349c7d6280 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);
@@ -712,14 +720,15 @@ void ex_retab(exarg_T *eap)
long len;
long col;
long vcol;
- long start_col = 0; /* For start of white-space string */
- long start_vcol = 0; /* For start of white-space string */
- int temp;
+ long start_col = 0; // For start of white-space string
+ long start_vcol = 0; // For start of white-space string
long old_len;
char_u *ptr;
- char_u *new_line = (char_u *)1; /* init to non-NULL */
- int did_undo; /* called u_save for current line */
- int new_ts;
+ char_u *new_line = (char_u *)1; // init to non-NULL
+ int did_undo; // called u_save for current line
+ long *new_vts_array = NULL;
+ char_u *new_ts_str; // string value of tab argument
+
int save_list;
linenr_T first_line = 0; /* first changed line */
linenr_T last_line = 0; /* last changed line */
@@ -727,14 +736,24 @@ void ex_retab(exarg_T *eap)
save_list = curwin->w_p_list;
curwin->w_p_list = 0; /* don't want list mode here */
- new_ts = getdigits_int(&(eap->arg), false, -1);
- if (new_ts < 0) {
- EMSG(_(e_positive));
+ new_ts_str = eap->arg;
+ if (!tabstop_set(eap->arg, &new_vts_array)) {
return;
}
- if (new_ts == 0)
- new_ts = curbuf->b_p_ts;
- for (lnum = eap->line1; !got_int && lnum <= eap->line2; ++lnum) {
+ while (ascii_isdigit(*(eap->arg)) || *(eap->arg) == ',') {
+ (eap->arg)++;
+ }
+
+ // This ensures that either new_vts_array and new_ts_str are freshly
+ // allocated, or new_vts_array points to an existing array and new_ts_str
+ // is null.
+ if (new_vts_array == NULL) {
+ new_vts_array = curbuf->b_p_vts_array;
+ new_ts_str = NULL;
+ } else {
+ new_ts_str = vim_strnsave(new_ts_str, eap->arg - new_ts_str);
+ }
+ for (lnum = eap->line1; !got_int && lnum <= eap->line2; lnum++) {
ptr = ml_get(lnum);
col = 0;
vcol = 0;
@@ -758,13 +777,12 @@ void ex_retab(exarg_T *eap)
len = num_spaces = vcol - start_vcol;
num_tabs = 0;
if (!curbuf->b_p_et) {
- temp = new_ts - (start_vcol % new_ts);
- if (num_spaces >= temp) {
- num_spaces -= temp;
- num_tabs++;
- }
- num_tabs += num_spaces / new_ts;
- num_spaces -= (num_spaces / new_ts) * new_ts;
+ int t, s;
+
+ tabstop_fromto(start_vcol, vcol,
+ curbuf->b_p_ts, new_vts_array, &t, &s);
+ num_tabs = t;
+ num_spaces = s;
}
if (curbuf->b_p_et || got_tab
|| (num_spaces + num_tabs < len)) {
@@ -780,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);
@@ -793,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;
@@ -817,15 +838,42 @@ void ex_retab(exarg_T *eap)
if (got_int)
EMSG(_(e_interr));
- if (curbuf->b_p_ts != new_ts)
+ // If a single value was given then it can be considered equal to
+ // either the value of 'tabstop' or the value of 'vartabstop'.
+ if (tabstop_count(curbuf->b_p_vts_array) == 0
+ && tabstop_count(new_vts_array) == 1
+ && curbuf->b_p_ts == tabstop_first(new_vts_array)) {
+ // not changed
+ } else if (tabstop_count(curbuf->b_p_vts_array) > 0
+ && tabstop_eq(curbuf->b_p_vts_array, new_vts_array)) {
+ // not changed
+ } else {
redraw_curbuf_later(NOT_VALID);
+ }
if (first_line != 0) {
changed_lines(first_line, 0, last_line + 1, 0L, true);
}
curwin->w_p_list = save_list; /* restore 'list' */
- curbuf->b_p_ts = new_ts;
+ if (new_ts_str != NULL) { // set the new tabstop
+ // If 'vartabstop' is in use or if the value given to retab has more
+ // than one tabstop then update 'vartabstop'.
+ long *old_vts_ary = curbuf->b_p_vts_array;
+
+ if (tabstop_count(old_vts_ary) > 0 || tabstop_count(new_vts_array) > 1) {
+ set_string_option_direct("vts", -1, new_ts_str,
+ OPT_FREE | OPT_LOCAL, 0);
+ curbuf->b_p_vts_array = new_vts_array;
+ xfree(old_vts_ary);
+ } else {
+ // 'vartabstop' wasn't in use and a single value was given to
+ // retab then update 'tabstop'.
+ curbuf->b_p_ts = tabstop_first(new_vts_array);
+ xfree(new_vts_array);
+ }
+ xfree(new_ts_str);
+ }
coladvance(curwin->w_curswant);
u_clearline();
@@ -928,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
@@ -955,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.
*/
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 bc3d29a03f..555029c1fb 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -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:
@@ -3641,7 +3642,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 +3930,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;
@@ -7494,7 +7496,7 @@ static void ex_syncbind(exarg_T *eap)
ctrl_o[0] = Ctrl_O;
ctrl_o[1] = 0;
- ins_typebuf(ctrl_o, REMAP_NONE, 0, TRUE, FALSE);
+ ins_typebuf(ctrl_o, REMAP_NONE, 0, true, false);
}
}
}
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..53571ec8da 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);
@@ -4093,9 +4111,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 */
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..2037ba5f19 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;
@@ -5203,38 +5204,113 @@ static void vim_maketempdir(void)
(void)umask(umask_save);
}
+// Evaluate "expr" for readdir().
+static varnumber_T readdir_checkitem(typval_T *expr, const char *name)
+{
+ typval_T save_val;
+ typval_T rettv;
+ typval_T argv[2];
+ varnumber_T retval = 0;
+ bool error = false;
+
+ prepare_vimvar(VV_VAL, &save_val);
+ set_vim_var_string(VV_VAL, name, -1);
+ argv[0].v_type = VAR_STRING;
+ argv[0].vval.v_string = (char_u *)name;
+
+ if (eval_expr_typval(expr, argv, 1, &rettv) == FAIL) {
+ goto theend;
+ }
+
+ retval = tv_get_number_chk(&rettv, &error);
+ if (error) {
+ retval = -1;
+ }
+
+ tv_clear(&rettv);
+
+theend:
+ set_vim_var_string(VV_VAL, NULL, 0);
+ restore_vimvar(VV_VAL, &save_val);
+ return retval;
+}
+
+/// Core part of "readdir()" function.
+/// Retrieve the list of files/directories of "dirp" into "gap".
+void readdir_core(
+ garray_T *gap,
+ Directory *dirp,
+ typval_T *expr,
+ bool is_checkitem)
+{
+ ga_init(gap, (int)sizeof(char *), 20);
+
+ for (;;) {
+ bool ignore;
+
+ const char *path = os_scandir_next(dirp);
+ if (path == NULL) {
+ break;
+ }
+
+ ignore = (path[0] == '.'
+ && (path[1] == NUL || (path[1] == '.' && path[2] == NUL)));
+ if (!ignore && expr != NULL && expr->v_type != VAR_UNKNOWN
+ && is_checkitem) {
+ varnumber_T r = readdir_checkitem(expr, path);
+
+ if (r < 0) {
+ break;
+ }
+ if (r == 0) {
+ ignore = true;
+ }
+ }
+
+ if (!ignore) {
+ ga_grow(gap, 1);
+ ((char **)gap->ga_data)[gap->ga_len++] = xstrdup(path);
+ }
+ }
+
+ if (gap->ga_len > 0) {
+ sort_strings((char_u **)gap->ga_data, gap->ga_len);
+ }
+
+ os_closedir(dirp);
+}
+
/// Delete "name" and everything in it, recursively.
/// @param name The path which should be deleted.
/// @return 0 for success, -1 if some file was not deleted.
int delete_recursive(const char *name)
{
int result = 0;
+ char *exp = (char *)vim_strsave((char_u *)name);
+ Directory dir;
- if (os_isrealdir(name)) {
- snprintf((char *)NameBuff, MAXPATHL, "%s/*", name); // NOLINT
-
- char_u **files;
- int file_count;
- char_u *exp = vim_strsave(NameBuff);
- if (gen_expand_wildcards(1, &exp, &file_count, &files,
- EW_DIR | EW_FILE | EW_SILENT | EW_ALLLINKS
- | EW_DODOT | EW_EMPTYOK) == OK) {
- for (int i = 0; i < file_count; i++) {
- if (delete_recursive((const char *)files[i]) != 0) {
- result = -1;
- }
+ if (os_isrealdir(name) && os_scandir(&dir, exp)) {
+ garray_T ga;
+
+ readdir_core(&ga, &dir, NULL, false);
+
+ for (int i = 0; i < ga.ga_len; i++) {
+ vim_snprintf((char *)NameBuff, MAXPATHL, "%s/%s", exp,
+ ((char_u **)ga.ga_data)[i]);
+ if (delete_recursive((const char *)NameBuff) != 0) {
+ result = -1;
}
- FreeWild(file_count, files);
- } else {
- result = -1;
}
- xfree(exp);
+ ga_clear_strings(&ga);
+
os_rmdir(name);
} else {
result = os_remove(name) == 0 ? 0 : -1;
}
+ xfree(exp);
+
return result;
}
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 2e2993ed26..5c2eed363e 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -78,7 +78,7 @@ FileDescriptor *scriptin[NSCRIPT] = { NULL };
* Un-escaping is done by vgetc().
*/
-#define MINIMAL_SIZE 20 /* minimal size for b_str */
+#define MINIMAL_SIZE 20 // minimal size for b_str
static buffheader_T redobuff = { { NULL, { NUL } }, NULL, 0, 0 };
static buffheader_T old_redobuff = { { NULL, { NUL } }, NULL, 0, 0 };
@@ -90,7 +90,7 @@ static buffheader_T readbuf1 = { { NULL, { NUL } }, NULL, 0, 0 };
// Second read ahead buffer. Used for redo.
static buffheader_T readbuf2 = { { NULL, { NUL } }, NULL, 0, 0 };
-static int typeahead_char = 0; /* typeahead char that's not flushed */
+static int typeahead_char = 0; // typeahead char that's not flushed
/*
* when block_redo is TRUE redo buffer will not be changed
@@ -116,9 +116,9 @@ static bool maphash_valid = false;
/*
* List used for abbreviations.
*/
-static mapblock_T *first_abbr = NULL; /* first entry in abbrlist */
+static mapblock_T *first_abbr = NULL; // first entry in abbrlist
-static int KeyNoremap = 0; /* remapping flags */
+static int KeyNoremap = 0; // remapping flags
/*
* Variables used by vgetorpeek() and flush_buffers()
@@ -139,18 +139,18 @@ static int KeyNoremap = 0; /* remapping flags */
* typebuf.tb_noremap[typebuf.tb_off] is the first valid flag.
* (typebuf has been put in globals.h, because check_termcode() needs it).
*/
-#define RM_YES 0 /* tb_noremap: remap */
-#define RM_NONE 1 /* tb_noremap: don't remap */
-#define RM_SCRIPT 2 /* tb_noremap: remap local script mappings */
-#define RM_ABBR 4 /* tb_noremap: don't remap, do abbrev. */
+#define RM_YES 0 // tb_noremap: remap
+#define RM_NONE 1 // tb_noremap: don't remap
+#define RM_SCRIPT 2 // tb_noremap: remap local script mappings
+#define RM_ABBR 4 // tb_noremap: don't remap, do abbrev.
/* typebuf.tb_buf has three parts: room in front (for result of mappings), the
* middle for typeahead and room for new characters (which needs to be 3 *
* MAXMAPLEN) for the Amiga).
*/
#define TYPELEN_INIT (5 * (MAXMAPLEN + 3))
-static char_u typebuf_init[TYPELEN_INIT]; /* initial typebuf.tb_buf */
-static char_u noremapbuf_init[TYPELEN_INIT]; /* initial typebuf.tb_noremap */
+static char_u typebuf_init[TYPELEN_INIT]; // initial typebuf.tb_buf
+static char_u noremapbuf_init[TYPELEN_INIT]; // initial typebuf.tb_noremap
static size_t last_recorded_len = 0; // number of last recorded chars
@@ -707,8 +707,9 @@ static int read_redo(bool init, bool old_redo)
break;
}
c = *p;
- if (c == NUL) /* cannot happen? */
+ if (c == NUL) { // cannot happen?
break;
+ }
}
return c;
@@ -744,14 +745,15 @@ int start_redo(long count, bool old_redo)
c = read_redo(false, old_redo);
- /* copy the buffer name, if present */
+ // copy the buffer name, if present
if (c == '"') {
add_buff(&readbuf2, "\"", 1L);
c = read_redo(false, old_redo);
- /* if a numbered buffer is used, increment the number */
- if (c >= '1' && c < '9')
- ++c;
+ // if a numbered buffer is used, increment the number
+ if (c >= '1' && c < '9') {
+ c++;
+ }
add_char_buff(&readbuf2, c);
// the expression register should be re-evaluated
@@ -763,7 +765,7 @@ int start_redo(long count, bool old_redo)
c = read_redo(false, old_redo);
}
- if (c == 'v') { /* redo Visual */
+ if (c == 'v') { // redo Visual
VIsual = curwin->w_cursor;
VIsual_active = true;
VIsual_select = false;
@@ -780,7 +782,7 @@ int start_redo(long count, bool old_redo)
add_num_buff(&readbuf2, count);
}
- /* copy from the redo buffer into the stuff buffer */
+ // copy from the redo buffer into the stuff buffer
add_char_buff(&readbuf2, c);
copy_redo(old_redo);
return OK;
@@ -838,26 +840,25 @@ static void init_typebuf(void)
}
}
-/*
- * insert a string in position 'offset' in the typeahead buffer (for "@r"
- * and ":normal" command, vgetorpeek() and check_termcode())
- *
- * If noremap is REMAP_YES, new string can be mapped again.
- * If noremap is REMAP_NONE, new string cannot be mapped again.
- * If noremap is REMAP_SKIP, fist char of new string cannot be mapped again,
- * but abbreviations are allowed.
- * If noremap is REMAP_SCRIPT, new string cannot be mapped again, except for
- * script-local mappings.
- * If noremap is > 0, that many characters of the new string cannot be mapped.
- *
- * If nottyped is TRUE, the string does not return KeyTyped (don't use when
- * offset is non-zero!).
- *
- * If silent is true, cmd_silent is set when the characters are obtained.
- *
- * return FAIL for failure, OK otherwise
- */
-int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
+// Insert a string in position 'offset' in the typeahead buffer (for "@r"
+// and ":normal" command, vgetorpeek() and check_termcode())
+//
+// If noremap is REMAP_YES, new string can be mapped again.
+// If noremap is REMAP_NONE, new string cannot be mapped again.
+// If noremap is REMAP_SKIP, fist char of new string cannot be mapped again,
+// but abbreviations are allowed.
+// If noremap is REMAP_SCRIPT, new string cannot be mapped again, except for
+// script-local mappings.
+// If noremap is > 0, that many characters of the new string cannot be mapped.
+//
+// If nottyped is true, the string does not return KeyTyped (don't use when
+// offset is non-zero!).
+//
+// If silent is true, cmd_silent is set when the characters are obtained.
+//
+// return FAIL for failure, OK otherwise
+int ins_typebuf(char_u *str, int noremap, int offset,
+ bool nottyped, bool silent)
{
char_u *s1, *s2;
int newlen;
@@ -890,8 +891,8 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
// often.
newoff = MAXMAPLEN + 4;
newlen = typebuf.tb_len + addlen + newoff + 4 * (MAXMAPLEN + 4);
- if (newlen < 0) { /* string is getting too long */
- EMSG(_(e_toocompl)); /* also calls flush_buffers */
+ if (newlen < 0) { // string is getting too long
+ EMSG(_(e_toocompl)); // also calls flush_buffers
setcursor();
return FAIL;
}
@@ -927,13 +928,14 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
}
typebuf.tb_len += addlen;
- /* If noremap == REMAP_SCRIPT: do remap script-local mappings. */
- if (noremap == REMAP_SCRIPT)
+ // If noremap == REMAP_SCRIPT: do remap script-local mappings.
+ if (noremap == REMAP_SCRIPT) {
val = RM_SCRIPT;
- else if (noremap == REMAP_SKIP)
+ } else if (noremap == REMAP_SKIP) {
val = RM_ABBR;
- else
+ } else {
val = RM_NONE;
+ }
/*
* Adjust typebuf.tb_noremap[] for the new characters:
@@ -962,8 +964,9 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
typebuf.tb_silent += addlen;
cmd_silent = true;
}
- if (typebuf.tb_no_abbr_cnt && offset == 0) /* and not used for abbrev.s */
+ if (typebuf.tb_no_abbr_cnt && offset == 0) { // and not used for abbrev.s
typebuf.tb_no_abbr_cnt += addlen;
+ }
return OK;
}
@@ -997,9 +1000,8 @@ void ins_char_typebuf(int c)
* Or "typebuf.tb_off" may have been changed and we would overwrite characters
* that was just added.
*/
-int
-typebuf_changed (
- int tb_change_cnt /* old value of typebuf.tb_change_cnt */
+bool typebuf_changed(
+ int tb_change_cnt // old value of typebuf.tb_change_cnt
)
{
return tb_change_cnt != 0 && (typebuf.tb_change_cnt != tb_change_cnt
@@ -1031,8 +1033,9 @@ void del_typebuf(int len, int offset)
{
int i;
- if (len == 0)
- return; /* nothing to do */
+ if (len == 0) {
+ return; // nothing to do
+ }
typebuf.tb_len -= len;
@@ -1068,23 +1071,26 @@ void del_typebuf(int len, int offset)
(size_t)(typebuf.tb_len - offset));
}
- if (typebuf.tb_maplen > offset) { /* adjust tb_maplen */
- if (typebuf.tb_maplen < offset + len)
+ if (typebuf.tb_maplen > offset) { // adjust tb_maplen
+ if (typebuf.tb_maplen < offset + len) {
typebuf.tb_maplen = offset;
- else
+ } else {
typebuf.tb_maplen -= len;
+ }
}
- if (typebuf.tb_silent > offset) { /* adjust tb_silent */
- if (typebuf.tb_silent < offset + len)
+ if (typebuf.tb_silent > offset) { // adjust tb_silent
+ if (typebuf.tb_silent < offset + len) {
typebuf.tb_silent = offset;
- else
+ } else {
typebuf.tb_silent -= len;
+ }
}
- if (typebuf.tb_no_abbr_cnt > offset) { /* adjust tb_no_abbr_cnt */
- if (typebuf.tb_no_abbr_cnt < offset + len)
+ if (typebuf.tb_no_abbr_cnt > offset) { // adjust tb_no_abbr_cnt
+ if (typebuf.tb_no_abbr_cnt < offset + len) {
typebuf.tb_no_abbr_cnt = offset;
- else
+ } else {
typebuf.tb_no_abbr_cnt -= len;
+ }
}
/* Reset the flag that text received from a client or from feedkeys()
@@ -1135,8 +1141,8 @@ static void gotchars(const char_u *chars, size_t len)
may_sync_undo();
- /* output "debug mode" message next time in debug mode */
- debug_did_msg = FALSE;
+ // output "debug mode" message next time in debug mode
+ debug_did_msg = false;
/* Since characters have been typed, consider the following to be in
* another mapping. Search string will be kept in history. */
@@ -1253,10 +1259,9 @@ void restore_typeahead(tasave_T *tp)
/*
* Open a new script file for the ":source!" command.
*/
-void
-openscript (
+void openscript(
char_u *name,
- int directly /* when TRUE execute directly */
+ bool directly // when true execute directly
)
{
if (curscript + 1 == NSCRIPT) {
@@ -1275,9 +1280,10 @@ openscript (
return;
}
- if (scriptin[curscript] != NULL) /* already reading script */
- ++curscript;
- /* use NameBuff for expanded name */
+ if (scriptin[curscript] != NULL) { // already reading script
+ curscript++;
+ }
+ // use NameBuff for expanded name
expand_env(name, NameBuff, MAXPATHL);
int error;
if ((scriptin[curscript] = file_open_new(&error, (char *)NameBuff,
@@ -1306,17 +1312,17 @@ openscript (
int save_msg_scroll = msg_scroll;
State = NORMAL;
- msg_scroll = FALSE; /* no msg scrolling in Normal mode */
- restart_edit = 0; /* don't go to Insert mode */
- p_im = FALSE; /* don't use 'insertmode' */
+ msg_scroll = false; // no msg scrolling in Normal mode
+ restart_edit = 0; // don't go to Insert mode
+ p_im = false; // don't use 'insertmode'
clear_oparg(&oa);
- finish_op = FALSE;
+ finish_op = false;
oldcurscript = curscript;
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;
@@ -1580,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;
}
@@ -1626,10 +1634,8 @@ int char_avail(void)
return retval != NUL;
}
-void
-vungetc ( /* unget one character (can only be done once!) */
- int c
-)
+// unget one character (can only be done once!)
+void vungetc(int c)
{
old_char = c;
old_mod_mask = mod_mask;
@@ -1669,10 +1675,10 @@ static int vgetorpeek(bool advance)
mapblock_T *mp2;
mapblock_T *mp_match;
int mp_match_len = 0;
- int timedout = FALSE; /* waited for more than 1 second
- for mapping to complete */
- int mapdepth = 0; /* check for recursive mapping */
- int mode_deleted = FALSE; /* set when mode has been deleted */
+ bool timedout = false; // waited for more than 1 second
+ // for mapping to complete
+ int mapdepth = 0; // check for recursive mapping
+ bool mode_deleted = false; // set when mode has been deleted
int local_State;
int mlen;
int max_mlen;
@@ -1729,8 +1735,9 @@ static int vgetorpeek(bool advance)
// needed for CTRL-W CTRL-] to open a fold, for example.
KeyStuffed = true;
}
- if (typebuf.tb_no_abbr_cnt == 0)
- typebuf.tb_no_abbr_cnt = 1; /* no abbreviations now */
+ if (typebuf.tb_no_abbr_cnt == 0) {
+ typebuf.tb_no_abbr_cnt = 1; // no abbreviations now
+ }
} else {
/*
* Loop until we either find a matching mapped key, or we
@@ -1744,10 +1751,11 @@ static int vgetorpeek(bool advance)
* inside a mapping. But call it each time for typed
* characters.
*/
- if (typebuf.tb_maplen)
+ if (typebuf.tb_maplen) {
line_breakcheck();
- else
- os_breakcheck(); /* check for CTRL-C */
+ } else {
+ os_breakcheck(); // check for CTRL-C
+ }
keylen = 0;
if (got_int) {
// flush all input
@@ -1814,11 +1822,11 @@ static int vgetorpeek(bool advance)
&& get_real_state() != SELECTMODE);
nolmaplen = 0;
}
- /* First try buffer-local mappings. */
+ // First try buffer-local mappings.
mp = curbuf->b_maphash[MAP_HASH(local_State, c1)];
mp2 = maphash[MAP_HASH(local_State, c1)];
if (mp == NULL) {
- /* There are no buffer-local mappings. */
+ // There are no buffer-local mappings.
mp = mp2;
mp2 = NULL;
}
@@ -1845,8 +1853,8 @@ static int vgetorpeek(bool advance)
|| typebuf.tb_maplen == 0)) {
int nomap = nolmaplen;
int c2;
- /* find the match length of this mapping */
- for (mlen = 1; mlen < typebuf.tb_len; ++mlen) {
+ // find the match length of this mapping
+ for (mlen = 1; mlen < typebuf.tb_len; mlen++) {
c2 = typebuf.tb_buf[typebuf.tb_off + mlen];
if (nomap > 0)
--nomap;
@@ -1901,7 +1909,7 @@ static int vgetorpeek(bool advance)
if (keylen > typebuf.tb_len) {
if (!timedout && !(mp_match != NULL
&& mp_match->m_nowait)) {
- /* break at a partly match */
+ // break at a partly match
keylen = KEYLEN_PART_MAP;
break;
}
@@ -1953,13 +1961,14 @@ static int vgetorpeek(bool advance)
setcursor();
continue;
}
- /* Need more chars for partly match. */
- if (mlen == typebuf.tb_len)
+ // Need more chars for partly match.
+ if (mlen == typebuf.tb_len) {
keylen = KEYLEN_PART_KEY;
- else if (max_mlen < mlen)
- /* no match, may have to check for termcode at
- * next character */
+ } else if (max_mlen < mlen) {
+ // no match, may have to check for termcode at
+ // next character
max_mlen = mlen + 1;
+ }
}
if ((mp == NULL || max_mlen >= mp_match_len)
@@ -1991,13 +2000,11 @@ static int vgetorpeek(bool advance)
}
}
- /* complete match */
+ // complete match
if (keylen >= 0 && keylen <= typebuf.tb_len) {
int save_m_expr;
int save_m_noremap;
int save_m_silent;
- char_u *save_m_keys;
- char_u *save_m_str;
// Write chars to script file(s)
// Note: :lmap mappings are written *after* being applied. #5658
@@ -2007,7 +2014,7 @@ static int vgetorpeek(bool advance)
}
cmd_silent = (typebuf.tb_silent > 0);
- del_typebuf(keylen, 0); /* remove the mapped keys */
+ del_typebuf(keylen, 0); // remove the mapped keys
/*
* Put the replacement string in front of mapstr.
@@ -2032,9 +2039,8 @@ static int vgetorpeek(bool advance)
*/
if (VIsual_active && VIsual_select
&& (mp->m_mode & VISUAL)) {
- VIsual_select = FALSE;
- (void)ins_typebuf(K_SELECT_STRING, REMAP_NONE,
- 0, TRUE, FALSE);
+ VIsual_select = false;
+ (void)ins_typebuf(K_SELECT_STRING, REMAP_NONE, 0, true, false);
}
/* Copy the values from *mp that are used, because
@@ -2044,8 +2050,8 @@ static int vgetorpeek(bool advance)
save_m_expr = mp->m_expr;
save_m_noremap = mp->m_noremap;
save_m_silent = mp->m_silent;
- save_m_keys = NULL; /* only saved when needed */
- save_m_str = NULL; /* only saved when needed */
+ char_u *save_m_keys = NULL; // only saved when needed
+ char_u *save_m_str = NULL; // only saved when needed
/*
* Handle ":map <expr>": evaluate the {rhs} as an
@@ -2141,14 +2147,14 @@ static int vgetorpeek(bool advance)
char_u *ptr;
if (mode_displayed) {
- unshowmode(TRUE);
- mode_deleted = TRUE;
+ unshowmode(true);
+ mode_deleted = true;
}
validate_cursor();
old_wcol = curwin->w_wcol;
old_wrow = curwin->w_wrow;
- /* move cursor left, if possible */
+ // move cursor left, if possible
if (curwin->w_cursor.col != 0) {
if (curwin->w_wcol > 0) {
if (did_ai) {
@@ -2170,7 +2176,7 @@ static int vgetorpeek(bool advance)
+ curwin->w_wcol / curwin->w_width_inner;
curwin->w_wcol %= curwin->w_width_inner;
curwin->w_wcol += curwin_col_off();
- col = 0; /* no correction needed */
+ col = 0; // no correction needed
} else {
--curwin->w_wcol;
col = curwin->w_cursor.col - 1;
@@ -2197,8 +2203,9 @@ static int vgetorpeek(bool advance)
curwin->w_wcol = old_wcol;
curwin->w_wrow = old_wrow;
}
- if (c < 0)
- continue; /* end of input script reached */
+ if (c < 0) {
+ continue; // end of input script reached
+ }
// Allow mapping for just typed characters. When we get here c
// is the number of extra bytes and typebuf.tb_len is 1.
@@ -2207,20 +2214,20 @@ static int vgetorpeek(bool advance)
}
typebuf.tb_len += c;
- /* buffer full, don't map */
+ // buffer full, don't map
if (typebuf.tb_len >= typebuf.tb_maplen + MAXMAPLEN) {
- timedout = TRUE;
+ timedout = true;
continue;
}
if (ex_normal_busy > 0) {
static int tc = 0;
- /* No typeahead left and inside ":normal". Must return
- * something to avoid getting stuck. When an incomplete
- * mapping is present, behave like it timed out. */
+ // No typeahead left and inside ":normal". Must return
+ // something to avoid getting stuck. When an incomplete
+ // mapping is present, behave like it timed out.
if (typebuf.tb_len > 0) {
- timedout = TRUE;
+ timedout = true;
continue;
}
/* When 'insertmode' is set, ESC just beeps in Insert
@@ -2254,7 +2261,7 @@ static int vgetorpeek(bool advance)
if (((State & INSERT) != 0 || p_lz) && (State & CMDLINE) == 0
&& advance && must_redraw != 0 && !need_wait_return) {
update_screen(0);
- setcursor(); /* put cursor back where it belongs */
+ setcursor(); // put cursor back where it belongs
}
/*
@@ -2267,16 +2274,16 @@ static int vgetorpeek(bool advance)
if (typebuf.tb_len > 0 && advance && !exmode_active) {
if (((State & (NORMAL | INSERT)) || State == LANGMAP)
&& State != HITRETURN) {
- /* this looks nice when typing a dead character map */
+ // this looks nice when typing a dead character map
if (State & INSERT
&& ptr2cells(typebuf.tb_buf + typebuf.tb_off
- + typebuf.tb_len - 1) == 1) {
- edit_putchar(typebuf.tb_buf[typebuf.tb_off
- + typebuf.tb_len - 1], FALSE);
- setcursor(); /* put cursor back where it belongs */
+ + typebuf.tb_len - 1) == 1) {
+ edit_putchar(typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len - 1],
+ false);
+ setcursor(); // put cursor back where it belongs
c1 = 1;
}
- /* need to use the col and row from above here */
+ // need to use the col and row from above here
old_wcol = curwin->w_wcol;
old_wrow = curwin->w_wrow;
curwin->w_wcol = new_wcol;
@@ -2332,31 +2339,34 @@ static int vgetorpeek(bool advance)
if (i != 0)
pop_showcmd();
if (c1 == 1) {
- if (State & INSERT)
+ if (State & INSERT) {
edit_unputchar();
- if (State & CMDLINE)
+ }
+ if (State & CMDLINE) {
unputcmdline();
- else
- setcursor(); /* put cursor back where it belongs */
+ } else {
+ setcursor(); // put cursor back where it belongs
+ }
}
- if (c < 0)
- continue; /* end of input script reached */
- if (c == NUL) { /* no character available */
- if (!advance)
+ if (c < 0) {
+ continue; // end of input script reached
+ }
+ if (c == NUL) { // no character available
+ if (!advance) {
break;
- if (wait_tb_len > 0) { /* timed out */
- timedout = TRUE;
+ }
+ if (wait_tb_len > 0) { // timed out
+ timedout = true;
continue;
}
- } else { /* allow mapping for just typed characters */
- while (typebuf.tb_buf[typebuf.tb_off
- + typebuf.tb_len] != NUL)
- typebuf.tb_noremap[typebuf.tb_off
- + typebuf.tb_len++] = RM_YES;
+ } else { // allow mapping for just typed characters
+ while (typebuf.tb_buf[typebuf.tb_off + typebuf.tb_len] != NUL) {
+ typebuf.tb_noremap[typebuf.tb_off + typebuf.tb_len++] = RM_YES;
+ }
}
- } /* for (;;) */
- } /* if (!character from stuffbuf) */
+ } // for (;;)
+ } // if (!character from stuffbuf)
// if advance is false don't loop on NULs
} while (c < 0 || (advance && c == NUL));
@@ -2368,15 +2378,17 @@ static int vgetorpeek(bool advance)
*/
if (advance && p_smd && msg_silent == 0 && (State & INSERT)) {
if (c == ESC && !mode_deleted && !no_mapping && mode_displayed) {
- if (typebuf.tb_len && !KeyTyped)
- redraw_cmdline = TRUE; /* delete mode later */
- else
- unshowmode(FALSE);
+ if (typebuf.tb_len && !KeyTyped) {
+ redraw_cmdline = true; // delete mode later
+ } else {
+ unshowmode(false);
+ }
} else if (c != ESC && mode_deleted) {
- if (typebuf.tb_len && !KeyTyped)
- redraw_cmdline = TRUE; /* show mode later */
- else
+ if (typebuf.tb_len && !KeyTyped) {
+ redraw_cmdline = true; // show mode later
+ } else {
showmode();
+ }
}
}
@@ -2440,8 +2452,8 @@ int inchar(
* on char wait, flush swapfile, write error....).
*/
if (State != HITRETURN) {
- did_outofmem_msg = FALSE; /* display out of memory message (again) */
- did_swapwrite_msg = FALSE; /* display swap file write error again */
+ did_outofmem_msg = false; // display out of memory message (again)
+ did_swapwrite_msg = false; // display swap file write error again
}
// Get a character from a script file if there is one.
@@ -3175,7 +3187,7 @@ static void validate_maphash(void)
/*
* Get the mapping mode from the command name.
*/
-int get_map_mode(char_u **cmdp, int forceit)
+int get_map_mode(char_u **cmdp, bool forceit)
{
char_u *p;
int modec;
@@ -3183,30 +3195,31 @@ int get_map_mode(char_u **cmdp, int forceit)
p = *cmdp;
modec = *p++;
- if (modec == 'i')
- mode = INSERT; /* :imap */
- else if (modec == 'l')
- mode = LANGMAP; /* :lmap */
- else if (modec == 'c')
- mode = CMDLINE; /* :cmap */
- else if (modec == 'n' && *p != 'o') /* avoid :noremap */
- mode = NORMAL; /* :nmap */
- else if (modec == 'v')
- mode = VISUAL + SELECTMODE; /* :vmap */
- else if (modec == 'x')
- mode = VISUAL; /* :xmap */
- else if (modec == 's')
- mode = SELECTMODE; /* :smap */
- else if (modec == 'o')
- mode = OP_PENDING; /* :omap */
- else if (modec == 't')
- mode = TERM_FOCUS; // :tmap
- else {
- --p;
- if (forceit)
- mode = INSERT + CMDLINE; /* :map ! */
- else
- mode = VISUAL + SELECTMODE + NORMAL + OP_PENDING; /* :map */
+ if (modec == 'i') {
+ mode = INSERT; // :imap
+ } else if (modec == 'l') {
+ mode = LANGMAP; // :lmap
+ } else if (modec == 'c') {
+ mode = CMDLINE; // :cmap
+ } else if (modec == 'n' && *p != 'o') { // avoid :noremap
+ mode = NORMAL; // :nmap
+ } else if (modec == 'v') {
+ mode = VISUAL + SELECTMODE; // :vmap
+ } else if (modec == 'x') {
+ mode = VISUAL; // :xmap
+ } else if (modec == 's') {
+ mode = SELECTMODE; // :smap
+ } else if (modec == 'o') {
+ mode = OP_PENDING; // :omap
+ } else if (modec == 't') {
+ mode = TERM_FOCUS; // :tmap
+ } else {
+ p--;
+ if (forceit) {
+ mode = INSERT + CMDLINE; // :map !
+ } else {
+ mode = VISUAL + SELECTMODE + NORMAL + OP_PENDING; // :map
+ }
}
*cmdp = p;
@@ -3237,12 +3250,11 @@ void map_clear_mode(char_u *cmdp, char_u *arg, int forceit, int abbr)
/*
* Clear all mappings in "mode".
*/
-void
-map_clear_int (
- buf_T *buf, /* buffer for local mappings */
- int mode, /* mode in which to delete */
- int local, /* TRUE for buffer-local mappings */
- int abbr /* TRUE for abbreviations */
+void map_clear_int(
+ buf_T *buf, // buffer for local mappings
+ int mode, // mode in which to delete
+ bool local, // true for buffer-local mappings
+ bool abbr // true for abbreviations
)
{
mapblock_T *mp, **mpp;
@@ -3253,12 +3265,14 @@ map_clear_int (
for (hash = 0; hash < 256; ++hash) {
if (abbr) {
- if (hash > 0) /* there is only one abbrlist */
+ if (hash > 0) { // there is only one abbrlist
break;
- if (local)
+ }
+ if (local) {
mpp = &buf->b_first_abbr;
- else
+ } else {
mpp = &first_abbr;
+ }
} else {
if (local)
mpp = &buf->b_maphash[hash];
@@ -3286,7 +3300,7 @@ map_clear_int (
mp->m_next = maphash[new_hash];
maphash[new_hash] = mp;
}
- continue; /* continue with *mpp */
+ continue; // continue with *mpp
}
}
mpp = &(mp->m_next);
@@ -3341,10 +3355,9 @@ char *map_mode_to_chars(int mode)
return (char *)mapmode.ga_data;
}
-static void
-showmap (
+static void showmap(
mapblock_T *mp,
- int local /* TRUE for buffer-local map */
+ bool local // true for buffer-local map
)
{
size_t len = 1;
@@ -3355,8 +3368,9 @@ showmap (
if (msg_didout || msg_silent != 0) {
msg_putchar('\n');
- if (got_int) /* 'q' typed at MORE prompt */
+ if (got_int) { // 'q' typed at MORE prompt
return;
+ }
}
{
@@ -3372,8 +3386,8 @@ showmap (
// Display the LHS. Get length of what we write.
len = (size_t)msg_outtrans_special(mp->m_keys, true, 0);
do {
- msg_putchar(' '); /* padd with blanks */
- ++len;
+ msg_putchar(' '); // padd with blanks
+ len++;
} while (len < 12);
if (mp->m_noremap == REMAP_NONE) {
@@ -3506,21 +3520,20 @@ int map_to_exists_mode(const char *const rhs, const int mode, const bool abbr)
* Used below when expanding mapping/abbreviation names.
*/
static int expand_mapmodes = 0;
-static int expand_isabbrev = 0;
-static int expand_buffer = FALSE;
+static bool expand_isabbrev = false;
+static bool expand_buffer = false;
/*
* Work out what to complete when doing command line completion of mapping
* or abbreviation names.
*/
-char_u *
-set_context_in_map_cmd (
+char_u *set_context_in_map_cmd(
expand_T *xp,
char_u *cmd,
char_u *arg,
- int forceit, /* TRUE if '!' given */
- int isabbrev, /* TRUE if abbreviation */
- int isunmap, /* TRUE if unmap/unabbrev command */
+ bool forceit, // true if '!' given
+ bool isabbrev, // true if abbreviation
+ bool isunmap, // true if unmap/unabbrev command
cmdidx_T cmdidx
)
{
@@ -3536,10 +3549,10 @@ set_context_in_map_cmd (
}
expand_isabbrev = isabbrev;
xp->xp_context = EXPAND_MAPPINGS;
- expand_buffer = FALSE;
+ expand_buffer = false;
for (;; ) {
if (STRNCMP(arg, "<buffer>", 8) == 0) {
- expand_buffer = TRUE;
+ expand_buffer = true;
arg = skipwhite(arg + 8);
continue;
}
@@ -3589,7 +3602,7 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
validate_maphash();
- *num_file = 0; /* return values in case of FAIL */
+ *num_file = 0; // return values in case of FAIL
*file = NULL;
/*
@@ -3628,8 +3641,9 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
for (hash = 0; hash < 256; ++hash) {
if (expand_isabbrev) {
- if (hash > 0) /* only one abbrev list */
- break; /* for (hash) */
+ if (hash > 0) { // only one abbrev list
+ break; // for (hash)
+ }
mp = first_abbr;
} else if (expand_buffer)
mp = curbuf->b_maphash[hash];
@@ -3648,26 +3662,27 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
}
xfree(p);
}
- } /* for (mp) */
- } /* for (hash) */
+ } // for (mp)
+ } // for (hash)
- if (count == 0) /* no match found */
- break; /* for (round) */
+ if (count == 0) { // no match found
+ break; // for (round)
+ }
if (round == 1) {
*file = (char_u **)xmalloc((size_t)count * sizeof(char_u *));
}
- } /* for (round) */
+ } // for (round)
if (count > 1) {
char_u **ptr1;
char_u **ptr2;
char_u **ptr3;
- /* Sort the matches */
+ // Sort the matches
sort_strings(*file, count);
- /* Remove multiple entries */
+ // Remove multiple entries
ptr1 = *file;
ptr2 = ptr1 + 1;
ptr3 = ptr1 + count;
@@ -3705,7 +3720,7 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
bool check_abbr(int c, char_u *ptr, int col, int mincol)
{
int len;
- int scol; /* starting column of the abbr. */
+ int scol; // starting column of the abbr.
int j;
char_u *s;
char_u tb[MB_MAXBYTES + 4];
@@ -3756,7 +3771,7 @@ bool check_abbr(int c, char_u *ptr, int col, int mincol)
if (scol < mincol)
scol = mincol;
- if (scol < col) { /* there is a word in front of the cursor */
+ if (scol < col) { // there is a word in front of the cursor
ptr += scol;
len = col - scol;
mp = curbuf->b_first_abbr;
@@ -3778,7 +3793,7 @@ bool check_abbr(int c, char_u *ptr, int col, int mincol)
vim_unescape_csi(q);
qlen = (int)STRLEN(q);
}
- /* find entries with right mode and keys */
+ // find entries with right mode and keys
match = (mp->m_mode & State)
&& qlen == len
&& !STRNCMP(q, ptr, (size_t)len);
@@ -3805,7 +3820,7 @@ bool check_abbr(int c, char_u *ptr, int col, int mincol)
*/
j = 0;
if (c != Ctrl_RSB) {
- /* special key code, split up */
+ // special key code, split up
if (IS_SPECIAL(c) || c == K_SPECIAL) {
tb[j++] = K_SPECIAL;
tb[j++] = (char_u)K_SECOND(c);
@@ -3818,20 +3833,29 @@ 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 */
- (void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
+ // insert the last typed char
+ (void)ins_typebuf(tb, 1, 0, true, mp->m_silent);
}
if (mp->m_expr)
s = eval_map_expr(mp->m_str, c);
else
s = mp->m_str;
if (s != NULL) {
- /* insert the to string */
- (void)ins_typebuf(s, mp->m_noremap, 0, TRUE, mp->m_silent);
- /* no abbrev. for these chars */
+ // insert the to string
+ (void)ins_typebuf(s, mp->m_noremap, 0, true, mp->m_silent);
+ // no abbrev. for these chars
typebuf.tb_no_abbr_cnt += (int)STRLEN(s) + j + 1;
if (mp->m_expr)
xfree(s);
@@ -3856,7 +3880,7 @@ bool check_abbr(int c, char_u *ptr, int col, int mincol)
static char_u *
eval_map_expr (
char_u *str,
- int c /* NUL or typed character for abbreviation */
+ int c // NUL or typed character for abbreviation
)
{
char_u *res;
@@ -3874,11 +3898,11 @@ eval_map_expr (
save_cmd = save_cmdline_alloc();
- /* Forbid changing text or using ":normal" to avoid most of the bad side
- * effects. Also restore the cursor position. */
- ++textlock;
- ++ex_normal_lock;
- set_vim_var_char(c); /* set v:char to the typed character */
+ // Forbid changing text or using ":normal" to avoid most of the bad side
+ // effects. Also restore the cursor position.
+ textlock++;
+ ex_normal_lock++;
+ set_vim_var_char(c); // set v:char to the typed character
save_cursor = curwin->w_cursor;
save_msg_col = msg_col;
save_msg_row = msg_row;
@@ -3894,7 +3918,7 @@ eval_map_expr (
if (p == NULL)
return NULL;
- /* Escape CSI in the result to be able to use the string as typeahead. */
+ // Escape CSI in the result to be able to use the string as typeahead.
res = vim_strsave_escape_csi(p);
xfree(p);
@@ -3914,7 +3938,7 @@ char_u *vim_strsave_escape_csi(char_u *p)
char_u *d = res;
for (char_u *s = p; *s != NUL; ) {
if (s[0] == K_SPECIAL && s[1] != NUL && s[2] != NUL) {
- /* Copy special key unmodified. */
+ // Copy special key unmodified.
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
@@ -4213,9 +4237,10 @@ int put_escstr(FILE *fd, char_u *strstart, int what)
c = TO_SPECIAL(str[1], str[2]);
str += 2;
}
- if (IS_SPECIAL(c) || modifiers) { /* special key */
- if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
+ if (IS_SPECIAL(c) || modifiers) { // special key
+ if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0) {
return FAIL;
+ }
continue;
}
}
@@ -4271,35 +4296,36 @@ char_u *
check_map (
char_u *keys,
int mode,
- int exact, /* require exact match */
- int ign_mod, /* ignore preceding modifier */
- int abbr, /* do abbreviations */
- mapblock_T **mp_ptr, /* return: pointer to mapblock or NULL */
- int *local_ptr /* return: buffer-local mapping or NULL */
+ int exact, // require exact match
+ int ign_mod, // ignore preceding modifier
+ int abbr, // do abbreviations
+ mapblock_T **mp_ptr, // return: pointer to mapblock or NULL
+ int *local_ptr // return: buffer-local mapping or NULL
)
{
- int hash;
int len, minlen;
mapblock_T *mp;
- int local;
validate_maphash();
len = (int)STRLEN(keys);
- for (local = 1; local >= 0; --local)
- /* loop over all hash lists */
- for (hash = 0; hash < 256; ++hash) {
+ for (int local = 1; local >= 0; local--) {
+ // loop over all hash lists
+ for (int hash = 0; hash < 256; hash++) {
if (abbr) {
- if (hash > 0) /* there is only one list. */
+ if (hash > 0) { // there is only one list.
break;
- if (local)
+ }
+ if (local) {
mp = curbuf->b_first_abbr;
- else
+ } else {
mp = first_abbr;
- } else if (local)
+ }
+ } else if (local) {
mp = curbuf->b_maphash[hash];
- else
+ } else {
mp = maphash[hash];
+ }
for (; mp != NULL; mp = mp->m_next) {
/* skip entries with wrong mode, wrong length and not matching
* ones */
@@ -4322,6 +4348,7 @@ check_map (
}
}
}
+ }
return NULL;
}
@@ -4336,7 +4363,7 @@ void add_map(char_u *map, int mode)
char_u *s;
char_u *cpo_save = p_cpo;
- p_cpo = (char_u *)""; /* Allow <> notation */
+ p_cpo = (char_u *)""; // Allow <> notation
s = vim_strsave(map);
(void)do_map(0, s, mode, FALSE);
xfree(s);
@@ -4384,7 +4411,7 @@ static char_u * translate_mapping (
}
if (IS_SPECIAL(c) || modifiers) { // special key
ga_concat(&ga, get_special_key_name(c, modifiers));
- continue; /* for (str) */
+ continue; // for (str)
}
}
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 7b8e809de7..624b7c93f3 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -256,7 +256,7 @@ EXTERN linenr_T sourcing_lnum INIT(= 0); // line number of the source file
EXTERN int ex_nesting_level INIT(= 0); // nesting level
EXTERN int debug_break_level INIT(= -1); // break below this level
-EXTERN int debug_did_msg INIT(= false); // did "debug mode" message
+EXTERN bool debug_did_msg INIT(= false); // did "debug mode" message
EXTERN int debug_tick INIT(= 0); // breakpoint change count
EXTERN int debug_backtrace_level INIT(= 0); // breakpoint backtrace level
@@ -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
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 4ec949759c..abba5425e7 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -890,8 +890,11 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
* Appropriately expand any tabs to spaces.
*/
if (line[col] == TAB || tab_spaces != 0) {
- if (tab_spaces == 0)
- tab_spaces = (int)(curbuf->b_p_ts - (print_pos % curbuf->b_p_ts));
+ if (tab_spaces == 0) {
+ tab_spaces = tabstop_padding(print_pos,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
+ }
while (tab_spaces > 0) {
need_break = mch_print_text_out((char_u *)" ", 1);
diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c
index 4a2bbc2739..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.
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
index fae971b3b3..8fa61515ef 100644
--- a/src/nvim/indent.c
+++ b/src/nvim/indent.c
@@ -34,14 +34,20 @@
// Count the size (in window cells) of the indent in the current line.
int get_indent(void)
{
- return get_indent_str(get_cursor_line_ptr(), (int)curbuf->b_p_ts, false);
+ return get_indent_str_vtab(get_cursor_line_ptr(),
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array,
+ false);
}
// Count the size (in window cells) of the indent in line "lnum".
int get_indent_lnum(linenr_T lnum)
{
- return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts, false);
+ return get_indent_str_vtab(ml_get(lnum),
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array,
+ false);
}
@@ -49,7 +55,10 @@ int get_indent_lnum(linenr_T lnum)
// "buf".
int get_indent_buf(buf_T *buf, linenr_T lnum)
{
- return get_indent_str(ml_get_buf(buf, lnum, false), (int)buf->b_p_ts, false);
+ return get_indent_str_vtab(ml_get_buf(buf, lnum, false),
+ curbuf->b_p_ts,
+ buf->b_p_vts_array,
+ false);
}
@@ -82,6 +91,30 @@ int get_indent_str(const char_u *ptr, int ts, int list)
return count;
}
+// Count the size (in window cells) of the indent in line "ptr", using
+// variable tabstops.
+// if "list" is true, count only screen size for tabs.
+int get_indent_str_vtab(const char_u *ptr, long ts, long *vts, bool list)
+{
+ int count = 0;
+
+ for (; *ptr; ptr++) {
+ if (*ptr == TAB) { // count a tab for what it is worth
+ if (!list || curwin->w_p_lcs_chars.tab1) {
+ count += tabstop_padding(count, ts, vts);
+ } else {
+ // In list mode, when tab is not set, count screen char width
+ // for Tab, displays: ^I
+ count += ptr2cells(ptr);
+ }
+ } else if (*ptr == ' ') {
+ count++; // count a space for one
+ } else {
+ break;
+ }
+ }
+ return count;
+}
// Set the indent of the current line.
// Leaves the cursor on the first non-blank in the line.
@@ -104,6 +137,7 @@ int set_indent(int size, int flags)
int line_len;
int doit = false;
int ind_done = 0; // Measured in spaces.
+ int ind_col = 0;
int tab_pad;
int retval = false;
@@ -130,7 +164,9 @@ int set_indent(int size, int flags)
// Count as many characters as we can use.
while (todo > 0 && ascii_iswhite(*p)) {
if (*p == TAB) {
- tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
// Stop if this tab will overshoot the target.
if (todo < tab_pad) {
@@ -147,35 +183,41 @@ int set_indent(int size, int flags)
p++;
}
+ // These diverge from this point.
+ ind_col = ind_done;
// Set initial number of whitespace chars to copy if we are
// preserving indent but expandtab is set.
if (curbuf->b_p_et) {
orig_char_len = ind_len;
}
-
// Fill to next tabstop with a tab, if possible.
- tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
-
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
if ((todo >= tab_pad) && (orig_char_len == -1)) {
doit = true;
todo -= tab_pad;
ind_len++;
// ind_done += tab_pad;
+ ind_col += tab_pad;
}
}
// Count tabs required for indent.
- while (todo >= (int)curbuf->b_p_ts) {
+ for (;;) {
+ tab_pad = tabstop_padding(ind_col, curbuf->b_p_ts, curbuf->b_p_vts_array);
+ if (todo < tab_pad) {
+ break;
+ }
if (*p != TAB) {
doit = true;
} else {
p++;
}
- todo -= (int)curbuf->b_p_ts;
+ todo -= tab_pad;
ind_len++;
-
- // ind_done += (int)curbuf->b_p_ts;
+ ind_col += tab_pad;
}
}
@@ -255,7 +297,9 @@ int set_indent(int size, int flags)
while (todo > 0 && ascii_iswhite(*p)) {
if (*p == TAB) {
- tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
// Stop if this tab will overshoot the target.
if (todo < tab_pad) {
@@ -272,18 +316,28 @@ int set_indent(int size, int flags)
}
// Fill to next tabstop with a tab, if possible.
- tab_pad = (int)curbuf->b_p_ts - (ind_done % (int)curbuf->b_p_ts);
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
if (todo >= tab_pad) {
*s++ = TAB;
todo -= tab_pad;
+ ind_done += tab_pad;
}
p = skipwhite(p);
}
- while (todo >= (int)curbuf->b_p_ts) {
+ for (;;) {
+ tab_pad = tabstop_padding(ind_done,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array);
+ if (todo < tab_pad) {
+ break;
+ }
*s++ = TAB;
- todo -= (int)curbuf->b_p_ts;
+ todo -= tab_pad;
+ ind_done += tab_pad;
}
}
@@ -375,11 +429,9 @@ int get_number_indent(linenr_T lnum)
return (int)col;
}
-/*
- * Return appropriate space number for breakindent, taking influencing
- * parameters into account. Window must be specified, since it is not
- * necessarily always the current one.
- */
+// Return appropriate space number for breakindent, taking influencing
+// parameters into account. Window must be specified, since it is not
+// necessarily always the current one.
int get_breakindent_win(win_T *wp, const char_u *line)
FUNC_ATTR_NONNULL_ALL
{
@@ -387,6 +439,7 @@ int get_breakindent_win(win_T *wp, const char_u *line)
static long prev_ts = 0; // Cached tabstop value.
static const char_u *prev_line = NULL; // cached pointer to line.
static varnumber_T prev_tick = 0; // Changedtick of cached value.
+ static long *prev_vts = NULL; // Cached vartabs values.
int bri = 0;
// window width minus window margin space, i.e. what rests for text
const int eff_wwidth = wp->w_width_inner
@@ -396,11 +449,16 @@ int get_breakindent_win(win_T *wp, const char_u *line)
// used cached indent, unless pointer or 'tabstop' changed
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
- || prev_tick != buf_get_changedtick(wp->w_buffer)) {
+ || prev_tick != buf_get_changedtick(wp->w_buffer)
+ || prev_vts != wp->w_buffer->b_p_vts_array) {
prev_line = line;
prev_ts = wp->w_buffer->b_p_ts;
prev_tick = buf_get_changedtick(wp->w_buffer);
- prev_indent = get_indent_str(line, (int)wp->w_buffer->b_p_ts, wp->w_p_list);
+ prev_vts = wp->w_buffer->b_p_vts_array;
+ prev_indent = get_indent_str_vtab(line,
+ wp->w_buffer->b_p_ts,
+ wp->w_buffer->b_p_vts_array,
+ wp->w_p_list);
}
bri = prev_indent + wp->w_briopt_shift;
diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c
index 9298e57411..771bf923b2 100644
--- a/src/nvim/indent_c.c
+++ b/src/nvim/indent_c.c
@@ -33,15 +33,12 @@ typedef struct {
* Search starts at w_cursor.lnum and goes backwards.
* Return NULL when not inside a comment.
*/
-static pos_T *ind_find_start_comment(void)
-{ /* XXX */
+static pos_T *ind_find_start_comment(void) // XXX
+{
return find_start_comment(curbuf->b_ind_maxcomment);
}
-pos_T *
-find_start_comment ( /* XXX */
- int ind_maxcomment
-)
+pos_T *find_start_comment(int ind_maxcomment) // XXX
{
pos_T *pos;
char_u *line;
@@ -109,8 +106,8 @@ static pos_T *ind_find_start_CORS(linenr_T *is_raw)
* Search starts at w_cursor.lnum and goes backwards.
* Return NULL when not inside a raw string.
*/
-static pos_T *find_start_rawstring(int ind_maxcomment)
-{ /* XXX */
+static pos_T *find_start_rawstring(int ind_maxcomment) // XXX
+{
pos_T *pos;
char_u *line;
char_u *p;
@@ -152,31 +149,35 @@ static char_u *skip_string(char_u *p)
/*
* We loop, because strings may be concatenated: "date""time".
*/
- for (;; ++p) {
- if (p[0] == '\'') { /* 'c' or '\n' or '\000' */
- if (!p[1]) /* ' at end of line */
+ for (;; p++) {
+ if (p[0] == '\'') { // 'c' or '\n' or '\000'
+ if (!p[1]) { // ' at end of line
break;
+ }
i = 2;
- if (p[1] == '\\') { /* '\n' or '\000' */
- ++i;
- while (ascii_isdigit(p[i - 1])) /* '\000' */
- ++i;
+ if (p[1] == '\\') { // '\n' or '\000'
+ i++;
+ while (ascii_isdigit(p[i - 1])) { // '\000'
+ i++;
+ }
}
- if (p[i] == '\'') { /* check for trailing ' */
+ if (p[i] == '\'') { // check for trailing '
p += i;
continue;
}
- } else if (p[0] == '"') { /* start of string */
- for (++p; p[0]; ++p) {
- if (p[0] == '\\' && p[1] != NUL)
- ++p;
- else if (p[0] == '"') /* end of string */
+ } else if (p[0] == '"') { // start of string
+ for (++p; p[0]; p++) {
+ if (p[0] == '\\' && p[1] != NUL) {
+ p++;
+ } else if (p[0] == '"') { // end of string
break;
+ }
+ }
+ if (p[0] == '"') {
+ continue; // continue for another string
}
- if (p[0] == '"')
- continue; /* continue for another string */
} else if (p[0] == 'R' && p[1] == '"') {
- /* Raw string: R"[delim](...)[delim]" */
+ // Raw string: R"[delim](...)[delim]"
char_u *delim = p + 2;
char_u *paren = vim_strchr(delim, '(');
@@ -190,14 +191,16 @@ static char_u *skip_string(char_u *p)
p += delim_len + 1;
break;
}
- if (p[0] == '"')
- continue; /* continue for another string */
+ if (p[0] == '"') {
+ continue; // continue for another string
+ }
}
}
- break; /* no string found */
+ break; // no string found
+ }
+ if (!*p) {
+ p--; // backup from NUL
}
- if (!*p)
- --p; /* backup from NUL */
return p;
}
@@ -255,20 +258,22 @@ static char_u *cin_skipcomment(char_u *s)
s += STRLEN(s);
break;
}
- if (*s != '/')
+ if (*s != '/') {
break;
- ++s;
- if (*s == '/') { /* slash-slash comment continues till eol */
+ }
+ s++;
+ if (*s == '/') { // slash-slash comment continues till eol
s += STRLEN(s);
break;
}
if (*s != '*')
break;
- for (++s; *s; ++s) /* skip slash-star comment */
+ for (++s; *s; s++) { // skip slash-star comment
if (s[0] == '*' && s[1] == '/') {
s += 2;
break;
}
+ }
}
return s;
}
@@ -285,7 +290,7 @@ static int cin_nocode(char_u *s)
/*
* Check previous lines for a "//" line comment, skipping over blank lines.
*/
-static pos_T *find_line_comment(void) /* XXX */
+static pos_T *find_line_comment(void) // XXX
{
static pos_T pos;
char_u *line;
@@ -335,39 +340,38 @@ static bool cin_has_js_key(char_u *text)
/// Checks if string matches "label:"; move to character after ':' if true.
/// "*s" must point to the start of the label, if there is one.
-static int cin_islabel_skip(char_u **s)
+static bool cin_islabel_skip(char_u **s)
+ FUNC_ATTR_NONNULL_ALL
{
- if (!vim_isIDc(**s)) /* need at least one ID character */
- return FALSE;
+ if (!vim_isIDc(**s)) { // need at least one ID character
+ return false;
+ }
while (vim_isIDc(**s))
(*s)++;
*s = cin_skipcomment(*s);
- /* "::" is not a label, it's C++ */
+ // "::" is not a label, it's C++
return **s == ':' && *++*s != ':';
}
-/*
- * Recognize a label: "label:".
- * Note: curwin->w_cursor must be where we are looking for the label.
- */
-int cin_islabel(void)
-{ /* XXX */
+// Recognize a label: "label:".
+// Note: curwin->w_cursor must be where we are looking for the label.
+bool cin_islabel(void) // XXX
+{
char_u *s = cin_skipcomment(get_cursor_line_ptr());
- /*
- * Exclude "default" from labels, since it should be indented
- * like a switch label. Same for C++ scope declarations.
- */
- if (cin_isdefault(s))
- return FALSE;
- if (cin_isscopedecl(s))
- return FALSE;
-
+ // Exclude "default" from labels, since it should be indented
+ // like a switch label. Same for C++ scope declarations.
+ if (cin_isdefault(s)) {
+ return false;
+ }
+ if (cin_isscopedecl(s)) {
+ return false;
+ }
if (!cin_islabel_skip(&s)) {
- return FALSE;
+ return false;
}
/*
@@ -392,21 +396,24 @@ int cin_islabel(void)
}
line = get_cursor_line_ptr();
- if (cin_ispreproc(line)) /* ignore #defines, #if, etc. */
+ if (cin_ispreproc(line)) { // ignore #defines, #if, etc.
continue;
- if (*(line = cin_skipcomment(line)) == NUL)
+ }
+ if (*(line = cin_skipcomment(line)) == NUL) {
continue;
+ }
curwin->w_cursor = cursor_save;
if (cin_isterminated(line, TRUE, FALSE)
|| cin_isscopedecl(line)
- || cin_iscase(line, TRUE)
- || (cin_islabel_skip(&line) && cin_nocode(line)))
- return TRUE;
- return FALSE;
+ || cin_iscase(line, true)
+ || (cin_islabel_skip(&line) && cin_nocode(line))) {
+ return true;
+ }
+ return false;
}
curwin->w_cursor = cursor_save;
- return TRUE; /* label at start of file??? */
+ return true; // label at start of file???
}
/*
@@ -451,10 +458,9 @@ static int cin_isinit(void)
/*
* Recognize a switch label: "case .*:" or "default:".
*/
-int
-cin_iscase (
+bool cin_iscase(
char_u *s,
- int strict /* Allow relaxed check of case statement for JS */
+ bool strict // Allow relaxed check of case statement for JS
)
{
s = cin_skipcomment(s);
@@ -465,29 +471,32 @@ cin_iscase (
break;
}
if (*s == ':') {
- if (s[1] == ':') /* skip over "::" for C++ */
- ++s;
- else
- return TRUE;
+ if (s[1] == ':') { // skip over "::" for C++
+ s++;
+ } else {
+ return true;
+ }
}
- if (*s == '\'' && s[1] && s[2] == '\'')
- s += 2; /* skip over ':' */
- else if (*s == '/' && (s[1] == '*' || s[1] == '/'))
- return FALSE; /* stop at comment */
- else if (*s == '"') {
- /* JS etc. */
- if (strict)
- return FALSE; /* stop at string */
- else
- return TRUE;
+ if (*s == '\'' && s[1] && s[2] == '\'') {
+ s += 2; // skip over ':'
+ } else if (*s == '/' && (s[1] == '*' || s[1] == '/')) {
+ return false; // stop at comment
+ } else if (*s == '"') {
+ // JS etc.
+ if (strict) {
+ return false; // stop at string
+ } else {
+ return true;
+ }
}
}
- return FALSE;
+ return false;
}
- if (cin_isdefault(s))
- return TRUE;
- return FALSE;
+ if (cin_isdefault(s)) {
+ return true;
+ }
+ return false;
}
/*
@@ -503,23 +512,24 @@ static int cin_isdefault(char_u *s)
/*
* Recognize a "public/private/protected" scope declaration label.
*/
-int cin_isscopedecl(char_u *s)
+bool cin_isscopedecl(char_u *s)
{
int i;
s = cin_skipcomment(s);
- if (STRNCMP(s, "public", 6) == 0)
+ if (STRNCMP(s, "public", 6) == 0) {
i = 6;
- else if (STRNCMP(s, "protected", 9) == 0)
+ } else if (STRNCMP(s, "protected", 9) == 0) {
i = 9;
- else if (STRNCMP(s, "private", 7) == 0)
+ } else if (STRNCMP(s, "private", 7) == 0) {
i = 7;
- else
- return FALSE;
+ } else {
+ return false;
+ }
return *(s = cin_skipcomment(s + i)) == ':' && s[1] != ':';
}
-/* Maximum number of lines to search back for a "namespace" line. */
+// Maximum number of lines to search back for a "namespace" line.
#define FIND_NAMESPACE_LIM 20
// Recognize a "namespace" scope declaration.
@@ -569,12 +579,14 @@ static char_u *after_label(char_u *l)
{
for (; *l; ++l) {
if (*l == ':') {
- if (l[1] == ':') /* skip over "::" for C++ */
- ++l;
- else if (!cin_iscase(l + 1, FALSE))
+ if (l[1] == ':') { // skip over "::" for C++
+ l++;
+ } else if (!cin_iscase(l + 1, false)) {
break;
- } else if (*l == '\'' && l[1] && l[2] == '\'')
- l += 2; /* skip over 'x' */
+ }
+ } else if (*l == '\'' && l[1] && l[2] == '\'') {
+ l += 2; // skip over 'x'
+ }
}
if (*l == NUL)
return NULL;
@@ -588,10 +600,7 @@ static char_u *after_label(char_u *l)
* Get indent of line "lnum", skipping a label.
* Return 0 if there is nothing after the label.
*/
-static int
-get_indent_nolabel ( /* XXX */
- linenr_T lnum
-)
+static int get_indent_nolabel(linenr_T lnum) // XXX
{
char_u *l;
pos_T fp;
@@ -624,12 +633,13 @@ static int skip_label(linenr_T lnum, char_u **pp)
cursor_save = curwin->w_cursor;
curwin->w_cursor.lnum = lnum;
l = get_cursor_line_ptr();
- /* XXX */
- if (cin_iscase(l, FALSE) || cin_isscopedecl(l) || cin_islabel()) {
+ // XXX
+ if (cin_iscase(l, false) || cin_isscopedecl(l) || cin_islabel()) {
amount = get_indent_nolabel(lnum);
l = after_label(get_cursor_line_ptr());
- if (l == NULL) /* just in case */
+ if (l == NULL) { // just in case
l = get_cursor_line_ptr();
+ }
} else {
amount = get_indent();
l = get_cursor_line_ptr();
@@ -710,10 +720,11 @@ static int cin_get_equal_amount(linenr_T lnum)
line = s = ml_get(lnum);
while (*s != NUL && vim_strchr((char_u *)"=;{}\"'", *s) == NULL) {
- if (cin_iscomment(s)) /* ignore comments */
+ if (cin_iscomment(s)) { // ignore comments
s = cin_skipcomment(s);
- else
- ++s;
+ } else {
+ s++;
+ }
}
if (*s != '=')
return 0;
@@ -722,8 +733,9 @@ static int cin_get_equal_amount(linenr_T lnum)
if (cin_nocode(s))
return 0;
- if (*s == '"') /* nice alignment for continued strings */
- ++s;
+ if (*s == '"') { // nice alignment for continued strings
+ s++;
+ }
fp.lnum = lnum;
fp.col = (colnr_T)(s - line);
@@ -806,8 +818,8 @@ static int cin_islinecomment(char_u *p)
static char_u
cin_isterminated (
char_u *s,
- int incl_open, /* include '{' at the end as terminator */
- int incl_comma /* recognize a trailing comma */
+ int incl_open, // include '{' at the end as terminator
+ int incl_comma // recognize a trailing comma
)
{
char_u found_start = 0;
@@ -823,7 +835,7 @@ cin_isterminated (
is_else = cin_iselse(s);
while (*s) {
- /* skip over comments, "" strings and 'c'haracters */
+ // skip over comments, "" strings and 'c'haracters
s = skip_string(cin_skipcomment(s));
if (*s == '}' && n_open > 0)
--n_open;
@@ -942,12 +954,12 @@ static int cin_isfuncdecl(char_u **sp, linenr_T first_lnum, linenr_T min_lnum)
s = skipwhite(s);
if (!just_started && (!comma && *s != ',' && *s != ')'))
break;
- just_started = FALSE;
- } else if (cin_iscomment(s)) /* ignore comments */
+ just_started = false;
+ } else if (cin_iscomment(s)) { // ignore comments
s = cin_skipcomment(s);
- else {
- ++s;
- just_started = FALSE;
+ } else {
+ s++;
+ just_started = false;
}
}
@@ -965,8 +977,9 @@ static int cin_isif(char_u *p)
static int cin_iselse(char_u *p)
{
- if (*p == '}') /* accept "} else" */
+ if (*p == '}') { // accept "} else"
p = cin_skipcomment(p + 1);
+ }
return STRNCMP(p, "else", 4) == 0 && !vim_isIDc(p[4]);
}
@@ -980,27 +993,24 @@ static int cin_isdo(char_u *p)
* We only accept a "while (condition) ;", with only white space between the
* ')' and ';'. The condition may be spread over several lines.
*/
-static int
-cin_iswhileofdo ( /* XXX */
- char_u *p,
- linenr_T lnum
-)
+static int cin_iswhileofdo(char_u *p, linenr_T lnum) // XXX
{
pos_T cursor_save;
pos_T *trypos;
int retval = FALSE;
p = cin_skipcomment(p);
- if (*p == '}') /* accept "} while (cond);" */
+ if (*p == '}') { // accept "} while (cond);"
p = cin_skipcomment(p + 1);
+ }
if (cin_starts_with(p, "while")) {
cursor_save = curwin->w_cursor;
curwin->w_cursor.lnum = lnum;
curwin->w_cursor.col = 0;
p = get_cursor_line_ptr();
- while (*p && *p != 'w') { /* skip any '}', until the 'w' of the "while" */
- ++p;
- ++curwin->w_cursor.col;
+ while (*p && *p != 'w') { // skip any '}', until the 'w' of the "while"
+ p++;
+ curwin->w_cursor.col++;
}
if ((trypos = findmatchlimit(NULL, 0, 0,
curbuf->b_ind_maxparen)) != NULL
@@ -1067,8 +1077,9 @@ static int cin_iswhileofdo_end(int terminated)
pos_T *trypos;
int i;
- if (terminated != ';') /* there must be a ';' at the end */
- return FALSE;
+ if (terminated != ';') { // there must be a ';' at the end
+ return false;
+ }
p = line = get_cursor_line_ptr();
while (*p != NUL) {
@@ -1083,15 +1094,16 @@ static int cin_iswhileofdo_end(int terminated)
trypos = find_match_paren(curbuf->b_ind_maxparen);
if (trypos != NULL) {
s = cin_skipcomment(ml_get(trypos->lnum));
- if (*s == '}') /* accept "} while (cond);" */
+ if (*s == '}') { // accept "} while (cond);"
s = cin_skipcomment(s + 1);
+ }
if (cin_starts_with(s, "while")) {
curwin->w_cursor.lnum = trypos->lnum;
return TRUE;
}
}
- /* Searching may have made "line" invalid, get it again. */
+ // Searching may have made "line" invalid, get it again.
line = get_cursor_line_ptr();
p = line + i;
}
@@ -1134,8 +1146,9 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) {
pos->col = 0;
s = skipwhite(line);
- if (*s == '#') /* skip #define FOO x ? (x) : x */
- return FALSE;
+ if (*s == '#') { // skip #define FOO x ? (x) : x
+ return false;
+ }
s = cin_skipcomment(s);
if (*s == NUL)
return FALSE;
@@ -1230,23 +1243,23 @@ static int cin_is_cpp_baseclass(cpp_baseclass_cache_T *cached) {
class_or_struct = FALSE;
lookfor_ctor_init = TRUE;
} else if (s[0] == '?') {
- /* Avoid seeing '() :' after '?' as constructor init. */
- return FALSE;
+ // Avoid seeing '() :' after '?' as constructor init.
+ return false;
} else if (!vim_isIDc(s[0])) {
- /* if it is not an identifier, we are wrong */
+ // if it is not an identifier, we are wrong
class_or_struct = false;
lookfor_ctor_init = false;
} else if (pos->col == 0) {
- /* it can't be a constructor-initialization any more */
- lookfor_ctor_init = FALSE;
+ // it can't be a constructor-initialization any more
+ lookfor_ctor_init = false;
- /* the first statement starts here: lineup with this one... */
+ // the first statement starts here: lineup with this one...
if (cpp_base_class) {
pos->col = (colnr_T)(s - line);
}
}
- /* When the line ends in a comma don't align with it. */
+ // When the line ends in a comma don't align with it.
if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1)) {
pos->col = 0;
}
@@ -1271,10 +1284,12 @@ static int get_baseclass_amount(int col)
if (col == 0) {
amount = get_indent();
if (find_last_paren(get_cursor_line_ptr(), '(', ')')
- && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL)
- amount = get_indent_lnum(trypos->lnum); /* XXX */
- if (!cin_ends_in(get_cursor_line_ptr(), (char_u *)",", NULL))
+ && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) {
+ amount = get_indent_lnum(trypos->lnum); // XXX
+ }
+ if (!cin_ends_in(get_cursor_line_ptr(), (char_u *)",", NULL)) {
amount += curbuf->b_ind_cpp_baseclass;
+ }
} else {
curwin->w_cursor.col = col;
getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
@@ -1389,12 +1404,12 @@ static int cin_skip2pos(pos_T *trypos)
* Return NULL if no match found.
* Ignore a '{' that is in a comment, makes indenting the next three lines
* work. */
-/* foo() */
-/* { */
-/* } */
+// foo()
+// {
+// }
-static pos_T *find_start_brace(void)
-{ /* XXX */
+static pos_T *find_start_brace(void) // XXX
+{
pos_T cursor_save;
pos_T *trypos;
pos_T *pos;
@@ -1402,11 +1417,11 @@ static pos_T *find_start_brace(void)
cursor_save = curwin->w_cursor;
while ((trypos = findmatchlimit(NULL, '{', FM_BLOCKSTOP, 0)) != NULL) {
- pos_copy = *trypos; /* copy pos_T, next findmatch will change it */
+ pos_copy = *trypos; // copy pos_T, next findmatch will change it
trypos = &pos_copy;
curwin->w_cursor = *trypos;
pos = NULL;
- /* ignore the { if it's in a // or / * * / comment */
+ // ignore the { if it's in a // or / * * / comment
if ((colnr_T)cin_skip2pos(trypos) == trypos->col
&& (pos = ind_find_start_CORS(NULL)) == NULL) { // XXX
break;
@@ -1449,7 +1464,7 @@ retry:
} else {
pos_T *trypos_wk;
- pos_copy = *trypos; /* copy trypos, findmatch will change it */
+ pos_copy = *trypos; // copy trypos, findmatch will change it
trypos = &pos_copy;
curwin->w_cursor = *trypos;
if ((trypos_wk = ind_find_start_CORS(NULL)) != NULL) { // XXX
@@ -1515,17 +1530,17 @@ static int find_last_paren(char_u *l, int start, int end)
int retval = FALSE;
int open_count = 0;
- curwin->w_cursor.col = 0; /* default is start of line */
+ curwin->w_cursor.col = 0; // default is start of line
for (i = 0; l[i] != NUL; i++) {
- i = (int)(cin_skipcomment(l + i) - l); /* ignore parens in comments */
- i = (int)(skip_string(l + i) - l); /* ignore parens in quotes */
- if (l[i] == start)
- ++open_count;
- else if (l[i] == end) {
- if (open_count > 0)
- --open_count;
- else {
+ i = (int)(cin_skipcomment(l + i) - l); // ignore parens in comments
+ i = (int)(skip_string(l + i) - l); // ignore parens in quotes
+ if (l[i] == start) {
+ open_count++;
+ } else if (l[i] == end) {
+ if (open_count > 0) {
+ open_count--;
+ } else {
curwin->w_cursor.col = i;
retval = TRUE;
}
@@ -1561,7 +1576,7 @@ void parse_cino(buf_T *buf)
* an opening brace. */
buf->b_ind_no_brace = 0;
- /* Column where the first { of a function should be located }. */
+ // Column where the first { of a function should be located }.
buf->b_ind_first_open = 0;
/* Spaces from the prevailing indent a leftmost open brace should be
@@ -1581,26 +1596,26 @@ void parse_cino(buf_T *buf)
* otherwise the jump label will be put to column 1. */
buf->b_ind_jump_label = -1;
- /* Spaces from the switch() indent a "case xx" label should be located. */
+ // Spaces from the switch() indent a "case xx" label should be located.
buf->b_ind_case = sw;
- /* Spaces from the "case xx:" code after a switch() should be located. */
+ // Spaces from the "case xx:" code after a switch() should be located.
buf->b_ind_case_code = sw;
- /* Lineup break at end of case in switch() with case label. */
+ // Lineup break at end of case in switch() with case label.
buf->b_ind_case_break = 0;
/* Spaces from the class declaration indent a scope declaration label
* should be located. */
buf->b_ind_scopedecl = sw;
- /* Spaces from the scope declaration label code should be located. */
+ // Spaces from the scope declaration label code should be located.
buf->b_ind_scopedecl_code = sw;
- /* Amount K&R-style parameters should be indented. */
+ // Amount K&R-style parameters should be indented.
buf->b_ind_param = sw;
- /* Amount a function type spec should be indented. */
+ // Amount a function type spec should be indented.
buf->b_ind_func_type = sw;
/* Amount a cpp base class declaration or constructor initialization
@@ -1611,7 +1626,7 @@ void parse_cino(buf_T *buf)
* should be located. */
buf->b_ind_continuation = sw;
- /* Spaces from the indent of the line with an unclosed parentheses. */
+ // Spaces from the indent of the line with an unclosed parentheses.
buf->b_ind_unclosed = sw * 2;
/* Spaces from the indent of the line with an unclosed parentheses, which
@@ -1635,35 +1650,35 @@ void parse_cino(buf_T *buf)
* opening parentheses. */
buf->b_ind_matching_paren = 0;
- /* Indent a closing parentheses under the previous line. */
+ // Indent a closing parentheses under the previous line.
buf->b_ind_paren_prev = 0;
- /* Extra indent for comments. */
+ // Extra indent for comments.
buf->b_ind_comment = 0;
- /* Spaces from the comment opener when there is nothing after it. */
+ // Spaces from the comment opener when there is nothing after it.
buf->b_ind_in_comment = 3;
/* Boolean: if non-zero, use b_ind_in_comment even if there is something
* after the comment opener. */
buf->b_ind_in_comment2 = 0;
- /* Max lines to search for an open paren. */
+ // Max lines to search for an open paren.
buf->b_ind_maxparen = 20;
- /* Max lines to search for an open comment. */
+ // Max lines to search for an open comment.
buf->b_ind_maxcomment = 70;
- /* Handle braces for java code. */
+ // Handle braces for java code.
buf->b_ind_java = 0;
- /* Not to confuse JS object properties with labels. */
+ // Not to confuse JS object properties with labels.
buf->b_ind_js = 0;
- /* Handle blocked cases correctly. */
+ // Handle blocked cases correctly.
buf->b_ind_keep_case_label = 0;
- /* Handle C++ namespace. */
+ // Handle C++ namespace.
buf->b_ind_cpp_namespace = 0;
/* Handle continuation lines containing conditions of if(), for() and
@@ -1777,9 +1792,9 @@ int get_c_indent(void)
pos_T our_paren_pos;
char_u *start;
int start_brace;
-#define BRACE_IN_COL0 1 /* '{' is in column 0 */
-#define BRACE_AT_START 2 /* '{' is at start of line */
-#define BRACE_AT_END 3 /* '{' is at end of line */
+#define BRACE_IN_COL0 1 // '{' is in column 0
+#define BRACE_AT_START 2 // '{' is at start of line
+#define BRACE_AT_END 3 // '{' is at end of line
linenr_T ourscope;
char_u *l;
char_u *look;
@@ -1802,24 +1817,24 @@ int get_c_indent(void)
int whilelevel;
linenr_T lnum;
int n;
- int iscase;
int lookfor_break;
- int lookfor_cpp_namespace = FALSE;
- int cont_amount = 0; /* amount for continuation line */
+ bool lookfor_cpp_namespace = false;
+ int cont_amount = 0; // amount for continuation line
int original_line_islabel;
int added_to_amount = 0;
linenr_T raw_string_start = 0;
cpp_baseclass_cache_T cache_cpp_baseclass = { false, { MAXLNUM, 0 } };
- /* make a copy, value is changed below */
+ // make a copy, value is changed below
int ind_continuation = curbuf->b_ind_continuation;
- /* remember where the cursor was when we started */
+ // remember where the cursor was when we started
cur_curpos = curwin->w_cursor;
- /* if we are at line 1 zero indent is fine, right? */
- if (cur_curpos.lnum == 1)
+ // if we are at line 1 zero indent is fine, right?
+ if (cur_curpos.lnum == 1) {
return 0;
+ }
/* Get a copy of the current contents of the line.
* This is required, because only the most recent line obtained with
@@ -1840,11 +1855,11 @@ int get_c_indent(void)
theline = skipwhite(linecopy);
- /* move the cursor to the start of the line */
+ // move the cursor to the start of the line
curwin->w_cursor.col = 0;
- original_line_islabel = cin_islabel(); /* XXX */
+ original_line_islabel = cin_islabel(); // XXX
/*
* If we are inside a raw string don't change the indent.
@@ -1852,7 +1867,7 @@ int get_c_indent(void)
*/
comment_pos = ind_find_start_comment();
if (comment_pos != NULL) {
- /* findmatchlimit() static pos is overwritten, make a copy */
+ // findmatchlimit() static pos is overwritten, make a copy
tryposCopy = *comment_pos;
comment_pos = &tryposCopy;
}
@@ -1887,8 +1902,8 @@ int get_c_indent(void)
* previous line, lineup with that one.
*/
if (cin_islinecomment(theline)
- && (trypos = find_line_comment()) != NULL) { /* XXX */
- /* find how indented the line beginning the comment is */
+ && (trypos = find_line_comment()) != NULL) { // XXX
+ // find how indented the line beginning the comment is
getvcol(curwin, trypos, &col, NULL, NULL);
amount = col;
goto theend;
@@ -1897,18 +1912,18 @@ int get_c_indent(void)
* If we're inside a comment and not looking at the start of the
* comment, try using the 'comments' option.
*/
- if (!cin_iscomment(theline) && comment_pos != NULL) { /* XXX */
+ if (!cin_iscomment(theline) && comment_pos != NULL) { // XXX
int lead_start_len = 2;
int lead_middle_len = 1;
- char_u lead_start[COM_MAX_LEN]; /* start-comment string */
- char_u lead_middle[COM_MAX_LEN]; /* middle-comment string */
- char_u lead_end[COM_MAX_LEN]; /* end-comment string */
+ char_u lead_start[COM_MAX_LEN]; // start-comment string
+ char_u lead_middle[COM_MAX_LEN]; // middle-comment string
+ char_u lead_end[COM_MAX_LEN]; // end-comment string
char_u *p;
int start_align = 0;
int start_off = 0;
int done = FALSE;
- /* find how indented the line beginning the comment is */
+ // find how indented the line beginning the comment is
getvcol(curwin, comment_pos, &col, NULL, NULL);
amount = col;
*lead_start = NUL;
@@ -1981,13 +1996,13 @@ int get_c_indent(void)
if (STRNCMP(theline, lead_middle, lead_middle_len) != 0
&& STRNCMP(theline, lead_end, STRLEN(lead_end)) == 0) {
amount = get_indent_lnum(curwin->w_cursor.lnum - 1);
- /* XXX */
- if (off != 0)
+ // XXX
+ if (off != 0) {
amount += off;
- else if (align == COM_RIGHT)
- amount += vim_strsize(lead_start)
- - vim_strsize(lead_middle);
- done = TRUE;
+ } else if (align == COM_RIGHT) {
+ amount += vim_strsize(lead_start) - vim_strsize(lead_middle);
+ }
+ done = true;
break;
}
}
@@ -2010,18 +2025,20 @@ int get_c_indent(void)
* otherwise, add the amount specified by "c" in 'cino'
*/
amount = -1;
- for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; --lnum) {
- if (linewhite(lnum)) /* skip blank lines */
+ for (lnum = cur_curpos.lnum - 1; lnum > comment_pos->lnum; lnum--) {
+ if (linewhite(lnum)) { // skip blank lines
continue;
- amount = get_indent_lnum(lnum); /* XXX */
+ }
+ amount = get_indent_lnum(lnum); // XXX
break;
}
- if (amount == -1) { /* use the comment opener */
+ if (amount == -1) { // use the comment opener
if (!curbuf->b_ind_in_comment2) {
- start = ml_get(comment_pos->lnum);
- look = start + comment_pos->col + 2; /* skip / and * */
- if (*look != NUL) /* if something after it */
- comment_pos->col = (colnr_T)(skipwhite(look) - start);
+ start = ml_get(comment_pos->lnum);
+ look = start + comment_pos->col + 2; // skip / and *
+ if (*look != NUL) { // if something after it
+ comment_pos->col = (colnr_T)(skipwhite(look) - start);
+ }
}
getvcol(curwin, comment_pos, &col, NULL, NULL);
amount = col;
@@ -2038,9 +2055,8 @@ int get_c_indent(void)
amount = get_indent_lnum(trypos->lnum);
goto theend;
}
- /*
- * Are we inside parentheses or braces?
- */ /* XXX */
+ // Are we inside parentheses or braces?
+ // XXX
if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL
&& curbuf->b_ind_java == 0)
|| (tryposBrace = find_start_brace()) != NULL
@@ -2063,8 +2079,8 @@ int get_c_indent(void)
* a previous non-empty line that matches the same paren.
*/
if (theline[0] == ')' && curbuf->b_ind_paren_prev) {
- /* Line up with the start of the matching paren line. */
- amount = get_indent_lnum(curwin->w_cursor.lnum - 1); /* XXX */
+ // Line up with the start of the matching paren line.
+ amount = get_indent_lnum(curwin->w_cursor.lnum - 1); // XXX
} else {
amount = -1;
for (lnum = cur_curpos.lnum - 1; lnum > our_paren_pos.lnum; --lnum) {
@@ -2083,12 +2099,12 @@ int get_c_indent(void)
continue;
}
- /* XXX */
+ // XXX
if ((trypos = find_match_paren(
corr_ind_maxparen(&cur_curpos))) != NULL
&& trypos->lnum == our_paren_pos.lnum
&& trypos->col == our_paren_pos.col) {
- amount = get_indent_lnum(lnum); /* XXX */
+ amount = get_indent_lnum(lnum); // XXX
if (theline[0] == ')') {
if (our_paren_pos.lnum != lnum
@@ -2200,10 +2216,11 @@ int get_c_indent(void)
col = our_paren_pos.col + 1;
while (ascii_iswhite(l[col]))
col++;
- if (l[col] != NUL) /* In case of trailing space */
+ if (l[col] != NUL) { // In case of trailing space
our_paren_pos.col = col;
- else
+ } else {
our_paren_pos.col++;
+ }
}
}
@@ -2219,7 +2236,7 @@ int get_c_indent(void)
}
if (theline[0] == ')' && curbuf->b_ind_matching_paren) {
- /* Line up with the start of the matching paren line. */
+ // Line up with the start of the matching paren line.
} else if ((curbuf->b_ind_unclosed == 0 && is_if_for_while == 0)
|| (!curbuf->b_ind_unclosed_noignore
&& *look == '(' && ignore_paren_col == 0)) {
@@ -2271,9 +2288,10 @@ int get_c_indent(void)
}
}
- /* add extra indent for a comment */
- if (cin_iscomment(theline))
+ // add extra indent for a comment
+ if (cin_iscomment(theline)) {
amount += curbuf->b_ind_comment;
+ }
} else {
// We are inside braces, there is a { before this line at the position
// stored in tryposBrace.
@@ -2317,7 +2335,7 @@ int get_c_indent(void)
// ldfd) {
// }
if ((curbuf->b_ind_js || curbuf->b_ind_keep_case_label)
- && cin_iscase(skipwhite(get_cursor_line_ptr()), FALSE)) {
+ && cin_iscase(skipwhite(get_cursor_line_ptr()), false)) {
amount = get_indent();
} else if (curbuf->b_ind_js) {
amount = get_indent_lnum(lnum);
@@ -2348,14 +2366,15 @@ int get_c_indent(void)
* to match it with.
*/
lookfor = LOOKFOR_INITIAL;
- if (cin_iselse(theline))
+ if (cin_iselse(theline)) {
lookfor = LOOKFOR_IF;
- else if (cin_iswhileofdo(theline, cur_curpos.lnum)) /* XXX */
+ } else if (cin_iswhileofdo(theline, cur_curpos.lnum)) { // XXX
lookfor = LOOKFOR_DO;
+ }
if (lookfor != LOOKFOR_INITIAL) {
curwin->w_cursor.lnum = cur_curpos.lnum;
if (find_match(lookfor, ourscope) == OK) {
- amount = get_indent(); /* XXX */
+ amount = get_indent(); // XXX
goto theend;
}
}
@@ -2390,7 +2409,7 @@ int get_c_indent(void)
amount += curbuf->b_ind_cpp_extern_c;
}
} else {
- /* Compensate for adding b_ind_open_extra later. */
+ // Compensate for adding b_ind_open_extra later.
amount -= curbuf->b_ind_open_extra;
if (amount < 0)
amount = 0;
@@ -2399,19 +2418,20 @@ int get_c_indent(void)
lookfor_break = FALSE;
- if (cin_iscase(theline, FALSE)) { /* it's a switch() label */
- lookfor = LOOKFOR_CASE; /* find a previous switch() label */
+ if (cin_iscase(theline, false)) { // it's a switch() label
+ lookfor = LOOKFOR_CASE; // find a previous switch() label
amount += curbuf->b_ind_case;
- } else if (cin_isscopedecl(theline)) { /* private:, ... */
- lookfor = LOOKFOR_SCOPEDECL; /* class decl is this block */
+ } else if (cin_isscopedecl(theline)) { // private:, ...
+ lookfor = LOOKFOR_SCOPEDECL; // class decl is this block
amount += curbuf->b_ind_scopedecl;
} else {
- if (curbuf->b_ind_case_break && cin_isbreak(theline))
- /* break; ... */
- lookfor_break = TRUE;
+ if (curbuf->b_ind_case_break && cin_isbreak(theline)) {
+ // break; ...
+ lookfor_break = true;
+ }
lookfor = LOOKFOR_INITIAL;
- /* b_ind_level from start of block */
+ // b_ind_level from start of block
amount += curbuf->b_ind_level;
}
scope_amount = amount;
@@ -2503,16 +2523,17 @@ int get_c_indent(void)
if (terminated != ';' && cin_isinit())
break;
- /* nothing useful found */
- if (terminated == 0 || terminated == '{')
+ // nothing useful found
+ if (terminated == 0 || terminated == '{') {
continue;
+ }
}
if (terminated != ';') {
- /* Skip parens and braces. Position the cursor
- * over the rightmost paren, so that matching it
- * will take us back to the start of the line.
- */ /* XXX */
+ // Skip parens and braces. Position the cursor
+ // over the rightmost paren, so that matching it
+ // will take us back to the start of the line.
+ // XXX
trypos = NULL;
if (find_last_paren(l, '(', ')'))
trypos = find_match_paren(
@@ -2582,7 +2603,7 @@ int get_c_indent(void)
continue;
}
- /* Finally the actual check for "namespace". */
+ // Finally the actual check for "namespace".
if (cin_is_cpp_namespace(l)) {
amount += curbuf->b_ind_cpp_namespace
- added_to_amount;
@@ -2614,7 +2635,7 @@ int get_c_indent(void)
* If this is a switch() label, may line up relative to that.
* If this is a C++ scope declaration, do the same.
*/
- iscase = cin_iscase(l, FALSE);
+ bool iscase = cin_iscase(l, false);
if (iscase || cin_isscopedecl(l)) {
/* we are only looking for cpp base class
* declaration/initialization any longer */
@@ -2640,27 +2661,24 @@ int get_c_indent(void)
break;
}
- /*
- * case xx: <- line up with this case
- * x = 333;
- * case yy:
- */
- if ( (iscase && lookfor == LOOKFOR_CASE)
- || (iscase && lookfor_break)
- || (!iscase && lookfor == LOOKFOR_SCOPEDECL)) {
- /*
- * Check that this case label is not for another
- * switch()
- */ /* XXX */
+ // case xx: <- line up with this case
+ // x = 333;
+ // case yy:
+ if ((iscase && lookfor == LOOKFOR_CASE)
+ || (iscase && lookfor_break)
+ || (!iscase && lookfor == LOOKFOR_SCOPEDECL)) {
+ // Check that this case label is not for another
+ // switch()
+ // XXX
if ((trypos = find_start_brace()) == NULL
|| trypos->lnum == ourscope) {
- amount = get_indent(); /* XXX */
+ amount = get_indent(); // XXX
break;
}
continue;
}
- n = get_indent_nolabel(curwin->w_cursor.lnum); /* XXX */
+ n = get_indent_nolabel(curwin->w_cursor.lnum); // XXX
/*
* case xx: if (cond) <- line up with this if
@@ -2708,7 +2726,7 @@ int get_c_indent(void)
* case xx:
* -> y = 1;
*/
- scope_amount = get_indent() + (iscase /* XXX */
+ scope_amount = get_indent() + (iscase // XXX
? curbuf->b_ind_case_code
: curbuf->b_ind_scopedecl_code);
lookfor = curbuf->b_ind_case_break
@@ -2750,11 +2768,10 @@ int get_c_indent(void)
continue;
}
- /*
- * Are we at the start of a cpp base class declaration or
- * constructor initialization?
- */ /* XXX */
- n = FALSE;
+ // Are we at the start of a cpp base class declaration or
+ // constructor initialization?
+ // XXX
+ n = 0;
if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0) {
n = cin_is_cpp_baseclass(&cache_cpp_baseclass);
l = get_cursor_line_ptr();
@@ -2766,13 +2783,14 @@ int get_c_indent(void)
else
amount += ind_continuation;
} else if (theline[0] == '{') {
- /* Need to find start of the declaration. */
+ // Need to find start of the declaration.
lookfor = LOOKFOR_UNTERM;
ind_continuation = 0;
continue;
- } else
- /* XXX */
+ } else {
+ // XXX
amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col);
+ }
break;
} else if (lookfor == LOOKFOR_CPP_BASECLASS) {
/* only look, whether there is a cpp base class
@@ -2871,8 +2889,8 @@ int get_c_indent(void)
*/
curwin->w_cursor = *trypos;
l = get_cursor_line_ptr();
- if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) {
- ++curwin->w_cursor.lnum;
+ if (cin_iscase(l, false) || cin_isscopedecl(l)) {
+ curwin->w_cursor.lnum++;
curwin->w_cursor.col = 0;
continue;
}
@@ -3025,9 +3043,10 @@ int get_c_indent(void)
* -> here;
*/
if (lookfor == LOOKFOR_UNTERM) {
- /* When line ends in a comma add extra indent */
- if (terminated == ',')
+ // When line ends in a comma add extra indent
+ if (terminated == ',') {
amount += ind_continuation;
+ }
break;
}
@@ -3144,9 +3163,10 @@ int get_c_indent(void)
if (whilelevel == 0) {
lookfor = LOOKFOR_TERM;
- amount = get_indent(); /* XXX */
- if (theline[0] == '{')
+ amount = get_indent(); // XXX
+ if (theline[0] == '{') {
amount += curbuf->b_ind_open_extra;
+ }
}
++whilelevel;
}
@@ -3174,8 +3194,8 @@ int get_c_indent(void)
if (whilelevel > 0) {
l = cin_skipcomment(get_cursor_line_ptr());
if (cin_isdo(l)) {
- amount = get_indent(); /* XXX */
- --whilelevel;
+ amount = get_indent(); // XXX
+ whilelevel--;
continue;
}
}
@@ -3240,8 +3260,8 @@ term_again:
*/
curwin->w_cursor = *trypos;
l = get_cursor_line_ptr();
- if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) {
- ++curwin->w_cursor.lnum;
+ if (cin_iscase(l, false) || cin_isscopedecl(l)) {
+ curwin->w_cursor.lnum++;
curwin->w_cursor.col = 0;
continue;
}
@@ -3256,8 +3276,7 @@ term_again:
* stat;
* }
*/
- iscase = (curbuf->b_ind_keep_case_label
- && cin_iscase(l, FALSE));
+ iscase = curbuf->b_ind_keep_case_label && cin_iscase(l, false);
/*
* Get indent and pointer to text for current line,
@@ -3267,7 +3286,7 @@ term_again:
if (theline[0] == '{')
amount += curbuf->b_ind_open_extra;
- /* See remark above: "Only add b_ind_open_extra.." */
+ // See remark above: "Only add b_ind_open_extra.."
l = skipwhite(l);
if (*l == '{')
amount -= curbuf->b_ind_open_extra;
@@ -3297,11 +3316,11 @@ term_again:
* that block.
*/
l = get_cursor_line_ptr();
- if (find_last_paren(l, '{', '}') /* XXX */
+ if (find_last_paren(l, '{', '}') // XXX
&& (trypos = find_start_brace()) != NULL) {
curwin->w_cursor = *trypos;
- /* if not "else {" check for terminated again */
- /* but skip block for "} else {" */
+ // if not "else {" check for terminated again
+ // but skip block for "} else {"
l = cin_skipcomment(get_cursor_line_ptr());
if (*l == '}' || !cin_iselse(l))
goto term_again;
@@ -3314,13 +3333,14 @@ term_again:
}
}
- /* add extra indent for a comment */
- if (cin_iscomment(theline))
+ // add extra indent for a comment
+ if (cin_iscomment(theline)) {
amount += curbuf->b_ind_comment;
-
- /* subtract extra left-shift for jump labels */
- if (curbuf->b_ind_jump_label > 0 && original_line_islabel)
+ }
+ // subtract extra left-shift for jump labels
+ if (curbuf->b_ind_jump_label > 0 && original_line_islabel) {
amount -= curbuf->b_ind_jump_label;
+ }
goto theend;
}
@@ -3360,7 +3380,7 @@ term_again:
goto theend;
}
- /* search backwards until we find something we recognize */
+ // search backwards until we find something we recognize
amount = 0;
curwin->w_cursor = cur_curpos;
while (curwin->w_cursor.lnum > 1) {
@@ -3386,7 +3406,7 @@ term_again:
l = get_cursor_line_ptr();
}
if (n) {
- /* XXX */
+ // XXX
amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col);
break;
}
@@ -3415,11 +3435,11 @@ term_again:
*/
if (cin_ends_in(l, (char_u *)",", NULL)
|| (*l != NUL && (n = l[STRLEN(l) - 1]) == '\\')) {
- /* take us back to opening paren */
+ // take us back to opening paren
if (find_last_paren(l, '(', ')')
- && (trypos = find_match_paren(
- curbuf->b_ind_maxparen)) != NULL)
+ && (trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL) {
curwin->w_cursor = *trypos;
+ }
/* For a line ending in ',' that is a continuation line go
* back to the first line with a backslash:
@@ -3435,7 +3455,7 @@ term_again:
curwin->w_cursor.col = 0;
}
- amount = get_indent(); /* XXX */
+ amount = get_indent(); // XXX
if (amount == 0)
amount = cin_first_id_amount();
@@ -3448,8 +3468,9 @@ term_again:
* If the line looks like a function declaration, and we're
* not in a comment, put it the left margin.
*/
- if (cin_isfuncdecl(NULL, cur_curpos.lnum, 0)) /* XXX */
+ if (cin_isfuncdecl(NULL, cur_curpos.lnum, 0)) { // XXX
break;
+ }
l = get_cursor_line_ptr();
/*
@@ -3535,13 +3556,14 @@ term_again:
if ((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL)
curwin->w_cursor = *trypos;
- amount = get_indent(); /* XXX */
+ amount = get_indent(); // XXX
break;
}
- /* add extra indent for a comment */
- if (cin_iscomment(theline))
+ // add extra indent for a comment
+ if (cin_iscomment(theline)) {
amount += curbuf->b_ind_comment;
+ }
/* add extra indent if the previous line ended in a backslash:
* "asdfasdf\
@@ -3565,7 +3587,7 @@ theend:
amount = 0;
laterend:
- /* put the cursor back where it belongs */
+ // put the cursor back where it belongs
curwin->w_cursor = cur_curpos;
xfree(linecopy);
@@ -3598,7 +3620,7 @@ static int find_match(int lookfor, linenr_T ourscope)
look = cin_skipcomment(get_cursor_line_ptr());
if (!cin_iselse(look)
&& !cin_isif(look)
- && !cin_isdo(look) /* XXX */
+ && !cin_isdo(look) // XXX
&& !cin_iswhileofdo(look, curwin->w_cursor.lnum)) {
continue;
}
@@ -3607,9 +3629,10 @@ static int find_match(int lookfor, linenr_T ourscope)
* if we've gone outside the braces entirely,
* we must be out of scope...
*/
- theirscope = find_start_brace(); /* XXX */
- if (theirscope == NULL)
+ theirscope = find_start_brace(); // XXX
+ if (theirscope == NULL) {
break;
+ }
/*
* and if the brace enclosing this is further
@@ -3649,7 +3672,7 @@ static int find_match(int lookfor, linenr_T ourscope)
continue;
}
- /* If it's an "if" decrement elselevel */
+ // If it's an "if" decrement elselevel
look = cin_skipcomment(get_cursor_line_ptr());
if (cin_isif(look)) {
elselevel--;
@@ -3661,9 +3684,10 @@ static int find_match(int lookfor, linenr_T ourscope)
whilelevel = 0;
}
- /* If it's a "do" decrement whilelevel */
- if (cin_isdo(look))
+ // If it's a "do" decrement whilelevel
+ if (cin_isdo(look)) {
whilelevel--;
+ }
/*
* if we've used up all the elses, then
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/lib/queue.h b/src/nvim/lib/queue.h
index ab9270081e..452998a5a4 100644
--- a/src/nvim/lib/queue.h
+++ b/src/nvim/lib/queue.h
@@ -33,11 +33,17 @@ typedef struct _queue {
#define QUEUE_DATA(ptr, type, field) \
((type *)((char *)(ptr) - offsetof(type, field)))
-// Important note: mutating the list while QUEUE_FOREACH is
-// iterating over its elements results in undefined behavior.
-#define QUEUE_FOREACH(q, h) \
- for ( /* NOLINT(readability/braces) */ \
- (q) = (h)->next; (q) != (h); (q) = (q)->next)
+// Important note: the node currently being processed can be safely deleted.
+// otherwise, mutating the list while QUEUE_FOREACH is iterating over its
+// elements results in undefined behavior.
+#define QUEUE_FOREACH(q, h, code) \
+ (q) = (h)->next; \
+ while((q) != (h)) { \
+ QUEUE *next = q->next; \
+ code \
+ (q) = next; \
+ }
+
// ffi.cdef is unable to swallow `bool` in place of `int` here.
static inline int QUEUE_EMPTY(const QUEUE *const q)
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 310b194c8c..f99a2dd0fe 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.
@@ -547,6 +553,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 +567,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 +584,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];
@@ -866,17 +896,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 +941,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 +953,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 +1066,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 +1244,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 +1263,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);
}
@@ -1272,6 +1306,12 @@ bool nlua_exec_file(const char *path)
return true;
}
+int tslua_get_language_version(lua_State *L)
+{
+ lua_pushnumber(L, TREE_SITTER_LANGUAGE_VERSION);
+ return 1;
+}
+
static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
{
tslua_init(lstate);
@@ -1288,8 +1328,11 @@ static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
lua_pushcfunction(lstate, tslua_inspect_lang);
lua_setfield(lstate, -2, "_ts_inspect_language");
- lua_pushcfunction(lstate, ts_lua_parse_query);
+ lua_pushcfunction(lstate, tslua_parse_query);
lua_setfield(lstate, -2, "_ts_parse_query");
+
+ lua_pushcfunction(lstate, tslua_get_language_version);
+ lua_setfield(lstate, -2, "_ts_get_language_version");
}
int nlua_expand_pat(expand_T *xp,
@@ -1499,6 +1542,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,
@@ -1508,53 +1553,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;
}
@@ -1564,55 +1596,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 33974c71cb..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;
}
@@ -1109,7 +1115,7 @@ static int querycursor_gc(lua_State *L)
// Query methods
-int ts_lua_parse_query(lua_State *L)
+int tslua_parse_query(lua_State *L)
{
if (lua_gettop(L) < 2 || !lua_isstring(L, 1) || !lua_isstring(L, 2)) {
return luaL_error(L, "string expected");
diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua
index eb54ff28ee..a678432dda 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
@@ -398,7 +400,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 +413,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 +522,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/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/message.c b/src/nvim/message.c
index 71cb345878..a34b895033 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,
@@ -869,18 +869,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 +1193,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.
@@ -1705,6 +1706,7 @@ void msg_prt_line(char_u *s, int list)
char_u *p_extra = NULL; // init to make SASC shut up
int n;
int attr = 0;
+ char_u *lead = NULL;
char_u *trail = NULL;
int l;
@@ -1712,11 +1714,24 @@ void msg_prt_line(char_u *s, int list)
list = true;
}
- // find start of trailing whitespace
- if (list && curwin->w_p_lcs_chars.trail) {
- trail = s + STRLEN(s);
- while (trail > s && ascii_iswhite(trail[-1])) {
- trail--;
+ if (list) {
+ // find start of trailing whitespace
+ if (curwin->w_p_lcs_chars.trail) {
+ trail = s + STRLEN(s);
+ while (trail > s && ascii_iswhite(trail[-1])) {
+ trail--;
+ }
+ }
+ // find end of leading whitespace
+ if (curwin->w_p_lcs_chars.lead) {
+ lead = s;
+ while (ascii_iswhite(lead[0])) {
+ lead++;
+ }
+ // in a line full of spaces all of them are treated as trailing
+ if (*lead == NUL) {
+ lead = NULL;
+ }
}
}
@@ -1758,7 +1773,9 @@ void msg_prt_line(char_u *s, int list)
c = *s++;
if (c == TAB && (!list || curwin->w_p_lcs_chars.tab1)) {
// tab amount depends on current column
- n_extra = curbuf->b_p_ts - col % curbuf->b_p_ts - 1;
+ n_extra = tabstop_padding(col,
+ curbuf->b_p_ts,
+ curbuf->b_p_vts_array) - 1;
if (!list) {
c = ' ';
c_extra = ' ';
@@ -1791,6 +1808,9 @@ void msg_prt_line(char_u *s, int list)
/* Use special coloring to be able to distinguish <hex> from
* the same in plain text. */
attr = HL_ATTR(HLF_8);
+ } else if (c == ' ' && lead != NULL && s <= lead) {
+ c = curwin->w_p_lcs_chars.lead;
+ attr = HL_ATTR(HLF_8);
} else if (c == ' ' && trail != NULL && s > trail) {
c = curwin->w_p_lcs_chars.trail;
attr = HL_ATTR(HLF_8);
@@ -2246,12 +2266,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..68a1bba78d 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
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 0b4e2e1f23..2f4c441beb 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);
}
@@ -2263,6 +2265,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 +3396,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 +3977,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 +4010,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 +5468,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;
@@ -6777,9 +6786,10 @@ static void nv_g_cmd(cmdarg_T *cap)
}
coladvance((colnr_T)i);
if (flag) {
- do
+ do {
i = gchar_cursor();
- while (ascii_iswhite(i) && oneright());
+ } while (ascii_iswhite(i) && oneright());
+ curwin->w_valid &= ~VALID_WCOL;
}
curwin->w_set_curswant = true;
break;
@@ -7032,6 +7042,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 0ff427c261..0ed116c17f 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -288,7 +288,7 @@ void shift_line(
{
int count;
int i, j;
- int p_sw = get_sw_value(curbuf);
+ int p_sw = (int)get_sw_value_indent(curbuf);
count = get_indent(); // get current indent
@@ -332,8 +332,9 @@ static void shift_block(oparg_T *oap, int amount)
const int oldstate = State;
char_u *newp;
const int oldcol = curwin->w_cursor.col;
- const int p_sw = get_sw_value(curbuf);
- const int p_ts = (int)curbuf->b_p_ts;
+ int p_sw = (int)get_sw_value_indent(curbuf);
+ long *p_vts = curbuf->b_p_vts_array;
+ const long p_ts = curbuf->b_p_ts;
struct block_def bd;
int incr;
int i = 0, j = 0;
@@ -383,12 +384,11 @@ static void shift_block(oparg_T *oap, int amount)
}
/* OK, now total=all the VWS reqd, and textstart points at the 1st
* non-ws char in the block. */
- if (!curbuf->b_p_et)
- i = ((ws_vcol % p_ts) + total) / p_ts; /* number of tabs */
- if (i)
- j = ((ws_vcol % p_ts) + total) % p_ts; /* number of spp */
- else
+ if (!curbuf->b_p_et) {
+ tabstop_fromto(ws_vcol, ws_vcol + total, p_ts, p_vts, &i, &j);
+ } else {
j = total;
+ }
// if we're splitting a TAB, allow for it
int col_pre = bd.pre_whitesp_c - (bd.startspaces != 0);
@@ -1079,13 +1079,15 @@ do_execreg(
}
}
escaped = vim_strsave_escape_csi(reg->y_array[i]);
- retval = ins_typebuf(escaped, remap, 0, TRUE, silent);
+ retval = ins_typebuf(escaped, remap, 0, true, silent);
xfree(escaped);
- if (retval == FAIL)
+ if (retval == FAIL) {
return FAIL;
- if (colon && ins_typebuf((char_u *)":", remap, 0, TRUE, silent)
- == FAIL)
+ }
+ if (colon
+ && ins_typebuf((char_u *)":", remap, 0, true, silent) == FAIL) {
return FAIL;
+ }
}
reg_executing = regname == 0 ? '"' : regname; // disable the 'q' command
}
@@ -1109,8 +1111,9 @@ static void put_reedit_in_typebuf(int silent)
buf[0] = (char_u)(restart_edit == 'I' ? 'i' : restart_edit);
buf[1] = NUL;
}
- if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
+ if (ins_typebuf(buf, REMAP_NONE, 0, true, silent) == OK) {
restart_edit = NUL;
+ }
}
}
@@ -1130,25 +1133,29 @@ static int put_in_typebuf(
int retval = OK;
put_reedit_in_typebuf(silent);
- if (colon)
- retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent);
+ if (colon) {
+ retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, true, silent);
+ }
if (retval == OK) {
char_u *p;
- if (esc)
+ if (esc) {
p = vim_strsave_escape_csi(s);
- else
+ } else {
p = s;
- if (p == NULL)
+ }
+ if (p == NULL) {
retval = FAIL;
- else
- retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES,
- 0, TRUE, silent);
- if (esc)
+ } else {
+ retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES, 0, true, silent);
+ }
+ if (esc) {
xfree(p);
+ }
+ }
+ if (colon && retval == OK) {
+ retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, true, silent);
}
- if (colon && retval == OK)
- retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent);
return retval;
}
@@ -1669,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--;
@@ -2800,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;
@@ -3061,14 +3070,17 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
if (gchar_cursor() == TAB) {
/* Don't need to insert spaces when "p" on the last position of a
* tab or "P" on the first position. */
+ int viscol = getviscol();
if (dir == FORWARD
- ? (int)curwin->w_cursor.coladd < curbuf->b_p_ts - 1
- : curwin->w_cursor.coladd > 0)
- coladvance_force(getviscol());
- else
+ ? tabstop_padding(viscol, curbuf->b_p_ts, curbuf->b_p_vts_array) != 1
+ : curwin->w_cursor.coladd > 0) {
+ coladvance_force(viscol);
+ } else {
curwin->w_cursor.coladd = 0;
- } else if (curwin->w_cursor.coladd > 0 || gchar_cursor() == NUL)
+ }
+ } else if (curwin->w_cursor.coladd > 0 || gchar_cursor() == NUL) {
coladvance_force(getviscol() + (dir == FORWARD));
+ }
}
lnum = curwin->w_cursor.lnum;
@@ -3318,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++;
@@ -3329,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.
@@ -4715,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;
@@ -4731,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;
@@ -4751,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'
@@ -4781,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'
@@ -4802,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--;
}
}
@@ -4816,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;
@@ -4828,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;
}
@@ -4836,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) {
@@ -4873,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;
@@ -4887,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
@@ -4900,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;
}
@@ -4932,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--;
@@ -5013,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';
}
@@ -6275,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 d04329e104..6f28f37d2b 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -180,6 +180,8 @@ static long p_ts;
static long p_tw;
static int p_udf;
static long p_wm;
+static char_u *p_vsts;
+static char_u *p_vts;
static char_u *p_keymap;
// Saved values for when 'bin' is set.
@@ -194,6 +196,7 @@ static int p_et_nopaste;
static long p_sts_nopaste;
static long p_tw_nopaste;
static long p_wm_nopaste;
+static char_u *p_vsts_nopaste;
typedef struct vimoption {
char *fullname; // full option name
@@ -289,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",
@@ -379,8 +383,8 @@ void set_init_1(bool clean_arg)
# else
static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"};
# endif
- int len;
garray_T ga;
+ opt_idx = findoption("backupskip");
ga_init(&ga, 1, 100);
for (size_t n = 0; n < ARRAY_SIZE(names); n++) {
@@ -401,15 +405,23 @@ void set_init_1(bool clean_arg)
}
if (p != NULL && *p != NUL) {
// First time count the NUL, otherwise count the ','.
- len = (int)strlen(p) + 3;
- ga_grow(&ga, len);
- if (!GA_EMPTY(&ga)) {
- STRCAT(ga.ga_data, ",");
+ const size_t len = strlen(p) + 3;
+ char *item = xmalloc(len);
+ xstrlcpy(item, p, len);
+ add_pathsep(item);
+ xstrlcat(item, "*", len);
+ if (find_dup_item(ga.ga_data, (char_u *)item, options[opt_idx].flags)
+ == NULL) {
+ ga_grow(&ga, (int)len);
+ if (!GA_EMPTY(&ga)) {
+ STRCAT(ga.ga_data, ",");
+ }
+ STRCAT(ga.ga_data, p);
+ add_pathsep(ga.ga_data);
+ STRCAT(ga.ga_data, "*");
+ ga.ga_len += (int)len;
}
- STRCAT(ga.ga_data, p);
- add_pathsep(ga.ga_data);
- STRCAT(ga.ga_data, "*");
- ga.ga_len += len;
+ xfree(item);
}
if(mustfree) {
xfree(p);
@@ -713,6 +725,38 @@ static void set_string_default(const char *name, char *val, bool allocated)
}
}
+// For an option value that contains comma separated items, find "newval" in
+// "origval". Return NULL if not found.
+static char_u *find_dup_item(char_u *origval, const char_u *newval,
+ uint32_t flags)
+ FUNC_ATTR_NONNULL_ARG(2)
+{
+ int bs = 0;
+
+ if (origval == NULL) {
+ return NULL;
+ }
+
+ const size_t newlen = STRLEN(newval);
+ for (char_u *s = origval; *s != NUL; s++) {
+ if ((!(flags & P_COMMA) || s == origval || (s[-1] == ',' && !(bs & 1)))
+ && STRNCMP(s, newval, newlen) == 0
+ && (!(flags & P_COMMA) || s[newlen] == ',' || s[newlen] == NUL)) {
+ return s;
+ }
+ // Count backslashes. Only a comma with an even number of backslashes
+ // or a single backslash preceded by a comma before it is recognized as
+ // a separator.
+ if ((s > origval + 1 && s[-1] == '\\' && s[-2] != ',')
+ || (s == origval + 1 && s[-1] == '\\')) {
+ bs++;
+ } else {
+ bs = 0;
+ }
+ }
+ return NULL;
+}
+
/// Set the Vi-default value of a number option.
/// Used for 'lines' and 'columns'.
void set_number_default(char *name, long val)
@@ -811,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;
@@ -1285,9 +1332,7 @@ int do_set(
char *saved_newval = NULL;
unsigned newlen;
int comma;
- int bs;
- int new_value_alloced; /* new string option
- was allocated */
+ bool new_value_alloced = false; // new string option was allocated
/* When using ":set opt=val" for a global option
* with a local value the local value will be
@@ -1486,34 +1531,20 @@ int do_set(
i = 0; // init for GCC
if (removing || (flags & P_NODUP)) {
i = (int)STRLEN(newval);
- bs = 0;
- for (s = origval; *s; s++) {
- if ((!(flags & P_COMMA)
- || s == origval
- || (s[-1] == ',' && !(bs & 1)))
- && STRNCMP(s, newval, i) == 0
- && (!(flags & P_COMMA)
- || s[i] == ','
- || s[i] == NUL)) {
- break;
- }
- // Count backslashes. Only a comma with an even number of
- // backslashes or a single backslash preceded by a comma
- // before it is recognized as a separator
- if ((s > origval + 1 && s[-1] == '\\' && s[-2] != ',')
- || (s == origval + 1 && s[-1] == '\\')) {
- bs++;
- } else {
- bs = 0;
- }
- }
+ s = find_dup_item(origval, newval, flags);
// do not add if already there
- if ((adding || prepending) && *s) {
+ if ((adding || prepending) && s != NULL) {
prepending = false;
adding = false;
STRCPY(newval, origval);
}
+
+ // if no duplicate, move pointer to end of
+ // original value
+ if (s == NULL) {
+ s = origval + (int)STRLEN(origval);
+ }
}
/* concatenate the two strings; add a ',' if
@@ -1974,6 +2005,10 @@ static void didset_options2(void)
// Parse default for 'wildmode'.
check_opt_wim();
+ xfree(curbuf->b_p_vsts_array);
+ tabstop_set(curbuf->b_p_vsts, &curbuf->b_p_vsts_array);
+ xfree(curbuf->b_p_vts_array);
+ tabstop_set(curbuf->b_p_vts, &curbuf->b_p_vts_array);
}
/// Check for string options that are NULL (normally only termcap options).
@@ -2040,6 +2075,8 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_lw);
check_string_option(&buf->b_p_bkc);
check_string_option(&buf->b_p_menc);
+ check_string_option(&buf->b_p_vsts);
+ check_string_option(&buf->b_p_vts);
}
/// Free the string allocated for an option.
@@ -2310,7 +2347,7 @@ static char_u *
did_set_string_option(
int opt_idx, // index in options[] table
char_u **varp, // pointer to the option variable
- int new_value_alloced, // new value was allocated
+ bool new_value_alloced, // new value was allocated
char_u *oldval, // previous value of the option
char_u *errbuf, // buffer for errors, or NULL
size_t errbuflen, // length of errors buffer
@@ -3086,6 +3123,65 @@ ambw_end:
if (opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true) != OK) {
errmsg = e_invarg;
}
+ } else if (varp == &(curbuf->b_p_vsts)) { // 'varsofttabstop'
+ char_u *cp;
+
+ if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1])) {
+ if (curbuf->b_p_vsts_array) {
+ xfree(curbuf->b_p_vsts_array);
+ curbuf->b_p_vsts_array = 0;
+ }
+ } else {
+ for (cp = *varp; *cp; cp++) {
+ if (ascii_isdigit(*cp)) {
+ continue;
+ }
+ if (*cp == ',' && cp > *varp && *(cp - 1) != ',') {
+ continue;
+ }
+ errmsg = e_invarg;
+ break;
+ }
+ if (errmsg == NULL) {
+ long *oldarray = curbuf->b_p_vsts_array;
+ if (tabstop_set(*varp, &(curbuf->b_p_vsts_array))) {
+ xfree(oldarray);
+ } else {
+ errmsg = e_invarg;
+ }
+ }
+ }
+ } else if (varp == &(curbuf->b_p_vts)) { // 'vartabstop'
+ char_u *cp;
+
+ if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1])) {
+ if (curbuf->b_p_vts_array) {
+ xfree(curbuf->b_p_vts_array);
+ curbuf->b_p_vts_array = NULL;
+ }
+ } else {
+ for (cp = *varp; *cp; cp++) {
+ if (ascii_isdigit(*cp)) {
+ continue;
+ }
+ if (*cp == ',' && cp > *varp && *(cp - 1) != ',') {
+ continue;
+ }
+ errmsg = e_invarg;
+ break;
+ }
+ if (errmsg == NULL) {
+ long *oldarray = curbuf->b_p_vts_array;
+ if (tabstop_set(*varp, &(curbuf->b_p_vts_array))) {
+ xfree(oldarray);
+ if (foldmethodIsIndent(curwin)) {
+ foldUpdateAll(curwin);
+ }
+ } else {
+ errmsg = e_invarg;
+ }
+ }
+ }
} else {
// Options that are a list of flags.
p = NULL;
@@ -3345,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
@@ -3385,6 +3487,7 @@ static char_u *set_chars_option(win_T *wp, char_u **varp, bool set)
{ &wp->w_p_lcs_chars.prec, "precedes", NUL },
{ &wp->w_p_lcs_chars.space, "space", NUL },
{ &wp->w_p_lcs_chars.tab2, "tab", NUL },
+ { &wp->w_p_lcs_chars.lead, "lead", NUL },
{ &wp->w_p_lcs_chars.trail, "trail", NUL },
{ &wp->w_p_lcs_chars.conceal, "conceal", NUL },
};
@@ -4287,7 +4390,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);
}
@@ -5660,6 +5763,8 @@ static char_u *get_varp(vimoption_T *p)
case PV_TW: return (char_u *)&(curbuf->b_p_tw);
case PV_UDF: return (char_u *)&(curbuf->b_p_udf);
case PV_WM: return (char_u *)&(curbuf->b_p_wm);
+ case PV_VSTS: return (char_u *)&(curbuf->b_p_vsts);
+ case PV_VTS: return (char_u *)&(curbuf->b_p_vts);
case PV_KMAP: return (char_u *)&(curbuf->b_p_keymap);
case PV_SCL: return (char_u *)&(curwin->w_p_scl);
case PV_WINHL: return (char_u *)&(curwin->w_p_winhl);
@@ -5800,6 +5905,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;
}
@@ -5911,6 +6017,15 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_tfu = vim_strsave(p_tfu);
buf->b_p_sts = p_sts;
buf->b_p_sts_nopaste = p_sts_nopaste;
+ buf->b_p_vsts = vim_strsave(p_vsts);
+ if (p_vsts && p_vsts != empty_option) {
+ tabstop_set(p_vsts, &buf->b_p_vsts_array);
+ } else {
+ buf->b_p_vsts_array = 0;
+ }
+ buf->b_p_vsts_nopaste = p_vsts_nopaste
+ ? vim_strsave(p_vsts_nopaste)
+ : NULL;
buf->b_p_com = vim_strsave(p_com);
buf->b_p_cms = vim_strsave(p_cms);
buf->b_p_fo = vim_strsave(p_fo);
@@ -5982,10 +6097,21 @@ void buf_copy_options(buf_T *buf, int flags)
*/
if (dont_do_help) {
buf->b_p_isk = save_p_isk;
+ if (p_vts && p_vts != empty_option && !buf->b_p_vts_array) {
+ tabstop_set(p_vts, &buf->b_p_vts_array);
+ } else {
+ buf->b_p_vts_array = NULL;
+ }
} else {
buf->b_p_isk = vim_strsave(p_isk);
did_isk = true;
buf->b_p_ts = p_ts;
+ buf->b_p_vts = vim_strsave(p_vts);
+ if (p_vts && p_vts != empty_option && !buf->b_p_vts_array) {
+ tabstop_set(p_vts, &buf->b_p_vts_array);
+ } else {
+ buf->b_p_vts_array = NULL;
+ }
buf->b_help = false;
if (buf->b_p_bt[0] == 'h') {
clear_string_option(&buf->b_p_bt);
@@ -6600,6 +6726,12 @@ static void paste_option_changed(void)
buf->b_p_sts_nopaste = buf->b_p_sts;
buf->b_p_ai_nopaste = buf->b_p_ai;
buf->b_p_et_nopaste = buf->b_p_et;
+ if (buf->b_p_vsts_nopaste) {
+ xfree(buf->b_p_vsts_nopaste);
+ }
+ buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_option
+ ? vim_strsave(buf->b_p_vsts)
+ : NULL;
}
// save global options
@@ -6614,6 +6746,12 @@ static void paste_option_changed(void)
p_sts_nopaste = p_sts;
p_tw_nopaste = p_tw;
p_wm_nopaste = p_wm;
+ if (p_vsts_nopaste) {
+ xfree(p_vsts_nopaste);
+ }
+ p_vsts_nopaste = p_vsts && p_vsts != empty_option
+ ? vim_strsave(p_vsts)
+ : NULL;
}
// Always set the option values, also when 'paste' is set when it is
@@ -6625,6 +6763,14 @@ static void paste_option_changed(void)
buf->b_p_sts = 0; // softtabstop is 0
buf->b_p_ai = 0; // no auto-indent
buf->b_p_et = 0; // no expandtab
+ if (buf->b_p_vsts) {
+ free_string_option(buf->b_p_vsts);
+ }
+ buf->b_p_vsts = empty_option;
+ if (buf->b_p_vsts_array) {
+ xfree(buf->b_p_vsts_array);
+ }
+ buf->b_p_vsts_array = 0;
}
// set global options
@@ -6641,6 +6787,10 @@ static void paste_option_changed(void)
p_wm = 0;
p_sts = 0;
p_ai = 0;
+ if (p_vsts) {
+ free_string_option(p_vsts);
+ }
+ p_vsts = empty_option;
} else if (old_p_paste) {
// Paste switched from on to off: Restore saved values.
@@ -6651,6 +6801,20 @@ static void paste_option_changed(void)
buf->b_p_sts = buf->b_p_sts_nopaste;
buf->b_p_ai = buf->b_p_ai_nopaste;
buf->b_p_et = buf->b_p_et_nopaste;
+ if (buf->b_p_vsts) {
+ free_string_option(buf->b_p_vsts);
+ }
+ buf->b_p_vsts = buf->b_p_vsts_nopaste
+ ? vim_strsave(buf->b_p_vsts_nopaste)
+ : empty_option;
+ if (buf->b_p_vsts_array) {
+ xfree(buf->b_p_vsts_array);
+ }
+ if (buf->b_p_vsts && buf->b_p_vsts != empty_option) {
+ tabstop_set(buf->b_p_vsts, &buf->b_p_vsts_array);
+ } else {
+ buf->b_p_vsts_array = 0;
+ }
}
// restore global options
@@ -6668,6 +6832,10 @@ static void paste_option_changed(void)
p_sts = p_sts_nopaste;
p_tw = p_tw_nopaste;
p_wm = p_wm_nopaste;
+ if (p_vsts) {
+ free_string_option(p_vsts);
+ }
+ p_vsts = p_vsts_nopaste ? vim_strsave(p_vsts_nopaste) : empty_option;
}
old_p_paste = p_paste;
@@ -6917,17 +7085,301 @@ int check_ff_value(char_u *p)
return check_opt_strings(p, p_ff_values, false);
}
+// Set the integer values corresponding to the string setting of 'vartabstop'.
+// "array" will be set, caller must free it if needed.
+bool tabstop_set(char_u *var, long **array)
+{
+ long valcount = 1;
+ int t;
+ char_u *cp;
+
+ if (var[0] == NUL || (var[0] == '0' && var[1] == NUL)) {
+ *array = NULL;
+ return true;
+ }
+
+ for (cp = var; *cp != NUL; cp++) {
+ if (cp == var || cp[-1] == ',') {
+ char_u *end;
+
+ if (strtol((char *)cp, (char **)&end, 10) <= 0) {
+ if (cp != end) {
+ EMSG(_(e_positive));
+ } else {
+ EMSG(_(e_invarg));
+ }
+ return false;
+ }
+ }
+
+ if (ascii_isdigit(*cp)) {
+ continue;
+ }
+ if (cp[0] == ',' && cp > var && cp[-1] != ',' && cp[1] != NUL) {
+ valcount++;
+ continue;
+ }
+ EMSG(_(e_invarg));
+ return false;
+ }
+
+ *array = (long *)xmalloc((unsigned)(valcount + 1) * sizeof(long));
+ (*array)[0] = valcount;
+
+ t = 1;
+ for (cp = var; *cp != NUL;) {
+ (*array)[t++] = atoi((char *)cp);
+ while (*cp != NUL && *cp != ',') {
+ cp++;
+ }
+ if (*cp != NUL) {
+ cp++;
+ }
+ }
+
+ return true;
+}
+
+// Calculate the number of screen spaces a tab will occupy.
+// If "vts" is set then the tab widths are taken from that array,
+// otherwise the value of ts is used.
+int tabstop_padding(colnr_T col, long ts_arg, long *vts)
+{
+ long ts = ts_arg == 0 ? 8 : ts_arg;
+ colnr_T tabcol = 0;
+ int t;
+ long padding = 0;
+
+ if (vts == NULL || vts[0] == 0) {
+ return (int)(ts - (col % ts));
+ }
+
+ const long tabcount = vts[0];
+
+ for (t = 1; t <= tabcount; t++) {
+ tabcol += (colnr_T)vts[t];
+ if (tabcol > col) {
+ padding = tabcol - col;
+ break;
+ }
+ }
+ if (t > tabcount) {
+ padding = vts[tabcount] - ((col - tabcol) % vts[tabcount]);
+ }
+
+ return (int)padding;
+}
+
+// Find the size of the tab that covers a particular column.
+int tabstop_at(colnr_T col, long ts, long *vts)
+{
+ colnr_T tabcol = 0;
+ int t;
+ long tab_size = 0;
+
+ if (vts == NULL || vts[0] == 0) {
+ return (int)ts;
+ }
+
+ const long tabcount = vts[0];
+ for (t = 1; t <= tabcount; t++) {
+ tabcol += (colnr_T)vts[t];
+ if (tabcol > col) {
+ tab_size = vts[t];
+ break;
+ }
+ }
+ if (t > tabcount) {
+ tab_size = vts[tabcount];
+ }
+
+ return (int)tab_size;
+}
+
+// Find the column on which a tab starts.
+colnr_T tabstop_start(colnr_T col, long ts, long *vts)
+{
+ colnr_T tabcol = 0;
+ int t;
+
+ if (vts == NULL || vts[0] == 0) {
+ return (int)((col / ts) * ts);
+ }
+
+ const long tabcount = vts[0];
+ for (t = 1; t <= tabcount; t++) {
+ tabcol += (colnr_T)vts[t];
+ if (tabcol > col) {
+ return (int)(tabcol - vts[t]);
+ }
+ }
+
+ const int excess = (int)(tabcol % vts[tabcount]);
+ return (int)(excess + ((col - excess) / vts[tabcount]) * vts[tabcount]);
+}
+
+// Find the number of tabs and spaces necessary to get from one column
+// to another.
+void tabstop_fromto(colnr_T start_col,
+ colnr_T end_col,
+ long ts_arg,
+ long *vts,
+ int *ntabs,
+ int *nspcs)
+{
+ int spaces = end_col - start_col;
+ colnr_T tabcol = 0;
+ long padding = 0;
+ int t;
+ long ts = ts_arg == 0 ? curbuf->b_p_ts : ts_arg;
+
+ if (vts == NULL || vts[0] == 0) {
+ int tabs = 0;
+
+ const int initspc = (int)(ts - (start_col % ts));
+ if (spaces >= initspc) {
+ spaces -= initspc;
+ tabs++;
+ }
+ tabs += (int)(spaces / ts);
+ spaces -= (int)((spaces / ts) * ts);
+
+ *ntabs = tabs;
+ *nspcs = spaces;
+ return;
+ }
+
+ // Find the padding needed to reach the next tabstop.
+ const long tabcount = vts[0];
+ for (t = 1; t <= tabcount; t++) {
+ tabcol += (colnr_T)vts[t];
+ if (tabcol > start_col) {
+ padding = tabcol - start_col;
+ break;
+ }
+ }
+ if (t > tabcount) {
+ padding = vts[tabcount] - ((start_col - tabcol) % vts[tabcount]);
+ }
+
+ // If the space needed is less than the padding no tabs can be used.
+ if (spaces < padding) {
+ *ntabs = 0;
+ *nspcs = spaces;
+ return;
+ }
+
+ *ntabs = 1;
+ spaces -= (int)padding;
+
+ // At least one tab has been used. See if any more will fit.
+ while (spaces != 0 && ++t <= tabcount) {
+ padding = vts[t];
+ if (spaces < padding) {
+ *nspcs = spaces;
+ return;
+ }
+ *ntabs += 1;
+ spaces -= (int)padding;
+ }
+
+ *ntabs += spaces / (int)vts[tabcount];
+ *nspcs = spaces % (int)vts[tabcount];
+}
+
+// See if two tabstop arrays contain the same values.
+bool tabstop_eq(long *ts1, long *ts2)
+{
+ int t;
+
+ if ((ts1 == 0 && ts2) || (ts1 && ts2 == 0)) {
+ return false;
+ }
+ if (ts1 == ts2) {
+ return true;
+ }
+ if (ts1[0] != ts2[0]) {
+ return false;
+ }
+
+ for (t = 1; t <= ts1[0]; t++) {
+ if (ts1[t] != ts2[t]) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// Copy a tabstop array, allocating space for the new array.
+int *tabstop_copy(long *oldts)
+{
+ long *newts;
+ int t;
+
+ if (oldts == 0) {
+ return 0;
+ }
+
+ newts = xmalloc((unsigned)(oldts[0] + 1) * sizeof(long));
+ for (t = 0; t <= oldts[0]; t++) {
+ newts[t] = oldts[t];
+ }
+
+ return (int *)newts;
+}
+
+// Return a count of the number of tabstops.
+int tabstop_count(long *ts)
+{
+ return ts != NULL ? (int)ts[0] : 0;
+}
+
+// Return the first tabstop, or 8 if there are no tabstops defined.
+int tabstop_first(long *ts)
+{
+ return ts != NULL ? (int)ts[1] : 8;
+}
+
/// Return the effective shiftwidth value for current buffer, using the
/// 'tabstop' value when 'shiftwidth' is zero.
int get_sw_value(buf_T *buf)
{
- long result = buf->b_p_sw ? buf->b_p_sw : buf->b_p_ts;
+ long result = get_sw_value_col(buf, 0);
assert(result >= 0 && result <= INT_MAX);
return (int)result;
}
+// Idem, using the first non-black in the current line.
+long get_sw_value_indent(buf_T *buf)
+{
+ pos_T pos = curwin->w_cursor;
+
+ pos.col = (colnr_T)getwhitecols_curline();
+ return get_sw_value_pos(buf, &pos);
+}
+
+// Idem, using "pos".
+long get_sw_value_pos(buf_T *buf, pos_T *pos)
+{
+ pos_T save_cursor = curwin->w_cursor;
+ long sw_value;
+
+ curwin->w_cursor = *pos;
+ sw_value = get_sw_value_col(buf, get_nolist_virtcol());
+ curwin->w_cursor = save_cursor;
+ return sw_value;
+}
+
+// Idem, using virtual column "col".
+long get_sw_value_col(buf_T *buf, colnr_T col)
+{
+ return buf->b_p_sw ? buf->b_p_sw
+ : tabstop_at(col, buf->b_p_ts, buf->b_p_vts_array);
+}
+
/// Return the effective softtabstop value for the current buffer,
-/// using the effective shiftwidth value when 'softtabstop' is negative.
+/// using the shiftwidth value when 'softtabstop' is negative.
int get_sts_value(void)
{
long result = curbuf->b_p_sts < 0 ? get_sw_value(curbuf) : curbuf->b_p_sts;
@@ -7135,9 +7587,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'
@@ -7155,7 +7617,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';
@@ -7166,7 +7632,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 43b0107800..16749ba86b 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -165,8 +165,8 @@ enum {
SHM_WRI = 'w', ///< "[w]" instead of "written".
SHM_ABBREVIATIONS = 'a', ///< Use abbreviations from #SHM_ALL_ABBREVIATIONS.
SHM_WRITE = 'W', ///< Don't use "written" at all.
- SHM_TRUNC = 't', ///< Trunctate file messages.
- SHM_TRUNCALL = 'T', ///< Trunctate all messages.
+ SHM_TRUNC = 't', ///< Truncate file messages.
+ SHM_TRUNCALL = 'T', ///< Truncate all messages.
SHM_OVER = 'o', ///< Overwrite file messages.
SHM_OVERALL = 'O', ///< Overwrite more messages.
SHM_SEARCH = 's', ///< No search hit bottom messages.
@@ -824,6 +824,8 @@ enum {
, BV_UDF
, BV_UL
, BV_WM
+ , BV_VSTS
+ , BV_VTS
, BV_COUNT // must be the last one
};
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index f4c1ac9131..d12b31bcaf 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -2999,6 +2999,23 @@ return {
defaults={if_true={vi=4000}}
},
{
+ full_name='varsofttabstop', abbreviation='vsts',
+ short_desc=N_("list of numbers of spaces that <Tab> uses while editing"),
+ type='string', list='comma', scope={'buffer'},
+ vi_def=true,
+ varname='p_vsts',
+ defaults={if_true={vi=""}}
+ },
+ {
+ full_name='vartabstop', abbreviation='vts',
+ short_desc=N_("list of numbers of spaces that <Tab> in file uses"),
+ type='string', list='comma', scope={'buffer'},
+ vi_def=true,
+ varname='p_vts',
+ redraw={'current_buffer'},
+ defaults={if_true={vi=""}}
+ },
+ {
full_name='verbose', abbreviation='vbs',
short_desc=N_("give informative messages"),
type='number', scope={'global'},
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 52d2f84ace..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);
@@ -343,19 +345,17 @@ static int build_cmd_line(char **argv, wchar_t **cmd_line, bool is_cmdexe)
utf8_cmd_line_len += argc;
char *utf8_cmd_line = xmalloc(utf8_cmd_line_len);
*utf8_cmd_line = NUL;
- while (1) {
- QUEUE *head = QUEUE_HEAD(&args_q);
- QUEUE_REMOVE(head);
- ArgNode *arg_node = QUEUE_DATA(head, ArgNode, node);
+ QUEUE *q;
+ QUEUE_FOREACH(q, &args_q, {
+ ArgNode *arg_node = QUEUE_DATA(q, ArgNode, node);
xstrlcat(utf8_cmd_line, arg_node->arg, utf8_cmd_line_len);
xfree(arg_node->arg);
xfree(arg_node);
- if (QUEUE_EMPTY(&args_q)) {
- break;
- } else {
+ QUEUE_REMOVE(q);
+ if (!QUEUE_EMPTY(&args_q)) {
xstrlcat(utf8_cmd_line, " ", utf8_cmd_line_len);
}
- }
+ })
int result = utf8_to_utf16(utf8_cmd_line, -1, cmd_line);
xfree(utf8_cmd_line);
@@ -507,11 +507,11 @@ static int build_env_block(dict_T *denv, wchar_t **env_block)
*env_block = xmalloc(sizeof(**env_block) * env_block_len);
wchar_t *pos = *env_block;
- QUEUE_FOREACH(q, &env_q) {
+ QUEUE_FOREACH(q, &env_q, {
EnvNode *env_node = QUEUE_DATA(q, EnvNode, node);
memcpy(pos, env_node->str, env_node->len * sizeof(*pos));
pos += env_node->len;
- }
+ })
*pos = L'\0';
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/shell.c b/src/nvim/os/shell.c
index b5d890bf52..2974245857 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -123,7 +123,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file,
int shell_style = STYLE_ECHO;
int check_spaces;
static bool did_find_nul = false;
- bool ampersent = false;
+ bool ampersand = false;
// vimglob() function to define for Posix shell
static char *sh_vimglob_func =
"vimglob() { while [ $# -ge 1 ]; do echo \"$1\"; shift; done }; vimglob >";
@@ -245,7 +245,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file,
p--;
}
if (*p == '&') { // remove trailing '&'
- ampersent = true;
+ ampersand = true;
*p = ' ';
}
STRCAT(command, ">");
@@ -309,7 +309,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file,
shellopts |= kShellOptHideMess;
}
- if (ampersent) {
+ if (ampersand) {
STRCAT(command, "&"); // put the '&' after the redirection
}
@@ -331,7 +331,7 @@ int os_expand_wildcards(int num_pat, char_u **pat, int *num_file,
// When running in the background, give it some time to create the temp
// file, but don't wait for it to finish.
- if (ampersent) {
+ if (ampersand) {
os_delay(10L, true);
}
diff --git a/src/nvim/os/time.c b/src/nvim/os/time.c
index 5cf628935f..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;
@@ -196,6 +197,22 @@ char *os_ctime(char *result, size_t result_len)
return os_ctime_r(&rawtime, result, result_len);
}
+/// Portable version of POSIX strptime()
+///
+/// @param str[in] string to convert
+/// @param format[in] format to parse "str"
+/// @param tm[out] time representation of "str"
+/// @return Pointer to first unprocessed character or NULL
+char *os_strptime(const char *str, const char *format, struct tm *tm)
+ FUNC_ATTR_NONNULL_ALL
+{
+#ifdef HAVE_STRPTIME
+ return strptime(str, format, tm);
+#else
+ return NULL;
+#endif
+}
+
/// Obtains the current Unix timestamp.
///
/// @return Seconds since epoch.
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 68abf57413..32c9750628 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -398,7 +398,7 @@ void pum_redraw(void)
char_u *p = NULL;
int totwidth, width, w;
int thumb_pos = 0;
- int thumb_heigth = 1;
+ int thumb_height = 1;
int round;
int n;
@@ -449,11 +449,11 @@ void pum_redraw(void)
}
if (pum_scrollbar) {
- thumb_heigth = pum_height * pum_height / pum_size;
- if (thumb_heigth == 0) {
- thumb_heigth = 1;
+ thumb_height = pum_height * pum_height / pum_size;
+ if (thumb_height == 0) {
+ thumb_height = 1;
}
- thumb_pos = (pum_first * (pum_height - thumb_heigth)
+ thumb_pos = (pum_first * (pum_height - thumb_height)
+ (pum_size - pum_height) / 2)
/ (pum_size - pum_height);
}
@@ -616,11 +616,11 @@ void pum_redraw(void)
if (pum_scrollbar > 0) {
if (pum_rl) {
grid_putchar(&pum_grid, ' ', row, col_off - pum_width,
- i >= thumb_pos && i < thumb_pos + thumb_heigth
+ i >= thumb_pos && i < thumb_pos + thumb_height
? attr_thumb : attr_scroll);
} else {
grid_putchar(&pum_grid, ' ', row, col_off + pum_width,
- i >= thumb_pos && i < thumb_pos + thumb_heigth
+ i >= thumb_pos && i < thumb_pos + thumb_height
? attr_thumb : attr_scroll);
}
}
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index dfd38a6eca..464d72eccb 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -2798,7 +2798,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;
}
}
@@ -3617,6 +3617,15 @@ static int qf_open_new_cwindow(qf_info_T *qi, int height)
if (win_split(height, flags) == FAIL) {
return FAIL; // not enough room for window
}
+
+ // User autocommands may have invalidated the previous window after calling
+ // win_split, so add a check to ensure that the win is still here
+ if (IS_LL_STACK(qi) && !win_valid(win)) {
+ // close the window that was supposed to be for the loclist
+ win_close(curwin, false);
+ return FAIL;
+ }
+
RESET_BINDING(curwin);
if (IS_LL_STACK(qi)) {
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index a2589ac431..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
@@ -5895,7 +5895,7 @@ static void regdump(char_u *pattern, bt_regprog_T *r)
fprintf(f, " count %" PRId64, (int64_t)OPERAND_MIN(s));
s += 4;
} else if (op == RE_LNUM || op == RE_COL || op == RE_VCOL) {
- /* one int plus comperator */
+ // one int plus comparator
fprintf(f, " count %" PRId64, (int64_t)OPERAND_MIN(s));
s += 5;
}
@@ -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);
}
@@ -7139,6 +7144,7 @@ list_T *reg_submatch_list(int no)
tv_list_append_string(list, s, (const char *)rsm.sm_match->endp[no] - s);
}
+ tv_list_ref(list);
return list;
}
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index 8b5ee59d40..923db6422e 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -559,7 +559,9 @@ static char_u *nfa_get_match_text(nfa_state_T *start)
*/
static void realloc_post_list(void)
{
- size_t new_max = (post_end - post_start) + 1000;
+ // For weird patterns the number of states can be very high. Increasing by
+ // 50% seems a reasonable compromise between memory use and speed.
+ const size_t new_max = (post_end - post_start) * 3 / 2;
int *new_start = xrealloc(post_start, new_max * sizeof(int));
post_ptr = new_start + (post_ptr - post_start);
post_end = new_start + new_max;
@@ -6489,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 095c020fe4..5151d82c1b 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -2082,7 +2082,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
int change_start = MAXCOL; // first col of changed area
int change_end = -1; // last col of changed area
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
@@ -2098,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
@@ -2322,7 +2326,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL);
}
// do at least one character; happens when past end of line
- if (fromcol == tocol) {
+ if (fromcol == tocol && search_match_endcol) {
tocol = fromcol + 1;
}
area_highlighting = true;
@@ -2374,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.
@@ -2427,6 +2434,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
if (wp->w_p_list && !has_fold) {
if (wp->w_p_lcs_chars.space
|| wp->w_p_lcs_chars.trail
+ || wp->w_p_lcs_chars.lead
|| wp->w_p_lcs_chars.nbsp) {
extra_check = true;
}
@@ -2438,6 +2446,20 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
trailcol += (colnr_T) (ptr - line);
}
+ // find end of leading whitespace
+ if (wp->w_p_lcs_chars.lead) {
+ leadcol = 0;
+ while (ascii_iswhite(ptr[leadcol])) {
+ leadcol++;
+ }
+ if (ptr[leadcol] == NUL) {
+ // in a line full of spaces all of them are treated as trailing
+ leadcol = (colnr_T)0;
+ } else {
+ // keep track of the first column not filled with spaces
+ leadcol += (colnr_T)(ptr - line) + 1;
+ }
+ }
}
/*
@@ -2680,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,
@@ -2699,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,
@@ -2752,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) {
@@ -2770,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
@@ -2884,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
@@ -3138,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:
@@ -3441,8 +3467,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
// TODO: is passing p for start of the line OK?
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, NULL) - 1;
if (c == TAB && n_extra + col > grid->Columns) {
- n_extra = (int)wp->w_buffer->b_p_ts
- - vcol % (int)wp->w_buffer->b_p_ts - 1;
+ n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts,
+ wp->w_buffer->b_p_vts_array) - 1;
}
c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' ';
c_final = NUL;
@@ -3462,6 +3488,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
|| (mb_utf8 && (mb_c == 160 || mb_c == 0x202f)))
&& curwin->w_p_lcs_chars.nbsp)
|| (c == ' ' && curwin->w_p_lcs_chars.space
+ && ptr - line >= leadcol
&& ptr - line <= trailcol))) {
c = (c == ' ') ? wp->w_p_lcs_chars.space : wp->w_p_lcs_chars.nbsp;
n_attr = 1;
@@ -3477,8 +3504,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
}
- if (trailcol != MAXCOL && ptr > line + trailcol && c == ' ') {
- c = wp->w_p_lcs_chars.trail;
+ if ((trailcol != MAXCOL && ptr > line + trailcol && c == ' ')
+ || (leadcol != 0 && ptr < line + leadcol && c == ' ')) {
+ c = (ptr > line + trailcol) ? wp->w_p_lcs_chars.trail
+ : wp->w_p_lcs_chars.lead;
n_attr = 1;
extra_attr = win_hl_attr(wp, HLF_0);
saved_attr2 = char_attr; // save current attr
@@ -3508,8 +3537,9 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
vcol_adjusted = vcol - MB_CHARLEN(p_sbr);
}
// tab amount depends on current column
- tab_len = (int)wp->w_buffer->b_p_ts
- - vcol_adjusted % (int)wp->w_buffer->b_p_ts - 1;
+ tab_len = tabstop_padding(vcol_adjusted,
+ wp->w_buffer->b_p_ts,
+ wp->w_buffer->b_p_vts_array) - 1;
if (!wp->w_p_lbr || !wp->w_p_list) {
n_extra = tab_len;
@@ -3542,6 +3572,10 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
xfree(p_extra_free);
p_extra_free = p;
for (i = 0; i < tab_len; i++) {
+ if (*p == NUL) {
+ tab_len = i;
+ break;
+ }
int lcs = wp->w_p_lcs_chars.tab2;
// if tab3 is given, need to change the char
@@ -3916,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;
}
@@ -3934,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;
@@ -3972,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;
}
@@ -4050,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++;
@@ -4271,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) {
@@ -4348,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);
}
}
}
@@ -4426,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,
@@ -4443,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;
@@ -4456,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;
@@ -4492,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;
}
}
@@ -5428,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
@@ -6182,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;
@@ -6221,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;
@@ -6241,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;
@@ -7483,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;
@@ -7585,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..abe05bbd12 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -1021,8 +1021,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,
@@ -1101,8 +1102,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 +1123,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 +1321,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)
@@ -1400,6 +1401,7 @@ int do_search(
}
dirc = *++pat;
+ search_delim = dirc;
if (dirc != '?' && dirc != '/') {
retval = 0;
EMSG(_("E386: Expected '?' or '/' after ';'"));
@@ -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;
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, &notanum);
+ 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, &notanum);
+ 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..f6dc3a04a7 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -3035,7 +3035,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..a6310344e9 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);
}
}
@@ -2811,7 +2811,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 +2821,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 +2830,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 +2853,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;
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/Makefile b/src/nvim/testdir/Makefile
index e52fd888bd..4641408069 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -31,20 +31,11 @@ endif
SCRIPTS ?= $(SCRIPTS_DEFAULT)
# Tests using runtest.vim.
-NEW_TESTS_ALOT := test_alot_utf8 test_alot
+NEW_TESTS_ALOT := test_alot_utf8 test_alot test_alot_latin
NEW_TESTS_IN_ALOT := $(shell sed -n '/^source/ s/^source //; s/\.vim$$//p' $(addsuffix .vim,$(NEW_TESTS_ALOT)))
-NEW_TESTS_IN_ALOT_LATIN := $(shell sed -n '/^source/ s/^source //; s/\.vim$$//p' test_alot_latin.vim)
# Ignored tests.
-# test_alot_latin: Nvim does not allow setting encoding.
-# test_autochdir: ported to Lua, but kept for easier merging.
-# test_eval_func: used as include in old-style test (test_eval.in).
-# test_listlbr: Nvim does not allow setting encoding.
# test_largefile: uses too much resources to run on CI.
NEW_TESTS_IGNORE := \
- test_alot_latin $(NEW_TESTS_IN_ALOT_LATIN) \
- test_autochdir \
- test_eval_func \
- test_listlbr \
test_largefile \
NEW_TESTS := $(sort $(basename $(notdir $(wildcard test_*.vim))))
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..e50602ccad 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -33,7 +33,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_latin.vim b/src/nvim/testdir/test_alot_latin.vim
index ebb3bde4ce..23a404cac1 100644
--- a/src/nvim/testdir/test_alot_latin.vim
+++ b/src/nvim/testdir/test_alot_latin.vim
@@ -4,7 +4,4 @@
" These tests use latin1 'encoding'. Setting 'encoding' is in the individual
" files, so that they can be run by themselves.
-" Nvim does not allow setting 'encoding', so skip this test group.
-finish
-
source test_regexp_latin.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_arglist.vim b/src/nvim/testdir/test_arglist.vim
index a1ef8325ec..08e578a226 100644
--- a/src/nvim/testdir/test_arglist.vim
+++ b/src/nvim/testdir/test_arglist.vim
@@ -26,6 +26,8 @@ func Test_argidx()
endfunc
func Test_argadd()
+ call Reset_arglist()
+
%argdelete
argadd a b c
call assert_equal(0, argidx())
@@ -103,6 +105,11 @@ func Init_abc()
next
endfunc
+func Reset_arglist()
+ cd
+ args a | %argd
+endfunc
+
func Assert_argc(l)
call assert_equal(len(a:l), argc())
let i = 0
@@ -115,8 +122,7 @@ endfunc
" Test for [count]argument and [count]argdelete commands
" Ported from the test_argument_count.in test script
func Test_argument()
- " Clean the argument list
- arga a | %argd
+ call Reset_arglist()
let save_hidden = &hidden
set hidden
@@ -244,8 +250,7 @@ endfunc
" Test for 0argadd and 0argedit
" Ported from the test_argument_0count.in test script
func Test_zero_argadd()
- " Clean the argument list
- arga a | %argd
+ call Reset_arglist()
arga a b c d
2argu
@@ -272,10 +277,6 @@ func Test_zero_argadd()
call assert_equal('file with spaces', expand('%'))
endfunc
-func Reset_arglist()
- args a | %argd
-endfunc
-
" Test for argc()
func Test_argc()
call Reset_arglist()
@@ -408,6 +409,7 @@ endfunc
" Test for the :argdelete command
func Test_argdelete()
call Reset_arglist()
+
args aa a aaa b bb
argdelete a*
call assert_equal(['b', 'bb'], argv())
diff --git a/src/nvim/testdir/test_assert.vim b/src/nvim/testdir/test_assert.vim
index b4f7478807..1d114221dc 100644
--- a/src/nvim/testdir/test_assert.vim
+++ b/src/nvim/testdir/test_assert.vim
@@ -52,6 +52,37 @@ func Test_assert_fails_in_try_block()
endtry
endfunc
+func Test_assert_inrange()
+ call assert_equal(0, assert_inrange(7, 7, 7))
+ call assert_equal(0, assert_inrange(5, 7, 5))
+ call assert_equal(0, assert_inrange(5, 7, 6))
+ call assert_equal(0, assert_inrange(5, 7, 7))
+ call assert_equal(1, assert_inrange(5, 7, 4))
+ call assert_match("Expected range 5 - 7, but got 4", v:errors[0])
+ call remove(v:errors, 0)
+ call assert_equal(1, assert_inrange(5, 7, 8))
+ call assert_match("Expected range 5 - 7, but got 8", v:errors[0])
+ call remove(v:errors, 0)
+
+ call assert_fails('call assert_inrange(1, 1)', 'E119:')
+
+ if has('float')
+ call assert_equal(0, assert_inrange(7.0, 7, 7))
+ call assert_equal(0, assert_inrange(7, 7.0, 7))
+ call assert_equal(0, assert_inrange(7, 7, 7.0))
+ call assert_equal(0, assert_inrange(5, 7, 5.0))
+ call assert_equal(0, assert_inrange(5, 7, 6.0))
+ call assert_equal(0, assert_inrange(5, 7, 7.0))
+
+ call assert_equal(1, assert_inrange(5, 7, 4.0))
+ call assert_match("Expected range 5.0 - 7.0, but got 4.0", v:errors[0])
+ call remove(v:errors, 0)
+ call assert_equal(1, assert_inrange(5, 7, 8.0))
+ call assert_match("Expected range 5.0 - 7.0, but got 8.0", v:errors[0])
+ call remove(v:errors, 0)
+ endif
+endfunc
+
" Must be last.
func Test_zz_quit_detected()
" Verify that if a test function ends Vim the test script detects this.
diff --git a/src/nvim/testdir/test_autochdir.vim b/src/nvim/testdir/test_autochdir.vim
index 67c537b407..d071f4b325 100644
--- a/src/nvim/testdir/test_autochdir.vim
+++ b/src/nvim/testdir/test_autochdir.vim
@@ -1,10 +1,10 @@
" Test 'autochdir' behavior
-if !exists("+autochdir")
- throw 'Skipped: autochdir feature missing'
-endif
+source check.vim
+CheckOption autochdir
func Test_set_filename()
+ CheckFunction test_autochdir
let cwd = getcwd()
call test_autochdir()
set acd
@@ -17,3 +17,5 @@ func Test_set_filename()
exe 'cd ' . cwd
call delete('samples/Xtest')
endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim
index 3401e791c9..5611560b1b 100644
--- a/src/nvim/testdir/test_autocmd.vim
+++ b/src/nvim/testdir/test_autocmd.vim
@@ -76,7 +76,7 @@ if has('timers')
endfunc
func Test_OptionSet_modeline()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
call test_override('starting', 1)
au! OptionSet
augroup set_tabstop
@@ -276,28 +276,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 +325,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
@@ -507,7 +507,7 @@ func s:AutoCommandOptionSet(match)
endfunc
func Test_OptionSet()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
if !has("eval") || !exists("+autochdir")
return
endif
@@ -648,7 +648,7 @@ func Test_OptionSet()
endfunc
func Test_OptionSet_diffmode()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
call test_override('starting', 1)
" 18: Changing an option when entering diff mode
new
@@ -682,7 +682,7 @@ func Test_OptionSet_diffmode()
endfunc
func Test_OptionSet_diffmode_close()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
call test_override('starting', 1)
" 19: Try to close the current window when entering diff mode
" should not segfault
@@ -1285,9 +1285,9 @@ func Test_autocommand_all_events()
endfunc
" Test TextChangedI and TextChangedP
+" See test/functional/viml/completion_spec.lua'
func Test_ChangedP()
- " Nvim does not support test_override().
- throw 'skipped: see test/functional/viml/completion_spec.lua'
+ CheckFunction test_override
new
call setline(1, ['foo', 'bar', 'foobar'])
call test_override("char_avail", 1)
@@ -1350,7 +1350,7 @@ func SetLineOne()
endfunc
func Test_TextChangedI_with_setline()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
new
call test_override('char_avail', 1)
autocmd TextChangedI <buffer> call SetLineOne()
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_breakindent.vim b/src/nvim/testdir/test_breakindent.vim
index d53acb77d7..ff5029b889 100644
--- a/src/nvim/testdir/test_breakindent.vim
+++ b/src/nvim/testdir/test_breakindent.vim
@@ -12,56 +12,88 @@ source view_util.vim
let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
-function s:screen_lines(lnum, width) abort
+func s:screen_lines(lnum, width) abort
return ScreenLines([a:lnum, a:lnum + 2], a:width)
-endfunction
+endfunc
-function! s:compare_lines(expect, actual)
+func! s:compare_lines(expect, actual)
call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
-endfunction
+endfunc
-function s:test_windows(...)
+func s:test_windows(...)
call NewWindow(10, 20)
setl ts=4 sw=4 sts=4 breakindent
put =s:input
exe get(a:000, 0, '')
-endfunction
+endfunc
-function s:close_windows(...)
+func s:close_windows(...)
call CloseWindow()
exe get(a:000, 0, '')
-endfunction
+endfunc
-function Test_breakindent01()
+func Test_breakindent01()
" simple breakindent test
call s:test_windows('setl briopt=min:0')
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ " abcd",
-\ " qrst",
-\ " GHIJ",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrst",
+ \ " GHIJ",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
-function Test_breakindent02()
+func Test_breakindent01_vartabs()
+ " like 01 but with vartabs feature
+ if !has("vartabs")
+ return
+ endif
+ call s:test_windows('setl briopt=min:0 vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrst",
+ \ " GHIJ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
+
+func Test_breakindent02()
" simple breakindent test with showbreak set
call s:test_windows('setl briopt=min:0 sbr=>>')
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ " abcd",
-\ " >>qr",
-\ " >>EF",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " >>qr",
+ \ " >>EF",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set sbr=')
-endfunction
+endfunc
+
+func Test_breakindent02_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " simple breakindent test with showbreak set
+ call s:test_windows('setl briopt=min:0 sbr=>> vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " >>qr",
+ \ " >>EF",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= vts&')
+endfunc
-function Test_breakindent03()
+func Test_breakindent03()
" simple breakindent test with showbreak set and briopt including sbr
call s:test_windows('setl briopt=sbr,min:0 sbr=++')
- let lines=s:screen_lines(line('.'),8)
+ let lines = s:screen_lines(line('.'),8)
let expect=[
\ " abcd",
\ "++ qrst",
@@ -70,77 +102,177 @@ function Test_breakindent03()
call s:compare_lines(expect, lines)
" clean up
call s:close_windows('set sbr=')
-endfunction
+endfunc
-function Test_breakindent04()
+func Test_breakindent03_vartabs()
+ " simple breakindent test with showbreak set and briopt including sbr
+ if !has("vartabs")
+ return
+ endif
+ call s:test_windows('setl briopt=sbr,min:0 sbr=++ vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ "++ qrst",
+ \ "++ GHIJ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= vts&')
+endfunc
+
+func Test_breakindent04()
" breakindent set with min width 18
call s:test_windows('setl sbr= briopt=min:18')
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ " abcd",
-\ " qrstuv",
-\ " IJKLMN",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrstuv",
+ \ " IJKLMN",
+ \ ]
call s:compare_lines(expect, lines)
" clean up
call s:close_windows('set sbr=')
-endfunction
+endfunc
+
+func Test_breakindent04_vartabs()
+ " breakindent set with min width 18
+ if !has("vartabs")
+ return
+ endif
+ call s:test_windows('setl sbr= briopt=min:18 vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrstuv",
+ \ " IJKLMN",
+ \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= vts&')
+endfunc
-function Test_breakindent05()
+func Test_breakindent05()
" breakindent set and shift by 2
call s:test_windows('setl briopt=shift:2,min:0')
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ " abcd",
-\ " qr",
-\ " EF",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qr",
+ \ " EF",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
-function Test_breakindent06()
+func Test_breakindent05_vartabs()
+ " breakindent set and shift by 2
+ if !has("vartabs")
+ return
+ endif
+ call s:test_windows('setl briopt=shift:2,min:0 vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qr",
+ \ " EF",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
+
+func Test_breakindent06()
" breakindent set and shift by -1
call s:test_windows('setl briopt=shift:-1,min:0')
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ " abcd",
-\ " qrstu",
-\ " HIJKL",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrstu",
+ \ " HIJKL",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
+
+func Test_breakindent06_vartabs()
+ " breakindent set and shift by -1
+ if !has("vartabs")
+ return
+ endif
+ call s:test_windows('setl briopt=shift:-1,min:0 vts=4')
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ " abcd",
+ \ " qrstu",
+ \ " HIJKL",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
-function Test_breakindent07()
+func Test_breakindent07()
" breakindent set and shift by 1, Number set sbr=? and briopt:sbr
call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n')
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ab",
-\ "? m",
-\ "? x",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ "? m",
+ \ "? x",
+ \ ]
call s:compare_lines(expect, lines)
" clean up
call s:close_windows('set sbr= cpo-=n')
-endfunction
+endfunc
+
+func Test_breakindent07_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 cpo+=n vts=4')
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ "? m",
+ \ "? x",
+ \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= cpo-=n vts&')
+endfunc
-function Test_breakindent07a()
+func Test_breakindent07a()
" breakindent set and shift by 1, Number set sbr=? and briopt:sbr
call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4')
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ab",
-\ " ? m",
-\ " ? x",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ " ? m",
+ \ " ? x",
+ \ ]
call s:compare_lines(expect, lines)
" clean up
call s:close_windows('set sbr=')
-endfunction
+endfunc
+
+func Test_breakindent07a_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set and shift by 1, Number set sbr=? and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 vts=4')
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ " ? m",
+ \ " ? x",
+ \ ]
+ call s:compare_lines(expect, lines)
+ " clean up
+ call s:close_windows('set sbr= vts&')
+endfunc
-function Test_breakindent08()
+func Test_breakindent08()
" breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4')
" make sure, cache is invalidated!
@@ -148,43 +280,96 @@ function Test_breakindent08()
redraw!
set ts=4
redraw!
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ^Iabcd",
-\ "# opq",
-\ "# BCD",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ "# opq",
+ \ "# BCD",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set sbr= cpo-=n')
-endfunction
+endfunc
+
+func Test_breakindent08_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list cpo+=n ts=4 vts=4')
+ " make sure, cache is invalidated!
+ set ts=8
+ redraw!
+ set ts=4
+ redraw!
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ "# opq",
+ \ "# BCD",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n vts&')
+endfunc
-function Test_breakindent08a()
+func Test_breakindent08a()
" breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list')
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ^Iabcd",
-\ " # opq",
-\ " # BCD",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ " # opq",
+ \ " # BCD",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set sbr=')
-endfunction
+endfunc
-function Test_breakindent09()
+func Test_breakindent08a_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set and shift by 1, Number and list set sbr=# and briopt:sbr
+ call s:test_windows('setl briopt=shift:1,sbr,min:0 nu nuw=4 sbr=# list vts=4')
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ " # opq",
+ \ " # BCD",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= vts&')
+endfunc
+
+func Test_breakindent09()
" breakindent set and shift by 1, Number and list set sbr=#
call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list')
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ^Iabcd",
-\ " #op",
-\ " #AB",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ " #op",
+ \ " #AB",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set sbr=')
-endfunction
+endfunc
+
+func Test_breakindent09_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set and shift by 1, Number and list set sbr=#
+ call s:test_windows('setl briopt=shift:1,min:0 nu nuw=4 sbr=# list vts=4')
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ^Iabcd",
+ \ " #op",
+ \ " #AB",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= vts&')
+endfunc
-function Test_breakindent10()
+func Test_breakindent10()
" breakindent set, Number set sbr=~
call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0')
" make sure, cache is invalidated!
@@ -192,41 +377,91 @@ function Test_breakindent10()
redraw!
set ts=4
redraw!
- let lines=s:screen_lines(line('.'),10)
- let expect=[
-\ " 2 ab",
-\ "~ mn",
-\ "~ yz",
-\ ]
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ "~ mn",
+ \ "~ yz",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set sbr= cpo-=n')
-endfunction
+endfunc
+
+func Test_breakindent10_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " breakindent set, Number set sbr=~
+ call s:test_windows('setl cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0 vts=4')
+ " make sure, cache is invalidated!
+ set ts=8
+ redraw!
+ set ts=4
+ redraw!
+ let lines = s:screen_lines(line('.'),10)
+ let expect = [
+ \ " 2 ab",
+ \ "~ mn",
+ \ "~ yz",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set sbr= cpo-=n vts&')
+endfunc
-function Test_breakindent11()
+func Test_breakindent11()
" test strdisplaywidth()
call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4')
let text=getline(2)
let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
call assert_equal(width, strdisplaywidth(text))
call s:close_windows('set sbr=')
-endfunction
+endfunc
+
+func Test_breakindent11_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " test strdisplaywidth()
+ call s:test_windows('setl cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4 vts=4')
+ let text = getline(2)
+ let width = strlen(text[1:])+indent(2)+strlen(&sbr)*3 " text wraps 3 times
+ call assert_equal(width, strdisplaywidth(text))
+ call s:close_windows('set sbr= vts&')
+endfunc
-function Test_breakindent12()
+func Test_breakindent12()
" test breakindent with long indent
let s:input="\t\t\t\t\t{"
call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>-')
- let lines=s:screen_lines(2,16)
- let expect=[
-\ " 2 >--->--->--->",
-\ " ---{ ",
-\ "~ ",
-\ ]
+ let lines = s:screen_lines(2,16)
+ let expect = [
+ \ " 2 >--->--->--->",
+ \ " ---{ ",
+ \ "~ ",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows('set nuw=4 listchars=')
-endfunction
+endfunc
+
+func Test_breakindent12_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " test breakindent with long indent
+ let s:input = "\t\t\t\t\t{"
+ call s:test_windows('setl breakindent linebreak briopt=min:10 nu numberwidth=3 ts=4 list listchars=tab:>- vts=4')
+ let lines = s:screen_lines(2,16)
+ let expect = [
+ \ " 2 >--->--->--->",
+ \ " ---{ ",
+ \ "~ ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set nuw=4 listchars= vts&')
+endfunc
-function Test_breakindent13()
- let s:input=""
+func Test_breakindent13()
+ let s:input = ""
call s:test_windows('setl breakindent briopt=min:10 ts=8')
vert resize 20
call setline(1, [" a\tb\tc\td\te", " z y x w v"])
@@ -237,65 +472,149 @@ function Test_breakindent13()
call assert_equal('d', @a)
call assert_equal('w', @b)
call s:close_windows()
-endfunction
+endfunc
+
+func Test_breakindent13_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ let s:input = ""
+ call s:test_windows('setl breakindent briopt=min:10 ts=8 vts=8')
+ vert resize 20
+ call setline(1, [" a\tb\tc\td\te", " z y x w v"])
+ 1
+ norm! fbgj"ayl
+ 2
+ norm! fygj"byl
+ call assert_equal('d', @a)
+ call assert_equal('w', @b)
+ call s:close_windows('set vts&')
+endfunc
-function Test_breakindent14()
- let s:input=""
+func Test_breakindent14()
+ let s:input = ""
call s:test_windows('setl breakindent briopt= ts=8')
vert resize 30
norm! 3a1234567890
norm! a abcde
exec "norm! 0\<C-V>tex"
- let lines=s:screen_lines(line('.'),8)
- let expect=[
-\ "e ",
-\ "~ ",
-\ "~ ",
-\ ]
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ "e ",
+ \ "~ ",
+ \ "~ ",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
+
+func Test_breakindent14_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ let s:input = ""
+ call s:test_windows('setl breakindent briopt= ts=8 vts=8')
+ vert resize 30
+ norm! 3a1234567890
+ norm! a abcde
+ exec "norm! 0\<C-V>tex"
+ let lines = s:screen_lines(line('.'),8)
+ let expect = [
+ \ "e ",
+ \ "~ ",
+ \ "~ ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
-function Test_breakindent15()
- let s:input=""
+func Test_breakindent15()
+ let s:input = ""
call s:test_windows('setl breakindent briopt= ts=8 sw=8')
vert resize 30
norm! 4a1234567890
exe "normal! >>\<C-V>3f0x"
- let lines=s:screen_lines(line('.'),20)
- let expect=[
-\ " 1234567890 ",
-\ "~ ",
-\ "~ ",
-\ ]
+ let lines = s:screen_lines(line('.'),20)
+ let expect = [
+ \ " 1234567890 ",
+ \ "~ ",
+ \ "~ ",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
+
+func Test_breakindent15_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ let s:input = ""
+ call s:test_windows('setl breakindent briopt= ts=8 sw=8 vts=8')
+ vert resize 30
+ norm! 4a1234567890
+ exe "normal! >>\<C-V>3f0x"
+ let lines = s:screen_lines(line('.'),20)
+ let expect = [
+ \ " 1234567890 ",
+ \ "~ ",
+ \ "~ ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
-function Test_breakindent16()
+func Test_breakindent16()
" Check that overlong lines are indented correctly.
- let s:input=""
+ let s:input = ""
call s:test_windows('setl breakindent briopt=min:0 ts=4')
call setline(1, "\t".repeat("1234567890", 10))
resize 6
norm! 1gg$
redraw!
- let lines=s:screen_lines(1,10)
- let expect=[
-\ " 789012",
-\ " 345678",
-\ " 901234",
-\ ]
+ let lines = s:screen_lines(1,10)
+ let expect = [
+ \ " 789012",
+ \ " 345678",
+ \ " 901234",
+ \ ]
call s:compare_lines(expect, lines)
- let lines=s:screen_lines(4,10)
- let expect=[
-\ " 567890",
-\ " 123456",
-\ " 7890 ",
-\ ]
+ let lines = s:screen_lines(4,10)
+ let expect = [
+ \ " 567890",
+ \ " 123456",
+ \ " 7890 ",
+ \ ]
call s:compare_lines(expect, lines)
call s:close_windows()
-endfunction
+endfunc
+
+func Test_breakindent16_vartabs()
+ if !has("vartabs")
+ return
+ endif
+ " Check that overlong lines are indented correctly.
+ let s:input = ""
+ call s:test_windows('setl breakindent briopt=min:0 ts=4 vts=4')
+ call setline(1, "\t".repeat("1234567890", 10))
+ resize 6
+ norm! 1gg$
+ redraw!
+ let lines = s:screen_lines(1,10)
+ let expect = [
+ \ " 789012",
+ \ " 345678",
+ \ " 901234",
+ \ ]
+ call s:compare_lines(expect, lines)
+ let lines = s:screen_lines(4,10)
+ let expect = [
+ \ " 567890",
+ \ " 123456",
+ \ " 7890 ",
+ \ ]
+ call s:compare_lines(expect, lines)
+ call s:close_windows('set vts&')
+endfunc
func Test_breakindent17_vartabs()
if !has("vartabs")
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
index 489b2477e6..a1968807ac 100644
--- a/src/nvim/testdir/test_cmdline.vim
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -615,10 +615,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 +643,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
diff --git a/src/nvim/testdir/test_command_count.vim b/src/nvim/testdir/test_command_count.vim
index 55b230373f..36ff4cd1bb 100644
--- a/src/nvim/testdir/test_command_count.vim
+++ b/src/nvim/testdir/test_command_count.vim
@@ -103,6 +103,8 @@ endfunc
func Test_command_count_2()
silent! %argd
+ cd
+
arga a b c d
call assert_fails('5argu', 'E16:')
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_eval_stuff.vim b/src/nvim/testdir/test_eval_stuff.vim
index ff50d53d86..4870b9a60a 100644
--- a/src/nvim/testdir/test_eval_stuff.vim
+++ b/src/nvim/testdir/test_eval_stuff.vim
@@ -24,7 +24,7 @@ endfunc
func Test_for_invalid()
call assert_fails("for x in 99", 'E714:')
- call assert_fails("for x in 'asdf'", 'E714:')
+ call assert_fails("for x in function('winnr')", 'E714:')
call assert_fails("for x in {'a': 9}", 'E714:')
if 0
@@ -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_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 5dae8d681a..c280aedffb 100644
--- a/src/nvim/testdir/test_functions.vim
+++ b/src/nvim/testdir/test_functions.vim
@@ -1,5 +1,7 @@
" Tests for various functions.
+
source shared.vim
+source check.vim
" Must be done first, since the alternate buffer must be unset.
func Test_00_bufexists()
@@ -171,9 +173,8 @@ func Test_str2nr()
endfunc
func Test_strftime()
- if !exists('*strftime')
- return
- endif
+ CheckFunction strftime
+
" Format of strftime() depends on system. We assume
" that basic formats tested here are available and
" identical on all systems which support strftime().
@@ -214,6 +215,33 @@ func Test_strftime()
endif
endfunc
+func Test_strptime()
+ CheckFunction strptime
+ CheckNotMSWindows
+
+ if exists('$TZ')
+ let tz = $TZ
+ endif
+ let $TZ = 'UTC'
+
+ call assert_equal(1484653763, strptime('%Y-%m-%d %T', '2017-01-17 11:49:23'))
+
+ " Force DST and check that it's considered
+ let $TZ = 'WINTER0SUMMER,J1,J365'
+ call assert_equal(1484653763 - 3600, strptime('%Y-%m-%d %T', '2017-01-17 11:49:23'))
+
+ call assert_fails('call strptime()', 'E119:')
+ call assert_fails('call strptime("xxx")', 'E119:')
+ call assert_equal(0, strptime("%Y", ''))
+ call assert_equal(0, strptime("%Y", "xxx"))
+
+ if exists('tz')
+ let $TZ = tz
+ else
+ unlet $TZ
+ endif
+endfunc
+
func Test_resolve_unix()
if !has('unix')
return
@@ -1043,10 +1071,10 @@ func Test_inputlist()
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()
@@ -1374,6 +1402,10 @@ func Test_bufadd_bufload()
endfunc
func Test_readdir()
+ if isdirectory('Xdir')
+ call delete('Xdir', 'rf')
+ endif
+
call mkdir('Xdir')
call writefile([], 'Xdir/foo.txt')
call writefile([], 'Xdir/bar.txt')
@@ -1420,4 +1452,27 @@ 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
+
+func Test_delete_rf()
+ call mkdir('Xdir')
+ call writefile([], 'Xdir/foo.txt')
+ call writefile([], 'Xdir/bar.txt')
+ call mkdir('Xdir/[a-1]') " issue #696
+ call writefile([], 'Xdir/[a-1]/foo.txt')
+ call writefile([], 'Xdir/[a-1]/bar.txt')
+ call assert_true(filereadable('Xdir/foo.txt'))
+ call assert_true(filereadable('Xdir/[a-1]/foo.txt'))
+
+ call assert_equal(0, delete('Xdir', 'rf'))
+ call assert_false(filereadable('Xdir/foo.txt'))
+ call assert_false(filereadable('Xdir/[a-1]/foo.txt'))
+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_gn.vim b/src/nvim/testdir/test_gn.vim
index 9acec51913..d09b25b0e7 100644
--- a/src/nvim/testdir/test_gn.vim
+++ b/src/nvim/testdir/test_gn.vim
@@ -1,9 +1,8 @@
" Test for gn command
func Test_gn_command()
- set belloff=all
noautocmd new
- " replace a single char by itsself quoted:
+ " replace a single char by itself quoted:
call setline('.', 'abc x def x ghi x jkl')
let @/ = 'x'
exe "norm! cgn'x'\<esc>.."
@@ -157,7 +156,6 @@ func Test_gn_command()
sil! %d _
set wrapscan&vim
- set belloff&vim
endfunc
func Test_gN_repeat()
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_listchars.vim b/src/nvim/testdir/test_listchars.vim
index dcc588120c..4cb609aaf0 100644
--- a/src/nvim/testdir/test_listchars.vim
+++ b/src/nvim/testdir/test_listchars.vim
@@ -110,6 +110,35 @@ func Test_listchars()
\ '.....h>-$',
\ 'iii<<<<><<$', '$'], l)
+ " Test lead and trail
+ normal ggdG
+ set listchars=eol:$
+ set listchars+=lead:>,trail:<,space:x
+ set list
+
+ call append(0, [
+ \ ' ffff ',
+ \ ' gg',
+ \ 'h ',
+ \ ' ',
+ \ ' 0 0 ',
+ \ ])
+
+ let expected = [
+ \ '>>>>ffff<<<<$',
+ \ '>>>>>>>>>>gg$',
+ \ 'h<<<<<<<<<<<$',
+ \ '<<<<<<<<<<<<$',
+ \ '>>>>0xx0<<<<$',
+ \ '$'
+ \ ]
+ redraw!
+ for i in range(1, 5)
+ call cursor(i, 1)
+ call assert_equal([expected[i - 1]], ScreenLines(i, virtcol('$')))
+ endfor
+
+ call assert_equal(expected, split(execute("%list"), "\n"))
" test nbsp
normal ggdG
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_listlbr.vim b/src/nvim/testdir/test_listlbr.vim
index d619ac0eb5..e0518de3c2 100644
--- a/src/nvim/testdir/test_listlbr.vim
+++ b/src/nvim/testdir/test_listlbr.vim
@@ -1,9 +1,5 @@
" Test for linebreak and list option (non-utf8)
-" Nvim does not allow setting 'encoding', so skip this test.
-finish
-
-set encoding=latin1
scriptencoding latin1
if !exists("+linebreak") || !has("conceal")
@@ -46,6 +42,7 @@ func Test_set_linebreak()
endfunc
func Test_linebreak_with_list()
+ throw 'skipped: Nvim does not support enc=latin1'
call s:test_windows('setl ts=4 sbr=+ list listchars=')
call setline(1, "\tabcdef hijklmn\tpqrstuvwxyz_1060ABCDEFGHIJKLMNOP ")
let lines = s:screen_lines([1, 4], winwidth(0))
@@ -217,6 +214,7 @@ func Test_norm_after_block_visual()
endfunc
func Test_block_replace_after_wrapping()
+ throw 'skipped: Nvim does not support enc=latin1'
call s:test_windows()
call setline(1, repeat("a", 150))
exe "norm! 0yypk147|\<C-V>jr0"
diff --git a/src/nvim/testdir/test_mapping.vim b/src/nvim/testdir/test_mapping.vim
index c4807797ff..f88e8cf843 100644
--- a/src/nvim/testdir/test_mapping.vim
+++ b/src/nvim/testdir/test_mapping.vim
@@ -427,6 +427,30 @@ func Test_error_in_map_expr()
exe buf .. 'bwipe!'
endfunc
+func Test_expr_map_gets_cursor()
+ new
+ call setline(1, ['one', 'some w!rd'])
+ func StoreColumn()
+ let g:exprLine = line('.')
+ let g:exprCol = col('.')
+ return 'x'
+ endfunc
+ nnoremap <expr> x StoreColumn()
+ 2
+ nmap ! f!<Ignore>x
+ call feedkeys("!", 'xt')
+ call assert_equal('some wrd', getline(2))
+ call assert_equal(2, g:exprLine)
+ call assert_equal(7, g:exprCol)
+
+ bwipe!
+ unlet g:exprLine
+ unlet g:exprCol
+ delfunc StoreColumn
+ nunmap x
+ nunmap !
+endfunc
+
" Test for mapping errors
func Test_map_error()
call assert_fails('unmap', 'E474:')
@@ -535,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_messages.vim b/src/nvim/testdir/test_messages.vim
index 3ebd048f46..08586dffe1 100644
--- a/src/nvim/testdir/test_messages.vim
+++ b/src/nvim/testdir/test_messages.vim
@@ -1,5 +1,6 @@
" Tests for :messages, :echomsg, :echoerr
+source check.vim
source shared.vim
func Test_messages()
@@ -77,7 +78,7 @@ func Test_echomsg()
endfunc
func Test_echoerr()
- throw 'skipped: Nvim does not support test_ignore_error()'
+ CheckFunction test_ignore_error
call test_ignore_error('IgNoRe')
call assert_equal("\nIgNoRe hello", execute(':echoerr "IgNoRe hello"'))
call assert_equal("\n12345 IgNoRe", execute(':echoerr 12345 "IgNoRe"'))
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 07e2481f95..8796af7a20 100644
--- a/src/nvim/testdir/test_options.vim
+++ b/src/nvim/testdir/test_options.vim
@@ -448,6 +448,36 @@ func Test_backupskip()
endif
endfor
+ " Duplicates from environment variables should be filtered out (option has
+ " P_NODUP). Run this in a separate instance and write v:errors in a file,
+ " so that we see what happens on startup.
+ let after =<< trim [CODE]
+ let bsklist = split(&backupskip, ',')
+ call assert_equal(uniq(copy(bsklist)), bsklist)
+ call writefile(['errors:'] + v:errors, 'Xtestout')
+ qall
+ [CODE]
+ call writefile(after, 'Xafter')
+ " let cmd = GetVimProg() . ' --not-a-term -S Xafter --cmd "set enc=utf8"'
+ let cmd = GetVimProg() . ' -S Xafter --cmd "set enc=utf8"'
+
+ let saveenv = {}
+ for var in ['TMPDIR', 'TMP', 'TEMP']
+ let saveenv[var] = getenv(var)
+ call setenv(var, '/duplicate/path')
+ endfor
+
+ exe 'silent !' . cmd
+ call assert_equal(['errors:'], readfile('Xtestout'))
+
+ " restore environment variables
+ for var in ['TMPDIR', 'TMP', 'TEMP']
+ call setenv(var, saveenv[var])
+ endfor
+
+ call delete('Xtestout')
+ call delete('Xafter')
+
" Duplicates should be filtered out (option has P_NODUP)
let backupskip = &backupskip
set backupskip=
@@ -599,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_popup.vim b/src/nvim/testdir/test_popup.vim
index 4ee16558a0..9443958984 100644
--- a/src/nvim/testdir/test_popup.vim
+++ b/src/nvim/testdir/test_popup.vim
@@ -871,7 +871,7 @@ func Test_popup_complete_backwards_ctrl_p()
endfunc
fun! Test_complete_o_tab()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
let s:o_char_pressed = 0
fun! s:act_on_text_changed()
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 704fdacdcd..16b6a5f464 100644
--- a/src/nvim/testdir/test_quickfix.vim
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -1011,10 +1011,9 @@ endfunc
" Tests for %D and %X errorformat options
func Test_efm_dirstack()
" Create the directory stack and files
- call mkdir('dir1')
- call mkdir('dir1/a')
- call mkdir('dir1/a/b')
- call mkdir('dir1/c')
+ call mkdir('dir1/a', 'p')
+ call mkdir('dir1/a/b', 'p')
+ call mkdir('dir1/c', 'p')
call mkdir('dir2')
let lines =<< trim [DATA]
@@ -2660,7 +2659,7 @@ endfunc
" Test for incsearch highlighting of the :vimgrep pattern
" This test used to cause "E315: ml_get: invalid lnum" errors.
func Test_vimgrep_incsearch()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
enew
set incsearch
call test_override("char_avail", 1)
@@ -3485,6 +3484,9 @@ func Xqftick_tests(cchar)
\ {'filename' : 'F7', 'lnum' : 11, 'text' : 'L11'}], 'r')
call assert_equal(2, g:Xgetlist({'changedtick' : 0}).changedtick)
+ if isdirectory("Xone")
+ call delete("Xone", 'rf')
+ endif
call writefile(["F8:80:L80", "F8:81:L81"], "Xone")
Xfile Xone
call assert_equal(1, g:Xgetlist({'changedtick' : 0}).changedtick)
diff --git a/src/nvim/testdir/test_quotestar.vim b/src/nvim/testdir/test_quotestar.vim
index 77a5153a81..6e6f91362b 100644
--- a/src/nvim/testdir/test_quotestar.vim
+++ b/src/nvim/testdir/test_quotestar.vim
@@ -97,7 +97,7 @@ func Do_test_quotestar_for_x11()
if has('unix') && has('gui') && !has('gui_running')
let @* = ''
- " Running in a terminal and the GUI is avaiable: Tell the server to open
+ " Running in a terminal and the GUI is available: Tell the server to open
" the GUI and check that the remote command still works.
" Need to wait for the GUI to start up, otherwise the send hangs in trying
" to send to the terminal window.
diff --git a/src/nvim/testdir/test_regexp_latin.vim b/src/nvim/testdir/test_regexp_latin.vim
index 1bb2ee53de..cacdd68d10 100644
--- a/src/nvim/testdir/test_regexp_latin.vim
+++ b/src/nvim/testdir/test_regexp_latin.vim
@@ -1,5 +1,5 @@
" Tests for regexp in latin1 encoding
-set encoding=latin1
+" set encoding=latin1
scriptencoding latin1
func s:equivalence_test()
@@ -22,11 +22,13 @@ func s:equivalence_test()
endfunc
func Test_equivalence_re1()
+ throw 'skipped: Nvim does not support enc=latin1'
set re=1
call s:equivalence_test()
endfunc
func Test_equivalence_re2()
+ throw 'skipped: Nvim does not support enc=latin1'
set re=2
call s:equivalence_test()
endfunc
@@ -39,6 +41,17 @@ func Test_range_with_newline()
bwipe!
endfunc
+func Test_pattern_compile_speed()
+ if !exists('+spellcapcheck') || !has('reltime')
+ return
+ endif
+ let start = reltime()
+ " this used to be very slow, not it should be about a second
+ set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
+ call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
+ set spc=
+endfunc
+
func Test_get_equi_class()
new
" Incomplete equivalence class caused invalid memory access
@@ -87,6 +100,7 @@ func Test_multi_failure()
endfunc
func Test_recursive_addstate()
+ throw 'skipped: TODO: '
" This will call addstate() recursively until it runs into the limit.
let lnum = search('\v((){328}){389}')
call assert_equal(0, lnum)
diff --git a/src/nvim/testdir/test_registers.vim b/src/nvim/testdir/test_registers.vim
index 8d2a768ba0..bcadb84ced 100644
--- a/src/nvim/testdir/test_registers.vim
+++ b/src/nvim/testdir/test_registers.vim
@@ -43,6 +43,9 @@ func Test_yank_shows_register()
endfunc
func Test_display_registers()
+ " Disable clipboard
+ let g:clipboard = {}
+
e file1
e file2
call setline(1, ['foo', 'bar'])
@@ -109,6 +112,8 @@ func Test_recording_esc_sequence()
bwipe!
if exists('save_F2')
let &t_F2 = save_F2
+ else
+ set t_F2=
endif
endfunc
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 0703a6b141..75d42b986b 100644
--- a/src/nvim/testdir/test_search.vim
+++ b/src/nvim/testdir/test_search.vim
@@ -2,13 +2,13 @@
source shared.vim
source screendump.vim
+source check.vim
+" See test/functional/legacy/search_spec.lua
func Test_search_cmdline()
- " See test/functional/legacy/search_spec.lua
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
@@ -202,12 +202,11 @@ func Test_search_cmdline()
bw!
endfunc
+" See test/functional/legacy/search_spec.lua
func Test_search_cmdline2()
- " See test/functional/legacy/search_spec.lua
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
@@ -351,7 +350,7 @@ func Test_searchc()
endfunc
func Cmdline3_prep()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
@@ -361,17 +360,15 @@ func Cmdline3_prep()
endfunc
func Incsearch_cleanup()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
set noincsearch
call test_override("char_avail", 0)
bw!
endfunc
func Test_search_cmdline3()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckOption incsearch
+
call Cmdline3_prep()
1
" first match
@@ -382,10 +379,8 @@ func Test_search_cmdline3()
endfunc
func Test_search_cmdline3s()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckOption incsearch
+
call Cmdline3_prep()
1
call feedkeys(":%s/the\<c-l>/xxx\<cr>", 'tx')
@@ -409,10 +404,8 @@ func Test_search_cmdline3s()
endfunc
func Test_search_cmdline3g()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckOption incsearch
+
call Cmdline3_prep()
1
call feedkeys(":g/the\<c-l>/d\<cr>", 'tx')
@@ -433,10 +426,8 @@ func Test_search_cmdline3g()
endfunc
func Test_search_cmdline3v()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckOption incsearch
+
call Cmdline3_prep()
1
call feedkeys(":v/the\<c-l>/d\<cr>", 'tx')
@@ -450,12 +441,11 @@ func Test_search_cmdline3v()
call Incsearch_cleanup()
endfunc
+" See test/functional/legacy/search_spec.lua
func Test_search_cmdline4()
- " See test/functional/legacy/search_spec.lua
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
" need to disable char_avail,
" so that expansion of commandline works
call test_override("char_avail", 1)
@@ -487,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
@@ -506,8 +495,48 @@ 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()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
" Test that pressing <c-g> in an empty command line
" does not move the cursor
if !exists('+incsearch')
@@ -601,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)',
@@ -726,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"])',
@@ -757,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"])',
@@ -798,10 +1068,9 @@ func Test_incsearch_vimgrep_dump()
endfunc
func Test_keep_last_search_pattern()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
new
call setline(1, ['foo', 'foo', 'foo'])
set incsearch
@@ -820,10 +1089,9 @@ func Test_keep_last_search_pattern()
endfunc
func Test_word_under_cursor_after_match()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
new
call setline(1, 'foo bar')
set incsearch
@@ -840,10 +1108,9 @@ func Test_word_under_cursor_after_match()
endfunc
func Test_subst_word_under_cursor()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
new
call setline(1, ['int SomeLongName;', 'for (xxx = 1; xxx < len; ++xxx)'])
set incsearch
@@ -857,132 +1124,8 @@ 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()
- throw 'skipped: Nvim does not support 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()
- throw 'skipped: Nvim does not support 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()
- throw 'skipped: Nvim does not support test_override()'
+ CheckFunction test_override
new
call test_override("char_avail", 1)
set incsearch
@@ -997,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
@@ -1015,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
@@ -1053,9 +1207,8 @@ func Test_search_Ctrl_L_combining()
" ' ̇' U+0307 Dec:775 COMBINING DOT ABOVE &#x307; /\%u307\Z "\u0307"
" ' ̣' U+0323 Dec:803 COMBINING DOT BELOW &#x323; /\%u323 "\u0323"
" Those should also appear on the commandline
- if !exists('+incsearch')
- return
- endif
+ CheckOption incsearch
+
call Cmdline3_prep()
1
let bufcontent = ['', 'Miạ̀́̇m']
@@ -1104,10 +1257,9 @@ func Test_one_error_msg()
endfunc
func Test_incsearch_add_char_under_cursor()
- throw 'skipped: Nvim does not support test_override()'
- if !exists('+incsearch')
- return
- endif
+ CheckFunction test_override
+ CheckOption incsearch
+
set incsearch
new
call setline(1, ['find match', 'anything'])
@@ -1192,4 +1344,36 @@ func Test_search_smartcase_utf8()
close!
endfunc
+func Test_incsearch_highlighting_newline()
+ CheckRunVimInTerminal
+ CheckOption incsearch
+ CheckScreendump
+ new
+ call test_override("char_avail", 1)
+
+ let commands =<< trim [CODE]
+ set incsearch nohls
+ call setline(1, ['test', 'xxx'])
+ [CODE]
+ call writefile(commands, 'Xincsearch_nl')
+ let buf = RunVimInTerminal('-S Xincsearch_nl', {'rows': 5, 'cols': 10})
+ call term_sendkeys(buf, '/test')
+ call VerifyScreenDump(buf, 'Test_incsearch_newline1', {})
+ " Need to send one key at a time to force a redraw
+ call term_sendkeys(buf, '\n')
+ call VerifyScreenDump(buf, 'Test_incsearch_newline2', {})
+ call term_sendkeys(buf, 'x')
+ call VerifyScreenDump(buf, 'Test_incsearch_newline3', {})
+ call term_sendkeys(buf, 'x')
+ call VerifyScreenDump(buf, 'Test_incsearch_newline4', {})
+ call term_sendkeys(buf, "\<CR>")
+ call VerifyScreenDump(buf, 'Test_incsearch_newline5', {})
+ call StopVimInTerminal(buf)
+
+ " clean up
+ call delete('Xincsearch_nl')
+ call test_override("char_avail", 0)
+ bw
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
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 4bbd722fdb..9753100375 100644
--- a/src/nvim/testdir/test_signs.vim
+++ b/src/nvim/testdir/test_signs.vim
@@ -1,8 +1,7 @@
" Test for signs
-if !has('signs')
- finish
-endif
+source check.vim
+CheckFeature signs
source screendump.vim
@@ -135,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
@@ -416,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()
@@ -445,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",
@@ -461,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()
@@ -505,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)
@@ -645,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}))
@@ -1132,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()
@@ -1541,7 +1550,7 @@ endfunc
" Tests for memory allocation failures in sign functions
func Test_sign_memfailures()
- throw 'skipped: Nvim does not support test_alloc_fail()'
+ CheckFunction test_alloc_fail
call writefile(repeat(["Sun is shining"], 30), "Xsign")
edit Xsign
@@ -1619,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
@@ -1869,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 4d1ad10c23..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'
@@ -862,6 +890,66 @@ func Test_x_arg()
call delete('Xtest_x_arg')
endfunc
+" Test for --not-a-term avoiding escape codes.
+func Test_not_a_term()
+ CheckUnix
+ CheckNotGui
+
+ if &shellredir =~ '%s'
+ let redir = printf(&shellredir, 'Xvimout')
+ else
+ let redir = &shellredir .. ' Xvimout'
+ endif
+
+ " Without --not-a-term there are a few escape sequences.
+ " This will take 2 seconds because of the missing --not-a-term
+ let cmd = GetVimProg() .. ' --cmd quit ' .. redir
+ exe "silent !" . cmd
+ " call assert_match("\<Esc>", readfile('Xvimout')->join())
+ call assert_match("\<Esc>", join(readfile('Xvimout')))
+ call delete('Xvimout')
+
+ " With --not-a-term there are no escape sequences.
+ let cmd = GetVimProg() .. ' --not-a-term --cmd quit ' .. redir
+ exe "silent !" . cmd
+ " call assert_notmatch("\<Esc>", readfile('Xvimout')->join())
+ call assert_notmatch("\<Esc>", join(readfile('Xvimout')))
+ call delete('Xvimout')
+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..f5b6446108 100644
--- a/src/nvim/testdir/test_statusline.vim
+++ b/src/nvim/testdir/test_statusline.vim
@@ -440,6 +440,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 2a27f7a3a1..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:')
@@ -746,3 +748,21 @@ func Test_sub_beyond_end()
call assert_equal('#', getline(1))
bwipe!
endfunc
+
+func Test_submatch_list_concatenate()
+ let pat = 'A\(.\)'
+ let Rep = {-> string([submatch(0, 1)] + [[submatch(1)]])}
+ " call substitute('A1', pat, Rep, '')->assert_equal("[['A1'], ['1']]")
+ 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 4cf0e983b0..875e23894f 100644
--- a/src/nvim/testdir/test_syntax.vim
+++ b/src/nvim/testdir/test_syntax.vim
@@ -24,13 +24,39 @@ 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, [
\ 'CREATE TABLE FOOBAR(',
\ ' DLTD_BY VARCHAR2(100)',
\ ');',
- \ ''])
+ \ ''])
syntax on
set ft=sql
@@ -521,7 +547,7 @@ func Test_synstack_synIDtrans()
norm f/
call assert_equal(['cComment', 'cCommentStart'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
- call assert_equal(['Comment', 'Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
+ call assert_equal(['Comment', 'Comment'], map(synstack(line("."), col(".")), 'synIDattr(synIDtrans(v:val), "name")'))
norm fA
call assert_equal(['cComment'], map(synstack(line("."), col(".")), 'synIDattr(v:val, "name")'))
@@ -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_system.vim b/src/nvim/testdir/test_system.vim
index 9cf8690d57..6bbe714d19 100644
--- a/src/nvim/testdir/test_system.vim
+++ b/src/nvim/testdir/test_system.vim
@@ -93,7 +93,6 @@ function! Test_system_exmode()
endfunc
func Test_system_with_shell_quote()
- throw 'skipped: enable after porting method patches'
CheckMSWindows
call mkdir('Xdir with spaces', 'p')
@@ -122,7 +121,8 @@ func Test_system_with_shell_quote()
let msg = printf('shell=%s shellxquote=%s', &shell, &shellxquote)
try
- let out = 'echo 123'->system()
+ " let out = 'echo 123'->system()
+ let out = system('echo 123')
catch
call assert_report(printf('%s: %s', msg, v:exception))
continue
diff --git a/src/nvim/testdir/test_tab.vim b/src/nvim/testdir/test_tab.vim
index b847dbd962..b8e8dfe062 100644
--- a/src/nvim/testdir/test_tab.vim
+++ b/src/nvim/testdir/test_tab.vim
@@ -1,3 +1,4 @@
+" Various tests for inserting a Tab.
" Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
" Also test that dv_ works correctly
@@ -43,3 +44,47 @@ func Test_smarttab()
enew!
set expandtab& smartindent& copyindent& ts& sw& sts&
endfunc
+
+func Test_softtabstop()
+ new
+ set sts=0 sw=0
+ exe "normal ix\<Tab>x\<Esc>"
+ call assert_equal("x\tx", getline(1))
+
+ call setline(1, '')
+ set sts=4
+ exe "normal ix\<Tab>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+ call setline(1, '')
+ set sts=-1 sw=4
+ exe "normal ix\<Tab>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+ call setline(1, 'x ')
+ set sts=0 sw=0 backspace=start
+ exe "normal A\<BS>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+ call setline(1, 'x ')
+ set sts=4
+ exe "normal A\<BS>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+ call setline(1, 'x ')
+ set sts=-1 sw=4
+ exe "normal A\<BS>x\<Esc>"
+ call assert_equal("x x", getline(1))
+
+ call setline(1, 'x')
+ set sts=-1 sw=0 smarttab
+ exe "normal I\<Tab>\<Esc>"
+ call assert_equal("\tx", getline(1))
+
+ call setline(1, 'x')
+ exe "normal I\<Tab>\<BS>\<Esc>"
+ call assert_equal("x", getline(1))
+
+ set sts=0 sw=0 backspace& nosmarttab
+ bwipe!
+endfunc
diff --git a/src/nvim/testdir/test_tabpage.vim b/src/nvim/testdir/test_tabpage.vim
index 2b6a89647e..b261b96c3b 100644
--- a/src/nvim/testdir/test_tabpage.vim
+++ b/src/nvim/testdir/test_tabpage.vim
@@ -142,9 +142,6 @@ endfunc
" Test autocommands
function Test_tabpage_with_autocmd()
- if !has('autocmd')
- return
- endif
command -nargs=1 -bar C :call add(s:li, '=== ' . <q-args> . ' ===')|<args>
augroup TestTabpageGroup
au!
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_timers.vim b/src/nvim/testdir/test_timers.vim
index 13971a918d..ceaa5de92b 100644
--- a/src/nvim/testdir/test_timers.vim
+++ b/src/nvim/testdir/test_timers.vim
@@ -317,8 +317,8 @@ endfunc
" Test that the garbage collector isn't triggered if a timer callback invokes
" vgetc().
func Test_nocatch_garbage_collect()
- " skipped: Nvim does not support test_garbagecollect_soon(), test_override()
- return
+ CheckFunction test_garbagecollect_soon
+ CheckFunction test_override
" 'uptimetime. must be bigger than the timer timeout
set ut=200
call test_garbagecollect_soon()
diff --git a/src/nvim/testdir/test_undo.vim b/src/nvim/testdir/test_undo.vim
index 3b66071d6d..54caed3983 100644
--- a/src/nvim/testdir/test_undo.vim
+++ b/src/nvim/testdir/test_undo.vim
@@ -3,6 +3,8 @@
" undo-able pieces. Do that by setting 'undolevels'.
" Also tests :earlier and :later.
+source check.vim
+
func Test_undotree()
new
@@ -135,7 +137,7 @@ func BackOne(expected)
endfunc
func Test_undo_del_chars()
- throw 'skipped: Nvim does not support test_settime()'
+ CheckFunction test_settime
" Setup a buffer without creating undo entries
new
@@ -330,7 +332,7 @@ func Test_insert_expr()
endfunc
func Test_undofile_earlier()
- throw 'skipped: Nvim does not support test_settime()'
+ CheckFunction test_settime
let t0 = localtime() - 43200
call test_settime(t0)
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_vartabs.vim b/src/nvim/testdir/test_vartabs.vim
new file mode 100644
index 0000000000..2fbf130345
--- /dev/null
+++ b/src/nvim/testdir/test_vartabs.vim
@@ -0,0 +1,381 @@
+" Test for variable tabstops
+
+if !has("vartabs")
+ finish
+endif
+
+source view_util.vim
+
+func s:compare_lines(expect, actual)
+ call assert_equal(join(a:expect, "\n"), join(a:actual, "\n"))
+endfunc
+
+func Test_vartabs()
+ new
+ %d
+
+ " Test normal operation of tabstops ...
+ set ts=4
+ call setline(1, join(split('aaaaa', '\zs'), "\t"))
+ retab 8
+ let expect = "a a\<tab>a a\<tab>a"
+ call assert_equal(expect, getline(1))
+
+ " ... and softtabstops
+ set ts=8 sts=6
+ exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
+ let expect = "b b\<tab> b\<tab> b\<tab>b"
+ call assert_equal(expect, getline(1))
+
+ " Test variable tabstops.
+ set sts=0 vts=4,8,4,8
+ exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
+ retab 8
+ let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
+ call assert_equal(expect, getline(1))
+
+ set et vts=4,8,4,8
+ exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
+ let expect = "d d d d d d"
+ call assert_equal(expect, getline(1))
+
+ " Changing ts should have no effect if vts is in use.
+ call cursor(1, 1)
+ set ts=6
+ exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
+ let expect = "e e e e e e"
+ call assert_equal(expect, getline(1))
+
+ " Clearing vts should revert to using ts.
+ set vts=
+ exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
+ let expect = "f f f f f f"
+ call assert_equal(expect, getline(1))
+
+ " Test variable softtabstops.
+ set noet ts=8 vsts=12,2,6
+ exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
+ let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
+ call assert_equal(expect, getline(1))
+
+ " Variable tabstops and softtabstops combined.
+ set vsts=6,12,8 vts=4,6,8
+ exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
+ let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
+ call assert_equal(expect, getline(1))
+
+ " Retab with a single value, not using vts.
+ set ts=8 sts=0 vts= vsts=
+ exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
+ retab 4
+ let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
+ call assert_equal(expect, getline(1))
+
+ " Retab with a single value, using vts.
+ set ts=8 sts=0 vts=6 vsts=
+ exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
+ retab 4
+ let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
+ call assert_equal(expect, getline(1))
+
+ " Retab with multiple values, not using vts.
+ set ts=6 sts=0 vts= vsts=
+ exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
+ retab 4,8
+ let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
+ call assert_equal(expect, getline(1))
+
+ " Retab with multiple values, using vts.
+ set ts=8 sts=0 vts=6 vsts=
+ exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
+ retab 4,8
+ let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
+ call assert_equal(expect, getline(1))
+
+ " Check that global and local values are set.
+ set ts=4 vts=6 sts=8 vsts=10
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ new
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ bwipeout!
+
+ " Check that local values only are set.
+ setlocal ts=5 vts=7 sts=9 vsts=11
+ call assert_equal(&ts, 5)
+ call assert_equal(&vts, '7')
+ call assert_equal(&sts, 9)
+ call assert_equal(&vsts, '11')
+ new
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ bwipeout!
+
+ " Check that global values only are set.
+ setglobal ts=6 vts=8 sts=10 vsts=12
+ call assert_equal(&ts, 5)
+ call assert_equal(&vts, '7')
+ call assert_equal(&sts, 9)
+ call assert_equal(&vsts, '11')
+ new
+ call assert_equal(&ts, 6)
+ call assert_equal(&vts, '8')
+ call assert_equal(&sts, 10)
+ call assert_equal(&vsts, '12')
+ bwipeout!
+
+ set ts& vts& sts& vsts& et&
+ bwipeout!
+endfunc
+
+func! Test_vartabs_breakindent()
+ if !exists("+breakindent")
+ return
+ endif
+ new
+ %d
+
+ " Test normal operation of tabstops ...
+ set ts=4
+ call setline(1, join(split('aaaaa', '\zs'), "\t"))
+ retab 8
+ let expect = "a a\<tab>a a\<tab>a"
+ call assert_equal(expect, getline(1))
+
+ " ... and softtabstops
+ set ts=8 sts=6
+ exe "norm! Sb\<tab>b\<tab>b\<tab>b\<tab>b"
+ let expect = "b b\<tab> b\<tab> b\<tab>b"
+ call assert_equal(expect, getline(1))
+
+ " Test variable tabstops.
+ set sts=0 vts=4,8,4,8
+ exe "norm! Sc\<tab>c\<tab>c\<tab>c\<tab>c\<tab>c"
+ retab 8
+ let expect = "c c\<tab> c\<tab>c\<tab>c\<tab>c"
+ call assert_equal(expect, getline(1))
+
+ set et vts=4,8,4,8
+ exe "norm! Sd\<tab>d\<tab>d\<tab>d\<tab>d\<tab>d"
+ let expect = "d d d d d d"
+ call assert_equal(expect, getline(1))
+
+ " Changing ts should have no effect if vts is in use.
+ call cursor(1, 1)
+ set ts=6
+ exe "norm! Se\<tab>e\<tab>e\<tab>e\<tab>e\<tab>e"
+ let expect = "e e e e e e"
+ call assert_equal(expect, getline(1))
+
+ " Clearing vts should revert to using ts.
+ set vts=
+ exe "norm! Sf\<tab>f\<tab>f\<tab>f\<tab>f\<tab>f"
+ let expect = "f f f f f f"
+ call assert_equal(expect, getline(1))
+
+ " Test variable softtabstops.
+ set noet ts=8 vsts=12,2,6
+ exe "norm! Sg\<tab>g\<tab>g\<tab>g\<tab>g\<tab>g"
+ let expect = "g\<tab> g g\<tab> g\<tab> g\<tab>g"
+ call assert_equal(expect, getline(1))
+
+ " Variable tabstops and softtabstops combined.
+ set vsts=6,12,8 vts=4,6,8
+ exe "norm! Sh\<tab>h\<tab>h\<tab>h\<tab>h"
+ let expect = "h\<tab> h\<tab>\<tab>h\<tab>h\<tab>h"
+ call assert_equal(expect, getline(1))
+
+ " Retab with a single value, not using vts.
+ set ts=8 sts=0 vts= vsts=
+ exe "norm! Si\<tab>i\<tab>i\<tab>i\<tab>i"
+ retab 4
+ let expect = "i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i\<tab>\<tab>i"
+ call assert_equal(expect, getline(1))
+
+ " Retab with a single value, using vts.
+ set ts=8 sts=0 vts=6 vsts=
+ exe "norm! Sj\<tab>j\<tab>j\<tab>j\<tab>j"
+ retab 4
+ let expect = "j\<tab> j\<tab>\<tab>j\<tab> j\<tab>\<tab>j"
+ call assert_equal(expect, getline(1))
+
+ " Retab with multiple values, not using vts.
+ set ts=6 sts=0 vts= vsts=
+ exe "norm! Sk\<tab>k\<tab>k\<tab>k\<tab>k\<tab>k"
+ retab 4,8
+ let expect = "k\<tab> k\<tab>k k\<tab> k\<tab> k"
+ call assert_equal(expect, getline(1))
+
+ " Retab with multiple values, using vts.
+ set ts=8 sts=0 vts=6 vsts=
+ exe "norm! Sl\<tab>l\<tab>l\<tab>l\<tab>l\<tab>l"
+ retab 4,8
+ let expect = "l\<tab> l\<tab>l l\<tab> l\<tab> l"
+ call assert_equal(expect, getline(1))
+
+ " Check that global and local values are set.
+ set ts=4 vts=6 sts=8 vsts=10
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ new
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ bwipeout!
+
+ " Check that local values only are set.
+ setlocal ts=5 vts=7 sts=9 vsts=11
+ call assert_equal(&ts, 5)
+ call assert_equal(&vts, '7')
+ call assert_equal(&sts, 9)
+ call assert_equal(&vsts, '11')
+ new
+ call assert_equal(&ts, 4)
+ call assert_equal(&vts, '6')
+ call assert_equal(&sts, 8)
+ call assert_equal(&vsts, '10')
+ bwipeout!
+
+ " Check that global values only are set.
+ setglobal ts=6 vts=8 sts=10 vsts=12
+ call assert_equal(&ts, 5)
+ call assert_equal(&vts, '7')
+ call assert_equal(&sts, 9)
+ call assert_equal(&vsts, '11')
+ new
+ call assert_equal(&ts, 6)
+ call assert_equal(&vts, '8')
+ call assert_equal(&sts, 10)
+ call assert_equal(&vsts, '12')
+ bwipeout!
+
+ bwipeout!
+endfunc
+
+func Test_vartabs_linebreak()
+ if winwidth(0) < 40
+ return
+ endif
+ new
+ 40vnew
+ %d
+ setl linebreak vartabstop=10,20,30,40
+ call setline(1, "\tx\tx\tx\tx")
+
+ let expect = [' x ',
+ \ 'x x ',
+ \ 'x ']
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call s:compare_lines(expect, lines)
+ setl list listchars=tab:>-
+ let expect = ['>---------x>------------------ ',
+ \ 'x>------------------x>------------------',
+ \ 'x ']
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call s:compare_lines(expect, lines)
+ setl linebreak vartabstop=40
+ let expect = ['>---------------------------------------',
+ \ 'x>--------------------------------------',
+ \ 'x>--------------------------------------',
+ \ 'x>--------------------------------------',
+ \ 'x ']
+ let lines = ScreenLines([1, 5], winwidth(0))
+ call s:compare_lines(expect, lines)
+
+ " cleanup
+ bw!
+ bw!
+ set nolist listchars&vim
+endfunc
+
+func Test_vartabs_shiftwidth()
+ "return
+ if winwidth(0) < 40
+ return
+ endif
+ new
+ 40vnew
+ %d
+" setl varsofttabstop=10,20,30,40
+ setl shiftwidth=0 vartabstop=10,20,30,40
+ call setline(1, "x")
+
+ " Check without any change.
+ let expect = ['x ']
+ let lines = ScreenLines(1, winwidth(0))
+ call s:compare_lines(expect, lines)
+ " Test 1:
+ " shiftwidth depends on the indent, first check with cursor at the end of the
+ " line (which is the same as the start of the line, since there is only one
+ " character).
+ norm! $>>
+ let expect1 = [' x ']
+ let lines = ScreenLines(1, winwidth(0))
+ call s:compare_lines(expect1, lines)
+ call assert_equal(10, shiftwidth())
+ call assert_equal(10, shiftwidth(1))
+ call assert_equal(20, shiftwidth(virtcol('.')))
+ norm! $>>
+ let expect2 = [' x ', '~ ']
+ let lines = ScreenLines([1, 2], winwidth(0))
+ call s:compare_lines(expect2, lines)
+ call assert_equal(20, shiftwidth(virtcol('.')-2))
+ call assert_equal(30, shiftwidth(virtcol('.')))
+ norm! $>>
+ let expect3 = [' ', ' x ', '~ ']
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call s:compare_lines(expect3, lines)
+ call assert_equal(30, shiftwidth(virtcol('.')-2))
+ call assert_equal(40, shiftwidth(virtcol('.')))
+ norm! $>>
+ let expect4 = [' ', ' ', ' x ']
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call assert_equal(40, shiftwidth(virtcol('.')))
+ call s:compare_lines(expect4, lines)
+
+ " Test 2: Put the cursor at the first column, result should be the same
+ call setline(1, "x")
+ norm! 0>>
+ let lines = ScreenLines(1, winwidth(0))
+ call s:compare_lines(expect1, lines)
+ norm! 0>>
+ let lines = ScreenLines([1, 2], winwidth(0))
+ call s:compare_lines(expect2, lines)
+ norm! 0>>
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call s:compare_lines(expect3, lines)
+ norm! 0>>
+ let lines = ScreenLines([1, 3], winwidth(0))
+ call s:compare_lines(expect4, lines)
+
+ " cleanup
+ bw!
+ bw!
+endfunc
+
+func Test_vartabs_failures()
+ call assert_fails('set vts=8,')
+ call assert_fails('set vsts=8,')
+ call assert_fails('set vts=8,,8')
+ call assert_fails('set vsts=8,,8')
+ call assert_fails('set vts=8,,8,')
+ call assert_fails('set vsts=8,,8,')
+ call assert_fails('set vts=,8')
+ call assert_fails('set vsts=,8')
+endfunc
+
+func Test_vartabs_reset()
+ set vts=8
+ set all&
+ call assert_equal('', &vts)
+endfunc
diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim
index 7f50894f66..73c7960579 100644
--- a/src/nvim/testdir/test_visual.vim
+++ b/src/nvim/testdir/test_visual.vim
@@ -255,7 +255,6 @@ func TriggerTheProblem()
endfunc
func Test_visual_mode_reset()
- set belloff=all
enew
let g:msg = "Everything's fine."
enew
@@ -268,7 +267,6 @@ func Test_visual_mode_reset()
exe "normal! GV:call TriggerTheProblem()\<CR>"
call assert_equal("Everything's fine.", g:msg)
- set belloff&
endfunc
func Test_Visual_word_textobject()
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..ed40a64c66 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) {
diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c
index a2e9266fbb..c1e4a40ef2 100644
--- a/src/nvim/ui_compositor.c
+++ b/src/nvim/ui_compositor.c
@@ -180,7 +180,8 @@ bool ui_comp_put_grid(ScreenGrid *grid, int row, int col, int height, int width,
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
+ && !on_top) {
insert_at--;
}
// not found: new grid
diff --git a/src/nvim/window.c b/src/nvim/window.c
index fd7af108b7..d4d00c0a71 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);
@@ -763,14 +775,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) {
@@ -1301,6 +1312,10 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
p_wh = i;
}
+ if (!win_valid(oldwin)) {
+ return FAIL;
+ }
+
// Send the window positions to the UI
oldwin->w_pos_changed = true;
@@ -2184,7 +2199,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.
@@ -3451,6 +3466,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;
}
@@ -3619,6 +3637,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);
@@ -5727,9 +5747,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.
@@ -6320,6 +6341,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;
@@ -6345,6 +6373,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;
@@ -6359,7 +6395,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.
@@ -6792,10 +6827,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;
}
}