aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/README.md2
-rw-r--r--src/nvim/api/private/helpers.c41
-rw-r--r--src/nvim/api/vim.c41
-rw-r--r--src/nvim/buffer.c7
-rw-r--r--src/nvim/edit.c5
-rw-r--r--src/nvim/eval.c24
-rw-r--r--src/nvim/eval.lua1
-rw-r--r--src/nvim/eval/funcs.c23
-rw-r--r--src/nvim/ex_cmds.c63
-rw-r--r--src/nvim/ex_cmds.lua1456
-rw-r--r--src/nvim/ex_cmds2.c2
-rw-r--r--src/nvim/ex_cmds_defs.h63
-rw-r--r--src/nvim/ex_docmd.c458
-rw-r--r--src/nvim/ex_getln.c4
-rw-r--r--src/nvim/generators/gen_ex_cmds.lua16
-rw-r--r--src/nvim/globals.h1
-rw-r--r--src/nvim/log.c18
-rw-r--r--src/nvim/lua/executor.c15
-rw-r--r--src/nvim/main.c1
-rw-r--r--src/nvim/mark.c85
-rw-r--r--src/nvim/message.c34
-rw-r--r--src/nvim/message.h9
-rw-r--r--src/nvim/option.c14
-rw-r--r--src/nvim/option_defs.h7
-rw-r--r--src/nvim/os/env.c53
-rw-r--r--src/nvim/os/input.c2
-rw-r--r--src/nvim/os/stdpaths.c11
-rw-r--r--src/nvim/po/af.po7
-rw-r--r--src/nvim/po/ca.po4
-rw-r--r--src/nvim/po/cs.cp1250.po4
-rw-r--r--src/nvim/po/cs.po4
-rw-r--r--src/nvim/po/da.po3
-rw-r--r--src/nvim/po/de.po4
-rw-r--r--src/nvim/po/en_GB.po4
-rw-r--r--src/nvim/po/eo.po3
-rw-r--r--src/nvim/po/es.po4
-rw-r--r--src/nvim/po/fi.po7
-rw-r--r--src/nvim/po/fr.po3
-rw-r--r--src/nvim/po/ga.po3
-rw-r--r--src/nvim/po/it.po4
-rw-r--r--src/nvim/po/ja.euc-jp.po3
-rw-r--r--src/nvim/po/ja.po3
-rw-r--r--src/nvim/po/ko.UTF-8.po4
-rw-r--r--src/nvim/po/nb.po4
-rw-r--r--src/nvim/po/nl.po4
-rw-r--r--src/nvim/po/no.po4
-rw-r--r--src/nvim/po/pl.UTF-8.po4
-rw-r--r--src/nvim/po/pt_BR.po4
-rw-r--r--src/nvim/po/ru.po4
-rw-r--r--src/nvim/po/sk.cp1250.po4
-rw-r--r--src/nvim/po/sk.po4
-rw-r--r--src/nvim/po/sr.po3
-rw-r--r--src/nvim/po/sv.po4
-rw-r--r--src/nvim/po/uk.po253
-rw-r--r--src/nvim/po/vi.po4
-rw-r--r--src/nvim/po/zh_CN.UTF-8.po4
-rw-r--r--src/nvim/po/zh_TW.UTF-8.po4
-rw-r--r--src/nvim/quickfix.c302
-rw-r--r--src/nvim/screen.c32
-rw-r--r--src/nvim/search.c87
-rw-r--r--src/nvim/syntax.c2
-rw-r--r--src/nvim/testdir/test_autocmd.vim6
-rw-r--r--src/nvim/testdir/test_backspace_opt.vim151
-rw-r--r--src/nvim/testdir/test_excmd.vim91
-rw-r--r--src/nvim/testdir/test_filetype.vim38
-rw-r--r--src/nvim/testdir/test_find_complete.vim8
-rw-r--r--src/nvim/testdir/test_findfile.vim43
-rw-r--r--src/nvim/testdir/test_hardcopy.vim80
-rw-r--r--src/nvim/testdir/test_marks.vim30
-rw-r--r--src/nvim/testdir/test_options.vim21
-rw-r--r--src/nvim/testdir/test_quickfix.vim248
-rw-r--r--src/nvim/testdir/test_sleep.vim26
-rw-r--r--src/nvim/testdir/test_startup.vim78
-rw-r--r--src/nvim/testdir/test_usercommands.vim10
-rw-r--r--src/nvim/testdir/test_window_cmd.vim2
75 files changed, 2663 insertions, 1416 deletions
diff --git a/src/nvim/README.md b/src/nvim/README.md
index d14ba85546..affc5c79cc 100644
--- a/src/nvim/README.md
+++ b/src/nvim/README.md
@@ -38,7 +38,7 @@ alternate file (e.g. stderr) use `LOG_CALLSTACK_TO_FILE(FILE*)`. Requires
Many log messages have a shared prefix, such as "UI" or "RPC". Use the shell to
filter the log, e.g. at DEBUG level you might want to exclude UI messages:
- tail -F ~/.local/share/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log
+ tail -F ~/.cache/nvim/log | cat -v | stdbuf -o0 grep -v UI | stdbuf -o0 tee -a log
Build with ASAN
---------------
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 2c99d3426c..7cee569989 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -820,6 +820,10 @@ void modify_keymap(Buffer buffer, bool is_unmap, String mode, String lhs,
}
buf_T *target_buf = find_buffer_by_handle(buffer, err);
+ if (!target_buf) {
+ return;
+ }
+
MapArguments parsed_args;
memset(&parsed_args, 0, sizeof(parsed_args));
if (parse_keymap_opts(opts, &parsed_args, err)) {
@@ -1641,6 +1645,43 @@ bool api_object_to_bool(Object obj, const char *what,
}
}
+HlMessage parse_hl_msg(Array chunks, Error *err)
+{
+ HlMessage hl_msg = KV_INITIAL_VALUE;
+ for (size_t i = 0; i < chunks.size; i++) {
+ if (chunks.items[i].type != kObjectTypeArray) {
+ api_set_error(err, kErrorTypeValidation, "Chunk is not an array");
+ goto free_exit;
+ }
+ Array chunk = chunks.items[i].data.array;
+ if (chunk.size == 0 || chunk.size > 2
+ || chunk.items[0].type != kObjectTypeString
+ || (chunk.size == 2 && chunk.items[1].type != kObjectTypeString)) {
+ api_set_error(err, kErrorTypeValidation,
+ "Chunk is not an array with one or two strings");
+ goto free_exit;
+ }
+
+ String str = copy_string(chunk.items[0].data.string);
+
+ int attr = 0;
+ if (chunk.size == 2) {
+ String hl = chunk.items[1].data.string;
+ if (hl.size > 0) {
+ int hl_id = syn_check_group((char_u *)hl.data, (int)hl.size);
+ attr = hl_id > 0 ? syn_id2attr(hl_id) : 0;
+ }
+ }
+ kv_push(hl_msg, ((HlMessageChunk){ .text = str, .attr = attr }));
+ }
+
+ return hl_msg;
+
+free_exit:
+ clear_hl_msg(&hl_msg);
+ return hl_msg;
+}
+
const char *describe_ns(NS ns_id)
{
String name;
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 1e972e01be..9e2fb6da6f 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -990,6 +990,47 @@ void nvim_set_option(uint64_t channel_id, String name, Object value, Error *err)
set_option_to(channel_id, NULL, SREQ_GLOBAL, name, value, err);
}
+/// Echo a message.
+///
+/// @param chunks A list of [text, hl_group] arrays, each representing a
+/// text chunk with specified highlight. `hl_group` element
+/// can be omitted for no highlight.
+/// @param history if true, add to |message-history|.
+/// @param opts Optional parameters. Reserved for future use.
+void nvim_echo(Array chunks, Boolean history, Dictionary opts, Error *err)
+ FUNC_API_SINCE(7)
+{
+ HlMessage hl_msg = parse_hl_msg(chunks, err);
+ if (ERROR_SET(err)) {
+ goto error;
+ }
+
+ if (opts.size > 0) {
+ api_set_error(err, kErrorTypeValidation, "opts dict isn't empty");
+ goto error;
+ }
+
+ no_wait_return++;
+ bool need_clear = true;
+ msg_start();
+ for (uint32_t i = 0; i < kv_size(hl_msg); i++) {
+ HlMessageChunk chunk = kv_A(hl_msg, i);
+ msg_multiline_attr((const char *)chunk.text.data, chunk.attr,
+ false, &need_clear);
+ }
+ if (history) {
+ msg_ext_set_kind("echomsg");
+ add_hl_msg_hist(hl_msg);
+ } else {
+ msg_ext_set_kind("echo");
+ }
+ no_wait_return--;
+ msg_end();
+
+error:
+ clear_hl_msg(&hl_msg);
+}
+
/// Writes a message to the Vim output buffer. Does not append "\n", the
/// message is buffered (won't display) until a linefeed is written.
///
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 93a03986e5..0134ee838d 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -2159,10 +2159,11 @@ static buf_T *buflist_findname_file_id(char_u *ffname, FileID *file_id,
int buflist_findpat(
const char_u *pattern,
const char_u *pattern_end, // pointer to first char after pattern
- int unlisted, // find unlisted buffers
- int diffmode, // find diff-mode buffers only
- int curtab_only // find buffers in current tab only
+ bool unlisted, // find unlisted buffers
+ bool diffmode, // find diff-mode buffers only
+ bool curtab_only // find buffers in current tab only
)
+ FUNC_ATTR_NONNULL_ARG(1)
{
int match = -1;
int find_listed;
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 876e53e3cd..b2abb06075 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -8282,8 +8282,9 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
}
} while (revins_on
|| (curwin->w_cursor.col > mincol
- && (curwin->w_cursor.lnum != Insstart_orig.lnum
- || curwin->w_cursor.col != Insstart_orig.col)));
+ && (can_bs(BS_NOSTOP)
+ || (curwin->w_cursor.lnum != Insstart_orig.lnum
+ || curwin->w_cursor.col != Insstart_orig.col))));
}
did_backspace = true;
}
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index f60504de5e..8a1556320c 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -5948,6 +5948,19 @@ int assert_exception(typval_T *argvars)
return 0;
}
+static void assert_append_cmd_or_arg(garray_T *gap, typval_T *argvars,
+ const char *cmd)
+ FUNC_ATTR_NONNULL_ALL
+{
+ if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN) {
+ char *const tofree = encode_tv2echo(&argvars[2], NULL);
+ ga_concat(gap, (char_u *)tofree);
+ xfree(tofree);
+ } else {
+ ga_concat(gap, (char_u *)cmd);
+ }
+}
+
int assert_fails(typval_T *argvars)
FUNC_ATTR_NONNULL_ALL
{
@@ -5966,14 +5979,7 @@ int assert_fails(typval_T *argvars)
if (!called_emsg) {
prepare_assert_error(&ga);
ga_concat(&ga, (const char_u *)"command did not fail: ");
- if (argvars[1].v_type != VAR_UNKNOWN
- && argvars[2].v_type != VAR_UNKNOWN) {
- char *const tofree = encode_tv2echo(&argvars[2], NULL);
- ga_concat(&ga, (char_u *)tofree);
- xfree(tofree);
- } else {
- ga_concat(&ga, (const char_u *)cmd);
- }
+ assert_append_cmd_or_arg(&ga, argvars, cmd);
assert_error(&ga);
ga_clear(&ga);
ret = 1;
@@ -5986,6 +5992,8 @@ int assert_fails(typval_T *argvars)
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
&vimvars[VV_ERRMSG].vv_tv, ASSERT_OTHER);
+ ga_concat(&ga, (char_u *)": ");
+ assert_append_cmd_or_arg(&ga, argvars, cmd);
assert_error(&ga);
ga_clear(&ga);
ret = 1;
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index 466f1800c7..952fa35b83 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -150,6 +150,7 @@ return {
getjumplist={args={0, 2}},
getline={args={1, 2}},
getloclist={args={1, 2}},
+ getmarklist={args={0, 1}},
getmatches={args={0, 1}},
getpid={},
getpos={args=1},
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 16eb6f8898..8235d74cbb 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -726,7 +726,7 @@ buf_T *tv_get_buf(typval_T *tv, int curtab_only)
p_cpo = (char_u *)"";
buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
- TRUE, FALSE, curtab_only));
+ true, false, curtab_only));
p_magic = save_magic;
p_cpo = save_cpo;
@@ -2165,7 +2165,7 @@ static void f_expandcmd(typval_T *argvars, typval_T *rettv, FunPtr fptr)
.nextcmd = NULL,
.cmdidx = CMD_USER,
};
- eap.argt |= NOSPC;
+ eap.argt |= EX_NOSPC;
expand_filename(&eap, &cmdstr, &errormsg);
if (errormsg != NULL && *errormsg != NUL) {
@@ -3483,6 +3483,25 @@ static void f_getloclist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
get_qf_loc_list(false, wp, &argvars[1], rettv);
}
+
+/// "getmarklist()" function
+static void f_getmarklist(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ tv_list_alloc_ret(rettv, kListLenMayKnow);
+
+ if (argvars[0].v_type == VAR_UNKNOWN) {
+ get_global_marks(rettv->vval.v_list);
+ return;
+ }
+
+ buf_T *buf = tv_get_buf(&argvars[0], false);
+ if (buf == NULL) {
+ return;
+ }
+
+ get_buf_local_marks(buf, rettv->vval.v_list);
+}
+
/*
* "getmatches()" function
*/
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index ae389a6727..a2487336f1 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -629,6 +629,8 @@ void ex_sort(exarg_T *eap)
if (sort_abort)
goto sortend;
+ bcount_t old_count = 0, new_count = 0;
+
// Insert the lines in the sorted order below the last one.
lnum = eap->line2;
for (i = 0; i < count; i++) {
@@ -641,6 +643,8 @@ 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) {
// Copy the line into a buffer, it may become invalid in
@@ -649,6 +653,7 @@ void ex_sort(exarg_T *eap)
if (ml_append(lnum++, sortbuf1, (colnr_T)0, false) == FAIL) {
break;
}
+ new_count += bytelen;
}
fast_breakcheck();
if (got_int)
@@ -668,11 +673,16 @@ void ex_sort(exarg_T *eap)
deleted = (long)(count - (lnum - eap->line2));
if (deleted > 0) {
mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted,
- kExtmarkUndo);
+ kExtmarkNOOP);
msgmore(-deleted);
} else if (deleted < 0) {
- mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, kExtmarkUndo);
+ mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, kExtmarkNOOP);
}
+
+ extmark_splice(curbuf, eap->line1-1, 0,
+ count, 0, old_count,
+ lnum - eap->line2, 0, new_count, kExtmarkUndo);
+
if (change_occurred || deleted != 0) {
changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true);
}
@@ -1032,14 +1042,15 @@ void free_prev_shellcmd(void)
* Bangs in the argument are replaced with the previously entered command.
* Remember the argument.
*/
-void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
+void do_bang(int addr_count, exarg_T *eap, bool forceit,
+ bool do_in, bool do_out)
+ FUNC_ATTR_NONNULL_ALL
{
- char_u *arg = eap->arg; /* command */
- linenr_T line1 = eap->line1; /* start of range */
- linenr_T line2 = eap->line2; /* end of range */
- char_u *newcmd = NULL; /* the new command */
- int free_newcmd = FALSE; /* need to free() newcmd */
- int ins_prevcmd;
+ char_u *arg = eap->arg; // command
+ linenr_T line1 = eap->line1; // start of range
+ linenr_T line2 = eap->line2; // end of range
+ char_u *newcmd = NULL; // the new command
+ bool free_newcmd = false; // need to free() newcmd
char_u *t;
char_u *p;
char_u *trailarg;
@@ -1064,7 +1075,7 @@ void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
* Try to find an embedded bang, like in :!<cmd> ! [args]
* (:!! is indicated by the 'forceit' variable)
*/
- ins_prevcmd = forceit;
+ bool ins_prevcmd = forceit;
trailarg = arg;
do {
len = (int)STRLEN(trailarg) + 1;
@@ -1101,7 +1112,7 @@ void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
else {
trailarg = p;
*trailarg++ = NUL;
- ins_prevcmd = TRUE;
+ ins_prevcmd = true;
break;
}
}
@@ -1131,7 +1142,7 @@ void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
STRCPY(newcmd, p_shq);
STRCAT(newcmd, prevcmd);
STRCAT(newcmd, p_shq);
- free_newcmd = TRUE;
+ free_newcmd = true;
}
if (addr_count == 0) { /* :! */
/* echo the command */
@@ -1164,15 +1175,15 @@ void do_bang(int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)
// do this.
// Alternatively, if on Unix and redirecting input or output, but not both,
// and the 'shelltemp' option isn't set, use pipes.
-// We use input redirection if do_in is TRUE.
-// We use output redirection if do_out is TRUE.
+// We use input redirection if do_in is true.
+// We use output redirection if do_out is true.
static void do_filter(
linenr_T line1,
linenr_T line2,
exarg_T *eap, /* for forced 'ff' and 'fenc' */
char_u *cmd,
- int do_in,
- int do_out)
+ bool do_in,
+ bool do_out)
{
char_u *itmp = NULL;
char_u *otmp = NULL;
@@ -1669,10 +1680,17 @@ void ex_update(exarg_T *eap)
*/
void ex_write(exarg_T *eap)
{
- if (eap->usefilter) /* input lines to shell command */
- do_bang(1, eap, FALSE, TRUE, FALSE);
- else
+ if (eap->cmdidx == CMD_saveas) {
+ // :saveas does not take a range, uses all lines.
+ eap->line1 = 1;
+ eap->line2 = curbuf->b_ml.ml_line_count;
+ }
+
+ if (eap->usefilter) { // input lines to shell command
+ do_bang(1, eap, false, true, false);
+ } else {
(void)do_write(eap);
+ }
}
/*
@@ -3675,6 +3693,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
} else {
char_u *orig_line = NULL;
int len_change = 0;
+ const bool save_p_lz = p_lz;
int save_p_fen = curwin->w_p_fen;
curwin->w_p_fen = FALSE;
@@ -3683,6 +3702,9 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
int temp = RedrawingDisabled;
RedrawingDisabled = 0;
+ // avoid calling update_screen() in vgetorpeek()
+ p_lz = false;
+
if (new_start != NULL) {
/* There already was a substitution, we would
* like to show this to the user. We cannot
@@ -3736,7 +3758,8 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
/* clear the question */
msg_didout = FALSE; /* don't scroll up */
msg_col = 0;
- gotocmdline(TRUE);
+ gotocmdline(true);
+ p_lz = save_p_lz;
// restore the line
if (orig_line != NULL) {
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua
index 380237c822..e9046da800 100644
--- a/src/nvim/ex_cmds.lua
+++ b/src/nvim/ex_cmds.lua
@@ -1,6 +1,9 @@
local bit = require 'bit'
+local module = {}
+
-- Description of the values below is contained in ex_cmds_defs.h file.
+-- "EX_" prefix is omitted.
local RANGE = 0x001
local BANG = 0x002
local EXTRA = 0x004
@@ -14,23 +17,26 @@ local REGSTR = 0x200
local COUNT = 0x400
local NOTRLCOM = 0x800
local ZEROR = 0x1000
-local USECTRLV = 0x2000
-local NOTADR = 0x4000
-local EDITCMD = 0x8000
-local BUFNAME = 0x10000
-local BUFUNL = 0x20000
-local ARGOPT = 0x40000
-local SBOXOK = 0x80000
-local CMDWIN = 0x100000
-local MODIFY = 0x200000
-local EXFLAGS = 0x400000
-local RESTRICT = 0x800000
+local CTRLV = 0x2000
+local CMDARG = 0x4000
+local BUFNAME = 0x8000
+local BUFUNL = 0x10000
+local ARGOPT = 0x20000
+local SBOXOK = 0x40000
+local CMDWIN = 0x80000
+local MODIFY = 0x100000
+local FLAGS = 0x200000
local FILES = bit.bor(XFILE, EXTRA)
local WORD1 = bit.bor(EXTRA, NOSPC)
local FILE1 = bit.bor(FILES, NOSPC)
+module.flags = {
+ RANGE = RANGE,
+ DFLALL = DFLALL,
+}
+
-- The following table is described in ex_cmds_defs.h file.
-return {
+module.cmds = {
{
command='append',
flags=bit.bor(BANG, RANGE, ZEROR, TRLBAR, CMDWIN, MODIFY),
@@ -39,247 +45,247 @@ return {
},
{
command='abbreviate',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='abclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_abclear',
},
{
command='aboveleft',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='all',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_all',
},
{
command='amenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='anoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='args',
- flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILES, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_args',
},
{
command='argadd',
- flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, FILES, TRLBAR),
+ flags=bit.bor(BANG, RANGE, ZEROR, FILES, TRLBAR),
addr_type='ADDR_ARGUMENTS',
func='ex_argadd',
},
{
command='argdelete',
- flags=bit.bor(BANG, RANGE, NOTADR, FILES, TRLBAR),
+ flags=bit.bor(BANG, RANGE, FILES, TRLBAR),
addr_type='ADDR_ARGUMENTS',
func='ex_argdelete',
},
{
command='argdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
addr_type='ADDR_ARGUMENTS',
func='ex_listdo',
},
{
command='argedit',
- flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILES, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, NEEDARG, RANGE, ZEROR, FILES, CMDARG, ARGOPT, TRLBAR),
addr_type='ADDR_ARGUMENTS',
func='ex_argedit',
},
{
command='argglobal',
- flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILES, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_args',
},
{
command='arglocal',
- flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILES, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_args',
},
{
command='argument',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, RANGE, COUNT, EXTRA, CMDARG, ARGOPT, TRLBAR),
addr_type='ADDR_ARGUMENTS',
func='ex_argument',
},
{
command='ascii',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='do_ascii',
},
{
command='autocmd',
- flags=bit.bor(BANG, EXTRA, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, EXTRA, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_autocmd',
},
{
command='augroup',
flags=bit.bor(BANG, WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_autocmd',
},
{
command='aunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='buffer',
- flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR),
+ flags=bit.bor(BANG, RANGE, BUFNAME, BUFUNL, COUNT, EXTRA, CMDARG, TRLBAR),
addr_type='ADDR_BUFFERS',
func='ex_buffer',
},
{
command='bNext',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bprevious',
},
{
command='ball',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_buffer_all',
},
{
command='badd',
- flags=bit.bor(NEEDARG, FILE1, EDITCMD, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(NEEDARG, FILE1, CMDARG, TRLBAR, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='bdelete',
- flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR),
+ flags=bit.bor(BANG, RANGE, BUFNAME, COUNT, EXTRA, TRLBAR),
addr_type='ADDR_BUFFERS',
func='ex_bunload',
},
{
command='behave',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_behave',
},
{
command='belowright',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='bfirst',
- flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_brewind',
},
{
command='blast',
- flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_blast',
},
{
command='bmodified',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bmodified',
},
{
command='bnext',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bnext',
},
{
command='botright',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='bprevious',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bprevious',
},
{
command='brewind',
- flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_brewind',
},
{
command='break',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_break',
},
{
command='breakadd',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_breakadd',
},
{
command='breakdel',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_breakdel',
},
{
command='breaklist',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_breaklist',
},
{
command='browse',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='buffers',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='buflist_list',
},
{
command='bufdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
addr_type='ADDR_BUFFERS',
func='ex_listdo',
},
{
command='bunload',
- flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR),
+ flags=bit.bor(BANG, RANGE, BUFNAME, COUNT, EXTRA, TRLBAR),
addr_type='ADDR_LOADED_BUFFERS',
func='ex_bunload',
},
{
command='bwipeout',
- flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, TRLBAR),
+ flags=bit.bor(BANG, RANGE, BUFNAME, BUFUNL, COUNT, EXTRA, TRLBAR),
addr_type='ADDR_BUFFERS',
func='ex_bunload',
},
@@ -291,53 +297,59 @@ return {
},
{
command='cNext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='cNfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='cabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='cabclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_abclear',
},
{
command='cabove',
- flags=bit.bor(RANGE, TRLBAR),
- addr_type='ADDR_OTHER ',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='ex_cbelow',
},
{
command='caddbuffer',
- flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
command='caddexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='caddfile',
flags=bit.bor(TRLBAR, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
{
+ command='cafter',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
+ func='ex_cbelow',
+ },
+ {
command='call',
flags=bit.bor(RANGE, NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
addr_type='ADDR_LINES',
@@ -346,49 +358,55 @@ return {
{
command='catch',
flags=bit.bor(EXTRA, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_catch',
},
{
command='cbuffer',
- flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
+ command='cbefore',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
+ func='ex_cbelow',
+ },
+ {
command='cbelow',
- flags=bit.bor(RANGE, TRLBAR),
- addr_type='ADDR_OTHER ',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='ex_cbelow',
},
{
command='cbottom',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cbottom',
},
{
command='cc',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_QUICKFIX',
func='ex_cc',
},
{
command='cclose',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_cclose',
},
{
command='cd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='cdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
- addr_type='ADDR_QUICKFIX',
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
+ addr_type='ADDR_QUICKFIX_VALID',
func='ex_listdo',
},
{
@@ -400,159 +418,159 @@ return {
{
command='cexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='cfile',
flags=bit.bor(TRLBAR, FILE1, BANG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
-- Even though 'cfdo' is alphabetically lower than 'cfile', it is after
-- 'cfile' in this cmd list to support the existing ":cf" abbreviation.
{
command='cfdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
- addr_type='ADDR_QUICKFIX',
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
+ addr_type='ADDR_QUICKFIX_VALID',
func='ex_listdo',
},
{
command='cfirst',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='cgetfile',
flags=bit.bor(TRLBAR, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
{
command='cgetbuffer',
- flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
command='cgetexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='chdir',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='changes',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_changes',
},
{
command='checkhealth',
flags=bit.bor(EXTRA, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_checkhealth',
},
{
command='checkpath',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_checkpath',
},
{
command='checktime',
- flags=bit.bor(RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BUFNAME, COUNT, EXTRA, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_checktime',
},
{
command='chistory',
- flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_history',
},
{
command='clist',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='qf_list',
},
{
command='clast',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='close',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR, CMDWIN),
addr_type='ADDR_WINDOWS',
func='ex_close',
},
{
command='clearjumps',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_clearjumps',
},
{
command='cmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='cmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='cmenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='cnext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='cnewer',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_age',
},
{
command='cnfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='cnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='cnoreabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='cnoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
@@ -563,116 +581,116 @@ return {
},
{
command='colder',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_age',
},
{
command='colorscheme',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_colorscheme',
},
{
command='command',
- flags=bit.bor(EXTRA, BANG, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_command',
},
{
command='comclear',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_comclear',
},
{
command='compiler',
flags=bit.bor(BANG, TRLBAR, WORD1, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_compiler',
},
{
command='continue',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_continue',
},
{
command='confirm',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='const',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_const',
},
{
command='copen',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_copen',
},
{
command='cprevious',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='cpfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_OTHER',
func='ex_cnext',
},
{
command='cquit',
- flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, ZEROR, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cquit',
},
{
command='crewind',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='cscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cscope',
},
{
command='cstag',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cstag',
},
{
command='cunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='cunabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='cunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='cwindow',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cwindow',
},
{
@@ -684,43 +702,43 @@ return {
{
command='delmarks',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_delmarks',
},
{
command='debug',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_debug',
},
{
command='debuggreedy',
- flags=bit.bor(RANGE, NOTADR, ZEROR, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, TRLBAR, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_debuggreedy',
},
{
command='delcommand',
flags=bit.bor(BANG, NEEDARG, WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_delcommand',
},
{
command='delfunction',
flags=bit.bor(BANG, NEEDARG, WORD1, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_delfunction',
},
{
command='display',
flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_display',
},
{
command='diffupdate',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_diffupdate',
},
{
@@ -732,13 +750,13 @@ return {
{
command='diffoff',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_diffoff',
},
{
command='diffpatch',
flags=bit.bor(EXTRA, FILE1, TRLBAR, MODIFY),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_diffpatch',
},
{
@@ -750,19 +768,19 @@ return {
{
command='diffsplit',
flags=bit.bor(EXTRA, FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_diffsplit',
},
{
command='diffthis',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_diffthis',
},
{
command='digraphs',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_digraphs',
},
{
@@ -780,19 +798,19 @@ return {
{
command='doautocmd',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_doautocmd',
},
{
command='doautoall',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_doautoall',
},
{
command='drop',
- flags=bit.bor(FILES, EDITCMD, NEEDARG, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(FILES, CMDARG, NEEDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_drop',
},
{
@@ -809,110 +827,110 @@ return {
},
{
command='edit',
- flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='earlier',
flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_later',
},
{
command='echo',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_echo',
},
{
command='echoerr',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_execute',
},
{
command='echohl',
flags=bit.bor(EXTRA, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_echohl',
},
{
command='echomsg',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_execute',
},
{
command='echon',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_echo',
},
{
command='else',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_else',
},
{
command='elseif',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_else',
},
{
command='emenu',
- flags=bit.bor(NEEDARG, EXTRA, TRLBAR, NOTRLCOM, RANGE, NOTADR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(NEEDARG, EXTRA, TRLBAR, NOTRLCOM, RANGE, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_emenu',
},
{
command='endif',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_endif',
},
{
command='endfunction',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_endfunction',
},
{
command='endfor',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_endwhile',
},
{
command='endtry',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_endtry',
},
{
command='endwhile',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_endwhile',
},
{
command='enew',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='ex',
- flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='execute',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_execute',
},
{
@@ -924,55 +942,55 @@ return {
{
command='exusage',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_exusage',
},
{
command='file',
- flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, BANG, FILE1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_file',
},
{
command='files',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='buflist_list',
},
{
command='filetype',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_filetype',
},
{
command='filter',
flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='find',
- flags=bit.bor(RANGE, NOTADR, BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, FILE1, CMDARG, ARGOPT, TRLBAR, NEEDARG),
+ addr_type='ADDR_OTHER',
func='ex_find',
},
{
command='finally',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_finally',
},
{
command='finish',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_finish',
},
{
command='first',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_rewind',
},
{
@@ -1008,13 +1026,13 @@ return {
{
command='for',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_while',
},
{
command='function',
flags=bit.bor(EXTRA, BANG, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_function',
},
{
@@ -1025,56 +1043,56 @@ return {
},
{
command='goto',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, SBOXOK, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_goto',
},
{
command='grep',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_make',
},
{
command='grepadd',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_make',
},
{
command='gui',
- flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILES, CMDARG, ARGOPT, TRLBAR, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_nogui',
},
{
command='gvim',
- flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILES, CMDARG, ARGOPT, TRLBAR, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_nogui',
},
{
command='help',
flags=bit.bor(BANG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_help',
},
{
command='helpclose',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_helpclose',
},
{
command='helpgrep',
flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_helpgrep',
},
{
command='helptags',
flags=bit.bor(NEEDARG, FILES, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_helptags',
},
{
@@ -1086,19 +1104,19 @@ return {
{
command='highlight',
flags=bit.bor(BANG, EXTRA, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_highlight',
},
{
command='hide',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, TRLBAR),
+ flags=bit.bor(BANG, RANGE, COUNT, EXTRA, TRLBAR),
addr_type='ADDR_WINDOWS',
func='ex_hide',
},
{
command='history',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_history',
},
{
@@ -1109,20 +1127,20 @@ return {
},
{
command='iabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='iabclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_abclear',
},
{
command='if',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_if',
},
{
@@ -1139,44 +1157,44 @@ return {
},
{
command='imap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='imapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='imenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='inoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='inoreabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='inoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='intro',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_intro',
},
{
@@ -1193,32 +1211,32 @@ return {
},
{
command='iunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='iunabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='iunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='join',
- flags=bit.bor(BANG, RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ flags=bit.bor(BANG, RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN, MODIFY),
addr_type='ADDR_LINES',
func='ex_join',
},
{
command='jumps',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_jumps',
},
{
@@ -1230,133 +1248,145 @@ return {
{
command='keepmarks',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='keepjumps',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='keeppatterns',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='keepalt',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='list',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN),
addr_type='ADDR_LINES',
func='ex_print',
},
{
command='lNext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='lNfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='last',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_last',
},
{
command='labove',
- flags=bit.bor(RANGE, TRLBAR),
- addr_type='ADDR_OTHER ',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='ex_cbelow',
},
{
command='language',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_language',
},
{
command='laddexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='laddbuffer',
- flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
command='laddfile',
flags=bit.bor(TRLBAR, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
{
+ command='lafter',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
+ func='ex_cbelow',
+ },
+ {
command='later',
flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_later',
},
{
command='lbuffer',
- flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
+ command='lbefore',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
+ func='ex_cbelow',
+ },
+ {
command='lbelow',
- flags=bit.bor(RANGE, TRLBAR),
- addr_type='ADDR_OTHER ',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='ex_cbelow',
},
{
command='lbottom',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cbottom',
},
{
command='lcd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='lchdir',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='lclose',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cclose',
},
{
command='lcscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cscope',
},
{
command='ldo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
- addr_type='ADDR_QUICKFIX',
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
+ addr_type='ADDR_QUICKFIX_VALID',
func='ex_listdo',
},
{
@@ -1368,249 +1398,249 @@ return {
{
command='leftabove',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='let',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_let',
},
{
command='lexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='lfile',
flags=bit.bor(TRLBAR, FILE1, BANG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
-- Even though 'lfdo' is alphabetically lower than 'lfile', it is after
-- 'lfile' in this cmd list to support the existing ":lf" abbreviation.
{
command='lfdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
- addr_type='ADDR_QUICKFIX',
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
+ addr_type='ADDR_QUICKFIX_VALID',
func='ex_listdo',
},
{
command='lfirst',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='lgetfile',
flags=bit.bor(TRLBAR, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cfile',
},
{
command='lgetbuffer',
- flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, WORD1, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cbuffer',
},
{
command='lgetexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cexpr',
},
{
command='lgrep',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_make',
},
{
command='lgrepadd',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_make',
},
{
command='lhelpgrep',
flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_helpgrep',
},
{
command='lhistory',
- flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_history',
},
{
command='ll',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_QUICKFIX',
func='ex_cc',
},
{
command='llast',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='llist',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='qf_list',
},
{
command='lmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='lmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='lmake',
flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_make',
},
{
command='lnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='lnext',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='lnewer',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_age',
},
{
command='lnfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='loadview',
flags=bit.bor(FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_loadview',
},
{
command='loadkeymap',
flags=bit.bor(CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_loadkeymap',
},
{
command='lockmarks',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='lockvar',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_lockvar',
},
{
command='lolder',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_UNSIGNED',
func='qf_age',
},
{
command='lopen',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_copen',
},
{
command='lprevious',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cnext',
},
{
command='lpfile',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_OTHER',
func='ex_cnext',
},
{
command='lrewind',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR, BANG),
+ addr_type='ADDR_UNSIGNED',
func='ex_cc',
},
{
command='ltag',
- flags=bit.bor(NOTADR, TRLBAR, BANG, WORD1),
- addr_type='ADDR_LINES',
+ flags=bit.bor(TRLBAR, BANG, WORD1),
+ addr_type='ADDR_NONE',
func='ex_tag',
},
{
command='lunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='lua',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_lua',
},
{
command='luado',
- flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_luado',
},
{
command='luafile',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_luafile',
},
{
command='lvimgrep',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_vimgrep',
},
{
command='lvimgrepadd',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_vimgrep',
},
{
command='lwindow',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_cwindow',
},
{
command='ls',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='buflist_list',
},
{
@@ -1628,43 +1658,43 @@ return {
{
command='make',
flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_make',
},
{
command='map',
- flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='mapclear',
flags=bit.bor(EXTRA, BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='marks',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_marks',
},
{
command='match',
- flags=bit.bor(RANGE, NOTADR, EXTRA, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, EXTRA, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_match',
},
{
command='menu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='menutranslate',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menutranslate',
},
{
@@ -1676,37 +1706,37 @@ return {
{
command='mkexrc',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mkrc',
},
{
command='mksession',
flags=bit.bor(BANG, FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mkrc',
},
{
command='mkspell',
flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mkspell',
},
{
command='mkvimrc',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mkrc',
},
{
command='mkview',
flags=bit.bor(BANG, FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mkrc',
},
{
command='mode',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mode',
},
{
@@ -1723,260 +1753,260 @@ return {
},
{
command='next',
- flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, FILES, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_next',
},
{
command='new',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='nmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='nmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='nmenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='nnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='nnoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='noremap',
- flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='noautocmd',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='nohlsearch',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_nohlsearch',
},
{
command='noreabbrev',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='noremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='noswapfile',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='normal',
- flags=bit.bor(RANGE, BANG, EXTRA, NEEDARG, NOTRLCOM, USECTRLV, SBOXOK, CMDWIN),
+ flags=bit.bor(RANGE, BANG, EXTRA, NEEDARG, NOTRLCOM, CTRLV, SBOXOK, CMDWIN),
addr_type='ADDR_LINES',
func='ex_normal',
},
{
command='number',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN),
addr_type='ADDR_LINES',
func='ex_print',
},
{
command='nunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='nunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='oldfiles',
flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_oldfiles',
},
{
command='omap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='omapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='omenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='only',
- flags=bit.bor(BANG, NOTADR, RANGE, COUNT, TRLBAR),
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR),
addr_type='ADDR_WINDOWS',
func='ex_only',
},
{
command='onoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='onoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='options',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_options',
},
{
command='ounmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='ounmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='ownsyntax',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ownsyntax',
},
{
command='print',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, SBOXOK),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN, SBOXOK),
addr_type='ADDR_LINES',
func='ex_print',
},
{
command='packadd',
flags=bit.bor(BANG, FILE1, NEEDARG, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_packadd',
},
{
command='packloadall',
flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_packloadall',
},
{
command='pclose',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_pclose',
},
{
command='perl',
- flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, SBOXOK, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, SBOXOK, CMDWIN),
addr_type='ADDR_LINES',
func='ex_perl',
},
{
command='perldo',
- flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_perldo',
},
{
command='perlfile',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_perlfile',
},
{
command='pedit',
- flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_pedit',
},
{
command='pop',
- flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, COUNT, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='popup',
flags=bit.bor(NEEDARG, EXTRA, BANG, TRLBAR, NOTRLCOM, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ni',
},
{
command='ppop',
- flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, COUNT, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='preserve',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_preserve',
},
{
command='previous',
- flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, RANGE, COUNT, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_previous',
},
{
command='profile',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_profile',
},
{
command='profdel',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_breakdel',
},
{
@@ -1987,56 +2017,56 @@ return {
},
{
command='ptag',
- flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptNext',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptfirst',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ptag',
},
{
command='ptlast',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ptag',
},
{
command='ptnext',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptprevious',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptrewind',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_ptag',
},
{
command='ptselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ptag',
},
{
@@ -2048,91 +2078,91 @@ return {
{
command='pwd',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_pwd',
},
{
command='python',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_python',
},
{
command='pydo',
- flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pydo',
},
{
command='pyfile',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pyfile',
},
{
command='py3',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_python3',
},
{
command='py3do',
- flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pydo3',
},
{
command='python3',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_python3',
},
{
command='py3file',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_py3file',
},
{
command='pyx',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pyx',
},
{
command='pyxdo',
- flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pyxdo',
},
{
command='pythonx',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pyx',
},
{
command='pyxfile',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_pyxfile',
},
{
command='quit',
- flags=bit.bor(BANG, RANGE, COUNT, NOTADR, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR, CMDWIN),
addr_type='ADDR_WINDOWS',
func='ex_quit',
},
{
command='quitall',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_quit_all',
},
{
command='qall',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_quit_all',
},
{
@@ -2144,49 +2174,49 @@ return {
{
command='recover',
flags=bit.bor(BANG, FILE1, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_recover',
},
{
command='redo',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_redo',
},
{
command='redir',
flags=bit.bor(BANG, FILES, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_redir',
},
{
command='redraw',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_redraw',
},
{
command='redrawstatus',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_redrawstatus',
},
{
command='redrawtabline',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_redrawtabline',
},
{
command='registers',
flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_display',
},
{
command='resize',
- flags=bit.bor(RANGE, NOTADR, TRLBAR, WORD1, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, TRLBAR, WORD1, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_resize',
},
{
@@ -2198,13 +2228,13 @@ return {
{
command='return',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_return',
},
{
command='rewind',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_rewind',
},
{
@@ -2216,49 +2246,49 @@ return {
{
command='rightbelow',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='rshada',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_shada',
},
{
command='runtime',
flags=bit.bor(BANG, NEEDARG, FILES, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_runtime',
},
{
command='rundo',
flags=bit.bor(NEEDARG, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_rundo',
},
{
command='ruby',
- flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_ruby',
},
{
command='rubydo',
- flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_rubydo',
},
{
command='rubyfile',
- flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT),
+ flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
addr_type='ADDR_LINES',
func='ex_rubyfile',
},
{
command='rviminfo',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_shada',
},
{
@@ -2269,170 +2299,170 @@ return {
},
{
command='sNext',
- flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, RANGE, COUNT, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_previous',
},
{
command='sargument',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, RANGE, COUNT, EXTRA, CMDARG, ARGOPT, TRLBAR),
addr_type='ADDR_ARGUMENTS',
func='ex_argument',
},
{
command='sall',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_all',
},
{
command='sandbox',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='saveas',
- flags=bit.bor(BANG, DFLALL, FILE1, ARGOPT, CMDWIN, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, ARGOPT, CMDWIN, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_write',
},
{
command='sbuffer',
- flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR),
+ flags=bit.bor(BANG, RANGE, BUFNAME, BUFUNL, COUNT, EXTRA, CMDARG, TRLBAR),
addr_type='ADDR_BUFFERS',
func='ex_buffer',
},
{
command='sbNext',
- flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bprevious',
},
{
command='sball',
- flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_buffer_all',
},
{
command='sbfirst',
- flags=bit.bor(EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(CMDARG, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_brewind',
},
{
command='sblast',
- flags=bit.bor(EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(CMDARG, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_blast',
},
{
command='sbmodified',
- flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bmodified',
},
{
command='sbnext',
- flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bnext',
},
{
command='sbprevious',
- flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, CMDARG, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_bprevious',
},
{
command='sbrewind',
- flags=bit.bor(EDITCMD, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(CMDARG, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_brewind',
},
{
command='scriptnames',
- flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, COUNT, TRLBAR, CMDWIN),
addr_type='ADDR_OTHER',
func='ex_scriptnames',
},
{
command='scriptencoding',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_scriptencoding',
},
{
command='scscope',
flags=bit.bor(EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_scscope',
},
{
command='set',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_set',
},
{
command='setfiletype',
flags=bit.bor(TRLBAR, EXTRA, NEEDARG, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_setfiletype',
},
{
command='setglobal',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_set',
},
{
command='setlocal',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_set',
},
{
command='sfind',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR, NEEDARG),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='sfirst',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_rewind',
},
{
command='simalt',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ni',
},
{
command='sign',
- flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(NEEDARG, RANGE, EXTRA, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_sign',
},
{
command='silent',
flags=bit.bor(NEEDARG, EXTRA, BANG, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='sleep',
- flags=bit.bor(RANGE, NOTADR, COUNT, EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, COUNT, EXTRA, TRLBAR, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_sleep',
},
{
command='slast',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_last',
},
{
@@ -2443,26 +2473,26 @@ return {
},
{
command='smap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='smapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='smenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='snext',
- flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, FILES, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_next',
},
{
@@ -2473,20 +2503,20 @@ return {
},
{
command='snoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='snoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='source',
flags=bit.bor(BANG, FILE1, TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_source',
},
{
@@ -2497,158 +2527,158 @@ return {
},
{
command='split',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='spellgood',
- flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, NEEDARG, EXTRA, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_spell',
},
{
command='spelldump',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_spelldump',
},
{
command='spellinfo',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_spellinfo',
},
{
command='spellrepall',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_spellrepall',
},
{
command='spellundo',
- flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, NEEDARG, EXTRA, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_spell',
},
{
command='spellwrong',
- flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, RANGE, NEEDARG, EXTRA, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_spell',
},
{
command='sprevious',
- flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, RANGE, COUNT, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_previous',
},
{
command='srewind',
- flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_rewind',
},
{
command='stop',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_stop',
},
{
command='stag',
- flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_stag',
},
{
command='startinsert',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_startinsert',
},
{
command='startgreplace',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_startinsert',
},
{
command='startreplace',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_startinsert',
},
{
command='stopinsert',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_stopinsert',
},
{
command='stjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_stag',
},
{
command='stselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_stag',
},
{
command='sunhide',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_buffer_all',
},
{
command='sunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='sunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='suspend',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_stop',
},
{
command='sview',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='swapname',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_swapname',
},
{
command='syntax',
flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_syntax',
},
{
command='syntime',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_syntime',
},
{
command='syncbind',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_syncbind',
},
{
@@ -2660,121 +2690,121 @@ return {
{
command='tcd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='tchdir',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_cd',
},
{
command='tNext',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='tag',
- flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='tags',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='do_tags',
},
{
command='tab',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_TABS',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='tabclose',
- flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
addr_type='ADDR_TABS',
func='ex_tabclose',
},
{
command='tabdo',
- flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
addr_type='ADDR_TABS',
func='ex_listdo',
},
{
command='tabedit',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, FILE1, RANGE, ZEROR, CMDARG, ARGOPT, TRLBAR),
addr_type='ADDR_TABS',
func='ex_splitview',
},
{
command='tabfind',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, NEEDARG, TRLBAR),
+ flags=bit.bor(BANG, FILE1, RANGE, ZEROR, CMDARG, ARGOPT, NEEDARG, TRLBAR),
addr_type='ADDR_TABS',
func='ex_splitview',
},
{
command='tabfirst',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_TABS',
+ addr_type='ADDR_NONE',
func='ex_tabnext',
},
{
command='tabmove',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ flags=bit.bor(RANGE, ZEROR, EXTRA, NOSPC, TRLBAR),
addr_type='ADDR_TABS',
func='ex_tabmove',
},
{
command='tablast',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_TABS',
+ addr_type='ADDR_NONE',
func='ex_tabnext',
},
{
command='tabnext',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ flags=bit.bor(RANGE, ZEROR, EXTRA, NOSPC, TRLBAR),
addr_type='ADDR_TABS',
func='ex_tabnext',
},
{
command='tabnew',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, FILE1, RANGE, ZEROR, CMDARG, ARGOPT, TRLBAR),
addr_type='ADDR_TABS',
func='ex_splitview',
},
{
command='tabonly',
- flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN),
addr_type='ADDR_TABS',
func='ex_tabonly',
},
{
command='tabprevious',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ flags=bit.bor(RANGE, ZEROR, EXTRA, NOSPC, TRLBAR),
addr_type='ADDR_TABS_RELATIVE',
func='ex_tabnext',
},
{
command='tabNext',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ flags=bit.bor(RANGE, ZEROR, EXTRA, NOSPC, TRLBAR),
addr_type='ADDR_TABS_RELATIVE',
func='ex_tabnext',
},
{
command='tabrewind',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_TABS',
+ addr_type='ADDR_NONE',
func='ex_tabnext',
},
{
command='tabs',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_TABS',
+ addr_type='ADDR_NONE',
func='ex_tabs',
},
{
@@ -2798,163 +2828,163 @@ return {
{
command='terminal',
flags=bit.bor(BANG, FILES, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_terminal',
},
{
command='tfirst',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='throw',
flags=bit.bor(EXTRA, NEEDARG, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_throw',
},
{
command='tjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_tag',
},
{
command='tlast',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_tag',
},
{
command='tmenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='tmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='tmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='tnext',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='tnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='topleft',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='tprevious',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='trewind',
- flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, TRLBAR, ZEROR),
+ addr_type='ADDR_OTHER',
func='ex_tag',
},
{
command='try',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_try',
},
{
command='tselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_tag',
},
{
command='tunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='tunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='undo',
- flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, ZEROR, TRLBAR, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_undo',
},
{
command='undojoin',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_undojoin',
},
{
command='undolist',
flags=bit.bor(TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_undolist',
},
{
command='unabbreviate',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_abbreviate',
},
{
command='unhide',
- flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, COUNT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_buffer_all',
},
{
command='unlet',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_unlet',
},
{
command='unlockvar',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_lockvar',
},
{
command='unmap',
- flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='unmenu',
- flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
command='unsilent',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
@@ -2972,103 +3002,103 @@ return {
{
command='version',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_version',
},
{
command='verbose',
- flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(NEEDARG, RANGE, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_wrongmodifier',
},
{
command='vertical',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wrongmodifier',
},
{
command='visual',
- flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='view',
- flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='ex_edit',
},
{
command='vimgrep',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_vimgrep',
},
{
command='vimgrepadd',
- flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type='ADDR_OTHER',
func='ex_vimgrep',
},
{
command='viusage',
flags=bit.bor(TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_viusage',
},
{
command='vmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='vmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='vmenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='vnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='vnew',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='vnoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='vsplit',
- flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, RANGE, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_splitview',
},
{
command='vunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='vunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
@@ -3079,56 +3109,56 @@ return {
},
{
command='wNext',
- flags=bit.bor(RANGE, WHOLEFOLD, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_wnext',
},
{
command='wall',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='do_wqall',
},
{
command='while',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_while',
},
{
command='winsize',
flags=bit.bor(EXTRA, NEEDARG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_winsize',
},
{
command='wincmd',
- flags=bit.bor(NEEDARG, WORD1, RANGE, NOTADR, CMDWIN),
- addr_type='ADDR_WINDOWS',
+ flags=bit.bor(NEEDARG, WORD1, RANGE, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_wincmd',
},
{
command='windo',
- flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, DFLALL),
addr_type='ADDR_WINDOWS',
func='ex_listdo',
},
{
command='winpos',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_ni',
},
{
command='wnext',
- flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_wnext',
},
{
command='wprevious',
- flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_wnext',
},
{
@@ -3139,26 +3169,26 @@ return {
},
{
command='wqall',
- flags=bit.bor(BANG, FILE1, ARGOPT, DFLALL, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type='ADDR_NONE',
func='do_wqall',
},
{
command='wshada',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_shada',
},
{
command='wundo',
flags=bit.bor(BANG, NEEDARG, FILE1),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_wundo',
},
{
command='wviminfo',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_shada',
},
{
@@ -3170,49 +3200,49 @@ return {
{
command='xall',
flags=bit.bor(BANG, TRLBAR),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='do_wqall',
},
{
command='xmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='xmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
- addr_type='ADDR_LINES',
+ addr_type='ADDR_NONE',
func='ex_mapclear',
},
{
command='xmenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='xnoremap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_map',
},
{
command='xnoremenu',
- flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(RANGE, ZEROR, EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_OTHER',
func='ex_menu',
},
{
command='xunmap',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_unmap',
},
{
command='xunmenu',
- flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, CTRLV, CMDWIN),
+ addr_type='ADDR_NONE',
func='ex_menu',
},
{
@@ -3223,7 +3253,7 @@ return {
},
{
command='z',
- flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, EXFLAGS, TRLBAR, CMDWIN),
+ flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, FLAGS, TRLBAR, CMDWIN),
addr_type='ADDR_LINES',
func='ex_z',
},
@@ -3237,7 +3267,7 @@ return {
{
command='#',
enum='CMD_pound',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN),
addr_type='ADDR_LINES',
func='ex_print',
},
@@ -3251,21 +3281,21 @@ return {
{
command='<',
enum='CMD_lshift',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN, MODIFY),
addr_type='ADDR_LINES',
func='ex_operators',
},
{
command='=',
enum='CMD_equal',
- flags=bit.bor(RANGE, TRLBAR, DFLALL, EXFLAGS, CMDWIN),
+ flags=bit.bor(RANGE, TRLBAR, DFLALL, FLAGS, CMDWIN),
addr_type='ADDR_LINES',
func='ex_equal',
},
{
command='>',
enum='CMD_rshift',
- flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ flags=bit.bor(RANGE, WHOLEFOLD, COUNT, FLAGS, TRLBAR, CMDWIN, MODIFY),
addr_type='ADDR_LINES',
func='ex_operators',
},
@@ -3278,8 +3308,8 @@ return {
},
{
command='Next',
- flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
- addr_type='ADDR_LINES',
+ flags=bit.bor(EXTRA, RANGE, COUNT, BANG, CMDARG, ARGOPT, TRLBAR),
+ addr_type='ADDR_OTHER',
func='ex_previous',
},
{
@@ -3290,3 +3320,5 @@ return {
func='ex_substitute',
},
}
+
+return module
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index bde584d27e..c400975108 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -2113,7 +2113,7 @@ void ex_listdo(exarg_T *eap)
}
} else if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
|| eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo) {
- qf_size = qf_get_size(eap);
+ qf_size = qf_get_valid_size(eap);
assert(eap->line1 >= 0);
if (qf_size == 0 || (size_t)eap->line1 > qf_size) {
buf = NULL;
diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h
index 5613ae4b8c..ca84d375ce 100644
--- a/src/nvim/ex_cmds_defs.h
+++ b/src/nvim/ex_cmds_defs.h
@@ -36,35 +36,34 @@
// 4. Add documentation in ../doc/xxx.txt. Add a tag for both the short and
// long name of the command.
-#define RANGE 0x001 // allow a linespecs
-#define BANG 0x002 // allow a ! after the command name
-#define EXTRA 0x004 // allow extra args after command name
-#define XFILE 0x008 // expand wildcards in extra part
-#define NOSPC 0x010 // no spaces allowed in the extra part
-#define DFLALL 0x020 // default file range is 1,$
-#define WHOLEFOLD 0x040 // extend range to include whole fold also
- // when less than two numbers given
-#define NEEDARG 0x080 // argument required
-#define TRLBAR 0x100 // check for trailing vertical bar
-#define REGSTR 0x200 // allow "x for register designation
-#define COUNT 0x400 // allow count in argument, after command
-#define NOTRLCOM 0x800 // no trailing comment allowed
-#define ZEROR 0x1000 // zero line number allowed
-#define USECTRLV 0x2000 // do not remove CTRL-V from argument
-#define NOTADR 0x4000 // number before command is not an address
-#define EDITCMD 0x8000 // allow "+command" argument
-#define BUFNAME 0x10000 // accepts buffer name
-#define BUFUNL 0x20000 // accepts unlisted buffer too
-#define ARGOPT 0x40000 // allow "++opt=val" argument
-#define SBOXOK 0x80000 // allowed in the sandbox
-#define CMDWIN 0x100000 // allowed in cmdline window; when missing
- // disallows editing another buffer when
- // curbuf_lock is set
-#define MODIFY 0x200000 // forbidden in non-'modifiable' buffer
-#define EXFLAGS 0x400000 // allow flags after count in argument
-#define FILES (XFILE | EXTRA) // multiple extra files allowed
-#define WORD1 (EXTRA | NOSPC) // one extra word allowed
-#define FILE1 (FILES | NOSPC) // 1 file allowed, defaults to current file
+#define EX_RANGE 0x001 // allow a linespecs
+#define EX_BANG 0x002 // allow a ! after the command name
+#define EX_EXTRA 0x004 // allow extra args after command name
+#define EX_XFILE 0x008 // expand wildcards in extra part
+#define EX_NOSPC 0x010 // no spaces allowed in the extra part
+#define EX_DFLALL 0x020 // default file range is 1,$
+#define EX_WHOLEFOLD 0x040 // extend range to include whole fold also
+ // when less than two numbers given
+#define EX_NEEDARG 0x080 // argument required
+#define EX_TRLBAR 0x100 // check for trailing vertical bar
+#define EX_REGSTR 0x200 // allow "x for register designation
+#define EX_COUNT 0x400 // allow count in argument, after command
+#define EX_NOTRLCOM 0x800 // no trailing comment allowed
+#define EX_ZEROR 0x1000 // zero line number allowed
+#define EX_CTRLV 0x2000 // do not remove CTRL-V from argument
+#define EX_CMDARG 0x4000 // allow "+command" argument
+#define EX_BUFNAME 0x8000 // accepts buffer name
+#define EX_BUFUNL 0x10000 // accepts unlisted buffer too
+#define EX_ARGOPT 0x20000 // allow "++opt=val" argument
+#define EX_SBOXOK 0x40000 // allowed in the sandbox
+#define EX_CMDWIN 0x80000 // allowed in cmdline window; when missing
+ // disallows editing another buffer when
+ // curbuf_lock is set
+#define EX_MODIFY 0x100000 // forbidden in non-'modifiable' buffer
+#define EX_FLAGS 0x200000 // allow flags after count in argument
+#define EX_FILES (EX_XFILE | EX_EXTRA) // multiple extra files allowed
+#define EX_FILE1 (EX_FILES | EX_NOSPC) // 1 file, defaults to current file
+#define EX_WORD1 (EX_EXTRA | EX_NOSPC) // one extra word allowed
// values for cmd_addr_type
typedef enum {
@@ -75,8 +74,10 @@ typedef enum {
ADDR_BUFFERS, // buffer number
ADDR_TABS, // tab page number
ADDR_TABS_RELATIVE, // Tab page that only relative
+ ADDR_QUICKFIX_VALID, // quickfix list valid entry number
ADDR_QUICKFIX, // quickfix list entry number
- ADDR_OTHER, // something else
+ ADDR_UNSIGNED, // positive count or zero, defaults to 1
+ ADDR_OTHER, // something else, use line number for '$', '%', etc.
ADDR_NONE // no range used
} cmd_addr_T;
@@ -153,7 +154,7 @@ struct exarg {
int addr_count; ///< the number of addresses given
linenr_T line1; ///< the first line number
linenr_T line2; ///< the second line number or count
- int addr_type; ///< type of the count/range
+ cmd_addr_T addr_type; ///< type of the count/range
int flags; ///< extra flags after count: EXFLAG_
char_u *do_ecmd_cmd; ///< +command arg to be used in edited file
linenr_T do_ecmd_lnum; ///< the line number in an edited file
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 003c78b241..ccf7dd0f68 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1086,7 +1086,10 @@ static int compute_buffer_local_count(int addr_type, int lnum, int offset)
return buf->b_fnum;
}
-static int current_win_nr(win_T *win)
+// Return the window number of "win".
+// When "win" is NULL return the number of windows.
+static int current_win_nr(const win_T *win)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
int nr = 0;
@@ -1163,7 +1166,7 @@ static void get_wincmd_addr_type(char_u *arg, exarg_T *eap)
case 'd':
case Ctrl_D:
// window size or any count
- eap->addr_type = ADDR_LINES; // -V1037
+ eap->addr_type = ADDR_OTHER; // -V1037
break;
case Ctrl_HAT:
@@ -1199,7 +1202,7 @@ static void get_wincmd_addr_type(char_u *arg, exarg_T *eap)
case '=':
case CAR:
// no count
- eap->addr_type = 0;
+ eap->addr_type = ADDR_NONE;
break;
}
}
@@ -1380,6 +1383,10 @@ static char_u * do_one_cmd(char_u **cmdlinep,
if (ea.cmdidx == CMD_wincmd && p != NULL) {
get_wincmd_addr_type(skipwhite(p), &ea);
}
+ // :.cc in quickfix window uses line number
+ if ((ea.cmdidx == CMD_cc || ea.cmdidx == CMD_ll) && bt_quickfix(curbuf)) {
+ ea.addr_type = ADDR_OTHER;
+ }
}
ea.cmd = cmd;
@@ -1411,7 +1418,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
if (*ea.cmd == '|' || (exmode_active && ea.line1 != ea.line2)) {
ea.cmdidx = CMD_print;
- ea.argt = RANGE | COUNT | TRLBAR;
+ ea.argt = EX_RANGE | EX_COUNT | EX_TRLBAR;
if ((errormsg = invalid_range(&ea)) == NULL) {
correct_range(&ea);
ex_print(&ea);
@@ -1490,20 +1497,18 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.forceit = false;
}
- /*
- * 6. Parse arguments.
- */
+ // 6. Parse arguments. Then check for errors.
if (!IS_USER_CMDIDX(ea.cmdidx)) {
ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt;
}
if (!ea.skip) {
- if (sandbox != 0 && !(ea.argt & SBOXOK)) {
+ if (sandbox != 0 && !(ea.argt & EX_SBOXOK)) {
// Command not allowed in sandbox.
errormsg = (char_u *)_(e_sandbox);
goto doend;
}
- if (!MODIFIABLE(curbuf) && (ea.argt & MODIFY)
+ if (!MODIFIABLE(curbuf) && (ea.argt & EX_MODIFY)
// allow :put in terminals
&& (!curbuf->terminal || ea.cmdidx != CMD_put)) {
/* Command not allowed in non-'modifiable' buffer */
@@ -1511,7 +1516,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
}
- if (text_locked() && !(ea.argt & CMDWIN)
+ if (text_locked() && !(ea.argt & EX_CMDWIN)
&& !IS_USER_CMDIDX(ea.cmdidx)) {
// Command not allowed when editing the command line.
errormsg = (char_u *)_(get_text_locked_msg());
@@ -1522,7 +1527,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
// Do allow ":checktime" (it is postponed).
// Do allow ":edit" (check for an argument later).
// Do allow ":file" with no arguments (check for an argument later).
- if (!(ea.argt & CMDWIN)
+ if (!(ea.argt & EX_CMDWIN)
&& ea.cmdidx != CMD_checktime
&& ea.cmdidx != CMD_edit
&& ea.cmdidx != CMD_file
@@ -1531,14 +1536,14 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
}
- if (!ni && !(ea.argt & RANGE) && ea.addr_count > 0) {
- /* no range allowed */
+ if (!ni && !(ea.argt & EX_RANGE) && ea.addr_count > 0) {
+ // no range allowed
errormsg = (char_u *)_(e_norange);
goto doend;
}
}
- if (!ni && !(ea.argt & BANG) && ea.forceit) { /* no <!> allowed */
+ if (!ni && !(ea.argt & EX_BANG) && ea.forceit) { // no <!> allowed
errormsg = (char_u *)_(e_nobang);
goto doend;
}
@@ -1547,12 +1552,10 @@ static char_u * do_one_cmd(char_u **cmdlinep,
* Don't complain about the range if it is not used
* (could happen if line_count is accidentally set to 0).
*/
- if (!ea.skip && !ni) {
- /*
- * If the range is backwards, ask for confirmation and, if given, swap
- * ea.line1 & ea.line2 so it's forwards again.
- * When global command is busy, don't ask, will fail below.
- */
+ if (!ea.skip && !ni && (ea.argt & EX_RANGE)) {
+ // If the range is backwards, ask for confirmation and, if given, swap
+ // ea.line1 & ea.line2 so it's forwards again.
+ // When global command is busy, don't ask, will fail below.
if (!global_busy && ea.line1 > ea.line2) {
if (msg_silent == 0) {
if ((flags & DOCMD_VERBOSE) || exmode_active) {
@@ -1571,12 +1574,14 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
}
- if ((ea.argt & NOTADR) && ea.addr_count == 0) /* default is 1, not cursor */
+ if ((ea.addr_type == ADDR_OTHER) && ea.addr_count == 0) {
+ // default is 1, not cursor
ea.line2 = 1;
+ }
correct_range(&ea);
- if (((ea.argt & WHOLEFOLD) || ea.addr_count >= 2) && !global_busy
+ if (((ea.argt & EX_WHOLEFOLD) || ea.addr_count >= 2) && !global_busy
&& ea.addr_type == ADDR_LINES) {
// Put the first line at the start of a closed fold, put the last line
// at the end of a closed fold.
@@ -1610,12 +1615,14 @@ static char_u * do_one_cmd(char_u **cmdlinep,
* Check for "++opt=val" argument.
* Must be first, allow ":w ++enc=utf8 !cmd"
*/
- if (ea.argt & ARGOPT)
- while (ea.arg[0] == '+' && ea.arg[1] == '+')
+ if (ea.argt & EX_ARGOPT) {
+ while (ea.arg[0] == '+' && ea.arg[1] == '+') {
if (getargopt(&ea) == FAIL && !ni) {
errormsg = (char_u *)_(e_invarg);
goto doend;
}
+ }
+ }
if (ea.cmdidx == CMD_write || ea.cmdidx == CMD_update) {
if (*ea.arg == '>') { /* append */
@@ -1654,14 +1661,15 @@ static char_u * do_one_cmd(char_u **cmdlinep,
* Check for "+command" argument, before checking for next command.
* Don't do this for ":read !cmd" and ":write !cmd".
*/
- if ((ea.argt & EDITCMD) && !ea.usefilter)
+ if ((ea.argt & EX_CMDARG) && !ea.usefilter) {
ea.do_ecmd_cmd = getargcmd(&ea.arg);
+ }
/*
* Check for '|' to separate commands and '"' to start comments.
* Don't do this for ":read !cmd" and ":write !cmd".
*/
- if ((ea.argt & TRLBAR) && !ea.usefilter) {
+ if ((ea.argt & EX_TRLBAR) && !ea.usefilter) {
separate_nextcmd(&ea);
} else if (ea.cmdidx == CMD_bang
|| ea.cmdidx == CMD_terminal
@@ -1688,12 +1696,13 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
}
- if ((ea.argt & DFLALL) && ea.addr_count == 0) {
+ if ((ea.argt & EX_DFLALL) && ea.addr_count == 0) {
buf_T *buf;
ea.line1 = 1;
switch (ea.addr_type) {
case ADDR_LINES:
+ case ADDR_OTHER:
ea.line2 = curbuf->b_ml.ml_line_count;
break;
case ADDR_LOADED_BUFFERS:
@@ -1728,24 +1737,27 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 = ARGCOUNT;
}
break;
- case ADDR_QUICKFIX:
- ea.line2 = qf_get_size(&ea);
+ case ADDR_QUICKFIX_VALID:
+ ea.line2 = qf_get_valid_size(&ea);
if (ea.line2 == 0) {
ea.line2 = 1;
}
break;
case ADDR_NONE:
- IEMSG(_("INTERNAL: Cannot use DFLALL with ADDR_NONE"));
+ case ADDR_UNSIGNED:
+ case ADDR_QUICKFIX:
+ IEMSG(_("INTERNAL: Cannot use EX_DFLALL "
+ "with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX"));
break;
}
}
- /* accept numbered register only when no count allowed (:put) */
- if ((ea.argt & REGSTR)
+ // accept numbered register only when no count allowed (:put)
+ if ((ea.argt & EX_REGSTR)
&& *ea.arg != NUL
/* Do not allow register = for user commands */
&& (!IS_USER_CMDIDX(ea.cmdidx) || *ea.arg != '=')
- && !((ea.argt & COUNT) && ascii_isdigit(*ea.arg))) {
+ && !((ea.argt & EX_COUNT) && ascii_isdigit(*ea.arg))) {
if (valid_yank_reg(*ea.arg, (ea.cmdidx != CMD_put
&& !IS_USER_CMDIDX(ea.cmdidx)))) {
ea.regname = *ea.arg++;
@@ -1759,19 +1771,19 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
//
- // Check for a count. When accepting a BUFNAME, don't use "123foo" as a
+ // Check for a count. When accepting a EX_BUFNAME, don't use "123foo" as a
// count, it's a buffer name.
///
- if ((ea.argt & COUNT) && ascii_isdigit(*ea.arg)
- && (!(ea.argt & BUFNAME) || *(p = skipdigits(ea.arg)) == NUL
+ if ((ea.argt & EX_COUNT) && ascii_isdigit(*ea.arg)
+ && (!(ea.argt & EX_BUFNAME) || *(p = skipdigits(ea.arg)) == NUL
|| ascii_iswhite(*p))) {
n = getdigits_long(&ea.arg, false, -1);
ea.arg = skipwhite(ea.arg);
- if (n <= 0 && !ni && (ea.argt & ZEROR) == 0) {
+ if (n <= 0 && !ni && (ea.argt & EX_ZEROR) == 0) {
errormsg = (char_u *)_(e_zerocount);
goto doend;
}
- if (ea.argt & NOTADR) { /* e.g. :buffer 2, :sleep 3 */
+ if (ea.addr_type != ADDR_LINES) { // e.g. :buffer 2, :sleep 3
ea.line2 = n;
if (ea.addr_count == 0)
ea.addr_count = 1;
@@ -1780,8 +1792,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.line2 += n - 1;
++ea.addr_count;
// Be vi compatible: no error message for out of range.
- if (ea.addr_type == ADDR_LINES
- && ea.line2 > curbuf->b_ml.ml_line_count) {
+ if (ea.line2 > curbuf->b_ml.ml_line_count) {
ea.line2 = curbuf->b_ml.ml_line_count;
}
}
@@ -1790,16 +1801,17 @@ static char_u * do_one_cmd(char_u **cmdlinep,
/*
* Check for flags: 'l', 'p' and '#'.
*/
- if (ea.argt & EXFLAGS)
+ if (ea.argt & EX_FLAGS) {
get_flags(&ea);
- /* no arguments allowed */
- if (!ni && !(ea.argt & EXTRA) && *ea.arg != NUL
- && *ea.arg != '"' && (*ea.arg != '|' || (ea.argt & TRLBAR) == 0)) {
+ }
+ if (!ni && !(ea.argt & EX_EXTRA) && *ea.arg != NUL
+ && *ea.arg != '"' && (*ea.arg != '|' || (ea.argt & EX_TRLBAR) == 0)) {
+ // no arguments allowed but there is something
errormsg = (char_u *)_(e_trailing);
goto doend;
}
- if (!ni && (ea.argt & NEEDARG) && *ea.arg == NUL) {
+ if (!ni && (ea.argt & EX_NEEDARG) && *ea.arg == NUL) {
errormsg = (char_u *)_(e_argreq);
goto doend;
}
@@ -1828,9 +1840,9 @@ static char_u * do_one_cmd(char_u **cmdlinep,
case CMD_function:
break;
- /* Commands that handle '|' themselves. Check: A command should
- * either have the TRLBAR flag, appear in this list or appear in
- * the list at ":help :bar". */
+ // Commands that handle '|' themselves. Check: A command should
+ // either have the EX_TRLBAR flag, appear in this list or appear in
+ // the list at ":help :bar".
case CMD_aboveleft:
case CMD_and:
case CMD_belowright:
@@ -1901,16 +1913,17 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
}
- if (ea.argt & XFILE) {
- if (expand_filename(&ea, cmdlinep, &errormsg) == FAIL)
+ if (ea.argt & EX_XFILE) {
+ if (expand_filename(&ea, cmdlinep, &errormsg) == FAIL) {
goto doend;
+ }
}
/*
* Accept buffer name. Cannot be used at the same time with a buffer
* number. Don't do this for a user command.
*/
- if ((ea.argt & BUFNAME) && *ea.arg != NUL && ea.addr_count == 0
+ if ((ea.argt & EX_BUFNAME) && *ea.arg != NUL && ea.addr_count == 0
&& !IS_USER_CMDIDX(ea.cmdidx)
) {
/*
@@ -1926,10 +1939,11 @@ static char_u * do_one_cmd(char_u **cmdlinep,
while (p > ea.arg && ascii_iswhite(p[-1]))
--p;
}
- ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & BUFUNL) != 0,
- FALSE, FALSE);
- if (ea.line2 < 0) /* failed */
+ ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & EX_BUFUNL) != 0,
+ false, false);
+ if (ea.line2 < 0) { // failed
goto doend;
+ }
ea.addr_count = 1;
ea.arg = skipwhite(p);
}
@@ -2325,6 +2339,7 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
eap->line1 = eap->line2;
switch (eap->addr_type) {
case ADDR_LINES:
+ case ADDR_OTHER:
// default is current line number
eap->line2 = curwin->w_cursor.lnum;
break;
@@ -2345,9 +2360,13 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
eap->line2 = CURRENT_TAB_NR;
break;
case ADDR_TABS_RELATIVE:
+ case ADDR_UNSIGNED:
eap->line2 = 1;
break;
case ADDR_QUICKFIX:
+ eap->line2 = qf_get_cur_idx(eap);
+ break;
+ case ADDR_QUICKFIX_VALID:
eap->line2 = qf_get_cur_valid_idx(eap);
break;
case ADDR_NONE:
@@ -2365,6 +2384,7 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
eap->cmd++;
switch (eap->addr_type) {
case ADDR_LINES:
+ case ADDR_OTHER:
eap->line1 = 1;
eap->line2 = curbuf->b_ml.ml_line_count;
break;
@@ -2400,7 +2420,8 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
}
break;
case ADDR_TABS_RELATIVE:
- case ADDR_OTHER:
+ case ADDR_UNSIGNED:
+ case ADDR_QUICKFIX:
*errormsg = (char_u *)_(e_invrange);
return FAIL;
case ADDR_ARGUMENTS:
@@ -2411,9 +2432,9 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent)
eap->line2 = ARGCOUNT;
}
break;
- case ADDR_QUICKFIX:
+ case ADDR_QUICKFIX_VALID:
eap->line1 = 1;
- eap->line2 = qf_get_size(eap);
+ eap->line2 = qf_get_valid_size(eap);
if (eap->line2 == 0) {
eap->line2 = 1;
}
@@ -2522,14 +2543,13 @@ static void append_command(char_u *cmd)
*d = NUL;
}
-/*
- * Find an Ex command by its name, either built-in or user.
- * Start of the name can be found at eap->cmd.
- * Returns pointer to char after the command name.
- * "full" is set to TRUE if the whole command name matched.
- * Returns NULL for an ambiguous user command.
- */
+// Find an Ex command by its name, either built-in or user.
+// Start of the name can be found at eap->cmd.
+// Sets eap->cmdidx and returns a pointer to char after the command name.
+// "full" is set to TRUE if the whole command name matched.
+// Returns NULL for an ambiguous user command.
static char_u *find_command(exarg_T *eap, int *full)
+ FUNC_ATTR_NONNULL_ARG(1)
{
int len;
char_u *p;
@@ -2980,7 +3000,7 @@ const char * set_one_cmd_context(
const char *arg = (const char *)skipwhite((const char_u *)p);
// Skip over ++argopt argument
- if ((ea.argt & ARGOPT) && *arg != NUL && strncmp(arg, "++", 2) == 0) {
+ if ((ea.argt & EX_ARGOPT) && *arg != NUL && strncmp(arg, "++", 2) == 0) {
p = arg;
while (*p && !ascii_isspace(*p)) {
MB_PTR_ADV(p);
@@ -3015,9 +3035,9 @@ const char * set_one_cmd_context(
arg = (const char *)skipwhite((const char_u *)arg);
}
- /* Does command allow "+command"? */
- if ((ea.argt & EDITCMD) && !usefilter && *arg == '+') {
- /* Check if we're in the +command */
+ // Does command allow "+command"?
+ if ((ea.argt & EX_CMDARG) && !usefilter && *arg == '+') {
+ // Check if we're in the +command
p = arg + 1;
arg = (const char *)skip_cmd_arg((char_u *)arg, false);
@@ -3033,17 +3053,19 @@ const char * set_one_cmd_context(
* Check for '|' to separate commands and '"' to start comments.
* Don't do this for ":read !cmd" and ":write !cmd".
*/
- if ((ea.argt & TRLBAR) && !usefilter) {
+ if ((ea.argt & EX_TRLBAR) && !usefilter) {
p = arg;
/* ":redir @" is not the start of a comment */
if (ea.cmdidx == CMD_redir && p[0] == '@' && p[1] == '"')
p += 2;
while (*p) {
if (*p == Ctrl_V) {
- if (p[1] != NUL)
- ++p;
- } else if ( (*p == '"' && !(ea.argt & NOTRLCOM))
- || *p == '|' || *p == '\n') {
+ if (p[1] != NUL) {
+ p++;
+ }
+ } else if ((*p == '"' && !(ea.argt & EX_NOTRLCOM))
+ || *p == '|'
+ || *p == '\n') {
if (*(p - 1) != '\\') {
if (*p == '|' || *p == '\n')
return p + 1;
@@ -3054,8 +3076,8 @@ const char * set_one_cmd_context(
}
}
- // no arguments allowed
- if (!(ea.argt & EXTRA) && *arg != NUL && strchr("|\"", *arg) == NULL) {
+ if (!(ea.argt & EX_EXTRA) && *arg != NUL && strchr("|\"", *arg) == NULL) {
+ // no arguments allowed but there is something
return NULL;
}
@@ -3075,7 +3097,7 @@ const char * set_one_cmd_context(
}
}
- if (ea.argt & XFILE) {
+ if (ea.argt & EX_XFILE) {
int c;
int in_quote = false;
const char *bow = NULL; // Beginning of word.
@@ -3496,8 +3518,8 @@ const char * set_one_cmd_context(
case CMD_USER:
case CMD_USER_BUF:
if (context != EXPAND_NOTHING) {
- // XFILE: file names are handled above.
- if (!(ea.argt & XFILE)) {
+ // EX_XFILE: file names are handled above.
+ if (!(ea.argt & EX_XFILE)) {
if (context == EXPAND_MENUS) {
return (const char *)set_context_in_menu_cmd(xp, (char_u *)cmd,
(char_u *)arg, forceit);
@@ -3707,6 +3729,15 @@ char_u *skip_range(
return (char_u *)cmd;
}
+static void addr_error(cmd_addr_T addr_type)
+{
+ if (addr_type == ADDR_NONE) {
+ EMSG(_(e_norange));
+ } else {
+ EMSG(_(e_invrange));
+ }
+}
+
// Get a single EX address
//
// Set ptr to the next character after the part that was interpreted.
@@ -3716,14 +3747,13 @@ char_u *skip_range(
// Return MAXLNUM when no Ex address was found.
static linenr_T get_address(exarg_T *eap,
char_u **ptr,
- cmd_addr_T addr_type_arg,
+ cmd_addr_T addr_type,
int skip, // only skip the address, don't use it
bool silent, // no errors or side effects
int to_other_file, // flag: may jump to other file
int address_count) // 1 for first, >1 after comma
FUNC_ATTR_NONNULL_ALL
{
- const int addr_type = addr_type_arg;
int c;
int i;
long n;
@@ -3741,6 +3771,7 @@ static linenr_T get_address(exarg_T *eap,
++cmd;
switch (addr_type) {
case ADDR_LINES:
+ case ADDR_OTHER:
lnum = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
@@ -3756,13 +3787,17 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_TABS:
lnum = CURRENT_TAB_NR;
break;
- case ADDR_TABS_RELATIVE:
case ADDR_NONE:
- EMSG(_(e_invrange));
+ case ADDR_TABS_RELATIVE:
+ case ADDR_UNSIGNED:
+ addr_error(addr_type);
cmd = NULL;
goto error;
break;
case ADDR_QUICKFIX:
+ lnum = qf_get_cur_idx(eap);
+ break;
+ case ADDR_QUICKFIX_VALID:
lnum = qf_get_cur_valid_idx(eap);
break;
}
@@ -3772,6 +3807,7 @@ static linenr_T get_address(exarg_T *eap,
++cmd;
switch (addr_type) {
case ADDR_LINES:
+ case ADDR_OTHER:
lnum = curbuf->b_ml.ml_line_count;
break;
case ADDR_WINDOWS:
@@ -3796,9 +3832,10 @@ static linenr_T get_address(exarg_T *eap,
case ADDR_TABS:
lnum = LAST_TAB_NR;
break;
- case ADDR_TABS_RELATIVE:
case ADDR_NONE:
- EMSG(_(e_invrange));
+ case ADDR_TABS_RELATIVE:
+ case ADDR_UNSIGNED:
+ addr_error(addr_type);
cmd = NULL;
goto error;
break;
@@ -3808,6 +3845,12 @@ static linenr_T get_address(exarg_T *eap,
lnum = 1;
}
break;
+ case ADDR_QUICKFIX_VALID:
+ lnum = qf_get_valid_size(eap);
+ if (lnum == 0) {
+ lnum = 1;
+ }
+ break;
}
break;
@@ -3817,7 +3860,7 @@ static linenr_T get_address(exarg_T *eap,
goto error;
}
if (addr_type != ADDR_LINES) {
- EMSG(_(e_invaddr));
+ addr_error(addr_type);
cmd = NULL;
goto error;
}
@@ -3845,7 +3888,7 @@ static linenr_T get_address(exarg_T *eap,
case '?': /* '/' or '?' - search */
c = *cmd++;
if (addr_type != ADDR_LINES) {
- EMSG(_(e_invaddr));
+ addr_error(addr_type);
cmd = NULL;
goto error;
}
@@ -3892,7 +3935,7 @@ static linenr_T get_address(exarg_T *eap,
case '\\': /* "\?", "\/" or "\&", repeat search */
++cmd;
if (addr_type != ADDR_LINES) {
- EMSG(_(e_invaddr));
+ addr_error(addr_type);
cmd = NULL;
goto error;
}
@@ -3939,7 +3982,9 @@ static linenr_T get_address(exarg_T *eap,
if (lnum == MAXLNUM) {
switch (addr_type) {
case ADDR_LINES:
- lnum = curwin->w_cursor.lnum; /* "+1" is same as ".+1" */
+ case ADDR_OTHER:
+ // "+1" is same as ".+1"
+ lnum = curwin->w_cursor.lnum;
break;
case ADDR_WINDOWS:
lnum = CURRENT_WIN_NR;
@@ -3958,9 +4003,14 @@ static linenr_T get_address(exarg_T *eap,
lnum = 1;
break;
case ADDR_QUICKFIX:
+ lnum = qf_get_cur_idx(eap);
+ break;
+ case ADDR_QUICKFIX_VALID:
lnum = qf_get_cur_valid_idx(eap);
break;
case ADDR_NONE:
+ case ADDR_UNSIGNED:
+ lnum = 0;
break;
}
}
@@ -4051,12 +4101,11 @@ static char_u *invalid_range(exarg_T *eap)
return (char_u *)_(e_invrange);
}
- if (eap->argt & RANGE) {
- switch(eap->addr_type) {
+ if (eap->argt & EX_RANGE) {
+ switch (eap->addr_type) {
case ADDR_LINES:
- if (!(eap->argt & NOTADR)
- && eap->line2 > curbuf->b_ml.ml_line_count
- + (eap->cmdidx == CMD_diffget)) {
+ if (eap->line2 > (curbuf->b_ml.ml_line_count
+ + (eap->cmdidx == CMD_diffget))) {
return (char_u *)_(e_invrange);
}
break;
@@ -4105,11 +4154,24 @@ static char_u *invalid_range(exarg_T *eap)
}
break;
case ADDR_TABS_RELATIVE:
- // Do nothing
+ case ADDR_OTHER:
+ // Any range is OK.
break;
case ADDR_QUICKFIX:
assert(eap->line2 >= 0);
- if (eap->line2 != 1 && (size_t)eap->line2 > qf_get_size(eap)) {
+ // No error for value that is too big, will use the last entry.
+ if (eap->line2 <= 0) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_QUICKFIX_VALID:
+ if ((eap->line2 != 1 && (size_t)eap->line2 > qf_get_valid_size(eap))
+ || eap->line2 < 0) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_UNSIGNED:
+ if (eap->line2 < 0) {
return (char_u *)_(e_invrange);
}
break;
@@ -4126,11 +4188,13 @@ static char_u *invalid_range(exarg_T *eap)
*/
static void correct_range(exarg_T *eap)
{
- if (!(eap->argt & ZEROR)) { /* zero in range not allowed */
- if (eap->line1 == 0)
+ if (!(eap->argt & EX_ZEROR)) { // zero in range not allowed
+ if (eap->line1 == 0) {
eap->line1 = 1;
- if (eap->line2 == 0)
+ }
+ if (eap->line2 == 0) {
eap->line2 = 1;
+ }
}
}
@@ -4297,7 +4361,7 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
&& eap->cmdidx != CMD_lmake
&& eap->cmdidx != CMD_make
&& eap->cmdidx != CMD_terminal
- && !(eap->argt & NOSPC)
+ && !(eap->argt & EX_NOSPC)
) {
char_u *l;
#ifdef BACKSLASH_IN_FILENAME
@@ -4338,7 +4402,7 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp)
* One file argument: Expand wildcards.
* Don't do this with ":r !command" or ":w !command".
*/
- if ((eap->argt & NOSPC) && !eap->usefilter) {
+ if ((eap->argt & EX_NOSPC) && !eap->usefilter) {
// Replace environment variables.
if (has_wildcards) {
/*
@@ -4451,38 +4515,39 @@ void separate_nextcmd(exarg_T *eap)
for (; *p; MB_PTR_ADV(p)) {
if (*p == Ctrl_V) {
- if (eap->argt & (USECTRLV | XFILE))
- ++p; /* skip CTRL-V and next char */
- else
- /* remove CTRL-V and skip next char */
+ if (eap->argt & (EX_CTRLV | EX_XFILE)) {
+ p++; // skip CTRL-V and next char
+ } else {
+ // remove CTRL-V and skip next char
STRMOVE(p, p + 1);
- if (*p == NUL) /* stop at NUL after CTRL-V */
+ }
+ if (*p == NUL) { // stop at NUL after CTRL-V
break;
- }
- /* Skip over `=expr` when wildcards are expanded. */
- else if (p[0] == '`' && p[1] == '=' && (eap->argt & XFILE)) {
+ }
+ } else if (p[0] == '`' && p[1] == '=' && (eap->argt & EX_XFILE)) {
+ // Skip over `=expr` when wildcards are expanded.
p += 2;
(void)skip_expr(&p);
if (*p == NUL) { // stop at NUL after CTRL-V
break;
}
- }
- /* Check for '"': start of comment or '|': next command */
- /* :@" does not start a comment!
- * :redir @" doesn't either. */
- else if ((*p == '"' && !(eap->argt & NOTRLCOM)
- && (eap->cmdidx != CMD_at || p != eap->arg)
- && (eap->cmdidx != CMD_redir
- || p != eap->arg + 1 || p[-1] != '@'))
- || *p == '|' || *p == '\n') {
- /*
- * We remove the '\' before the '|', unless USECTRLV is used
- * AND 'b' is present in 'cpoptions'.
- */
+ } else if (
+ // Check for '"': start of comment or '|': next command */
+ // :@" does not start a comment!
+ // :redir @" doesn't either.
+ (*p == '"'
+ && !(eap->argt & EX_NOTRLCOM)
+ && (eap->cmdidx != CMD_at || p != eap->arg)
+ && (eap->cmdidx != CMD_redir
+ || p != eap->arg + 1 || p[-1] != '@'))
+ || *p == '|'
+ || *p == '\n') {
+ // We remove the '\' before the '|', unless EX_CTRLV is used
+ // AND 'b' is present in 'cpoptions'.
if ((vim_strchr(p_cpo, CPO_BAR) == NULL
- || !(eap->argt & USECTRLV)) && *(p - 1) == '\\') {
- STRMOVE(p - 1, p); /* remove the '\' */
- --p;
+ || !(eap->argt & EX_CTRLV)) && *(p - 1) == '\\') {
+ STRMOVE(p - 1, p); // remove the '\'
+ p--;
} else {
eap->nextcmd = check_nextcmd(p);
*p = NUL;
@@ -4491,8 +4556,9 @@ void separate_nextcmd(exarg_T *eap)
}
}
- if (!(eap->argt & NOTRLCOM)) /* remove trailing spaces */
+ if (!(eap->argt & EX_NOTRLCOM)) { // remove trailing spaces
del_trailing_spaces(eap->arg);
+ }
}
/*
@@ -5181,11 +5247,11 @@ static void uc_list(char_u *name, size_t name_len)
// Special cases
int len = 4;
- if (a & BANG) {
+ if (a & EX_BANG) {
msg_putchar('!');
len--;
}
- if (a & REGSTR) {
+ if (a & EX_REGSTR) {
msg_putchar('"');
len--;
}
@@ -5193,7 +5259,7 @@ static void uc_list(char_u *name, size_t name_len)
msg_putchar('b');
len--;
}
- if (a & TRLBAR) {
+ if (a & EX_TRLBAR) {
msg_putchar('|');
len--;
}
@@ -5215,20 +5281,20 @@ static void uc_list(char_u *name, size_t name_len)
len = 0;
// Arguments
- switch (a & (EXTRA|NOSPC|NEEDARG)) {
+ switch (a & (EX_EXTRA | EX_NOSPC | EX_NEEDARG)) {
case 0:
IObuff[len++] = '0';
break;
- case (EXTRA):
+ case (EX_EXTRA):
IObuff[len++] = '*';
break;
- case (EXTRA|NOSPC):
+ case (EX_EXTRA | EX_NOSPC):
IObuff[len++] = '?';
break;
- case (EXTRA|NEEDARG):
+ case (EX_EXTRA | EX_NEEDARG):
IObuff[len++] = '+';
break;
- case (EXTRA|NOSPC|NEEDARG):
+ case (EX_EXTRA | EX_NOSPC | EX_NEEDARG):
IObuff[len++] = '1';
break;
}
@@ -5238,13 +5304,13 @@ static void uc_list(char_u *name, size_t name_len)
} while (len < 5 - over);
// Address / Range
- if (a & (RANGE|COUNT)) {
- if (a & COUNT) {
+ if (a & (EX_RANGE | EX_COUNT)) {
+ if (a & EX_COUNT) {
// -count=N
snprintf((char *)IObuff + len, IOSIZE, "%" PRId64 "c",
(int64_t)cmd->uc_def);
len += (int)STRLEN(IObuff + len);
- } else if (a & DFLALL) {
+ } else if (a & EX_DFLALL) {
IObuff[len++] = '%';
} else if (cmd->uc_def >= 0) {
// -range=N
@@ -5319,16 +5385,16 @@ static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def,
return FAIL;
}
- /* First, try the simple attributes (no arguments) */
- if (STRNICMP(attr, "bang", len) == 0)
- *argt |= BANG;
- else if (STRNICMP(attr, "buffer", len) == 0)
+ // First, try the simple attributes (no arguments)
+ if (STRNICMP(attr, "bang", len) == 0) {
+ *argt |= EX_BANG;
+ } else if (STRNICMP(attr, "buffer", len) == 0) {
*flags |= UC_BUFFER;
- else if (STRNICMP(attr, "register", len) == 0)
- *argt |= REGSTR;
- else if (STRNICMP(attr, "bar", len) == 0)
- *argt |= TRLBAR;
- else {
+ } else if (STRNICMP(attr, "register", len) == 0) {
+ *argt |= EX_REGSTR;
+ } else if (STRNICMP(attr, "bar", len) == 0) {
+ *argt |= EX_TRLBAR;
+ } else {
int i;
char_u *val = NULL;
size_t vallen = 0;
@@ -5346,28 +5412,29 @@ static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def,
if (STRNICMP(attr, "nargs", attrlen) == 0) {
if (vallen == 1) {
- if (*val == '0')
- /* Do nothing - this is the default */;
- else if (*val == '1')
- *argt |= (EXTRA | NOSPC | NEEDARG);
- else if (*val == '*')
- *argt |= EXTRA;
- else if (*val == '?')
- *argt |= (EXTRA | NOSPC);
- else if (*val == '+')
- *argt |= (EXTRA | NEEDARG);
- else
+ if (*val == '0') {
+ // Do nothing - this is the default;
+ } else if (*val == '1') {
+ *argt |= (EX_EXTRA | EX_NOSPC | EX_NEEDARG);
+ } else if (*val == '*') {
+ *argt |= EX_EXTRA;
+ } else if (*val == '?') {
+ *argt |= (EX_EXTRA | EX_NOSPC);
+ } else if (*val == '+') {
+ *argt |= (EX_EXTRA | EX_NEEDARG);
+ } else {
goto wrong_nargs;
+ }
} else {
wrong_nargs:
EMSG(_("E176: Invalid number of arguments"));
return FAIL;
}
} else if (STRNICMP(attr, "range", attrlen) == 0) {
- *argt |= RANGE;
- if (vallen == 1 && *val == '%')
- *argt |= DFLALL;
- else if (val != NULL) {
+ *argt |= EX_RANGE;
+ if (vallen == 1 && *val == '%') {
+ *argt |= EX_DFLALL;
+ } else if (val != NULL) {
p = val;
if (*def >= 0) {
two_count:
@@ -5376,7 +5443,7 @@ two_count:
}
*def = getdigits_long(&p, true, 0);
- *argt |= (ZEROR | NOTADR);
+ *argt |= EX_ZEROR;
if (p != val + vallen || vallen == 0) {
invalid_count:
@@ -5384,8 +5451,16 @@ invalid_count:
return FAIL;
}
}
+ // default for -range is using buffer lines
+ if (*addr_type_arg == ADDR_NONE) {
+ *addr_type_arg = ADDR_LINES;
+ }
} else if (STRNICMP(attr, "count", attrlen) == 0) {
- *argt |= (COUNT | ZEROR | RANGE | NOTADR);
+ *argt |= (EX_COUNT | EX_ZEROR | EX_RANGE);
+ // default for -count is using any number
+ if (*addr_type_arg == ADDR_NONE) {
+ *addr_type_arg = ADDR_OTHER;
+ }
if (val != NULL) {
p = val;
@@ -5411,16 +5486,16 @@ invalid_count:
return FAIL;
}
} else if (STRNICMP(attr, "addr", attrlen) == 0) {
- *argt |= RANGE;
+ *argt |= EX_RANGE;
if (val == NULL) {
EMSG(_("E179: argument required for -addr"));
return FAIL;
}
- if (parse_addr_type_arg(val, (int)vallen, argt, addr_type_arg) == FAIL) {
+ if (parse_addr_type_arg(val, (int)vallen, addr_type_arg) == FAIL) {
return FAIL;
}
if (*addr_type_arg != ADDR_LINES) {
- *argt |= (ZEROR | NOTADR);
+ *argt |= EX_ZEROR;
}
} else {
char_u ch = attr[len];
@@ -5447,7 +5522,7 @@ static void ex_command(exarg_T *eap)
int flags = 0;
int compl = EXPAND_NOTHING;
char_u *compl_arg = NULL;
- cmd_addr_T addr_type_arg = ADDR_LINES;
+ cmd_addr_T addr_type_arg = ADDR_NONE;
int has_attr = (eap->arg[0] == '-');
int name_len;
@@ -5724,8 +5799,9 @@ uc_check_code(
/* When specified there is a single argument don't split it.
* Works for ":Cmd %" when % is "a b c". */
- if ((eap->argt & NOSPC) && quote == 2)
+ if ((eap->argt & EX_NOSPC) && quote == 2) {
quote = 1;
+ }
switch (quote) {
case 0: /* No quoting, no splitting */
@@ -6105,8 +6181,7 @@ char_u *get_user_cmd_complete(expand_T *xp, int idx)
/*
* Parse address type argument
*/
-int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
- cmd_addr_T *addr_type_arg)
+int parse_addr_type_arg(char_u *value, int vallen, cmd_addr_T *addr_type_arg)
FUNC_ATTR_NONNULL_ALL
{
int i, a, b;
@@ -6129,9 +6204,6 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
return FAIL;
}
- if (*addr_type_arg != ADDR_LINES)
- *argt |= NOTADR;
-
return OK;
}
@@ -6169,9 +6241,9 @@ int parse_compl_arg(const char_u *value, int vallen, int *complp,
&& STRNCMP(value, command_complete[i], valend) == 0) {
*complp = i;
if (i == EXPAND_BUFFERS) {
- *argt |= BUFNAME;
+ *argt |= EX_BUFNAME;
} else if (i == EXPAND_DIRECTORIES || i == EXPAND_FILES) {
- *argt |= XFILE;
+ *argt |= EX_XFILE;
}
break;
}
@@ -7423,11 +7495,12 @@ static void ex_read(exarg_T *eap)
int empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
linenr_T lnum;
- if (eap->usefilter) /* :r!cmd */
- do_bang(1, eap, FALSE, FALSE, TRUE);
- else {
- if (u_save(eap->line2, (linenr_T)(eap->line2 + 1)) == FAIL)
+ if (eap->usefilter) { // :r!cmd
+ do_bang(1, eap, false, false, true);
+ } else {
+ if (u_save(eap->line2, (linenr_T)(eap->line2 + 1)) == FAIL) {
return;
+ }
if (*eap->arg == NUL) {
if (check_fname() == FAIL) /* check for no file name */
@@ -7799,7 +7872,7 @@ static void ex_copymove(exarg_T *eap)
* move or copy lines from 'eap->line1'-'eap->line2' to below line 'n'
*/
if (n == MAXLNUM || n < 0 || n > curbuf->b_ml.ml_line_count) {
- EMSG(_(e_invaddr));
+ EMSG(_(e_invrange));
return;
}
@@ -7897,7 +7970,7 @@ static void ex_at(exarg_T *eap)
*/
static void ex_bang(exarg_T *eap)
{
- do_bang(eap->addr_count, eap, eap->forceit, TRUE, TRUE);
+ do_bang(eap->addr_count, eap, eap->forceit, true, true);
}
/*
@@ -8647,6 +8720,7 @@ ssize_t find_cmdline_var(const char_u *src, size_t *usedlen)
* '#' to curwin->w_altfile
* '<cword>' to word under the cursor
* '<cWORD>' to WORD under the cursor
+ * '<cexpr>' to C-expression under the cursor
* '<cfile>' to path name under the cursor
* '<sfile>' to sourced file name
* '<slnum>' to sourced file line number
@@ -9475,16 +9549,16 @@ Dictionary commands_array(buf_T *buf)
PUT(d, "name", STRING_OBJ(cstr_to_string((char *)cmd->uc_name)));
PUT(d, "definition", STRING_OBJ(cstr_to_string((char *)cmd->uc_rep)));
PUT(d, "script_id", INTEGER_OBJ(cmd->uc_script_ctx.sc_sid));
- PUT(d, "bang", BOOLEAN_OBJ(!!(cmd->uc_argt & BANG)));
- PUT(d, "bar", BOOLEAN_OBJ(!!(cmd->uc_argt & TRLBAR)));
- PUT(d, "register", BOOLEAN_OBJ(!!(cmd->uc_argt & REGSTR)));
+ PUT(d, "bang", BOOLEAN_OBJ(!!(cmd->uc_argt & EX_BANG)));
+ PUT(d, "bar", BOOLEAN_OBJ(!!(cmd->uc_argt & EX_TRLBAR)));
+ PUT(d, "register", BOOLEAN_OBJ(!!(cmd->uc_argt & EX_REGSTR)));
- switch (cmd->uc_argt & (EXTRA|NOSPC|NEEDARG)) {
- case 0: arg[0] = '0'; break;
- case(EXTRA): arg[0] = '*'; break;
- case(EXTRA|NOSPC): arg[0] = '?'; break;
- case(EXTRA|NEEDARG): arg[0] = '+'; break;
- case(EXTRA|NOSPC|NEEDARG): arg[0] = '1'; break;
+ switch (cmd->uc_argt & (EX_EXTRA | EX_NOSPC | EX_NEEDARG)) {
+ case 0: arg[0] = '0'; break;
+ case(EX_EXTRA): arg[0] = '*'; break;
+ case(EX_EXTRA | EX_NOSPC): arg[0] = '?'; break;
+ case(EX_EXTRA | EX_NEEDARG): arg[0] = '+'; break;
+ case(EX_EXTRA | EX_NOSPC | EX_NEEDARG): arg[0] = '1'; break;
}
PUT(d, "nargs", STRING_OBJ(cstr_to_string(arg)));
@@ -9495,7 +9569,7 @@ Dictionary commands_array(buf_T *buf)
? NIL : STRING_OBJ(cstr_to_string((char *)cmd->uc_compl_arg)));
Object obj = NIL;
- if (cmd->uc_argt & COUNT) {
+ if (cmd->uc_argt & EX_COUNT) {
if (cmd->uc_def >= 0) {
snprintf(str, sizeof(str), "%" PRId64, (int64_t)cmd->uc_def);
obj = STRING_OBJ(cstr_to_string(str)); // -count=N
@@ -9506,8 +9580,8 @@ Dictionary commands_array(buf_T *buf)
PUT(d, "count", obj);
obj = NIL;
- if (cmd->uc_argt & RANGE) {
- if (cmd->uc_argt & DFLALL) {
+ if (cmd->uc_argt & EX_RANGE) {
+ if (cmd->uc_argt & EX_DFLALL) {
obj = STRING_OBJ(cstr_to_string("%")); // -range=%
} else if (cmd->uc_def >= 0) {
snprintf(str, sizeof(str), "%" PRId64, (int64_t)cmd->uc_def);
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index 0f50d5153d..2aa66f6a8c 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -3828,7 +3828,7 @@ static void cmd_cursor_goto(int row, int col)
ui_grid_cursor_goto(grid->handle, row, col);
}
-void gotocmdline(int clr)
+void gotocmdline(bool clr)
{
if (ui_has(kUICmdline)) {
return;
@@ -4780,7 +4780,7 @@ char_u *addstar(char_u *fname, size_t len, int context)
* EXPAND_COMMANDS Cursor is still touching the command, so complete
* it.
* EXPAND_BUFFERS Complete file names for :buf and :sbuf commands.
- * EXPAND_FILES After command with XFILE set, or after setting
+ * EXPAND_FILES After command with EX_XFILE set, or after setting
* with P_EXPAND set. eg :e ^I, :w>>^I
* EXPAND_DIRECTORIES In some cases this is used instead of the latter
* when we know only directories are of interest. eg
diff --git a/src/nvim/generators/gen_ex_cmds.lua b/src/nvim/generators/gen_ex_cmds.lua
index 2574af6218..844661adc3 100644
--- a/src/nvim/generators/gen_ex_cmds.lua
+++ b/src/nvim/generators/gen_ex_cmds.lua
@@ -22,7 +22,10 @@ local defsfname = autodir .. '/ex_cmds_defs.generated.h'
local enumfile = io.open(enumfname, 'w')
local defsfile = io.open(defsfname, 'w')
-local defs = require('ex_cmds')
+local bit = require 'bit'
+local ex_cmds = require('ex_cmds')
+local defs = ex_cmds.cmds
+local flags = ex_cmds.flags
local byte_a = string.byte('a')
local byte_z = string.byte('z')
@@ -51,6 +54,17 @@ static CommandDefinition cmdnames[%u] = {
]], #defs, #defs))
local cmds, cmdidxs1, cmdidxs2 = {}, {}, {}
for _, cmd in ipairs(defs) do
+ if bit.band(cmd.flags, flags.RANGE) == flags.RANGE then
+ assert(cmd.addr_type ~= 'ADDR_NONE',
+ string.format('ex_cmds.lua:%s: Using RANGE with ADDR_NONE\n', cmd.command))
+ else
+ assert(cmd.addr_type == 'ADDR_NONE',
+ string.format('ex_cmds.lua:%s: Missing ADDR_NONE\n', cmd.command))
+ end
+ if bit.band(cmd.flags, flags.DFLALL) == flags.DFLALL then
+ assert(cmd.addr_type ~= 'ADDR_OTHER' and cmd.addr_type ~= 'ADDR_NONE',
+ string.format('ex_cmds.lua:%s: Missing misplaced DFLALL\n', cmd.command))
+ end
local enumname = cmd.enum or ('CMD_' .. cmd.command)
local byte_cmd = cmd.command:sub(1, 1):byte()
if byte_a <= byte_cmd and byte_cmd <= byte_z then
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 31b905e858..3b8f4116b7 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -866,7 +866,6 @@ EXTERN char_u e_failed[] INIT(= N_("E472: Command failed"));
EXTERN char_u e_internal[] INIT(= N_("E473: Internal error"));
EXTERN char_u e_intern2[] INIT(= N_("E685: Internal error: %s"));
EXTERN char_u e_interr[] INIT(= N_("Interrupted"));
-EXTERN char_u e_invaddr[] INIT(= N_("E14: Invalid address"));
EXTERN char_u e_invarg[] INIT(= N_("E474: Invalid argument"));
EXTERN char_u e_invarg2[] INIT(= N_("E475: Invalid argument: %s"));
EXTERN char_u e_invargval[] INIT(= N_("E475: Invalid value for argument %s"));
diff --git a/src/nvim/log.c b/src/nvim/log.c
index 19203a3c2a..324382a0f7 100644
--- a/src/nvim/log.c
+++ b/src/nvim/log.c
@@ -51,7 +51,7 @@ static bool log_try_create(char *fname)
/// Initializes path to log file. Sets $NVIM_LOG_FILE if empty.
///
-/// Tries $NVIM_LOG_FILE, or falls back to $XDG_DATA_HOME/nvim/log. Path to log
+/// Tries $NVIM_LOG_FILE, or falls back to $XDG_CACHE_HOME/nvim/log. Path to log
/// file is cached, so only the first call has effect, unless first call was not
/// successful. Failed initialization indicates either a bug in expand_env()
/// or both $NVIM_LOG_FILE and $HOME environment variables are undefined.
@@ -69,8 +69,16 @@ static bool log_path_init(void)
|| log_file_path[0] == '\0'
|| os_isdir((char_u *)log_file_path)
|| !log_try_create(log_file_path)) {
+ // Make kXDGCacheHome if it does not exist.
+ char *cachehome = get_xdg_home(kXDGCacheHome);
+ char *failed_dir = NULL;
+ bool log_dir_failure = false;
+ if (!os_isdir((char_u *)cachehome)) {
+ log_dir_failure = (os_mkdir_recurse(cachehome, 0700, &failed_dir) != 0);
+ }
+ XFREE_CLEAR(cachehome);
// Invalid $NVIM_LOG_FILE or failed to expand; fall back to default.
- char *defaultpath = stdpaths_user_data_subpath("log", 0, true);
+ char *defaultpath = stdpaths_user_cache_subpath("log");
size_t len = xstrlcpy(log_file_path, defaultpath, size);
xfree(defaultpath);
// Fall back to .nvimlog
@@ -83,6 +91,11 @@ static bool log_path_init(void)
return false;
}
os_setenv(LOG_FILE_ENV, log_file_path, true);
+ if (log_dir_failure) {
+ WLOG("Failed to create directory %s for writing logs: %s",
+ failed_dir, os_strerror(log_dir_failure));
+ }
+ XFREE_CLEAR(failed_dir);
}
return true;
}
@@ -323,4 +336,3 @@ static bool v_do_log_to_file(FILE *log_file, int log_level,
return true;
}
-
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 344a2387d6..3219c02068 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/version.h"
#include "nvim/misc1.h"
#include "nvim/getchar.h"
#include "nvim/garray.h"
@@ -78,6 +79,17 @@ static void nlua_error(lua_State *const lstate, const char *const msg)
lua_pop(lstate, 1);
}
+/// Return version of current neovim build
+///
+/// @param lstate Lua interpreter state.
+static int nlua_nvim_version(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
+{
+ Dictionary version = version_dict();
+ nlua_push_Dictionary(lstate, version, true);
+ api_free_dictionary(version);
+ return 1;
+}
+
/// Compare two strings, ignoring case
///
/// Expects two values on the stack: compared strings. Returns one of the
@@ -420,6 +432,9 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
// str_byteindex
lua_pushcfunction(lstate, &nlua_str_byteindex);
lua_setfield(lstate, -2, "str_byteindex");
+ // neovim version
+ lua_pushcfunction(lstate, &nlua_nvim_version);
+ lua_setfield(lstate, -2, "version");
// schedule
lua_pushcfunction(lstate, &nlua_schedule);
lua_setfield(lstate, -2, "schedule");
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 8bf745966e..9f71df3a46 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -2044,7 +2044,6 @@ static void usage(void)
mch_msg(_(" -u <config> Use this config file\n"));
mch_msg(_(" -v, --version Print version information\n"));
mch_msg(_(" -V[N][file] Verbose [level][file]\n"));
- mch_msg(_(" -Z Restricted mode\n"));
mch_msg("\n");
mch_msg(_(" --api-info Write msgpack-encoded API metadata to stdout\n"));
mch_msg(_(" --embed Use stdin/stdout as a msgpack-rpc channel\n"));
diff --git a/src/nvim/mark.c b/src/nvim/mark.c
index 1ecfae57ed..73a9c1d1d7 100644
--- a/src/nvim/mark.c
+++ b/src/nvim/mark.c
@@ -777,6 +777,7 @@ void ex_delmarks(exarg_T *eap)
n = i - 'A';
}
namedfm[n].fmark.mark.lnum = 0;
+ namedfm[n].fmark.fnum = 0;
XFREE_CLEAR(namedfm[n].fname);
}
}
@@ -1552,3 +1553,87 @@ void mark_mb_adjustpos(buf_T *buf, pos_T *lp)
}
}
}
+
+
+// Add information about mark 'mname' to list 'l'
+static int add_mark(list_T *l, const char *mname, const pos_T *pos, int bufnr,
+ const char *fname)
+ FUNC_ATTR_NONNULL_ARG(1, 2, 3)
+{
+ if (pos->lnum <= 0) {
+ return OK;
+ }
+
+ dict_T *d = tv_dict_alloc();
+ tv_list_append_dict(l, d);
+
+ list_T *lpos = tv_list_alloc(kListLenMayKnow);
+
+ tv_list_append_number(lpos, bufnr);
+ tv_list_append_number(lpos, pos->lnum);
+ tv_list_append_number(lpos, pos->col + 1);
+ tv_list_append_number(lpos, pos->coladd);
+
+ if (tv_dict_add_str(d, S_LEN("mark"), mname) == FAIL
+ || tv_dict_add_list(d, S_LEN("pos"), lpos) == FAIL
+ || (fname != NULL && tv_dict_add_str(d, S_LEN("file"), fname) == FAIL)) {
+ return FAIL;
+ }
+
+ return OK;
+}
+
+
+/// Get information about marks local to a buffer.
+///
+/// @param[in] buf Buffer to get the marks from
+/// @param[out] l List to store marks
+void get_buf_local_marks(const buf_T *buf, list_T *l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ char mname[3] = "' ";
+
+ // Marks 'a' to 'z'
+ for (int i = 0; i < NMARKS; i++) {
+ mname[1] = (char)('a' + i);
+ add_mark(l, mname, &buf->b_namedm[i].mark, buf->b_fnum, NULL);
+ }
+
+ // Mark '' is a window local mark and not a buffer local mark
+ add_mark(l, "''", &curwin->w_pcmark, curbuf->b_fnum, NULL);
+
+ add_mark(l, "'\"", &buf->b_last_cursor.mark, buf->b_fnum, NULL);
+ add_mark(l, "'[", &buf->b_op_start, buf->b_fnum, NULL);
+ add_mark(l, "']", &buf->b_op_end, buf->b_fnum, NULL);
+ add_mark(l, "'^", &buf->b_last_insert.mark, buf->b_fnum, NULL);
+ add_mark(l, "'.", &buf->b_last_change.mark, buf->b_fnum, NULL);
+ add_mark(l, "'<", &buf->b_visual.vi_start, buf->b_fnum, NULL);
+ add_mark(l, "'>", &buf->b_visual.vi_end, buf->b_fnum, NULL);
+}
+
+/// Get information about global marks ('A' to 'Z' and '0' to '9')
+///
+/// @param[out] l List to store global marks
+void get_global_marks(list_T *l)
+ FUNC_ATTR_NONNULL_ALL
+{
+ char mname[3] = "' ";
+ char *name;
+
+ // Marks 'A' to 'Z' and '0' to '9'
+ for (int i = 0; i < NMARKS + EXTRA_MARKS; i++) {
+ if (namedfm[i].fmark.fnum != 0) {
+ name = (char *)buflist_nr2name(namedfm[i].fmark.fnum, true, true);
+ } else {
+ name = (char *)namedfm[i].fname;
+ }
+ if (name != NULL) {
+ mname[1] = i >= NMARKS ? (char)(i - NMARKS + '0') : (char)(i + 'A');
+
+ add_mark(l, mname, &namedfm[i].fmark.mark, namedfm[i].fmark.fnum, name);
+ if (namedfm[i].fmark.fnum != 0) {
+ xfree(name);
+ }
+ }
+ }
+}
diff --git a/src/nvim/message.c b/src/nvim/message.c
index f94529c687..ba7a667a60 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -890,6 +890,40 @@ char_u *msg_may_trunc(int force, char_u *s)
return s;
}
+void clear_hl_msg(HlMessage *hl_msg)
+{
+ for (size_t i = 0; i < kv_size(*hl_msg); i++) {
+ xfree(kv_A(*hl_msg, i).text.data);
+ }
+ kv_destroy(*hl_msg);
+ *hl_msg = (HlMessage)KV_INITIAL_VALUE;
+}
+
+#define LINE_BUFFER_SIZE 4096
+
+void add_hl_msg_hist(HlMessage hl_msg)
+{
+ // TODO(notomo): support multi highlighted message history
+ size_t pos = 0;
+ char buf[LINE_BUFFER_SIZE];
+ for (uint32_t i = 0; i < kv_size(hl_msg); i++) {
+ HlMessageChunk chunk = kv_A(hl_msg, i);
+ for (uint32_t j = 0; j < chunk.text.size; j++) {
+ if (pos == LINE_BUFFER_SIZE - 1) {
+ buf[pos] = NUL;
+ add_msg_hist((const char *)buf, -1, MSG_HIST, true);
+ pos = 0;
+ continue;
+ }
+ buf[pos++] = chunk.text.data[j];
+ }
+ }
+ if (pos != 0) {
+ buf[pos] = NUL;
+ add_msg_hist((const char *)buf, -1, MSG_HIST, true);
+ }
+}
+
/// @param[in] len Length of s or -1.
static void add_msg_hist(const char *s, int len, int attr, bool multiline)
{
diff --git a/src/nvim/message.h b/src/nvim/message.h
index fdb9bc96ca..377c725fa1 100644
--- a/src/nvim/message.h
+++ b/src/nvim/message.h
@@ -8,6 +8,8 @@
#include "nvim/macros.h"
#include "nvim/types.h"
#include "nvim/grid_defs.h"
+#include "nvim/api/private/defs.h"
+#include "nvim/lib/kvec.h"
/*
* Types of dialogs passed to do_dialog().
@@ -75,6 +77,13 @@
/// Like #MSG_PUTS_ATTR, but if middle part of long messages will be replaced
#define MSG_PUTS_LONG_ATTR(s, a) msg_puts_long_attr((char_u *)(s), (a))
+typedef struct {
+ String text;
+ int attr;
+} HlMessageChunk;
+
+typedef kvec_t(HlMessageChunk) HlMessage;
+
/// Message history for `:messages`
typedef struct msg_hist {
struct msg_hist *next; ///< Next message.
diff --git a/src/nvim/option.c b/src/nvim/option.c
index d43dd9ba15..47b9e9bb07 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -306,7 +306,7 @@ static char *(p_buftype_values[]) = { "nofile", "nowrite", "quickfix",
static char *(p_bufhidden_values[]) = { "hide", "unload", "delete",
"wipe", NULL };
-static char *(p_bs_values[]) = { "indent", "eol", "start", NULL };
+static char *(p_bs_values[]) = { "indent", "eol", "start", "nostop", NULL };
static char *(p_fdm_values[]) = { "manual", "expr", "marker", "indent",
"syntax", "diff", NULL };
static char *(p_fcl_values[]) = { "all", NULL };
@@ -1366,6 +1366,10 @@ int do_set(
*(char_u **)varp = vim_strsave(
(char_u *)"indent,eol,start");
break;
+ case 3:
+ *(char_u **)varp = vim_strsave(
+ (char_u *)"indent,eol,nostop");
+ break;
}
xfree(oldval);
if (origval == oldval) {
@@ -2939,7 +2943,7 @@ ambw_end:
}
} else if (varp == &p_bs) { // 'backspace'
if (ascii_isdigit(*p_bs)) {
- if (*p_bs >'2' || p_bs[1] != NUL) {
+ if (*p_bs > '3' || p_bs[1] != NUL) {
errmsg = e_invarg;
}
} else if (check_opt_strings(p_bs, p_bs_values, true) != OK) {
@@ -6801,15 +6805,15 @@ static int check_opt_wim(void)
}
/// Check if backspacing over something is allowed.
-/// The parameter what is one of the following: whatBS_INDENT, BS_EOL
-/// or BS_START
+/// @param what BS_INDENT, BS_EOL, BS_START, or BS_NOSTOP
bool can_bs(int what)
{
if (what == BS_START && bt_prompt(curbuf)) {
return false;
}
switch (*p_bs) {
- case '2': return true;
+ case '3': return true;
+ case '2': return what != BS_NOSTOP;
case '1': return what != BS_START;
case '0': return false;
}
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index ec2160d365..683afc670e 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -282,9 +282,14 @@ enum {
#define WIM_BUFLASTUSED 8
// arguments for can_bs()
+// each defined char should be unique over all values
+// except for BS_START, that intentionally also matches BS_NOSTOP
+// because BS_NOSTOP behaves exactly the same except it
+// does not stop at the start of the insert point
#define BS_INDENT 'i' // "Indent"
-#define BS_EOL 'o' // "eOl"
+#define BS_EOL 'l' // "eoL"
#define BS_START 's' // "Start"
+#define BS_NOSTOP 'p' // "nostoP
#define LISPWORD_VALUE \
"defun,define,defmacro,set!,lambda,if,case,let,flet,let*,letrec,do,do*,define-syntax,let-syntax,letrec-syntax,destructuring-bind,defpackage,defparameter,defstruct,deftype,defvar,do-all-symbols,do-external-symbols,do-symbols,dolist,dotimes,ecase,etypecase,eval-when,labels,macrolet,multiple-value-bind,multiple-value-call,multiple-value-prog1,multiple-value-setq,prog1,progv,typecase,unless,unwind-protect,when,with-input-from-string,with-open-file,with-open-stream,with-output-to-string,with-package-iterator,define-condition,handler-bind,handler-case,restart-bind,restart-case,with-simple-restart,store-value,use-value,muffle-warning,abort,continue,with-slots,with-slots*,with-accessors,with-accessors*,defclass,defmethod,print-unreadable-object"
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index 879266e3d4..008f5ef63b 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -394,13 +394,21 @@ void os_get_hostname(char *hostname, size_t size)
}
/// To get the "real" home directory:
-/// - get value of $HOME
+/// 1. get value of $HOME
+/// 2. if $HOME is not set, try the following
+/// For Windows:
+/// 1. assemble homedir using HOMEDRIVE and HOMEPATH
+/// 2. try os_homedir()
+/// 3. resolve a direct reference to another system variable
+/// 4. guess C drive
/// For Unix:
-/// - go to that directory
-/// - do os_dirname() to get the real name of that directory.
-/// This also works with mounts and links.
-/// Don't do this for Windows, it will change the "current dir" for a drive.
+/// 1. try os_homedir()
+/// 2. go to that directory
+/// This also works with mounts and links.
+/// Don't do this for Windows, it will change the "current dir" for a drive.
+/// 3. fall back to current working directory as a last resort
static char *homedir = NULL;
+static char *os_homedir(void);
void init_homedir(void)
{
@@ -430,7 +438,7 @@ void init_homedir(void)
}
}
if (var == NULL) {
- var = os_getenv("USERPROFILE");
+ var = os_homedir();
}
// Weird but true: $HOME may contain an indirect reference to another
@@ -440,6 +448,7 @@ void init_homedir(void)
const char *p = strchr(var + 1, '%');
if (p != NULL) {
vim_snprintf(os_buf, (size_t)(p - var), "%s", var + 1);
+ var = NULL;
const char *exp = os_getenv(os_buf);
if (exp != NULL && *exp != NUL
&& STRLEN(exp) + STRLEN(p) < MAXPATHL) {
@@ -458,8 +467,12 @@ void init_homedir(void)
}
#endif
- if (var != NULL) {
#ifdef UNIX
+ if (var == NULL) {
+ var = os_homedir();
+ }
+
+ if (var != NULL) {
// Change to the directory and get the actual path. This resolves
// links. Don't do it when we can't return.
if (os_dirname((char_u *)os_buf, MAXPATHL) == OK && os_chdir(os_buf) == 0) {
@@ -470,11 +483,37 @@ void init_homedir(void)
EMSG(_(e_prev_dir));
}
}
+ }
+
+ // Fall back to current working directory if home is not found
+ if ((var == NULL || *var == NUL)
+ && os_dirname((char_u *)os_buf, sizeof(os_buf)) == OK) {
+ var = os_buf;
+ }
#endif
+ if (var != NULL) {
homedir = xstrdup(var);
}
}
+static char homedir_buf[MAXPATHL];
+
+static char *os_homedir(void)
+{
+ homedir_buf[0] = NUL;
+ size_t homedir_size = MAXPATHL;
+ uv_mutex_lock(&mutex);
+ // http://docs.libuv.org/en/v1.x/misc.html#c.uv_os_homedir
+ int ret_value = uv_os_homedir(homedir_buf, &homedir_size);
+ uv_mutex_unlock(&mutex);
+ if (ret_value == 0 && homedir_size < MAXPATHL) {
+ return homedir_buf;
+ }
+ ELOG("uv_os_homedir() failed %d: %s", ret_value, os_strerror(ret_value));
+ homedir_buf[0] = NUL;
+ return NULL;
+}
+
#if defined(EXITFREE)
void free_homedir(void)
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index b7878d9da8..9d6518841a 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -393,7 +393,7 @@ static InbufPollResult inbuf_poll(int ms, MultiQueue *events)
prof_inchar_enter();
}
- if ((ms == - 1 || ms > 0) && events == NULL && !input_eof) {
+ if ((ms == - 1 || ms > 0) && events != main_loop.events && !input_eof) {
// The pending input provoked a blocking wait. Do special events now. #6247
blocking = true;
multiqueue_process_events(ch_before_blocking_events);
diff --git a/src/nvim/os/stdpaths.c b/src/nvim/os/stdpaths.c
index 66bc990402..93b8d5ca12 100644
--- a/src/nvim/os/stdpaths.c
+++ b/src/nvim/os/stdpaths.c
@@ -108,6 +108,17 @@ char *get_xdg_home(const XDGVarType idx)
return dir;
}
+/// Return subpath of $XDG_CACHE_HOME
+///
+/// @param[in] fname New component of the path.
+///
+/// @return [allocated] `$XDG_CACHE_HOME/nvim/{fname}`
+char *stdpaths_user_cache_subpath(const char *fname)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET
+{
+ return concat_fnames_realloc(get_xdg_home(kXDGCacheHome), fname, true);
+}
+
/// Return subpath of $XDG_CONFIG_HOME
///
/// @param[in] fname New component of the path.
diff --git a/src/nvim/po/af.po b/src/nvim/po/af.po
index fa6674469c..db44f50a46 100644
--- a/src/nvim/po/af.po
+++ b/src/nvim/po/af.po
@@ -3290,10 +3290,6 @@ msgstr "-o[N]\t\tMaak N vensters oop (verstek: een vir elke ler)"
#~ msgid " -V[N][file] Verbose [level][file]\n"
#~ msgstr ""
-#, fuzzy
-#~ msgid " -Z Restricted mode\n"
-#~ msgstr " vir twee modusse "
-
#~ msgid " --api-info Write msgpack-encoded API metadata to stdout\n"
#~ msgstr ""
@@ -7473,9 +7469,6 @@ msgstr "E446: Geen lernaam onder loper"
#~ msgid "-b\t\t\tBinary mode"
#~ msgstr "-b\t\t\tBinre modus"
-#~ msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-#~ msgstr "-Z\t\t\tBeperkte modus (soos \"rvim\")"
-
#~ msgid "-R\t\t\tReadonly mode (like \"view\")"
#~ msgstr "-R\t\t\tLeesalleen modus (soos \"view\")"
diff --git a/src/nvim/po/ca.po b/src/nvim/po/ca.po
index be4206f36e..6c4d6ddd22 100644
--- a/src/nvim/po/ca.po
+++ b/src/nvim/po/ca.po
@@ -3469,10 +3469,6 @@ msgstr "-y\t\t\tMode senzill (com \"evim\", sense modes)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tMode noms lectura (com \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tMode restringit (com \"rvim)"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tNo permet modificar (escriure) fitxers"
diff --git a/src/nvim/po/cs.cp1250.po b/src/nvim/po/cs.cp1250.po
index 5b9f3d3a58..859039eb87 100644
--- a/src/nvim/po/cs.cp1250.po
+++ b/src/nvim/po/cs.cp1250.po
@@ -3547,10 +3547,6 @@ msgstr "-v\t\t\tSnadn reim (stejn jako \"evim\", dn mdy )"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tReim pouze_pro_ten (jako \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tOmezen reim (stejn jako \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tZmny (ukldn soubor) zakzny"
diff --git a/src/nvim/po/cs.po b/src/nvim/po/cs.po
index 31a90dc514..4d9ad58836 100644
--- a/src/nvim/po/cs.po
+++ b/src/nvim/po/cs.po
@@ -3547,10 +3547,6 @@ msgstr "-v\t\t\tSnadn reim (stejn jako \"evim\", dn mdy )"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tReim pouze_pro_ten (jako \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tOmezen reim (stejn jako \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tZmny (ukldn soubor) zakzny"
diff --git a/src/nvim/po/da.po b/src/nvim/po/da.po
index f35272810b..7a75425019 100644
--- a/src/nvim/po/da.po
+++ b/src/nvim/po/da.po
@@ -3015,9 +3015,6 @@ msgstr "-y\t\t\tEasy-tilstand (ligesom \"evim\", tilstandsløs)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tSkrivebeskyttet tilstand (ligesom \"view\")"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tRestriktiv tilstand (ligesom \"rvim\")"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tÆndringer (skrivning af filer) ikke tilladt"
diff --git a/src/nvim/po/de.po b/src/nvim/po/de.po
index a2e04965e5..740e9e5f6a 100644
--- a/src/nvim/po/de.po
+++ b/src/nvim/po/de.po
@@ -2895,10 +2895,6 @@ msgstr "-y\t\t\tLeichter Modus (wie \"evim\", ohne Modi)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tModus ohne Schreibrechte (wie \"view\")"
-#: ../main.c:2186
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tEingeschrnkter Modus (wie \"rvim\")"
-
#: ../main.c:2187
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tnderungen (beim Schreiben von Dateien) sind nicht erlaubt"
diff --git a/src/nvim/po/en_GB.po b/src/nvim/po/en_GB.po
index 7919fc8946..66cdba6f92 100644
--- a/src/nvim/po/en_GB.po
+++ b/src/nvim/po/en_GB.po
@@ -3368,10 +3368,6 @@ msgstr ""
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr ""
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr ""
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr ""
diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po
index 99c46c7275..5480e6a4d8 100644
--- a/src/nvim/po/eo.po
+++ b/src/nvim/po/eo.po
@@ -2989,9 +2989,6 @@ msgstr "-y\t\t\tFacila reĝimo (kiel \"evim\", senreĝima)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tNurlegebla reĝimo (kiel \"view\")"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tLimigita reĝimo (kiel \"rvim\")"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tŜanĝoj (skribo al dosieroj) nepermeseblaj"
diff --git a/src/nvim/po/es.po b/src/nvim/po/es.po
index eeea27610d..064484d1a4 100644
--- a/src/nvim/po/es.po
+++ b/src/nvim/po/es.po
@@ -3524,10 +3524,6 @@ msgstr "-y\t\t\tModo fácil (como \"evim\", sin modo)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tModo de solo lectura (como \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tModo restringido (como \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tModificación de archivos desactivada"
diff --git a/src/nvim/po/fi.po b/src/nvim/po/fi.po
index 4489139cfb..5986a57488 100644
--- a/src/nvim/po/fi.po
+++ b/src/nvim/po/fi.po
@@ -3249,10 +3249,6 @@ msgstr ""
#~ msgstr " kahta tilaa varten "
#, fuzzy
-#~ msgid " -Z Restricted mode\n"
-#~ msgstr " kahta tilaa varten "
-
-#, fuzzy
#~ msgid " -m Modifications (writing files) not allowed\n"
#~ msgstr "-m\t\t\tMuokkaukset (kirjoittaminen tiedostoon) pois käytöstä"
@@ -6961,9 +6957,6 @@ msgstr "Lista tai luku tarvitaan"
#~ msgid "-b\t\t\tBinary mode"
#~ msgstr "-b\t\t\tBinääritila"
-#~ msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-#~ msgstr "-Z\t\t\tRajoitettu tila (kuten rvimillä)"
-
#~ msgid "-R\t\t\tReadonly mode (like \"view\")"
#~ msgstr "-R\t\t\tKirjoitussuojattu tila (kuten view'lla)"
diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po
index bb60649c91..5f1ca2fec5 100644
--- a/src/nvim/po/fr.po
+++ b/src/nvim/po/fr.po
@@ -3231,9 +3231,6 @@ msgstr "-y\t\tMode facile (comme \"evim\", vim sans modes)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\tMode lecture seule (comme \"view\")"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\tMode restreint (comme \"rvim\")"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\tInterdire l'enregistrement des fichiers"
diff --git a/src/nvim/po/ga.po b/src/nvim/po/ga.po
index 1104b31c32..bad01d592a 100644
--- a/src/nvim/po/ga.po
+++ b/src/nvim/po/ga.po
@@ -3022,9 +3022,6 @@ msgstr "-y\t\t\tMd asca (mar \"evim\", gan mhid)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tMd inlite amhin (mar \"view\")"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tMd srianta (mar \"rvim\")"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tN cheadatear athruithe (.i. scrobh na gcomhad)"
diff --git a/src/nvim/po/it.po b/src/nvim/po/it.po
index 511f910b71..dfabc4bee0 100644
--- a/src/nvim/po/it.po
+++ b/src/nvim/po/it.po
@@ -3510,10 +3510,6 @@ msgstr "-y\t\t\tModalit Facile (come \"evim\", senza modalit)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tModalit Sola Lettura (come \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tModalit Ristretta (come \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tRiscritture del file non permesse"
diff --git a/src/nvim/po/ja.euc-jp.po b/src/nvim/po/ja.euc-jp.po
index 523e9ca4e3..e2cf68f016 100644
--- a/src/nvim/po/ja.euc-jp.po
+++ b/src/nvim/po/ja.euc-jp.po
@@ -3024,9 +3024,6 @@ msgstr "-y\t\t\t⡼ (\"evim\" Ʊ⡼̵)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tɹѥ⡼ (\"view\" Ʊ)"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\t¥⡼ (\"rvim\" Ʊ)"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tѹ (ե¸) Ǥʤ褦ˤ"
diff --git a/src/nvim/po/ja.po b/src/nvim/po/ja.po
index 5a69d0c5bf..85a45cd171 100644
--- a/src/nvim/po/ja.po
+++ b/src/nvim/po/ja.po
@@ -3024,9 +3024,6 @@ msgstr "-y\t\t\tイージーモード (\"evim\" と同じ、モード無)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\t読込専用モード (\"view\" と同じ)"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\t制限モード (\"rvim\" と同じ)"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\t変更 (ファイル保存時) をできないようにする"
diff --git a/src/nvim/po/ko.UTF-8.po b/src/nvim/po/ko.UTF-8.po
index 128b238f8b..b99c22caeb 100644
--- a/src/nvim/po/ko.UTF-8.po
+++ b/src/nvim/po/ko.UTF-8.po
@@ -3438,10 +3438,6 @@ msgstr "-y\t\t\t쉬운 상태 (\"evim\"과 같음, modeless)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\t읽기 전용 상태 (\"view\"와 같음)"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\t제한된 상태 (\"rvim\"과 같음)"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\t수정(파일 쓰기)이 허용되지 않음"
diff --git a/src/nvim/po/nb.po b/src/nvim/po/nb.po
index 34617ccf18..2285d755cf 100644
--- a/src/nvim/po/nb.po
+++ b/src/nvim/po/nb.po
@@ -3452,10 +3452,6 @@ msgstr "-y\t\t\tLett modus (som \"evim\", uten modus)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tSkrivebeskyttet modus (som \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tBegrenset modus (som \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tModifisering (lagring av filer) ikke tillatt"
diff --git a/src/nvim/po/nl.po b/src/nvim/po/nl.po
index 30f34508f5..00d113c83c 100644
--- a/src/nvim/po/nl.po
+++ b/src/nvim/po/nl.po
@@ -3449,10 +3449,6 @@ msgstr "-y\t\t\tEenvoudige modus (zoals \"evim\", zonder modus)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tAlleen-lezen modus (zoals \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tBeperkte modus (zoals \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tAanpassingen (bestanden opslaan) niet toegestaan"
diff --git a/src/nvim/po/no.po b/src/nvim/po/no.po
index 34617ccf18..2285d755cf 100644
--- a/src/nvim/po/no.po
+++ b/src/nvim/po/no.po
@@ -3452,10 +3452,6 @@ msgstr "-y\t\t\tLett modus (som \"evim\", uten modus)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tSkrivebeskyttet modus (som \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tBegrenset modus (som \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tModifisering (lagring av filer) ikke tillatt"
diff --git a/src/nvim/po/pl.UTF-8.po b/src/nvim/po/pl.UTF-8.po
index f5c452e924..5f1779d1bd 100644
--- a/src/nvim/po/pl.UTF-8.po
+++ b/src/nvim/po/pl.UTF-8.po
@@ -3417,10 +3417,6 @@ msgstr "-y\t\t\tTryb łatwy (jak \"evim\", bez trybów)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tTryb wyłącznie do odczytu (jak \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tTryb ograniczenia (jak \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tModyfikacje (zapisywanie plików) niedozwolone"
diff --git a/src/nvim/po/pt_BR.po b/src/nvim/po/pt_BR.po
index 4f39cb5bdb..533d916de1 100644
--- a/src/nvim/po/pt_BR.po
+++ b/src/nvim/po/pt_BR.po
@@ -6229,10 +6229,6 @@ msgstr "-y\t\t\tModo fácil (como \"evim\", o Vim não modal)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tmodo somente-leitura (como \"view\")"
-#: ../main.c:2186
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tmodo restrito (como \"rvim\")"
-
#: ../main.c:2187
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tNo permitir alteraes (gravao de arquivos)"
diff --git a/src/nvim/po/ru.po b/src/nvim/po/ru.po
index 62f892d257..3a96ece2fb 100644
--- a/src/nvim/po/ru.po
+++ b/src/nvim/po/ru.po
@@ -3442,10 +3442,6 @@ msgstr "-y\t\t\tПростой режим (как \"evim\", безрежимны
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tТолько для чтения (как \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tОграниченный режим (как \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tБез возможности сохранения изменений (записи файлов)"
diff --git a/src/nvim/po/sk.cp1250.po b/src/nvim/po/sk.cp1250.po
index ced343bf6b..ff95c68a12 100644
--- a/src/nvim/po/sk.cp1250.po
+++ b/src/nvim/po/sk.cp1250.po
@@ -3450,10 +3450,6 @@ msgstr "-y\t\t\tJednoduch md (rovnak ako \"evim\", bezmdov)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tMd iba pre tanie (ako \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tObmedzen md (rovnak ako \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tZmeny (ukladanie sborov) zakzan"
diff --git a/src/nvim/po/sk.po b/src/nvim/po/sk.po
index 66b3d5abb1..d35622726f 100644
--- a/src/nvim/po/sk.po
+++ b/src/nvim/po/sk.po
@@ -3450,10 +3450,6 @@ msgstr "-y\t\t\tJednoduch md (rovnak ako \"evim\", bezmdov)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tMd iba pre tanie (ako \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tObmedzen md (rovnak ako \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tZmeny (ukladanie sborov) zakzan"
diff --git a/src/nvim/po/sr.po b/src/nvim/po/sr.po
index 4c157658e5..a93a2ec584 100644
--- a/src/nvim/po/sr.po
+++ b/src/nvim/po/sr.po
@@ -3028,9 +3028,6 @@ msgstr "-y\t\t\tEasy режим (као \"evim\", безрежимни)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tReadonly режим (као \"view\")"
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tRestricted режим (као \"rvim\")"
-
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tИзмене (уписивање датотека) нису дозвољене"
diff --git a/src/nvim/po/sv.po b/src/nvim/po/sv.po
index db7bada888..d50c9d695d 100644
--- a/src/nvim/po/sv.po
+++ b/src/nvim/po/sv.po
@@ -5735,10 +5735,6 @@ msgstr "-y\t\t\tLtt lge (som \"evim\", lgesls)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tSkrivskyddat lge (som \"view\")"
-#: ../main.c:2186
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tBegrnsat lge (som \"rvim\")"
-
#: ../main.c:2187
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tModifieringar (skriva filer) inte tilltet"
diff --git a/src/nvim/po/uk.po b/src/nvim/po/uk.po
index 604e425bd0..f0ae154648 100644
--- a/src/nvim/po/uk.po
+++ b/src/nvim/po/uk.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: vim 7.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-08-23 18:45+0300\n"
+"POT-Creation-Date: 2021-01-18 17:46+0200\n"
"PO-Revision-Date: 2020-08-23 20:19+0300\n"
"Last-Translator: Анатолій Сахнік <sakhnik@gmail.com>\n"
"Language-Team: Ukrainian\n"
@@ -23,6 +23,67 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+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: Знищення автогрупи, яка все ще використовується"
+
+#, 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 "[Location List]"
msgstr "[Список місць]"
@@ -95,9 +156,15 @@ msgid ""
"E89: No write since last change for buffer %<PRId64> (add ! to override)"
msgstr "E89: Буфер %<PRId64> має зміни (! щоб не зважати)"
+msgid "E948: Job still running (add ! to end the job)"
+msgstr "E948: Задача все ще виконується (! щоб закінчити)"
+
msgid "E37: No write since last change (add ! to override)"
msgstr "E37: Зміни не було записано (! щоб не зважати)"
+msgid "E948: Job still running"
+msgstr "E948: Задача все ще виконується"
+
msgid "E37: No write since last change"
msgstr "E37: Не записано після останніх змін"
@@ -465,6 +532,10 @@ msgid "E957: Invalid window number"
msgstr "E957: Некоректний номер вікна"
#, c-format
+msgid "E940: Cannot lock or unlock variable %s"
+msgstr "E940: Неможливо заблокувати чи розблокувати змінну %s"
+
+#, c-format
msgid "E734: Wrong variable type for %s="
msgstr "E734: Неправильний тип змінної для %s="
@@ -544,10 +615,6 @@ msgstr "E690: Пропущено «in» після :for"
msgid "E108: No such variable: \"%s\""
msgstr "E108: Змінної немає: «%s»"
-#, c-format
-msgid "E940: Cannot lock or unlock variable %s"
-msgstr "E940: Неможливо заблокувати чи розблокувати змінну %s"
-
msgid "E109: Missing ':' after '?'"
msgstr "E109: Бракує ':' після '?'"
@@ -950,9 +1017,6 @@ msgstr "E684: Індекс списку поза межами: %<PRId64>"
msgid "E686: Argument of %s must be a List"
msgstr "E686: Аргумент у %s має бути списком"
-msgid "E928: String required"
-msgstr "E928: Потрібен String"
-
#, c-format
msgid "Error converting the call result: %s"
msgstr "Не вдалося перетворити результат виклику: %s"
@@ -1591,6 +1655,10 @@ msgid "Close \"%s\"?"
msgstr "Закрити «%s»?"
#, c-format
+msgid "E947: Job still running in buffer \"%s\""
+msgstr "E947: Задача все ще запущена у буфері «%s»"
+
+#, c-format
msgid "E162: No write since last change for buffer \"%s\""
msgstr "E162: Буфер «%s» має незбережені зміни"
@@ -1615,18 +1683,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 ":source error parsing command %s"
msgstr ":source помилка розбору команди %s"
@@ -1702,12 +1758,16 @@ msgstr "Режим Ex. Для повернення до нормального
msgid "E501: At end-of-file"
msgstr "E501: Кінець файлу"
-msgid "E169: Command too recursive"
-msgstr "E169: Команда занадто рекурсивна"
+#, c-format
+msgid "Executing: %s"
+msgstr "Виконується: %s"
msgid "line %"
msgstr "рядок %"
+msgid "E169: Command too recursive"
+msgstr "E169: Команда занадто рекурсивна"
+
#, c-format
msgid "E605: Exception not caught: %s"
msgstr "E605: Виняткова ситуація не оброблена: %s"
@@ -1724,9 +1784,6 @@ msgstr "E464: Неоднозначний вжиток команди корис
msgid "E492: Not an editor command"
msgstr "E492: Це не команда редактора"
-msgid "E981: Command not allowed in restricted mode"
-msgstr "E981: Команду не дозволено у обмеженому режимі"
-
msgid "E493: Backwards range given"
msgstr "E493: Інтервал задано навиворіт"
@@ -1736,6 +1793,11 @@ msgstr "Інтервал задано навиворіт, щоб помінят
msgid "E494: Use w or w>>"
msgstr "E494: Спробуйте w або w>>"
+msgid ""
+"INTERNAL: Cannot use EX_DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX"
+msgstr ""
+"ВНУТРІШНЄ: Не можна вживати EX_DFLALL з ADDR_NONE, ADDR_UNSIGNED чи ADDR_QUICKFIX"
+
msgid "E943: Command table needs to be updated, run 'make'"
msgstr "E943: Потрібно поновити таблицю команд, запустіть 'make'"
@@ -1762,10 +1824,10 @@ msgstr "E174: Команда вже існує, ! щоб замінити її:
msgid ""
"\n"
-" Name Args Address Complete Definition"
+" Name Args Address Complete Definition"
msgstr ""
"\n"
-" Назва Арг. Адреса Доповнення Визначення"
+" Назва Арг. Адреса Доповнення Визначення"
msgid "No user-defined commands found"
msgstr "Не знайдено команд користувача"
@@ -2077,12 +2139,12 @@ msgstr "E347: У шляху пошуку більше немає файлів «
msgid "E812: Autocommands changed buffer or buffer name"
msgstr "E812: Автокоманди змінили буфер чи його назву"
-msgid "Illegal file name"
-msgstr "Недозволена назва файлу"
-
msgid "is a directory"
msgstr "каталог"
+msgid "Illegal file name"
+msgstr "Недозволена назва файлу"
+
msgid "is not a file"
msgstr "не файл"
@@ -2104,9 +2166,6 @@ msgstr "E201: Автокоманди *ReadPre не повинні змінюва
msgid "E202: Conversion made file unreadable!"
msgstr "E202: Конвертація унеможливила читання файлу!"
-msgid "[fifo/socket]"
-msgstr "[канал/сокет]"
-
msgid "[fifo]"
msgstr "[канал]"
@@ -2353,67 +2412,6 @@ msgstr "E462: Не вдалося підготувати «%s», щоб пере
msgid "E321: Could not reload \"%s\""
msgstr "E321: Не вдалося перечитати «%s»"
-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: Знищення автогрупи, яка все ще використовується"
-
-#, 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 "E219: Missing {."
msgstr "E219: Бракує {."
@@ -2519,9 +2517,6 @@ msgstr "E685: Внутрішня помилка: %s"
msgid "Interrupted"
msgstr "Перервано"
-msgid "E14: Invalid address"
-msgstr "E14: Неправильна адреса"
-
msgid "E474: Invalid argument"
msgstr "E474: Некоректний аргумент"
@@ -2719,6 +2714,9 @@ msgstr "E45: Встановлено опцію 'readonly' (! щоб не зва
msgid "E46: Cannot change read-only variable \"%.*s\""
msgstr "E46: Змінна тільки для читання: «%.*s»"
+msgid "E928: String required"
+msgstr "E928: Потрібен String"
+
msgid "E715: Dictionary required"
msgstr "E715: Потрібен словник"
@@ -2727,8 +2725,8 @@ msgid "E118: Too many arguments for function: %s"
msgstr "E118: Забагато аргументів для функції: %s"
#, c-format
-msgid "E716: Key not present in Dictionary: %s"
-msgstr "E716: Немає такого ключа у словнику: %s"
+msgid "E716: Key not present in Dictionary: \"%s\""
+msgstr "E716: Немає такого ключа у словнику: «%s»"
msgid "E714: List required"
msgstr "E714: Потрібен список"
@@ -3158,6 +3156,10 @@ msgid "E5106: Error while creating shared module: %.*s"
msgstr "E5106: Помилка створення розділюваного модуля: %.*s"
#, c-format
+msgid "E5106: Error while creating inspect module: %.*s"
+msgstr "E5106: Помилка створення модуля inspect: %.*s"
+
+#, c-format
msgid "E5106: Error while creating vim module: %.*s"
msgstr "E5106: Помилка створення модуля vim: %.*s"
@@ -3165,10 +3167,6 @@ msgid "E970: Failed to initialize lua interpreter"
msgstr "E970: Не вдалося ініціалізувати інтерпретатор lua"
#, c-format
-msgid "E5117: Error while updating package paths: %.*s"
-msgstr "E5117: Помилка оновлення шляхів пакунку: %.*s"
-
-#, c-format
msgid "E5114: Error while converting print argument #%i: %.*s"
msgstr "E5114: Не вдалося перетворити аргумент #%i друку: %.*s"
@@ -3256,6 +3254,10 @@ msgid "pre-vimrc command line"
msgstr "команди перед vimrc"
#, c-format
+msgid "Conflicting configs: \"%s\" \"%s\""
+msgstr "Суперечливі конфігурації: «%s» «%s»"
+
+#, c-format
msgid "E282: Cannot read from \"%s\""
msgstr "E282: Не вдалося прочитати з «%s»"
@@ -3367,9 +3369,6 @@ msgstr " -v, --version Надрукувати інформацію пр
msgid " -V[N][file] Verbose [level][file]\n"
msgstr " -V[N][файл] Більше повідомлень [рівень][файл]\n"
-msgid " -Z Restricted mode\n"
-msgstr " -Z Обмежений режим\n"
-
msgid " --api-info Write msgpack-encoded API metadata to stdout\n"
msgstr ""
" --api-info Записати метадані API, серіалізовані у msgpack, у "
@@ -4005,8 +4004,7 @@ msgstr ""
"Введіть :qa! і натисність <Enter> щоб відкинути всі зміни і вийти Nvim"
msgid "Type :qa and press <Enter> to exit Nvim"
-msgstr ""
-"Введіть :qa і натисність <Enter> щоб вийти з Nvim"
+msgstr "Введіть :qa і натисність <Enter> щоб вийти з Nvim"
#, c-format
msgid "1 line %sed 1 time"
@@ -4071,10 +4069,10 @@ msgstr "E353: У регістрі %s нічого немає"
msgid ""
"\n"
-"--- Registers ---"
+"Type Name Content"
msgstr ""
"\n"
-"--- Регістри ---"
+"Тип Наз. Вміст "
msgid ""
"E883: search pattern and expression register may not contain two or more "
@@ -4187,9 +4185,6 @@ msgstr "E537: 'commentstring' має бути порожньою чи місти
msgid "E540: Unclosed expression sequence"
msgstr "E540: Послідовність виразів не завершено"
-msgid "E541: too many items"
-msgstr "E541: Забагато елементів"
-
msgid "E542: unbalanced groups"
msgstr "E542: Групи не збалансовано"
@@ -4277,6 +4272,9 @@ msgstr ""
msgid "E5677: Error writing input to shell-command: %s"
msgstr "E5677: Не вдалося записати на вхід команди оболонки: %s"
+msgid "%a %b %d %H:%M:%S %Y"
+msgstr "%H:%M:%S %a, %d %B %Y р."
+
#, c-format
msgid "E447: Can't find file \"%s\" in path"
msgstr "E447: Файл «%s» не знайдено у шляху пошуку"
@@ -4284,8 +4282,11 @@ msgstr "E447: Файл «%s» не знайдено у шляху пошуку"
msgid "E553: No more items"
msgstr "E553: Немає більше елементів"
+msgid "E925: Current quickfix list was changed"
+msgstr "E925: Поточний список quickfix змінився"
+
msgid "E926: Current location list was changed"
-msgstr "E926: Цей список місць було змінено"
+msgstr "E926: Поточний список місць змінився"
#, c-format
msgid "E372: Too many %%%c in format string"
@@ -4319,9 +4320,6 @@ msgstr "E379: Пропущена чи порожня назва каталогу
msgid "E924: Current window was closed"
msgstr "E924: Активне вікно було закрито"
-msgid "E925: Current quickfix was changed"
-msgstr "E925: Цей quickfix було змінено"
-
#, c-format
msgid "(%d of %d)%s%s: "
msgstr "(%d з %d)%s%s: "
@@ -4349,6 +4347,9 @@ msgstr "E683: Пропущено назву файлу чи некоректни
msgid "Cannot open file \"%s\""
msgstr "Не вдалося відкрити файл «%s»"
+msgid "cannot have both a list and a \"what\" argument"
+msgstr "не можна задавати одночасно список і аргумент «що»"
+
msgid "E681: Buffer is not loaded"
msgstr "E681: Буфер не завантажено"
@@ -4469,6 +4470,18 @@ msgstr ""
msgid "Switching to backtracking RE engine for pattern: "
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 " TERMINAL"
msgstr " ТЕРМІНАЛ"
@@ -5252,6 +5265,9 @@ msgstr "синхронізується по коментарях стилю С"
msgid "no syncing"
msgstr "без синхронізації"
+msgid "syncing starts at the first line"
+msgstr "синхронізація починається з першого рядка"
+
msgid "syncing starts "
msgstr "починається синхронізація за "
@@ -5283,6 +5299,9 @@ msgstr ""
msgid "E392: No such syntax cluster: %s"
msgstr "E392: Немає такого синтаксичного кластера: %s"
+msgid "from the first line"
+msgstr "з першого рядка"
+
msgid "minimal "
msgstr "мінімальний "
diff --git a/src/nvim/po/vi.po b/src/nvim/po/vi.po
index a954ea6e34..c693f910d8 100644
--- a/src/nvim/po/vi.po
+++ b/src/nvim/po/vi.po
@@ -3479,10 +3479,6 @@ msgstr "-y\t\t\tChế độ đơn giản (giống \"evim\", không có chế đ
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\tChế độ chỉ đọc (giống \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\tChế độ hạn chế (giống \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\tKhông có khả năng ghi nhớ thay đổi (ghi nhớ tập tin)"
diff --git a/src/nvim/po/zh_CN.UTF-8.po b/src/nvim/po/zh_CN.UTF-8.po
index 542157002a..1e329443ce 100644
--- a/src/nvim/po/zh_CN.UTF-8.po
+++ b/src/nvim/po/zh_CN.UTF-8.po
@@ -3427,10 +3427,6 @@ msgstr "-y\t\t\t容易模式 (同 \"evim\",无模式)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\t只读模式 (同 \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\t限制模式 (同 \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\t不可修改(写入文件)"
diff --git a/src/nvim/po/zh_TW.UTF-8.po b/src/nvim/po/zh_TW.UTF-8.po
index 6a11b5e669..c97f31ddcf 100644
--- a/src/nvim/po/zh_TW.UTF-8.po
+++ b/src/nvim/po/zh_TW.UTF-8.po
@@ -3482,10 +3482,6 @@ msgstr "-y\t\t\t簡易模式 (同 \"evim\", modeless)"
msgid "-R\t\t\tReadonly mode (like \"view\")"
msgstr "-R\t\t\t唯讀模式 (同 \"view\")"
-#: ../main.c:2208
-msgid "-Z\t\t\tRestricted mode (like \"rvim\")"
-msgstr "-Z\t\t\t限制模式 (同 \"rvim\")"
-
#: ../main.c:2209
msgid "-m\t\t\tModifications (writing files) not allowed"
msgstr "-m\t\t\t不可修改 (寫入檔案)"
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index aeac6e4905..a625c09f78 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -143,6 +143,7 @@ struct efm_S {
// 'E' error message
// 'W' warning message
// 'I' informational message
+ // 'N' note message
// 'C' continuation line
// 'Z' end of multi-line message
// 'G' general, unspecific message
@@ -457,7 +458,7 @@ static const char_u *efm_analyze_prefix(const char_u *efmp, efm_T *efminfo,
if (vim_strchr((char_u *)"+-", *efmp) != NULL) {
efminfo->flags = *efmp++;
}
- if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL) {
+ if (vim_strchr((char_u *)"DXAEWINCZGOPQ", *efmp) != NULL) {
efminfo->prefix = *efmp;
} else {
snprintf((char *)errmsg, errmsglen,
@@ -967,7 +968,7 @@ restofline:
fmt_start = fmt_ptr;
}
- if (vim_strchr((char_u *)"AEWI", idx) != NULL) {
+ if (vim_strchr((char_u *)"AEWIN", idx) != NULL) {
qfl->qf_multiline = true; // start of a multi-line message
qfl->qf_multiignore = false; // reset continuation
} else if (vim_strchr((char_u *)"CZ", idx) != NULL) {
@@ -1499,7 +1500,7 @@ static int qf_parse_match(char_u *linebuf, size_t linelen, efm_T *fmt_ptr,
if ((idx == 'C' || idx == 'Z') && !qf_multiline) {
return QF_FAIL;
}
- if (vim_strchr((char_u *)"EWI", idx) != NULL) {
+ if (vim_strchr((char_u *)"EWIN", idx) != NULL) {
fields->type = idx;
} else {
fields->type = 0;
@@ -3300,6 +3301,24 @@ void qf_history(exarg_T *eap)
qf_info_T *qi = qf_cmd_get_stack(eap, false);
int i;
+ if (eap->addr_count > 0) {
+ if (qi == NULL) {
+ EMSG(_(e_loclist));
+ return;
+ }
+
+ // Jump to the specified quickfix list
+ if (eap->line2 > 0 && eap->line2 <= qi->qf_listcount) {
+ qi->qf_curlist = (int)(eap->line2 - 1);
+ qf_msg(qi, qi->qf_curlist, "");
+ qf_update_buffer(qi, NULL);
+ } else {
+ EMSG(_(e_invrange));
+ }
+
+ return;
+ }
+
if (qf_stack_empty(qi)) {
MSG(_("No entries"));
} else {
@@ -3414,11 +3433,13 @@ bool qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount,
// e or E 0 " error"
// w or W 0 " warning"
// i or I 0 " info"
+// n or N 0 " note"
// 0 0 ""
// other 0 " c"
// e or E n " error n"
// w or W n " warning n"
// i or I n " info n"
+// n or N n " note n"
// 0 n " error n"
// other n " c n"
// 1 x "" :helpgrep
@@ -3428,15 +3449,17 @@ static char_u *qf_types(int c, int nr)
static char_u cc[3];
char_u *p;
- if (c == 'W' || c == 'w')
+ if (c == 'W' || c == 'w') {
p = (char_u *)" warning";
- else if (c == 'I' || c == 'i')
+ } else if (c == 'I' || c == 'i') {
p = (char_u *)" info";
- else if (c == 'E' || c == 'e' || (c == 0 && nr > 0))
+ } else if (c == 'N' || c == 'n') {
+ p = (char_u *)" note";
+ } else if (c == 'E' || c == 'e' || (c == 0 && nr > 0)) {
p = (char_u *)" error";
- else if (c == 0 || c == 1)
+ } else if (c == 0 || c == 1) {
p = (char_u *)"";
- else {
+ } else {
cc[0] = ' ';
cc[1] = (char_u)c;
cc[2] = NUL;
@@ -3622,7 +3645,7 @@ static int qf_open_new_cwindow(qf_info_T *qi, int height)
// Set the options for the quickfix buffer/window (if not already done)
// Do this even if the quickfix buffer was already present, as an autocmd
// might have previously deleted (:bdelete) the quickfix buffer.
- if (curbuf->b_p_bt[0] != 'q') {
+ if (!bt_quickfix(curbuf)) {
qf_set_cwindow_options();
}
@@ -4269,11 +4292,22 @@ static char_u *get_mef_name(void)
return name;
}
-/// Returns the number of valid entries in the current quickfix/location list.
+/// Returns the number of entries in the current quickfix/location list.
size_t qf_get_size(exarg_T *eap)
FUNC_ATTR_NONNULL_ALL
{
qf_info_T *qi;
+
+ if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
+ return 0;
+ }
+ return (size_t)qf_get_curlist(qi)->qf_count;
+}
+
+/// Returns the number of valid entries in the current quickfix/location list.
+size_t qf_get_valid_size(exarg_T *eap)
+{
+ qf_info_T *qi;
qf_list_T *qfl;
if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
@@ -4562,74 +4596,150 @@ static qfline_T * qf_find_last_entry_on_line(qfline_T *entry, int *errornr)
return entry;
}
-/// Find the first quickfix entry below line 'lnum' in buffer 'bnr'.
+// Returns true if the specified quickfix entry is
+// after the given line (linewise is true)
+// or after the line and column.
+static bool qf_entry_after_pos(const qfline_T *qfp, const pos_T *pos,
+ bool linewise)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (linewise) {
+ return qfp->qf_lnum > pos->lnum;
+ }
+ return qfp->qf_lnum > pos->lnum
+ || (qfp->qf_lnum == pos->lnum && qfp->qf_col > pos->col);
+}
+
+// Returns true if the specified quickfix entry is
+// before the given line (linewise is true)
+// or before the line and column.
+static bool qf_entry_before_pos(const qfline_T *qfp, const pos_T *pos,
+ bool linewise)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (linewise) {
+ return qfp->qf_lnum < pos->lnum;
+ }
+ return qfp->qf_lnum < pos->lnum
+ || (qfp->qf_lnum == pos->lnum && qfp->qf_col < pos->col);
+}
+
+// Returns true if the specified quickfix entry is
+// on or after the given line (linewise is true)
+// or on or after the line and column.
+static bool qf_entry_on_or_after_pos(const qfline_T *qfp, const pos_T *pos,
+ bool linewise)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (linewise) {
+ return qfp->qf_lnum >= pos->lnum;
+ }
+ return qfp->qf_lnum > pos->lnum
+ || (qfp->qf_lnum == pos->lnum && qfp->qf_col >= pos->col);
+}
+
+// Returns true if the specified quickfix entry is
+// on or before the given line (linewise is true)
+// or on or before the line and column.
+static bool qf_entry_on_or_before_pos(const qfline_T *qfp, const pos_T *pos,
+ bool linewise)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ if (linewise) {
+ return qfp->qf_lnum <= pos->lnum;
+ }
+ return qfp->qf_lnum < pos->lnum
+ || (qfp->qf_lnum == pos->lnum && qfp->qf_col <= pos->col);
+}
+
+/// Find the first quickfix entry after position 'pos' in buffer 'bnr'.
+/// If 'linewise' is true, returns the entry after the specified line and treats
+/// multiple entries on a single line as one. Otherwise returns the entry after
+/// the specified line and column.
/// 'qfp' points to the very first entry in the buffer and 'errornr' is the
/// index of the very first entry in the quickfix list.
-/// Returns NULL if an entry is not found after 'lnum'.
-static qfline_T *qf_find_entry_on_next_line(int bnr,
- linenr_T lnum,
- qfline_T *qfp,
- int *errornr)
+/// Returns NULL if an entry is not found after 'pos'.
+static qfline_T *qf_find_entry_after_pos(
+ int bnr,
+ const pos_T *pos,
+ bool linewise,
+ qfline_T *qfp,
+ int *errornr
+)
+ FUNC_ATTR_NONNULL_ALL
{
- if (qfp->qf_lnum > lnum) {
- // First entry is after line 'lnum'
+ if (qf_entry_after_pos(qfp, pos, linewise)) {
+ // First entry is after postion 'pos'
return qfp;
}
- // Find the entry just before or at the line 'lnum'
+ // Find the entry just before or at the position 'pos'
while (qfp->qf_next != NULL
&& qfp->qf_next->qf_fnum == bnr
- && qfp->qf_next->qf_lnum <= lnum) {
+ && qf_entry_on_or_before_pos(qfp->qf_next, pos, linewise)) {
qfp = qfp->qf_next;
(*errornr)++;
}
if (qfp->qf_next == NULL || qfp->qf_next->qf_fnum != bnr) {
- // No entries found after 'lnum'
+ // No entries found after position 'pos'
return NULL;
}
- // Use the entry just after line 'lnum'
+ // Use the entry just after position 'pos'
qfp = qfp->qf_next;
(*errornr)++;
return qfp;
}
-/// Find the first quickfix entry before line 'lnum' in buffer 'bnr'.
+/// Find the first quickfix entry before position 'pos' in buffer 'bnr'.
+/// If 'linewise' is true, returns the entry before the specified line and
+/// treats multiple entries on a single line as one. Otherwise returns the entry
+/// before the specified line and column.
/// 'qfp' points to the very first entry in the buffer and 'errornr' is the
/// index of the very first entry in the quickfix list.
-/// Returns NULL if an entry is not found before 'lnum'.
-static qfline_T *qf_find_entry_on_prev_line(int bnr,
- linenr_T lnum,
- qfline_T *qfp,
- int *errornr)
+/// Returns NULL if an entry is not found before 'pos'.
+static qfline_T *qf_find_entry_before_pos(
+ int bnr,
+ const pos_T *pos,
+ bool linewise,
+ qfline_T *qfp,
+ int *errornr
+)
+ FUNC_ATTR_NONNULL_ALL
{
- // Find the entry just before the line 'lnum'
+ // Find the entry just before the position 'pos'
while (qfp->qf_next != NULL
&& qfp->qf_next->qf_fnum == bnr
- && qfp->qf_next->qf_lnum < lnum) {
+ && qf_entry_before_pos(qfp->qf_next, pos, linewise)) {
qfp = qfp->qf_next;
(*errornr)++;
}
- if (qfp->qf_lnum >= lnum) { // entry is after 'lnum'
+ if (qf_entry_on_or_after_pos(qfp, pos, linewise)) {
return NULL;
}
- // If multiple entries are on the same line, then use the first entry
- qfp = qf_find_first_entry_on_line(qfp, errornr);
+ if (linewise) {
+ // If multiple entries are on the same line, then use the first entry
+ qfp = qf_find_first_entry_on_line(qfp, errornr);
+ }
return qfp;
}
-/// Find a quickfix entry in 'qfl' closest to line 'lnum' in buffer 'bnr' in
+/// Find a quickfix entry in 'qfl' closest to position 'pos' in buffer 'bnr' in
/// the direction 'dir'.
-static qfline_T *qf_find_closest_entry(qf_list_T *qfl,
- int bnr,
- linenr_T lnum,
- int dir,
- int *errornr)
+static qfline_T *qf_find_closest_entry(
+ qf_list_T *qfl,
+ int bnr,
+ const pos_T *pos,
+ Direction dir,
+ bool linewise,
+ int *errornr
+)
+ FUNC_ATTR_NONNULL_ALL
{
qfline_T *qfp;
@@ -4642,33 +4752,38 @@ static qfline_T *qf_find_closest_entry(qf_list_T *qfl,
}
if (dir == FORWARD) {
- qfp = qf_find_entry_on_next_line(bnr, lnum, qfp, errornr);
+ qfp = qf_find_entry_after_pos(bnr, pos, linewise, qfp, errornr);
} else {
- qfp = qf_find_entry_on_prev_line(bnr, lnum, qfp, errornr);
+ qfp = qf_find_entry_before_pos(bnr, pos, linewise, qfp, errornr);
}
return qfp;
}
-/// Get the nth quickfix entry below the specified entry treating multiple
-/// entries on a single line as one. Searches forward in the list.
-static void qf_get_nth_below_entry(qfline_T *entry,
- int *errornr,
- linenr_T n)
+/// Get the nth quickfix entry below the specified entry. Searches forward in
+/// the list. If linewise is true, then treat multiple entries on a single line
+/// as one.
+static void qf_get_nth_below_entry(qfline_T *entry, linenr_T n,
+ bool linewise, int *errornr)
+ FUNC_ATTR_NONNULL_ALL
{
while (n-- > 0 && !got_int) {
// qfline_T *first_entry = entry;
int first_errornr = *errornr;
- // Treat all the entries on the same line in this file as one
- entry = qf_find_last_entry_on_line(entry, errornr);
+ if (linewise) {
+ // Treat all the entries on the same line in this file as one
+ entry = qf_find_last_entry_on_line(entry, errornr);
+ }
if (entry->qf_next == NULL
|| entry->qf_next->qf_fnum != entry->qf_fnum) {
- // If multiple entries are on the same line, then use the first
- // entry
- // entry = first_entry;
- *errornr = first_errornr;
+ if (linewise) {
+ // If multiple entries are on the same line, then use the first
+ // entry
+ // entry = first_entry;
+ *errornr = first_errornr;
+ }
break;
}
@@ -4677,11 +4792,12 @@ static void qf_get_nth_below_entry(qfline_T *entry,
}
}
-/// Get the nth quickfix entry above the specified entry treating multiple
-/// entries on a single line as one. Searches backwards in the list.
-static void qf_get_nth_above_entry(qfline_T *entry,
- int *errornr,
- linenr_T n)
+/// Get the nth quickfix entry above the specified entry. Searches backwards in
+/// the list. If linewise is TRUE, then treat multiple entries on a single line
+/// as one.
+static void qf_get_nth_above_entry(qfline_T *entry, linenr_T n,
+ bool linewise, int *errornr)
+ FUNC_ATTR_NONNULL_ALL
{
while (n-- > 0 && !got_int) {
if (entry->qf_prev == NULL
@@ -4692,25 +4808,30 @@ static void qf_get_nth_above_entry(qfline_T *entry,
entry = entry->qf_prev;
(*errornr)--;
- // If multiple entries are on the same line, then use the first entry
- entry = qf_find_first_entry_on_line(entry, errornr);
+ if (linewise) {
+ entry = qf_find_first_entry_on_line(entry, errornr);
+ }
}
}
-/// Find the n'th quickfix entry adjacent to line 'lnum' in buffer 'bnr' in the
-/// specified direction.
-/// Returns the error number in the quickfix list or 0 if an entry is not found.
-static int qf_find_nth_adj_entry(qf_list_T *qfl,
- int bnr,
- linenr_T lnum,
- linenr_T n,
- int dir)
+/// Find the n'th quickfix entry adjacent to position 'pos' in buffer 'bnr' in
+/// the specified direction. Returns the error number in the quickfix list or 0
+/// if an entry is not found.
+static int qf_find_nth_adj_entry(
+ qf_list_T *qfl,
+ int bnr,
+ pos_T *pos,
+ linenr_T n,
+ Direction dir,
+ bool linewise
+)
+ FUNC_ATTR_NONNULL_ALL
{
- qfline_T *adj_entry;
int errornr;
- // Find an entry closest to the specified line
- adj_entry = qf_find_closest_entry(qfl, bnr, lnum, dir, &errornr);
+ // Find an entry closest to the specified position
+ qfline_T *const adj_entry = qf_find_closest_entry(qfl, bnr, pos, dir,
+ linewise, &errornr);
if (adj_entry == NULL) {
return 0;
}
@@ -4718,24 +4839,25 @@ static int qf_find_nth_adj_entry(qf_list_T *qfl,
if (--n > 0) {
// Go to the n'th entry in the current buffer
if (dir == FORWARD) {
- qf_get_nth_below_entry(adj_entry, &errornr, n);
+ qf_get_nth_below_entry(adj_entry, n, linewise, &errornr);
} else {
- qf_get_nth_above_entry(adj_entry, &errornr, n);
+ qf_get_nth_above_entry(adj_entry, n, linewise, &errornr);
}
}
return errornr;
}
-/// Jump to a quickfix entry in the current file nearest to the current line.
-/// ":cabove", ":cbelow", ":labove" and ":lbelow" commands
+/// Jump to a quickfix entry in the current file nearest to the current line or
+/// current line/col.
+/// ":cabove", ":cbelow", ":labove", ":lbelow", ":cafter", ":cbefore",
+/// ":lafter" and ":lbefore" commands
void ex_cbelow(exarg_T *eap)
{
qf_info_T *qi;
qf_list_T *qfl;
int dir;
int buf_has_flag;
- int errornr = 0;
if (eap->addr_count > 0 && eap->line2 <= 0) {
EMSG(_(e_invrange));
@@ -4743,7 +4865,8 @@ void ex_cbelow(exarg_T *eap)
}
// Check whether the current buffer has any quickfix entries
- if (eap->cmdidx == CMD_cabove || eap->cmdidx == CMD_cbelow) {
+ if (eap->cmdidx == CMD_cabove || eap->cmdidx == CMD_cbelow
+ || eap->cmdidx == CMD_cbefore || eap->cmdidx == CMD_cafter) {
buf_has_flag = BUF_HAS_QF_ENTRY;
} else {
buf_has_flag = BUF_HAS_LL_ENTRY;
@@ -4764,14 +4887,30 @@ void ex_cbelow(exarg_T *eap)
return;
}
- if (eap->cmdidx == CMD_cbelow || eap->cmdidx == CMD_lbelow) {
+ if (eap->cmdidx == CMD_cbelow
+ || eap->cmdidx == CMD_lbelow
+ || eap->cmdidx == CMD_cafter
+ || eap->cmdidx == CMD_lafter) {
+ // Forward motion commands
dir = FORWARD;
} else {
dir = BACKWARD;
}
- errornr = qf_find_nth_adj_entry(qfl, curbuf->b_fnum, curwin->w_cursor.lnum,
- eap->addr_count > 0 ? eap->line2 : 0, dir);
+ pos_T pos = curwin->w_cursor;
+ // A quickfix entry column number is 1 based whereas cursor column
+ // number is 0 based. Adjust the column number.
+ pos.col++;
+ const int errornr = qf_find_nth_adj_entry(
+ qfl,
+ curbuf->b_fnum,
+ &pos,
+ eap->addr_count > 0 ? eap->line2 : 0,
+ dir,
+ eap->cmdidx == CMD_cbelow
+ || eap->cmdidx == CMD_lbelow
+ || eap->cmdidx == CMD_cabove
+ || eap->cmdidx == CMD_labove);
if (errornr > 0) {
qf_jump(qi, 0, errornr, false);
@@ -6818,8 +6957,9 @@ void ex_helpgrep(exarg_T *eap)
if (au_name != NULL) {
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
curbuf->b_fname, true, curbuf);
- if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL) {
- // autocommands made "qi" invalid
+ // When adding a location list to an existing location list stack,
+ // if the autocmd made the stack invalid, then just return.
+ if (!new_qi && IS_LL_STACK(qi) && qf_find_win_with_loclist(qi) == NULL) {
decr_quickfix_busy();
return;
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index a7fd2bfcc6..a78f905a70 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -2417,8 +2417,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
}
- if (wp->w_p_list) {
- if (curwin->w_p_lcs_chars.space
+ 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.nbsp) {
extra_check = true;
@@ -2665,7 +2665,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
}
- //sign column
+ // sign column, this is hit until sign_idx reaches count
if (draw_state == WL_SIGN - 1 && n_extra == 0) {
draw_state = WL_SIGN;
/* Show the sign column when there are any signs in this
@@ -2883,8 +2883,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
if (draw_state == WL_LINE
- && foldinfo.fi_level != 0
- && foldinfo.fi_lines > 0
+ && has_fold
&& vcol == 0
&& n_extra == 0
&& row == startrow) {
@@ -2905,8 +2904,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
if (draw_state == WL_LINE
- && foldinfo.fi_level != 0
- && foldinfo.fi_lines > 0
+ && has_fold
&& col < grid->Columns
&& n_extra == 0
&& row == startrow) {
@@ -2918,8 +2916,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
if (draw_state == WL_LINE
- && foldinfo.fi_level != 0
- && foldinfo.fi_lines > 0
+ && has_fold
&& col >= grid->Columns
&& n_extra != 0
&& row == startrow) {
@@ -3087,7 +3084,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
|| vcol < fromcol || vcol_prev < fromcol_prev
|| vcol >= tocol)) {
char_attr = line_attr;
- } else {
+ } else {
attr_pri = false;
if (has_syntax) {
char_attr = syntax_attr;
@@ -3742,7 +3739,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
}
wp->w_wrow = row;
did_wcol = true;
- curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
+ wp->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
}
// Don't override visual selection highlighting.
@@ -3835,9 +3832,9 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
// Add a blank character to highlight.
schar_from_ascii(linebuf_char[off], ' ');
}
- if (area_attr == 0) {
- /* Use attributes from match with highest priority among
- * 'search_hl' and the match list. */
+ if (area_attr == 0 && !has_fold) {
+ // Use attributes from match with highest priority among
+ // 'search_hl' and the match list.
char_attr = search_hl.attr;
cur = wp->w_match_head;
shl_flag = FALSE;
@@ -4053,6 +4050,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow,
&& !wp->w_p_wrap
&& filler_todo <= 0
&& (wp->w_p_rl ? col == 0 : col == grid->Columns - 1)
+ && !has_fold
&& (*ptr != NUL
|| lcs_eol_one > 0
|| (n_extra && (c_extra != NUL || *p_extra != NUL)))) {
@@ -4347,6 +4345,10 @@ void screen_adjust_grid(ScreenGrid **grid, int *row_off, int *col_off)
// Get information needed to display the sign in line 'lnum' in window 'wp'.
// If 'nrcol' is TRUE, the sign is going to be displayed in the number column.
// Otherwise the sign is going to be displayed in the sign column.
+//
+// @param count max number of signs
+// @param[out] n_extrap number of characters from pp_extra to display
+// @param[in, out] sign_idxp Index of the displayed sign
static void get_sign_display_info(
bool nrcol,
win_T *wp,
@@ -4423,6 +4425,8 @@ static void get_sign_display_info(
(*sign_idxp)++;
if (*sign_idxp < count) {
*draw_statep = WL_SIGN - 1;
+ } else {
+ *sign_idxp = 0;
}
}
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 787a464070..2802da6f7f 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -4497,9 +4497,9 @@ find_pattern_in_path(
regmatch_T regmatch;
regmatch_T incl_regmatch;
regmatch_T def_regmatch;
- int matched = FALSE;
- int did_show = FALSE;
- int found = FALSE;
+ bool matched = false;
+ bool did_show = false;
+ bool found = false;
int i;
char_u *already = NULL;
char_u *startp = NULL;
@@ -4611,7 +4611,7 @@ find_pattern_in_path(
}
MSG_PUTS_TITLE(_("in path ---\n"));
}
- did_show = TRUE;
+ did_show = true;
while (depth_displayed < depth && !got_int) {
++depth_displayed;
for (i = 0; i < depth_displayed; i++)
@@ -4761,10 +4761,10 @@ search_line:
matched = !STRNCMP(startp, ptr, len);
if (matched && define_matched && whole
&& vim_iswordc(startp[len]))
- matched = FALSE;
+ matched = false;
} else if (regmatch.regprog != NULL
&& vim_regexec(&regmatch, line, (colnr_T)(p - line))) {
- matched = TRUE;
+ matched = true;
startp = regmatch.startp[0];
// Check if the line is not a comment line (unless we are
// looking for a define). A line starting with "# define"
@@ -4789,15 +4789,16 @@ search_line:
if (matched
&& p[0] == '/'
&& (p[1] == '*' || p[1] == '/')) {
- matched = FALSE;
- /* After "//" all text is comment */
- if (p[1] == '/')
+ matched = false;
+ // After "//" all text is comment
+ if (p[1] == '/') {
break;
- ++p;
+ }
+ p++;
} else if (!matched && p[0] == '*' && p[1] == '/') {
- /* Can find match after "* /". */
- matched = TRUE;
- ++p;
+ // Can find match after "* /".
+ matched = true;
+ p++;
}
}
}
@@ -4811,7 +4812,7 @@ search_line:
if (depth == -1 && lnum == curwin->w_cursor.lnum)
break;
- found = TRUE;
+ found = true;
aux = p = startp;
if (compl_cont_status & CONT_ADDING) {
p += compl_length;
@@ -4879,9 +4880,10 @@ search_line:
break;
}
} else if (action == ACTION_SHOW_ALL) {
- found = TRUE;
- if (!did_show)
- gotocmdline(TRUE); /* cursor at status line */
+ found = true;
+ if (!did_show) {
+ gotocmdline(true); // cursor at status line
+ }
if (curr_fname != prev_fname) {
if (did_show)
msg_putchar('\n'); /* cursor below last one */
@@ -4890,28 +4892,28 @@ search_line:
msg_home_replace_hl(curr_fname);
prev_fname = curr_fname;
}
- did_show = TRUE;
- if (!got_int)
- show_pat_in_path(line, type, TRUE, action,
- (depth == -1) ? NULL : files[depth].fp,
- (depth == -1) ? &lnum : &files[depth].lnum,
- match_count++);
+ did_show = true;
+ if (!got_int) {
+ show_pat_in_path(line, type, true, action,
+ (depth == -1) ? NULL : files[depth].fp,
+ (depth == -1) ? &lnum : &files[depth].lnum,
+ match_count++);
+ }
/* Set matched flag for this file and all the ones that
* include it */
for (i = 0; i <= depth; ++i)
files[i].matched = TRUE;
} else if (--count <= 0) {
- found = TRUE;
+ found = true;
if (depth == -1 && lnum == curwin->w_cursor.lnum
- && l_g_do_tagpreview == 0
- )
+ && l_g_do_tagpreview == 0) {
EMSG(_("E387: Match is on current line"));
- else if (action == ACTION_SHOW) {
+ } else if (action == ACTION_SHOW) {
show_pat_in_path(line, type, did_show, action,
- (depth == -1) ? NULL : files[depth].fp,
- (depth == -1) ? &lnum : &files[depth].lnum, 1L);
- did_show = TRUE;
+ (depth == -1) ? NULL : files[depth].fp,
+ (depth == -1) ? &lnum : &files[depth].lnum, 1L);
+ did_show = true;
} else {
/* ":psearch" uses the preview window */
if (l_g_do_tagpreview != 0) {
@@ -4960,15 +4962,16 @@ search_line:
break;
}
exit_matched:
- matched = FALSE;
- /* look for other matches in the rest of the line if we
- * are not at the end of it already */
+ matched = false;
+ // look for other matches in the rest of the line if we
+ // are not at the end of it already
if (def_regmatch.regprog == NULL
&& action == ACTION_EXPAND
&& !(compl_cont_status & CONT_SOL)
&& *startp != NUL
- && *(p = startp + utfc_ptr2len(startp)) != NUL)
+ && *(p = startp + utfc_ptr2len(startp)) != NUL) {
goto search_line;
+ }
}
line_breakcheck();
if (action == ACTION_EXPAND)
@@ -5046,16 +5049,20 @@ fpip_end:
vim_regfree(def_regmatch.regprog);
}
-static void show_pat_in_path(char_u *line, int type, int did_show, int action, FILE *fp, linenr_T *lnum, long count)
+static void show_pat_in_path(char_u *line, int type, bool did_show, int action,
+ FILE *fp, linenr_T *lnum, long count)
+ FUNC_ATTR_NONNULL_ARG(1, 6)
{
char_u *p;
- if (did_show)
- msg_putchar('\n'); /* cursor below last one */
- else if (!msg_silent)
- gotocmdline(TRUE); /* cursor at status line */
- if (got_int) /* 'q' typed at "--more--" message */
+ if (did_show) {
+ msg_putchar('\n'); // cursor below last one
+ } else if (!msg_silent) {
+ gotocmdline(true); // cursor at status line
+ }
+ if (got_int) { // 'q' typed at "--more--" message
return;
+ }
for (;; ) {
p = line + STRLEN(line) - 1;
if (fp != NULL) {
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 4d88df5a3a..f99eca7953 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -4275,7 +4275,7 @@ static void syn_cmd_include(exarg_T *eap, int syncing)
* Everything that's left, up to the next command, should be the
* filename to include.
*/
- eap->argt |= (XFILE | NOSPC);
+ eap->argt |= (EX_XFILE | EX_NOSPC);
separate_nextcmd(eap);
if (*eap->arg == '<' || *eap->arg == '$' || path_is_absolute(eap->arg)) {
// For an absolute path, "$VIM/..." or "<sfile>.." we ":source" the
diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim
index 641e98ab30..c571e37ac3 100644
--- a/src/nvim/testdir/test_autocmd.vim
+++ b/src/nvim/testdir/test_autocmd.vim
@@ -1110,14 +1110,14 @@ func Test_BufReadCmd()
endfunc
func SetChangeMarks(start, end)
- exe a:start. 'mark ['
- exe a:end. 'mark ]'
+ exe a:start .. 'mark ['
+ exe a:end .. 'mark ]'
endfunc
" Verify the effects of autocmds on '[ and ']
func Test_change_mark_in_autocmds()
edit! Xtest
- call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u", 'xtn')
+ call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u\<Esc>", 'xtn')
call SetChangeMarks(2, 3)
write
diff --git a/src/nvim/testdir/test_backspace_opt.vim b/src/nvim/testdir/test_backspace_opt.vim
new file mode 100644
index 0000000000..d680b442db
--- /dev/null
+++ b/src/nvim/testdir/test_backspace_opt.vim
@@ -0,0 +1,151 @@
+" 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)
+ set backspace=indent
+ call assert_equal('indent', &backspace)
+ set backspace=eol
+ call assert_equal('eol', &backspace)
+ set backspace=start
+ call assert_equal('start', &backspace)
+ set backspace=nostop
+ call assert_equal('nostop', &backspace)
+ " Add the value
+ set backspace=
+ set backspace=indent
+ call assert_equal('indent', &backspace)
+ set backspace+=eol
+ call assert_equal('indent,eol', &backspace)
+ set backspace+=start
+ call assert_equal('indent,eol,start', &backspace)
+ set backspace+=nostop
+ call assert_equal('indent,eol,start,nostop', &backspace)
+ " Delete the value
+ set backspace-=nostop
+ call assert_equal('indent,eol,start', &backspace)
+ set backspace-=indent
+ call assert_equal('eol,start', &backspace)
+ set backspace-=start
+ call assert_equal('eol', &backspace)
+ 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'))
+ " NOTE: Vim doesn't check following error...
+ "call assert_equal(0, match(Exec('set backspace-=ghi'), '.*E474'))
+
+ " Check backwards compatibility with version 5.4 and earlier
+ set backspace=0
+ call assert_equal('0', &backspace)
+ set backspace=1
+ call assert_equal('1', &backspace)
+ set backspace=2
+ 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'))
+
+ " Cleared when 'compatible' is set
+ " set compatible
+ " call assert_equal('', &backspace)
+ set nocompatible viminfo+=nviminfo
+endfunc
+
+" Test with backspace set to the non-compatible setting
+func Test_backspace_ctrl_u()
+ new
+ call append(0, [
+ \ "1 this shouldn't be deleted",
+ \ "2 this shouldn't be deleted",
+ \ "3 this shouldn't be deleted",
+ \ "4 this should be deleted",
+ \ "5 this shouldn't be deleted",
+ \ "6 this shouldn't be deleted",
+ \ "7 this shouldn't be deleted",
+ \ "8 this shouldn't be deleted (not touched yet)"])
+ call cursor(2, 1)
+
+ " set compatible
+ set backspace=2
+
+ exe "normal Avim1\<C-U>\<Esc>\<CR>"
+ exe "normal Avim2\<C-G>u\<C-U>\<Esc>\<CR>"
+
+ set cpo-=<
+ inoremap <c-u> <left><c-u>
+ exe "normal Avim3\<C-U>\<Esc>\<CR>"
+ iunmap <c-u>
+ exe "normal Avim4\<C-U>\<C-U>\<Esc>\<CR>"
+
+ " Test with backspace set to the compatible setting
+ set backspace= visualbell
+ exe "normal A vim5\<Esc>A\<C-U>\<C-U>\<Esc>\<CR>"
+ exe "normal A vim6\<Esc>Azwei\<C-G>u\<C-U>\<Esc>\<CR>"
+
+ inoremap <c-u> <left><c-u>
+ exe "normal A vim7\<C-U>\<C-U>\<Esc>\<CR>"
+
+ call assert_equal([
+ \ "1 this shouldn't be deleted",
+ \ "2 this shouldn't be deleted",
+ \ "3 this shouldn't be deleted",
+ \ "4 this should be deleted3",
+ \ "",
+ \ "6 this shouldn't be deleted vim5",
+ \ "7 this shouldn't be deleted vim6",
+ \ "8 this shouldn't be deleted (not touched yet) vim7",
+ \ ""], getline(1, '$'))
+
+ " Reset values
+ set compatible&vim
+ set visualbell&vim
+ set backspace&vim
+
+ " Test new nostop option
+ %d_
+ let expected = "foo bar foobar"
+ call setline(1, expected)
+ call cursor(1, 8)
+ exe ":norm! ianotherone\<c-u>"
+ call assert_equal(expected, getline(1))
+ call cursor(1, 8)
+ exe ":norm! ianothertwo\<c-w>"
+ call assert_equal(expected, getline(1))
+
+ let content = getline(1)
+ for value in ['indent,nostop', 'eol,nostop', 'indent,eol,nostop', 'indent,eol,start,nostop']
+ exe ":set bs=".. value
+ %d _
+ call setline(1, content)
+ let expected = " foobar"
+ call cursor(1, 8)
+ exe ":norm! ianotherone\<c-u>"
+ call assert_equal(expected, getline(1), 'CTRL-U backspace value: '.. &bs)
+ let expected = "foo foobar"
+ call setline(1, content)
+ call cursor(1, 8)
+ exe ":norm! ianothertwo\<c-w>"
+ call assert_equal(expected, getline(1), 'CTRL-W backspace value: '.. &bs)
+ endfor
+
+ " Reset options
+ set compatible&vim
+ set visualbell&vim
+ set backspace&vim
+ close!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_excmd.vim b/src/nvim/testdir/test_excmd.vim
index 4a027c3864..20508b12d3 100644
--- a/src/nvim/testdir/test_excmd.vim
+++ b/src/nvim/testdir/test_excmd.vim
@@ -1,5 +1,7 @@
" Tests for various Ex commands.
+source check.vim
+
func Test_ex_delete()
new
call setline(1, ['a', 'b', 'c'])
@@ -9,6 +11,17 @@ func Test_ex_delete()
call assert_equal(['a', 'c'], getline(1, 2))
endfunc
+func Test_range_error()
+ call assert_fails(':.echo 1', 'E481:')
+ call assert_fails(':$echo 1', 'E481:')
+ call assert_fails(':1,2echo 1', 'E481:')
+ call assert_fails(':+1echo 1', 'E481:')
+ call assert_fails(':/1/echo 1', 'E481:')
+ call assert_fails(':\/echo 1', 'E481:')
+ normal vv
+ call assert_fails(":'<,'>echo 1", 'E481:')
+endfunc
+
func Test_buffers_lastused()
edit bufc " oldest
@@ -40,3 +53,81 @@ func Test_buffers_lastused()
bwipeout bufb
bwipeout bufc
endfunc
+
+" Test for the :confirm command dialog
+func Test_confirm_cmd()
+ CheckNotGui
+ CheckRunVimInTerminal
+ call writefile(['foo1'], 'foo')
+ call writefile(['bar1'], 'bar')
+ " Test for saving all the modified buffers
+ let buf = RunVimInTerminal('', {'rows': 20})
+ call term_sendkeys(buf, ":set nomore\n")
+ call term_sendkeys(buf, ":new foo\n")
+ call term_sendkeys(buf, ":call setline(1, 'foo2')\n")
+ call term_sendkeys(buf, ":new bar\n")
+ call term_sendkeys(buf, ":call setline(1, 'bar2')\n")
+ call term_sendkeys(buf, ":wincmd b\n")
+ call term_sendkeys(buf, ":confirm qall\n")
+ call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "A")
+ call StopVimInTerminal(buf)
+ call assert_equal(['foo2'], readfile('foo'))
+ call assert_equal(['bar2'], readfile('bar'))
+ " Test for discarding all the changes to modified buffers
+ let buf = RunVimInTerminal('', {'rows': 20})
+ call term_sendkeys(buf, ":set nomore\n")
+ call term_sendkeys(buf, ":new foo\n")
+ call term_sendkeys(buf, ":call setline(1, 'foo3')\n")
+ call term_sendkeys(buf, ":new bar\n")
+ call term_sendkeys(buf, ":call setline(1, 'bar3')\n")
+ call term_sendkeys(buf, ":wincmd b\n")
+ call term_sendkeys(buf, ":confirm qall\n")
+ call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "D")
+ call StopVimInTerminal(buf)
+ call assert_equal(['foo2'], readfile('foo'))
+ call assert_equal(['bar2'], readfile('bar'))
+ " Test for saving and discarding changes to some buffers
+ let buf = RunVimInTerminal('', {'rows': 20})
+ call term_sendkeys(buf, ":set nomore\n")
+ call term_sendkeys(buf, ":new foo\n")
+ call term_sendkeys(buf, ":call setline(1, 'foo4')\n")
+ call term_sendkeys(buf, ":new bar\n")
+ call term_sendkeys(buf, ":call setline(1, 'bar4')\n")
+ call term_sendkeys(buf, ":wincmd b\n")
+ call term_sendkeys(buf, ":confirm qall\n")
+ call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "N")
+ call WaitForAssert({-> assert_match('\[Y\]es, (N)o, (C)ancel: ', term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "Y")
+ call StopVimInTerminal(buf)
+ call assert_equal(['foo4'], readfile('foo'))
+ call assert_equal(['bar2'], readfile('bar'))
+
+ call delete('foo')
+ call delete('bar')
+endfunc
+
+func Test_confirm_cmd_cancel()
+ CheckNotGui
+ CheckRunVimInTerminal
+
+ " Test for closing a window with a modified buffer
+ let buf = RunVimInTerminal('', {'rows': 20})
+ call term_sendkeys(buf, ":set nomore\n")
+ call term_sendkeys(buf, ":new\n")
+ call term_sendkeys(buf, ":call setline(1, 'abc')\n")
+ call term_sendkeys(buf, ":confirm close\n")
+ call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$',
+ \ term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "C")
+ call WaitForAssert({-> assert_equal('', term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, ":confirm close\n")
+ call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$',
+ \ term_getline(buf, 20))}, 1000)
+ call term_sendkeys(buf, "N")
+ call WaitForAssert({-> assert_match('^ *0,0-1 All$',
+ \ term_getline(buf, 20))}, 1000)
+ call StopVimInTerminal(buf)
+endfunc
diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim
index 2123780f11..180170fe9a 100644
--- a/src/nvim/testdir/test_filetype.vim
+++ b/src/nvim/testdir/test_filetype.vim
@@ -150,6 +150,7 @@ let s:filename_checks = {
\ 'dsl': ['file.dsl'],
\ 'dtd': ['file.dtd'],
\ 'dts': ['file.dts', 'file.dtsi'],
+ \ 'dune': ['jbuild', 'dune', 'dune-project', 'dune-workspace'],
\ 'dylan': ['file.dylan'],
\ 'dylanintr': ['file.intr'],
\ 'dylanlid': ['file.lid'],
@@ -322,15 +323,16 @@ let s:filename_checks = {
\ 'nroff': ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom'],
\ 'nsis': ['file.nsi', 'file.nsh'],
\ 'obj': ['file.obj'],
- \ 'ocaml': ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit'],
+ \ 'ocaml': ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit', 'file.mlt', 'file.mlp', 'file.mlip', 'file.mli.cppo', 'file.ml.cppo'],
\ 'occam': ['file.occ'],
\ 'omnimark': ['file.xom', 'file.xin'],
+ \ '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'],
\ 'papp': ['file.papp', 'file.pxml', 'file.pxsl'],
- \ 'pascal': ['file.pas', 'file.pp', 'file.dpr', 'file.lpr'],
+ \ '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'],
\ 'pbtxt': ['file.pbtxt'],
\ 'pccts': ['file.g'],
@@ -366,6 +368,7 @@ let s:filename_checks = {
\ 'proto': ['file.proto'],
\ 'protocols': ['/etc/protocols'],
\ 'psf': ['file.psf'],
+ \ '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'],
@@ -398,6 +401,7 @@ let s:filename_checks = {
\ 'scheme': ['file.scm', 'file.ss', 'file.rkt'],
\ 'scilab': ['file.sci', 'file.sce'],
\ 'screen': ['.screenrc', 'screenrc'],
+ \ 'sexplib': ['file.sexp'],
\ 'scss': ['file.scss'],
\ 'sd': ['file.sd'],
\ 'sdc': ['file.sdc'],
@@ -425,6 +429,7 @@ let s:filename_checks = {
\ 'smith': ['file.smt', 'file.smith'],
\ 'sml': ['file.sml'],
\ 'snobol4': ['file.sno', 'file.spt'],
+ \ 'sparql': ['file.rq', 'file.sparql'],
\ 'spec': ['file.spec'],
\ 'spice': ['file.sp', 'file.spice'],
\ 'spup': ['file.speedup', 'file.spdata', 'file.spd'],
@@ -616,6 +621,7 @@ let s:script_checks = {
\ 'cpp': [['// Standard iostream objects -*- C++ -*-'],
\ ['// -*- C++ -*-']],
\ 'yaml': [['%YAML 1.2']],
+ \ 'pascal': [['#!/path/instantfpc']],
\ }
" Various forms of "env" optional arguments.
@@ -686,5 +692,33 @@ func Test_ts_file()
filetype off
endfunc
+func Test_pp_file()
+ filetype on
+
+ call writefile(['looks like puppet'], 'Xfile.pp')
+ split Xfile.pp
+ call assert_equal('puppet', &filetype)
+ bwipe!
+
+ let g:filetype_pp = 'pascal'
+ split Xfile.pp
+ call assert_equal('pascal', &filetype)
+ bwipe!
+
+ " Test dist#ft#FTpp()
+ call writefile(['{ pascal comment'], 'Xfile.pp')
+ split Xfile.pp
+ call assert_equal('pascal', &filetype)
+ bwipe!
+
+ call writefile(['procedure pascal'], 'Xfile.pp')
+ split Xfile.pp
+ call assert_equal('pascal', &filetype)
+ bwipe!
+
+ call delete('Xfile.pp')
+ filetype off
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_find_complete.vim b/src/nvim/testdir/test_find_complete.vim
index a7bc135d47..0a00d9432f 100644
--- a/src/nvim/testdir/test_find_complete.vim
+++ b/src/nvim/testdir/test_find_complete.vim
@@ -15,22 +15,22 @@ func Test_find_complete()
new
set path=
- call assert_fails('call feedkeys(":find\t\n", "xt")', 'E345:')
+ call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
close
new
set path=.
- call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
close
new
set path=.,,
- call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
close
new
set path=./**
- call assert_fails('call feedkeys(":find\t\n", "xt")', 'E32:')
+ call assert_fails('call feedkeys(":find \t\n", "xt")', 'E471:')
close
" We shouldn't find any file till this point
diff --git a/src/nvim/testdir/test_findfile.vim b/src/nvim/testdir/test_findfile.vim
index f5488a6a27..2195bf527e 100644
--- a/src/nvim/testdir/test_findfile.vim
+++ b/src/nvim/testdir/test_findfile.vim
@@ -184,3 +184,46 @@ func Test_finddir_error()
call assert_fails('call finddir("x", "**x")', 'E343:')
call assert_fails('call finddir("x", repeat("x", 5000))', 'E854:')
endfunc
+
+" Test for the :find, :sfind and :tabfind commands
+func Test_find_cmd()
+ new
+ let save_path = &path
+ let save_dir = getcwd()
+ set path=.,./**/*
+ call CreateFiles()
+ cd Xdir1
+ " Test for :find
+ find foo
+ call assert_equal('foo', expand('%:.'))
+ 2find foo
+ call assert_equal('Xdir2/foo', expand('%:.'))
+ call assert_fails('3find foo', 'E347:')
+ " Test for :sfind
+ enew
+ sfind barfoo
+ call assert_equal('Xdir2/Xdir3/barfoo', expand('%:.'))
+ call assert_equal(3, winnr('$'))
+ close
+ call assert_fails('sfind baz', 'E345:')
+ call assert_equal(2, winnr('$'))
+ " Test for :tabfind
+ enew
+ tabfind foobar
+ call assert_equal('Xdir2/foobar', expand('%:.'))
+ call assert_equal(2, tabpagenr('$'))
+ tabclose
+ call assert_fails('tabfind baz', 'E345:')
+ call assert_equal(1, tabpagenr('$'))
+ " call chdir(save_dir)
+ exe 'cd ' . save_dir
+ call CleanFiles()
+ let &path = save_path
+ close
+
+ call assert_fails('find', 'E471:')
+ call assert_fails('sfind', 'E471:')
+ call assert_fails('tabfind', 'E471:')
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_hardcopy.vim b/src/nvim/testdir/test_hardcopy.vim
index 6125f9b993..e390bd5cc8 100644
--- a/src/nvim/testdir/test_hardcopy.vim
+++ b/src/nvim/testdir/test_hardcopy.vim
@@ -1,5 +1,7 @@
" Test :hardcopy
+source check.vim
+
func Test_printoptions()
edit test_hardcopy.vim
syn on
@@ -8,8 +10,10 @@ func Test_printoptions()
\ 'left:2in,top:30pt,right:16mm,bottom:3pc',
\ 'header:3,syntax:y,number:y,wrap:n',
\ 'header:3,syntax:n,number:y,wrap:y',
+ \ 'header:0,syntax:a,number:y,wrap:y',
\ 'duplex:short,collate:n,jobsplit:y,portrait:n',
\ 'duplex:long,collate:y,jobsplit:n,portrait:y',
+ \ 'duplex:off,collate:y,jobsplit:y,portrait:y',
\ 'paper:10x14',
\ 'paper:A3',
\ 'paper:A4',
@@ -28,7 +32,7 @@ func Test_printoptions()
\ '']
exe 'set printoptions=' .. opt
if has('postscript')
- hardcopy > Xhardcopy_printoptions
+ 1,50hardcopy > Xhardcopy_printoptions
let lines = readfile('Xhardcopy_printoptions')
call assert_true(len(lines) > 20, opt)
call assert_true(lines[0] =~ 'PS-Adobe', opt)
@@ -44,8 +48,8 @@ func Test_printoptions()
endfunc
func Test_printmbfont()
- " Print a small help page which contains tabs to cover code that expands tabs to spaces.
- help help
+ " Print a help page which contains tabs, underlines (etc) to recover more code.
+ help syntax.txt
syn on
for opt in [':WadaMin-Regular,b:WadaMin-Bold,i:WadaMin-Italic,o:WadaMin-Bold-Italic,c:yes,a:no',
@@ -63,10 +67,39 @@ func Test_printmbfont()
bwipe
endfunc
+func Test_printmbcharset()
+ CheckFeature postscript
+
+ " digraph.txt has plenty of non-latin1 characters.
+ help digraph.txt
+ set printmbcharset=ISO10646 printencoding=utf-8
+ for courier in ['yes', 'no']
+ for ascii in ['yes', 'no']
+ exe 'set printmbfont=r:WadaMin-Regular,b:WadaMin-Bold,i:WadaMin-Italic,o:WadaMin-BoldItalic'
+ \ .. ',c:' .. courier .. ',a:' .. ascii
+ hardcopy > Xhardcopy_printmbcharset
+ let lines = readfile('Xhardcopy_printmbcharset')
+ call assert_true(len(lines) > 20)
+ call assert_true(lines[0] =~ 'PS-Adobe')
+ endfor
+ endfor
+
+ set printmbcharset=does-not-exist printencoding=utf-8 printmbfont=r:WadaMin-Regular
+ call assert_fails('hardcopy > Xhardcopy_printmbcharset', 'E456:')
+
+ set printmbcharset=GB_2312-80 printencoding=utf-8 printmbfont=r:WadaMin-Regular
+ call assert_fails('hardcopy > Xhardcopy_printmbcharset', 'E673:')
+
+ set printmbcharset=ISO10646 printencoding=utf-8 printmbfont=
+ call assert_fails('hardcopy > Xhardcopy_printmbcharset', 'E675:')
+
+ call delete('Xhardcopy_printmbcharset')
+ set printmbcharset& printencoding& printmbfont&
+ bwipe
+endfunc
+
func Test_printexpr()
- if !has('unix')
- return
- endif
+ CheckFeature postscript
" Not a very useful printexpr value, but enough to test
" hardcopy with 'printexpr'.
@@ -84,7 +117,7 @@ func Test_printexpr()
\ readfile('Xhardcopy_printexpr'))
call delete('Xhardcopy_printexpr')
- " Function return 1 to test print failure.
+ " Function returns 1 to test print failure.
function PrintFails(fname)
call delete(a:fname)
return 1
@@ -97,12 +130,11 @@ func Test_printexpr()
endfunc
func Test_errors()
- " FIXME: Windows fails differently than Unix.
- if has('unix')
- edit test_hardcopy.vim
- call assert_fails('hardcopy >', 'E324:')
- bwipe
- endif
+ CheckFeature postscript
+
+ edit test_hardcopy.vim
+ call assert_fails('hardcopy >', 'E324:')
+ bwipe
endfunc
func Test_dark_background()
@@ -126,12 +158,11 @@ func Test_dark_background()
endfun
func Test_empty_buffer()
- " FIXME: Unclear why this fails on Windows.
- if has('unix')
- new
- call assert_equal("\nNo text to be printed", execute('hardcopy'))
- bwipe
- endif
+ CheckFeature postscript
+
+ new
+ call assert_equal("\nNo text to be printed", execute('hardcopy'))
+ bwipe
endfunc
func Test_printheader_parsing()
@@ -145,9 +176,8 @@ func Test_printheader_parsing()
endfunc
func Test_fname_with_spaces()
- if !has('postscript')
- return
- endif
+ CheckFeature postscript
+
split t\ e\ s\ t.txt
call setline(1, ['just', 'some', 'text'])
hardcopy > %.ps
@@ -157,9 +187,11 @@ func Test_fname_with_spaces()
endfunc
func Test_illegal_byte()
- if !has('postscript') || &enc != 'utf-8'
+ CheckFeature postscript
+ if &enc != 'utf-8'
return
endif
+
new
" conversion of 0xff will fail, this used to cause a crash
call setline(1, "\xff")
@@ -168,3 +200,5 @@ func Test_illegal_byte()
bwipe!
call delete('Xpstest')
endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_marks.vim b/src/nvim/testdir/test_marks.vim
index 66df57ea39..2fd82a4b6d 100644
--- a/src/nvim/testdir/test_marks.vim
+++ b/src/nvim/testdir/test_marks.vim
@@ -171,6 +171,11 @@ func Test_delmarks()
" Deleting an already deleted mark should not fail.
delmarks x
+ " getpos() should return all zeros after deleting a filemark.
+ norm mA
+ delmarks A
+ call assert_equal([0, 0, 0, 0], getpos("'A"))
+
" Test deleting a range of marks.
norm ma
norm mb
@@ -201,3 +206,28 @@ func Test_mark_error()
call assert_fails('mark xx', 'E488:')
call assert_fails('mark _', 'E191:')
endfunc
+
+" Test for the getmarklist() function
+func Test_getmarklist()
+ new
+ " global marks
+ delmarks A-Z 0-9 \" ^.[]
+ call assert_equal([], getmarklist())
+ call setline(1, ['one', 'two', 'three'])
+ mark A
+ call cursor(3, 5)
+ normal mN
+ call assert_equal([{'file' : '', 'mark' : "'A", 'pos' : [bufnr(), 1, 1, 0]},
+ \ {'file' : '', 'mark' : "'N", 'pos' : [bufnr(), 3, 5, 0]}],
+ \ getmarklist())
+ " buffer local marks
+ delmarks!
+ call assert_equal([{'mark' : "''", 'pos' : [bufnr(), 1, 1, 0]},
+ \ {'mark' : "'\"", 'pos' : [bufnr(), 1, 1, 0]}], getmarklist(bufnr()))
+ call cursor(2, 2)
+ normal mr
+ call assert_equal({'mark' : "'r", 'pos' : [bufnr(), 2, 2, 0]},
+ \ getmarklist(bufnr())[0])
+ call assert_equal([], getmarklist({}))
+ close!
+endfunc
diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim
index ccc5e6ffc9..84d99ebb74 100644
--- a/src/nvim/testdir/test_options.vim
+++ b/src/nvim/testdir/test_options.vim
@@ -266,8 +266,14 @@ func Test_set_errors()
call assert_fails('set foldmarker=x', 'E536:')
call assert_fails('set commentstring=x', 'E537:')
call assert_fails('set complete=x', 'E539:')
+ call assert_fails('set rulerformat=%-', 'E539:')
+ call assert_fails('set rulerformat=%(', 'E542:')
+ call assert_fails('set rulerformat=%15(%%', 'E542:')
+ call assert_fails('set statusline=%$', 'E539:')
call assert_fails('set statusline=%{', 'E540:')
call assert_fails('set statusline=%(', 'E542:')
+ call assert_fails('set statusline=%)', 'E542:')
+
if has('cursorshape')
" This invalid value for 'guicursor' used to cause Vim to crash.
call assert_fails('set guicursor=i-ci,r-cr:h', 'E545:')
@@ -281,6 +287,21 @@ func Test_set_errors()
call assert_fails('set winminwidth=10 winwidth=9', 'E592:')
call assert_fails("set showbreak=\x01", 'E595:')
call assert_fails('set t_foo=', 'E846:')
+ if has('python') || has('python3')
+ call assert_fails('set pyxversion=6', 'E474:')
+ endif
+ call assert_fails("let &tabstop='ab'", 'E521:')
+ call assert_fails('set sessionoptions=curdir,sesdir', 'E474:')
+ call assert_fails('set foldmarker={{{,', 'E474:')
+ call assert_fails('set sessionoptions=sesdir,curdir', 'E474:')
+ call assert_fails('set listchars=trail:· ambiwidth=double', 'E834:')
+ set listchars&
+ call assert_fails('set fillchars=stl:· ambiwidth=double', 'E835:')
+ set fillchars&
+ call assert_fails('set fileencoding=latin1,utf-8', 'E474:')
+ set nomodifiable
+ call assert_fails('set fileencoding=latin1', 'E21:')
+ set modifiable&
endfunc
" Must be executed before other tests that set 'term'.
diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
index 563dbd90d9..48c0a83053 100644
--- a/src/nvim/testdir/test_quickfix.vim
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -29,7 +29,7 @@ func s:setup_commands(cchar)
command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>clast<bang> <args>
- command! -nargs=* -bang -range Xnfile <mods><count>cnfile<bang> <args>
+ command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
command! -nargs=* Xexpr <mods>cexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
@@ -40,6 +40,8 @@ func s:setup_commands(cchar)
command! -nargs=0 -count Xcc <count>cc
command! -count=1 -nargs=0 Xbelow <mods><count>cbelow
command! -count=1 -nargs=0 Xabove <mods><count>cabove
+ command! -count=1 -nargs=0 Xbefore <mods><count>cbefore
+ command! -count=1 -nargs=0 Xafter <mods><count>cafter
let g:Xgetlist = function('getqflist')
let g:Xsetlist = function('setqflist')
call setqflist([], 'f')
@@ -64,7 +66,7 @@ func s:setup_commands(cchar)
command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>llast<bang> <args>
- command! -nargs=* -bang -range Xnfile <mods><count>lnfile<bang> <args>
+ command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
command! -nargs=* Xexpr <mods>lexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
@@ -75,6 +77,8 @@ func s:setup_commands(cchar)
command! -nargs=0 -count Xcc <count>ll
command! -count=1 -nargs=0 Xbelow <mods><count>lbelow
command! -count=1 -nargs=0 Xabove <mods><count>labove
+ command! -count=1 -nargs=0 Xbefore <mods><count>lbefore
+ command! -count=1 -nargs=0 Xafter <mods><count>lafter
let g:Xgetlist = function('getloclist', [0])
let g:Xsetlist = function('setloclist', [0])
call setloclist(0, [], 'f')
@@ -260,6 +264,9 @@ func XwindowTests(cchar)
\ winheight('.') == 7 &&
\ getline('.') ==# '|| non-error 1')
+ " :cnext in quickfix window should move to the next entry
+ Xnext
+ call assert_equal(2, g:Xgetlist({'idx' : 0}).idx)
" Calling cwindow should close the quickfix window with no valid errors
Xwindow
@@ -431,13 +438,19 @@ func Xtest_browse(cchar)
" result in failure
if a:cchar == 'c'
let err = 'E42:'
+ let cmd = '$cc'
else
let err = 'E776:'
+ let cmd = '$ll'
endif
call assert_fails('Xnext', err)
call assert_fails('Xprev', err)
call assert_fails('Xnfile', err)
call assert_fails('Xpfile', err)
+ call assert_fails(cmd, err)
+
+ Xexpr ''
+ call assert_fails(cmd, 'E42:')
call s:create_test_file('Xqftestfile1')
call s:create_test_file('Xqftestfile2')
@@ -1247,6 +1260,36 @@ func Test_efm2()
let &efm = save_efm
endfunc
+" Test for '%t' (error type) field in 'efm'
+func Test_efm_error_type()
+ let save_efm = &efm
+
+ " error type
+ set efm=%f:%l:%t:%m
+ cexpr ["Xfile1:10:E:msg1", "Xfile1:20:W:msg2", "Xfile1:30:I:msg3",
+ \ "Xfile1:40:N:msg4", "Xfile1:50:R:msg5"]
+ let output = split(execute('clist'), "\n")
+ call assert_equal([
+ \ ' 1 Xfile1:10 error: msg1',
+ \ ' 2 Xfile1:20 warning: msg2',
+ \ ' 3 Xfile1:30 info: msg3',
+ \ ' 4 Xfile1:40 note: msg4',
+ \ ' 5 Xfile1:50 R: msg5'], output)
+
+ " error type and a error number
+ set efm=%f:%l:%t:%n:%m
+ cexpr ["Xfile1:10:E:2:msg1", "Xfile1:20:W:4:msg2", "Xfile1:30:I:6:msg3",
+ \ "Xfile1:40:N:8:msg4", "Xfile1:50:R:3:msg5"]
+ let output = split(execute('clist'), "\n")
+ call assert_equal([
+ \ ' 1 Xfile1:10 error 2: msg1',
+ \ ' 2 Xfile1:20 warning 4: msg2',
+ \ ' 3 Xfile1:30 info 6: msg3',
+ \ ' 4 Xfile1:40 note 8: msg4',
+ \ ' 5 Xfile1:50 R 3: msg5'], output)
+ let &efm = save_efm
+endfunc
+
func XquickfixChangedByAutocmd(cchar)
call s:setup_commands(a:cchar)
if a:cchar == 'c'
@@ -1810,14 +1853,27 @@ func s:test_xgrep(cchar)
enew! | only
set makeef&vim
silent Xgrep Grep_Test_Text: test_quickfix.vim
- call assert_true(len(g:Xgetlist()) == 3)
+ call assert_true(len(g:Xgetlist()) == 5)
Xopen
call assert_true(w:quickfix_title =~ '^:grep')
Xclose
enew
set makeef=Temp_File_##
silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
- call assert_true(len(g:Xgetlist()) == 6)
+
+ " Try with 'grepprg' set to 'internal'
+ set grepprg=internal
+ silent Xgrep Grep_Test_Text: test_quickfix.vim
+ silent Xgrepadd GrepAdd_Test_Text: test_quickfix.vim
+ call assert_true(len(g:Xgetlist()) == 9)
+ set grepprg&vim
+
+ call writefile(['Vim'], 'XtestTempFile')
+ set makeef=XtestTempFile
+ silent Xgrep Grep_Test_Text: test_quickfix.vim
+ call assert_equal(5, len(g:Xgetlist()))
+ call assert_false(filereadable('XtestTempFile'))
+ set makeef&vim
endfunc
func Test_grep()
@@ -1914,9 +1970,23 @@ func HistoryTest(cchar)
call assert_equal(' error list 2 of 3; 2 ' . common, res[1])
call assert_equal('> error list 3 of 3; 3 ' . common, res[2])
+ " Test for changing the quickfix lists
+ call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
+ exe '1' . a:cchar . 'hist'
+ call assert_equal(1, g:Xgetlist({'nr' : 0}).nr)
+ exe '3' . a:cchar . 'hist'
+ call assert_equal(3, g:Xgetlist({'nr' : 0}).nr)
+ call assert_fails('-2' . a:cchar . 'hist', 'E16:')
+ call assert_fails('4' . a:cchar . 'hist', 'E16:')
+
call g:Xsetlist([], 'f')
let l = split(execute(a:cchar . 'hist'), "\n")
call assert_equal('No entries', l[0])
+ if a:cchar == 'c'
+ call assert_fails('4chist', 'E16:')
+ else
+ call assert_fails('4lhist', 'E776:')
+ endif
" An empty list should still show the stack history
call g:Xsetlist([])
@@ -2365,14 +2435,28 @@ func Test_Autocmd()
silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
silent grep abc123def Xtest
silent grepadd abc123def Xtest
+ set grepprg=internal
+ silent grep Grep_Autocmd_Text test_quickfix.vim
+ silent grepadd GrepAdd_Autocmd_Text test_quickfix.vim
+ silent lgrep Grep_Autocmd_Text test_quickfix.vim
+ silent lgrepadd GrepAdd_Autocmd_Text test_quickfix.vim
+ set grepprg&vim
let l = ['pregrep',
- \ 'postgrep',
- \ 'pregrepadd',
- \ 'postgrepadd',
- \ 'pregrep',
- \ 'postgrep',
- \ 'pregrepadd',
- \ 'postgrepadd']
+ \ 'postgrep',
+ \ 'pregrepadd',
+ \ 'postgrepadd',
+ \ 'pregrep',
+ \ 'postgrep',
+ \ 'pregrepadd',
+ \ 'postgrepadd',
+ \ 'pregrep',
+ \ 'postgrep',
+ \ 'pregrepadd',
+ \ 'postgrepadd',
+ \ 'prelgrep',
+ \ 'postlgrep',
+ \ 'prelgrepadd',
+ \ 'postlgrepadd']
call assert_equal(l, g:acmds)
endif
@@ -2491,6 +2575,19 @@ func Test_cwindow_jump()
call assert_true(winnr('$') == 2)
call assert_true(winnr() == 1)
+ " Jumping to a file from the location list window should find a usuable
+ " window by wrapping around the window list.
+ enew | only
+ call setloclist(0, [], 'f')
+ new | new
+ lgetexpr ["F1%10%Line 10", "F2%20%Line 20", "F3%30%Line 30"]
+ lopen
+ 1close
+ call assert_equal(0, getloclist(3, {'id' : 0}).id)
+ lnext
+ call assert_equal(3, winnr())
+ call assert_equal(getloclist(1, {'id' : 0}).id, getloclist(3, {'id' : 0}).id)
+
enew | only
set efm&vim
endfunc
@@ -4201,17 +4298,22 @@ func Test_empty_qfbuf()
endfunc
" Test for the :cbelow, :cabove, :lbelow and :labove commands.
+" And for the :cafter, :cbefore, :lafter and :lbefore commands.
func Xtest_below(cchar)
call s:setup_commands(a:cchar)
" No quickfix/location list
call assert_fails('Xbelow', 'E42:')
call assert_fails('Xabove', 'E42:')
+ call assert_fails('Xbefore', 'E42:')
+ call assert_fails('Xafter', 'E42:')
" Empty quickfix/location list
call g:Xsetlist([])
call assert_fails('Xbelow', 'E42:')
call assert_fails('Xabove', 'E42:')
+ call assert_fails('Xbefore', 'E42:')
+ call assert_fails('Xafter', 'E42:')
call s:create_test_file('X1')
call s:create_test_file('X2')
@@ -4225,39 +4327,74 @@ func Xtest_below(cchar)
call assert_fails('Xabove', 'E42:')
call assert_fails('3Xbelow', 'E42:')
call assert_fails('4Xabove', 'E42:')
+ call assert_fails('Xbefore', 'E42:')
+ call assert_fails('Xafter', 'E42:')
+ call assert_fails('3Xbefore', 'E42:')
+ call assert_fails('4Xafter', 'E42:')
" Test the commands with various arguments
- Xexpr ["X1:5:L5", "X2:5:L5", "X2:10:L10", "X2:15:L15", "X3:3:L3"]
+ Xexpr ["X1:5:3:L5", "X2:5:2:L5", "X2:10:3:L10", "X2:15:4:L15", "X3:3:5:L3"]
edit +7 X2
Xabove
call assert_equal(['X2', 5], [bufname(''), line('.')])
call assert_fails('Xabove', 'E553:')
+ normal 7G
+ Xbefore
+ call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
+ call assert_fails('Xbefore', 'E553:')
+
normal 2j
Xbelow
call assert_equal(['X2', 10], [bufname(''), line('.')])
+ normal 7G
+ Xafter
+ call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
+
" Last error in this file
Xbelow 99
call assert_equal(['X2', 15], [bufname(''), line('.')])
call assert_fails('Xbelow', 'E553:')
+ normal gg
+ Xafter 99
+ call assert_equal(['X2', 15, 4], [bufname(''), line('.'), col('.')])
+ call assert_fails('Xafter', 'E553:')
+
" First error in this file
Xabove 99
call assert_equal(['X2', 5], [bufname(''), line('.')])
call assert_fails('Xabove', 'E553:')
+ normal G
+ Xbefore 99
+ call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
+ call assert_fails('Xbefore', 'E553:')
+
normal gg
Xbelow 2
call assert_equal(['X2', 10], [bufname(''), line('.')])
+ normal gg
+ Xafter 2
+ call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
+
normal G
Xabove 2
call assert_equal(['X2', 10], [bufname(''), line('.')])
+ normal G
+ Xbefore 2
+ call assert_equal(['X2', 10, 3], [bufname(''), line('.'), col('.')])
+
edit X4
call assert_fails('Xabove', 'E42:')
call assert_fails('Xbelow', 'E42:')
+ call assert_fails('Xbefore', 'E42:')
+ call assert_fails('Xafter', 'E42:')
if a:cchar == 'l'
" If a buffer has location list entries from some other window but not
" from the current window, then the commands should fail.
edit X1 | split | call setloclist(0, [], 'f')
call assert_fails('Xabove', 'E776:')
call assert_fails('Xbelow', 'E776:')
+ call assert_fails('Xbefore', 'E776:')
+ call assert_fails('Xafter', 'E776:')
close
endif
@@ -4268,31 +4405,52 @@ func Xtest_below(cchar)
edit +1 X2
Xbelow 2
call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
+ normal 1G
+ Xafter 2
+ call assert_equal(['X2', 5, 2], [bufname(''), line('.'), col('.')])
+
normal gg
Xbelow 99
call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
+ normal gg
+ Xafter 99
+ call assert_equal(['X2', 15, 3], [bufname(''), line('.'), col('.')])
+
normal G
Xabove 2
call assert_equal(['X2', 10, 1], [bufname(''), line('.'), col('.')])
normal G
+ Xbefore 2
+ call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
+
+ normal G
Xabove 99
call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
+ normal G
+ Xbefore 99
+ call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
+
normal 10G
Xabove
call assert_equal(['X2', 5, 1], [bufname(''), line('.'), col('.')])
+ normal 10G$
+ 2Xbefore
+ call assert_equal(['X2', 10, 2], [bufname(''), line('.'), col('.')])
+
normal 10G
Xbelow
call assert_equal(['X2', 15, 1], [bufname(''), line('.'), col('.')])
+ normal 9G
+ 5Xafter
+ call assert_equal(['X2', 15, 2], [bufname(''), line('.'), col('.')])
" Invalid range
if a:cchar == 'c'
- call assert_fails('-2cbelow', 'E553:')
- " TODO: should go to first error in the current line?
- 0cabove
+ call assert_fails('-2cbelow', 'E16:')
+ call assert_fails('-2cafter', 'E16:')
else
- call assert_fails('-2lbelow', 'E553:')
- " TODO: should go to first error in the current line?
- 0labove
+ call assert_fails('-2lbelow', 'E16:')
+ call assert_fails('-2lafter', 'E16:')
endif
call delete('X1')
@@ -4306,6 +4464,42 @@ func Test_cbelow()
call Xtest_below('l')
endfunc
+func Test_quickfix_count()
+ let commands = [
+ \ 'cNext',
+ \ 'cNfile',
+ \ 'cabove',
+ \ 'cbelow',
+ \ 'cfirst',
+ \ 'clast',
+ \ 'cnewer',
+ \ 'cnext',
+ \ 'cnfile',
+ \ 'colder',
+ \ 'cprevious',
+ \ 'crewind',
+ \
+ \ 'lNext',
+ \ 'lNfile',
+ \ 'labove',
+ \ 'lbelow',
+ \ 'lfirst',
+ \ 'llast',
+ \ 'lnewer',
+ \ 'lnext',
+ \ 'lnfile',
+ \ 'lolder',
+ \ 'lprevious',
+ \ 'lrewind',
+ \ ]
+ for cmd in commands
+ call assert_fails('-1' .. cmd, 'E16:')
+ call assert_fails('.' .. cmd, 'E16:')
+ call assert_fails('%' .. cmd, 'E16:')
+ call assert_fails('$' .. cmd, 'E16:')
+ endfor
+endfunc
+
" Test for aborting quickfix commands using QuickFixCmdPre
func Xtest_qfcmd_abort(cchar)
call s:setup_commands(a:cchar)
@@ -4461,6 +4655,24 @@ func Test_cquit()
call assert_fails('-3cquit', 'E16:')
endfunc
+" Running :lhelpgrep command more than once in a help window, doesn't jump to
+" the help topic
+func Test_lhelpgrep_from_help_window()
+ call mkdir('Xtestdir/doc', 'p')
+ call writefile(['window'], 'Xtestdir/doc/a.txt')
+ call writefile(['buffer'], 'Xtestdir/doc/b.txt')
+ let save_rtp = &rtp
+ let &rtp = 'Xtestdir'
+ lhelpgrep window
+ lhelpgrep buffer
+ call assert_equal('b.txt', fnamemodify(@%, ":p:t"))
+ lhelpgrep window
+ call assert_equal('a.txt', fnamemodify(@%, ":p:t"))
+ let &rtp = save_rtp
+ call delete('Xtestdir', 'rf')
+ new | only!
+endfunc
+
" Test for adding an invalid entry with the quickfix window open and making
" sure that the window contents are not changed
func Test_add_invalid_entry_with_qf_window()
diff --git a/src/nvim/testdir/test_sleep.vim b/src/nvim/testdir/test_sleep.vim
new file mode 100644
index 0000000000..f71855fd4b
--- /dev/null
+++ b/src/nvim/testdir/test_sleep.vim
@@ -0,0 +1,26 @@
+" Test for sleep and sleep! commands
+
+func! s:get_time_ms()
+ let timestr = reltimestr(reltime())
+ let dotidx = stridx(timestr, '.')
+ let sec = str2nr(timestr[:dotidx])
+ let msec = str2nr(timestr[dotidx + 1:])
+ return (sec * 1000) + (msec / 1000)
+endfunc
+
+func! s:assert_takes_longer(cmd, time_ms)
+ let start = s:get_time_ms()
+ execute a:cmd
+ let end = s:get_time_ms()
+ call assert_true(end - start >=# a:time_ms)
+endfun
+
+func! Test_sleep_bang()
+ call s:assert_takes_longer('sleep 50m', 50)
+ call s:assert_takes_longer('sleep! 50m', 50)
+ call s:assert_takes_longer('sl 50m', 50)
+ call s:assert_takes_longer('sl! 50m', 50)
+ call s:assert_takes_longer('1sleep', 1000)
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim
index e7f332bc4c..e6ad92f483 100644
--- a/src/nvim/testdir/test_startup.vim
+++ b/src/nvim/testdir/test_startup.vim
@@ -735,4 +735,82 @@ func Test_x_arg()
call delete('Xtest_x_arg')
endfunc
+" Test starting vim with various names: vim, ex, view, evim, etc.
+func Test_progname()
+ CheckUnix
+
+ call mkdir('Xprogname', 'p')
+ call writefile(['silent !date',
+ \ 'call writefile([mode(1), '
+ \ .. '&insertmode, &diff, &readonly, &updatecount, '
+ \ .. 'join(split(execute("message"), "\n")[1:])], "Xprogname_out")',
+ \ 'qall'], 'Xprogname_after')
+
+ " +---------------------------------------------- progname
+ " | +--------------------------------- mode(1)
+ " | | +--------------------------- &insertmode
+ " | | | +---------------------- &diff
+ " | | | | +----------------- &readonly
+ " | | | | | +-------- &updatecount
+ " | | | | | | +--- :messages
+ " | | | | | | |
+ " let expectations = {
+ " \ 'vim': ['n', '0', '0', '0', '200', ''],
+ " \ 'gvim': ['n', '0', '0', '0', '200', ''],
+ " \ 'ex': ['ce', '0', '0', '0', '200', ''],
+ " \ 'exim': ['cv', '0', '0', '0', '200', ''],
+ " \ 'view': ['n', '0', '0', '1', '10000', ''],
+ " \ 'gview': ['n', '0', '0', '1', '10000', ''],
+ " \ 'evim': ['n', '1', '0', '0', '200', ''],
+ " \ 'eview': ['n', '1', '0', '1', '10000', ''],
+ " \ 'rvim': ['n', '0', '0', '0', '200', 'line 1: E145: Shell commands and some functionality not allowed in rvim'],
+ " \ 'rgvim': ['n', '0', '0', '0', '200', 'line 1: E145: Shell commands and some functionality not allowed in rvim'],
+ " \ 'rview': ['n', '0', '0', '1', '10000', 'line 1: E145: Shell commands and some functionality not allowed in rvim'],
+ " \ 'rgview': ['n', '0', '0', '1', '10000', 'line 1: E145: Shell commands and some functionality not allowed in rvim'],
+ " \ 'vimdiff': ['n', '0', '1', '0', '200', ''],
+ " \ 'gvimdiff': ['n', '0', '1', '0', '200', '']}
+ let expectations = {'nvim': ['n', '0', '0', '0', '200', '']}
+
+ " let prognames = ['vim', 'gvim', 'ex', 'exim', 'view', 'gview',
+ " \ 'evim', 'eview', 'rvim', 'rgvim', 'rview', 'rgview',
+ " \ 'vimdiff', 'gvimdiff']
+ let prognames = ['nvim']
+
+ for progname in prognames
+ if empty($DISPLAY)
+ if progname =~# 'g'
+ " Can't run gvim, gview (etc.) if $DISPLAY is not setup.
+ continue
+ endif
+ if has('gui') && (progname ==# 'evim' || progname ==# 'eview')
+ " evim or eview will start the GUI if there is gui support.
+ " So don't try to start them either if $DISPLAY is not setup.
+ continue
+ endif
+ endif
+
+ exe 'silent !ln -s -f ' ..exepath(GetVimProg()) .. ' Xprogname/' .. progname
+
+ let stdout_stderr = ''
+ if progname =~# 'g'
+ let stdout_stderr = system('Xprogname/'..progname..' -f --clean --not-a-term -S Xprogname_after')
+ else
+ exe 'sil !Xprogname/'..progname..' -f --clean -S Xprogname_after'
+ endif
+
+ if progname =~# 'g' && !has('gui')
+ call assert_equal("E25: GUI cannot be used: Not enabled at compile time\n", stdout_stderr, progname)
+ else
+ call assert_equal('', stdout_stderr, progname)
+ call assert_equal(expectations[progname], readfile('Xprogname_out'), progname)
+ endif
+
+ call delete('Xprogname/' .. progname)
+ call delete('Xprogname_out')
+ endfor
+
+ call delete('Xprogname_after')
+ call delete('Xprogname', 'd')
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_usercommands.vim b/src/nvim/testdir/test_usercommands.vim
index 0a89066a2b..4621207d19 100644
--- a/src/nvim/testdir/test_usercommands.vim
+++ b/src/nvim/testdir/test_usercommands.vim
@@ -393,9 +393,13 @@ func Test_addr_all()
call assert_equal(len(gettabinfo()), g:a2)
bwipe
- command! -addr=other DoSomething echo 'nothing'
+ command! -addr=other DoSomething let g:a1 = <line1> | let g:a2 = <line2>
DoSomething
- call assert_fails('%DoSomething')
+ call assert_equal(line('.'), g:a1)
+ call assert_equal(line('.'), g:a2)
+ %DoSomething
+ call assert_equal(1, g:a1)
+ call assert_equal(line('$'), g:a2)
delcommand DoSomething
endfunc
@@ -421,7 +425,7 @@ func Test_command_list()
\ execute('command DoCmd'))
command! -count=2 DoCmd :
call assert_equal("\n Name Args Address Complete Definition"
- \ .. "\n DoCmd 0 2c :",
+ \ .. "\n DoCmd 0 2c ? :",
\ execute('command DoCmd'))
" Test with various -addr= argument values.
diff --git a/src/nvim/testdir/test_window_cmd.vim b/src/nvim/testdir/test_window_cmd.vim
index bed39d0741..687b1cb989 100644
--- a/src/nvim/testdir/test_window_cmd.vim
+++ b/src/nvim/testdir/test_window_cmd.vim
@@ -856,7 +856,7 @@ func Test_window_resize()
wincmd l
let other_winnr = winnr('h')
call assert_notequal(winnr(), other_winnr)
- exe 'vert ' .. other_winnr .. 'resize -100'
+ exe 'vert ' .. other_winnr .. 'resize -' .. &columns
call assert_equal(0, winwidth(other_winnr))
%bwipe!