aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/editing.txt7
-rw-r--r--runtime/doc/map.txt14
-rw-r--r--runtime/doc/tabpage.txt57
-rw-r--r--runtime/doc/windows.txt106
-rw-r--r--scripts/genex_cmds.lua5
-rw-r--r--src/nvim/ex_cmds.lua551
-rw-r--r--src/nvim/ex_cmds2.c36
-rw-r--r--src/nvim/ex_cmds_defs.h10
-rw-r--r--src/nvim/ex_docmd.c681
-rw-r--r--src/nvim/ex_getln.c1
-rw-r--r--src/nvim/testdir/Makefile6
-rw-r--r--src/nvim/testdir/test62.in2
-rw-r--r--src/nvim/testdir/test_argument_0count.in28
-rw-r--r--src/nvim/testdir/test_argument_0count.ok5
-rw-r--r--src/nvim/testdir/test_argument_count.in46
-rw-r--r--src/nvim/testdir/test_argument_count.ok13
-rw-r--r--src/nvim/testdir/test_close_count.in156
-rw-r--r--src/nvim/testdir/test_close_count.ok23
-rw-r--r--src/nvim/testdir/test_command_count.in157
-rw-r--r--src/nvim/testdir/test_command_count.ok38
-rw-r--r--src/nvim/version.c24
-rw-r--r--src/nvim/vim.h1
-rw-r--r--src/nvim/window.c24
23 files changed, 1845 insertions, 146 deletions
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
index f2daa9ec24..7c7628cd78 100644
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1,4 +1,4 @@
-*editing.txt* For Vim version 7.4. Last change: 2014 Jul 19
+*editing.txt* For Vim version 7.4. Last change: 2015 Apr 18
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -801,8 +801,9 @@ current window. The two windows then share this list, until one of them uses
USING THE ARGUMENT LIST
*:argdo*
-:argdo[!] {cmd} Execute {cmd} for each file in the argument list.
- It works like doing this: >
+:[range]argdo[!] {cmd} Execute {cmd} for each file in the argument list or,
+ if [range] is specified, only for arguments in that
+ range. It works like doing this: >
:rewind
:{cmd}
:next
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 1be2827c2c..d4caea198c 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1358,6 +1358,20 @@ Possible attributes are:
Note that -range=N and -count=N are mutually exclusive - only one should be
specified.
+ *E889* *:command-addr*
+It is possible that the special characters in the range like `.`, `$` or `%`
+which by default correspond to the current line, last line and the whole
+buffer, relate to arguments, (loaded) buffers, windows or tab pages.
+
+Possible values are:
+ -addr=lines Range of lines (this is the default)
+ -addr=arguments Range for arguments
+ -addr=buffers Range for buffers (also not loaded buffers)
+ -addr=loaded_buffers Range for loaded buffers
+ -addr=windows Range for windows
+ -addr=tabs Range for tab pages
+
+
Special cases *:command-bang* *:command-bar*
*:command-register* *:command-buffer*
There are some special cases as well:
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index dd3a031020..bb0baf4ccf 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -1,4 +1,4 @@
-*tabpage.txt* For Vim version 7.4. Last change: 2012 Aug 08
+*tabpage.txt* For Vim version 7.4. Last change: 2015 Apr 18
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -61,16 +61,25 @@ In the GUI tab pages line you can use the right mouse button to open menu.
:[count]tabe[dit] *:tabe* *:tabedit* *:tabnew*
:[count]tabnew
Open a new tab page with an empty window, after the current
- tab page. For [count] see |:tab| below.
+ tab page. If [count] is given the new tab page appears after
+ the tabpage [count] otherwise the new tab page will appear
+ after the current one. >
+ :tabnew " opens tabpage after the current one
+ :.tabnew " as above
+ :+tabnew " opens tabpage after the next tab page
+ " note: it is one further than :tabnew
+ :-tabnew " opens tabpage before the current
+ :0tabnew " opens tabpage before the first one
+ :$tabnew " opens tabpage after the last one
:[count]tabe[dit] [++opt] [+cmd] {file}
:[count]tabnew [++opt] [+cmd] {file}
Open a new tab page and edit {file}, like with |:edit|.
- For [count] see |:tab| below.
+ For [count] see |:tabnew| above.
:[count]tabf[ind] [++opt] [+cmd] {file} *:tabf* *:tabfind*
Open a new tab page and edit {file} in 'path', like with
- |:find|. For [count] see |:tab| below.
+ |:find|. For [count] see |:tabnew| above.
{not available when the |+file_in_path| feature was disabled
at compile time}
@@ -110,12 +119,18 @@ something else.
- When 'hidden' is not set, [!] is not used, a buffer has
changes, and there is no other window on this buffer.
Changes to the buffer are not written and won't get lost, so
- this is a "safe" command.
+ this is a "safe" command. >
+ :tabclose " close the current tab page
+:{count}tabc[lose][!]
:tabc[lose][!] {count}
Close tab page {count}. Fails in the same way as `:tabclose`
- above.
-
+ above. >
+ :-tabclose " close the previous tab page
+ :+tabclose " close the next tab page
+ :1tabclose " close the first tab page
+ :$tabclose " close the last tab page
+<
*:tabo* *:tabonly*
:tabo[nly][!] Close all other tab pages.
When the 'hidden' option is set, all buffers in closed windows
@@ -124,7 +139,16 @@ something else.
modified buffers are written. Otherwise, windows that have
buffers that are modified are not removed, unless the [!] is
given, then they become hidden. But modified buffers are
- never abandoned, so changes cannot get lost.
+ never abandoned, so changes cannot get lost. >
+ :tabonly " close all tab pages except the current one
+
+:{count}tabo[nly][!]
+ Close all tab pages except the {count}th one. >
+ :.tabonly " one
+ :-tabonly " close all tab pages except the previous one
+ :+tabonly " close all tab pages except the next one
+ :1tabonly " close all tab pages except the first one
+ :$tabonly " close all tab pages except the last one.
SWITCHING TO ANOTHER TAB PAGE:
@@ -176,8 +200,15 @@ REORDERING TAB PAGES:
:[N]tabm[ove]
Move the current tab page to after tab page N. Use zero to
make the current tab page the first one. Without N the tab
- page is made the last one.
-
+ page is made the last one. >
+ :-tabmove " move the tab page to the left
+ :tabmove " move the tab page to the right
+ :.tabmove " as above
+ :+tabmove " as above
+ :0tabmove " move the tab page to the beginning of the tab
+ " list
+ :$tabmove " move the tab page to the end of the tab list
+<
:tabm[ove] +[N]
:tabm[ove] -[N]
Move the current tab page N places to the right (with +) or to
@@ -191,8 +222,10 @@ clarification what +N means in this context see |[range]|.
LOOPING OVER TAB PAGES:
*:tabd* *:tabdo*
-:tabd[o] {cmd} Execute {cmd} in each tab page.
- It works like doing this: >
+:[range]tabd[o] {cmd}
+ Execute {cmd} in each tab page or, if [range] is given, only
+ in tabpages which tab page number is in the [range]. It works
+ like doing this: >
:tabfirst
:{cmd}
:tabnext
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index 0098e3e521..782349abe8 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -263,28 +263,54 @@ left of the Vim window.
Closing a window
----------------
+:q[uit]
+:{count}q[uit]
CTRL-W q *CTRL-W_q*
CTRL-W CTRL-Q *CTRL-W_CTRL-Q*
-:q[uit] Quit current window. When quitting the last window (not
- counting a help window), exit Vim.
- When 'hidden' is set, and there is only one window for the
- current buffer, it becomes hidden.
- When 'hidden' is not set, and there is only one window for the
- current buffer, and the buffer was changed, the command fails.
- (Note: CTRL-Q does not work on all terminals)
+ Without {count}: Quit the current window. If {count} is
+ given quit the {count} window
-:q[uit]! Quit current window. If this was the last window for a buffer,
- any changes to that buffer are lost. When quitting the last
- window (not counting help windows), exit Vim. The contents of
- the buffer are lost, even when 'hidden' is set.
+ When quitting the last window (not counting a help window),
+ exit Vim.
+ When 'hidden' is set, and there is only one window for the
+ current buffer, it becomes hidden. When 'hidden' is not set,
+ and there is only one window for the current buffer, and the
+ buffer was changed, the command fails.
+ (Note: CTRL-Q does not work on all terminals).
+ If [count] is greater than the last window number the last
+ window will be closed: >
+ :1quit " quit the first window
+ :$quit " quit the last window
+ :9quit " quit the last window
+ " if there are less than 9 windows opened
+ :-quit " quit the previous window
+ :+quit " quit the next window
+ :+2quit " will also work as expected
+<
+:q[uit]!
+:{count}q[uit]!
+ Without {count}: Quit the current window. If {count} is
+ given quit the {count} window
+ If this was the last window for a buffer, any changes to that
+ buffer are lost. When quitting the last window (not counting
+ help windows), exit Vim. The contents of the buffer are lost,
+ even when 'hidden' is set.
+
+:clo[se][!]
+:{count}clo[se][!]
CTRL-W c *CTRL-W_c* *:clo* *:close*
-:clo[se][!] Close current window. When the 'hidden' option is set, or
- when the buffer was changed and the [!] is used, the buffer
- becomes hidden (unless there is another window editing it).
+ Without {count}: Close the current window. If given close the
+ {count} window.
+
+ When 'hidden' is set, or when the buffer was changed and the
+ [!] is used, the buffer becomes hidden (unless there is another
+ window editing it).
+
When there is only one window in the current tab page and
there is another tab page, this closes the current tab page.
|tab-page|.
+
This command fails when: *E444*
- There is only one window on the screen.
- When 'hidden' is not set, [!] is not used, the buffer has
@@ -297,29 +323,38 @@ CTRL-W CTRL-C *CTRL-W_CTRL-C*
window, but that does not work, because the CTRL-C cancels the
command.
- *:hide*
-:hid[e] Quit current window, unless it is the last window on the
- screen. The buffer becomes hidden (unless there is another
- window editing it or 'bufhidden' is "unload" or "delete").
- If the window is the last one in the current tab page the tab
- page is closed. |tab-page|
+ *:hide*
+:hid[e]
+:{count}hid[e]
+ Quit the current window, unless it is the last window on the
+ screen. For {count} see |:quit|.
+
+ The buffer becomes hidden (unless there is another window
+ editing it or 'bufhidden' is `unload` or `delete`). If the
+ window is the last one in the current tab page the tab page is
+ closed. |tab-page|
+
The value of 'hidden' is irrelevant for this command.
Changes to the buffer are not written and won't get lost, so
this is a "safe" command.
-:hid[e] {cmd} Execute {cmd} with 'hidden' is set. The previous value of
+:hid[e] {cmd} Execute {cmd} with 'hidden' set. The previous value of
'hidden' is restored after {cmd} has been executed.
Example: >
:hide edit Makefile
< This will edit "Makefile", and hide the current buffer if it
has any changes.
+:on[ly][!]
+:{count}on[ly][!]
CTRL-W o *CTRL-W_o* *E445*
CTRL-W CTRL-O *CTRL-W_CTRL-O* *:on* *:only*
-:on[ly][!] Make the current window the only one on the screen. All other
- windows are closed.
+ Make the current window the only one on the screen. All other
+ windows are closed. For {count} see |:quit|.
+
When the 'hidden' option is set, all buffers in closed windows
become hidden.
+
When 'hidden' is not set, and the 'autowrite' option is set,
modified buffers are written. Otherwise, windows that have
buffers that are modified are not removed, unless the [!] is
@@ -660,8 +695,9 @@ can also get to them with the buffer list commands, like ":bnext".
8. Do a command in all buffers or windows *list-repeat*
*:windo*
-:windo {cmd} Execute {cmd} in each window.
- It works like doing this: >
+:[range]windo {cmd} Execute {cmd} in each window or if [range] is given
+ only in windows for which the window number lies in
+ the [range]. It works like doing this: >
CTRL-W t
:{cmd}
CTRL-W w
@@ -679,8 +715,10 @@ can also get to them with the buffer list commands, like ":bnext".
Also see |:tabdo|, |:argdo| and |:bufdo|.
*:bufdo*
-:bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list.
- It works like doing this: >
+:[range]bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list or if
+ [range[ is given only for buffers for which their
+ buffer name is in the [range]. It works like doing
+ this: >
:bfirst
:{cmd}
:bnext
@@ -992,8 +1030,11 @@ list of buffers. |unlisted-buffer|
Actually, the buffer isn't completely deleted, it is removed
from the buffer list |unlisted-buffer| and option values,
variables and mappings/abbreviations for the buffer are
- cleared.
-
+ cleared. Examples: >
+ :.,$-bdelete "delete buffers from the current one to
+ " last but one
+ :%bdelete " delete all buffers
+<
:bdelete[!] {bufname} *E93* *E94*
Like ":bdelete[!] [N]", but buffer given by name. Note that a
buffer whose name is a number cannot be referenced by that
@@ -1016,8 +1057,11 @@ list of buffers. |unlisted-buffer|
Like |:bdelete|, but really delete the buffer. Everything
related to the buffer is lost. All marks in this buffer
become invalid, option settings are lost, etc. Don't use this
- unless you know what you are doing.
-
+ unless you know what you are doing. Examples: >
+ :.+,$bwipeout " wipe out all buffers after the current
+ " one
+ :%bwipeout " wipe out all buffers
+<
:[N]bun[load][!] *:bun* *:bunload* *E515*
:bun[load][!] [N]
Unload buffer [N] (default: current buffer). The memory
diff --git a/scripts/genex_cmds.lua b/scripts/genex_cmds.lua
index 75739bda74..b1d34fbffd 100644
--- a/scripts/genex_cmds.lua
+++ b/scripts/genex_cmds.lua
@@ -67,8 +67,9 @@ for i, cmd in ipairs(defs) do
[%s] = {
.cmd_name = (char_u *) "%s",
.cmd_func = &%s,
- .cmd_argt = %u
- }]], enumname, cmd.command, cmd.func, cmd.flags))
+ .cmd_argt = %uL,
+ .cmd_addr_type = %i
+ }]], enumname, cmd.command, cmd.func, cmd.flags, cmd.addr_type))
end
defsfile:write([[
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua
index 52dc0d6212..5f60b8cb09 100644
--- a/src/nvim/ex_cmds.lua
+++ b/src/nvim/ex_cmds.lua
@@ -28,2635 +28,3166 @@ local FILES = bit.bor(XFILE, EXTRA)
local WORD1 = bit.bor(EXTRA, NOSPC)
local FILE1 = bit.bor(FILES, NOSPC)
+local ADDR_LINES = 0
+local ADDR_WINDOWS = 1
+local ADDR_ARGUMENTS = 2
+local ADDR_LOADED_BUFFERS = 3
+local ADDR_BUFFERS = 4
+local ADDR_TABS = 5
+
-- The following table is described in ex_cmds_defs.h file.
return {
{
command='append',
flags=bit.bor(BANG, RANGE, ZEROR, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_append',
},
{
command='abbreviate',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='abclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abclear',
},
{
command='aboveleft',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='all',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_all',
},
{
command='amenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='anoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='args',
flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_args',
},
{
command='argadd',
flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILES, TRLBAR),
+ addr_type=ADDR_ARGUMENTS,
func='ex_argadd',
},
{
command='argdelete',
flags=bit.bor(BANG, RANGE, NOTADR, FILES, TRLBAR),
+ addr_type=ADDR_ARGUMENTS,
func='ex_argdelete',
},
{
command='argdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ addr_type=ADDR_ARGUMENTS,
func='ex_listdo',
},
{
command='argedit',
- flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_ARGUMENTS,
func='ex_argedit',
},
{
command='argglobal',
flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_args',
},
{
command='arglocal',
flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_args',
},
{
command='argument',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_ARGUMENTS,
func='ex_argument',
},
{
command='ascii',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='do_ascii',
},
{
command='autocmd',
flags=bit.bor(BANG, EXTRA, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_autocmd',
},
{
command='augroup',
flags=bit.bor(BANG, WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_autocmd',
},
{
command='aunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='buffer',
flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR),
+ addr_type=ADDR_BUFFERS,
func='ex_buffer',
},
{
command='bNext',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bprevious',
},
{
command='ball',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_buffer_all',
},
{
command='badd',
flags=bit.bor(NEEDARG, FILE1, EDITCMD, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='bdelete',
flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR),
+ addr_type=ADDR_BUFFERS,
func='ex_bunload',
},
{
command='behave',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_behave',
},
{
command='belowright',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='bfirst',
flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_brewind',
},
{
command='blast',
flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_blast',
},
{
command='bmodified',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bmodified',
},
{
command='bnext',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bnext',
},
{
command='botright',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='bprevious',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bprevious',
},
{
command='brewind',
flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_brewind',
},
{
command='break',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_break',
},
{
command='breakadd',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_breakadd',
},
{
command='breakdel',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_breakdel',
},
{
command='breaklist',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_breaklist',
},
{
command='browse',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='buffers',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='buflist_list',
},
{
command='bufdo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ addr_type=ADDR_BUFFERS,
func='ex_listdo',
},
{
command='bunload',
flags=bit.bor(BANG, RANGE, NOTADR, 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),
+ addr_type=ADDR_BUFFERS,
func='ex_bunload',
},
{
command='change',
flags=bit.bor(BANG, WHOLEFOLD, RANGE, COUNT, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_change',
},
{
command='cNext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cNfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='cabclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abclear',
},
{
command='caddbuffer',
flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='caddexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='caddfile',
flags=bit.bor(TRLBAR, FILE1),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='call',
flags=bit.bor(RANGE, NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_call',
},
{
command='catch',
flags=bit.bor(EXTRA, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_catch',
},
{
command='cbuffer',
flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='cc',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='cclose',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cclose',
},
{
command='cd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_cd',
},
{
command='center',
flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_align',
},
{
command='cexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='cfile',
flags=bit.bor(TRLBAR, FILE1, BANG),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='cfirst',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='cgetfile',
flags=bit.bor(TRLBAR, FILE1),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='cgetbuffer',
flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='cgetexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='chdir',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_cd',
},
{
command='changes',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_changes',
},
{
command='checkpath',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_checkpath',
},
{
command='checktime',
flags=bit.bor(RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_checktime',
},
{
command='clist',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='qf_list',
},
{
command='clast',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='close',
- flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN),
+ addr_type=ADDR_WINDOWS,
func='ex_close',
},
{
command='cmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='cmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='cmenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='cnext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cnewer',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='qf_age',
},
{
command='cnfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='cnoreabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='cnoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='copy',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_copymove',
},
{
command='colder',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='qf_age',
},
{
command='colorscheme',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_colorscheme',
},
{
command='command',
flags=bit.bor(EXTRA, BANG, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_command',
},
{
command='comclear',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_comclear',
},
{
command='compiler',
flags=bit.bor(BANG, TRLBAR, WORD1, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_compiler',
},
{
command='continue',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_continue',
},
{
command='confirm',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='copen',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_copen',
},
{
command='cprevious',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cpfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='cquit',
flags=bit.bor(TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cquit',
},
{
command='crewind',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='cscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
+ addr_type=ADDR_LINES,
func='do_cscope',
},
{
command='cstag',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='do_cstag',
},
{
command='cunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='cunabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='cunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='cwindow',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cwindow',
},
{
command='delete',
flags=bit.bor(RANGE, WHOLEFOLD, REGSTR, COUNT, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_operators',
},
{
command='delmarks',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_delmarks',
},
{
command='debug',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_debug',
},
{
command='debuggreedy',
flags=bit.bor(RANGE, NOTADR, ZEROR, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_debuggreedy',
},
{
command='delcommand',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_delcommand',
},
{
command='delfunction',
flags=bit.bor(NEEDARG, WORD1, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_delfunction',
},
{
command='display',
flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_display',
},
{
command='diffupdate',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_diffupdate',
},
{
command='diffget',
flags=bit.bor(RANGE, EXTRA, TRLBAR, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_diffgetput',
},
{
command='diffoff',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_diffoff',
},
{
command='diffpatch',
flags=bit.bor(EXTRA, FILE1, TRLBAR, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_diffpatch',
},
{
command='diffput',
flags=bit.bor(RANGE, EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_diffgetput',
},
{
command='diffsplit',
flags=bit.bor(EXTRA, FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_diffsplit',
},
{
command='diffthis',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_diffthis',
},
{
command='digraphs',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_digraphs',
},
{
command='djump',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='dlist',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='doautocmd',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_doautocmd',
},
{
command='doautoall',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_doautoall',
},
{
command='drop',
flags=bit.bor(FILES, EDITCMD, NEEDARG, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_drop',
},
{
command='dsearch',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='dsplit',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='edit',
flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='earlier',
flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_later',
},
{
command='echo',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_echo',
},
{
command='echoerr',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_execute',
},
{
command='echohl',
flags=bit.bor(EXTRA, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_echohl',
},
{
command='echomsg',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_execute',
},
{
command='echon',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_echo',
},
{
command='else',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_else',
},
{
command='elseif',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_else',
},
{
command='emenu',
flags=bit.bor(NEEDARG, EXTRA, TRLBAR, NOTRLCOM, RANGE, NOTADR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_emenu',
},
{
command='endif',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_endif',
},
{
command='endfunction',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_endfunction',
},
{
command='endfor',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_endwhile',
},
{
command='endtry',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_endtry',
},
{
command='endwhile',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_endwhile',
},
{
command='enew',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='ex',
flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='execute',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_execute',
},
{
command='exit',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_exit',
},
{
command='exusage',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_exusage',
},
{
command='file',
flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_file',
},
{
command='files',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='buflist_list',
},
{
command='filetype',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_filetype',
},
{
command='find',
flags=bit.bor(RANGE, NOTADR, BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_find',
},
{
command='finally',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_finally',
},
{
command='finish',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_finish',
},
{
command='first',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_rewind',
},
{
command='fold',
flags=bit.bor(RANGE, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_fold',
},
{
command='foldclose',
flags=bit.bor(RANGE, BANG, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_foldopen',
},
{
command='folddoopen',
flags=bit.bor(RANGE, DFLALL, NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_folddo',
},
{
command='folddoclosed',
flags=bit.bor(RANGE, DFLALL, NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_folddo',
},
{
command='foldopen',
flags=bit.bor(RANGE, BANG, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_foldopen',
},
{
command='for',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_while',
},
{
command='function',
flags=bit.bor(EXTRA, BANG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_function',
},
{
command='global',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, EXTRA, DFLALL, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_global',
},
{
command='goto',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_goto',
},
{
command='grep',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='grepadd',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='gui',
flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_gui',
},
{
command='gvim',
flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_gui',
},
{
command='help',
flags=bit.bor(BANG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_help',
},
{
command='helpclose',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_helpclose',
},
{
command='helpfind',
flags=bit.bor(EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_helpfind',
},
{
command='helpgrep',
flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG),
+ addr_type=ADDR_LINES,
func='ex_helpgrep',
},
{
command='helptags',
flags=bit.bor(NEEDARG, FILES, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_helptags',
},
{
command='hardcopy',
flags=bit.bor(RANGE, COUNT, EXTRA, TRLBAR, DFLALL, BANG),
+ addr_type=ADDR_LINES,
func='ex_hardcopy',
},
{
command='highlight',
flags=bit.bor(BANG, EXTRA, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_highlight',
},
{
command='hide',
- flags=bit.bor(BANG, EXTRA, NOTRLCOM),
+ flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, NOTRLCOM),
+ addr_type=ADDR_WINDOWS,
func='ex_hide',
},
{
command='history',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_history',
},
{
command='insert',
flags=bit.bor(BANG, RANGE, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_append',
},
{
command='iabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='iabclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abclear',
},
{
command='if',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_if',
},
{
command='ijump',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='ilist',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='imap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='imapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='imenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='inoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='inoreabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='inoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='intro',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_intro',
},
{
command='isearch',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='isplit',
flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_findpat',
},
{
command='iunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='iunabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='iunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='join',
flags=bit.bor(BANG, RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_join',
},
{
command='jumps',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_jumps',
},
{
command='k',
flags=bit.bor(RANGE, WORD1, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mark',
},
{
command='keepmarks',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='keepjumps',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='keeppatterns',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='keepalt',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='list',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_print',
},
{
command='lNext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='lNfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='last',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_last',
},
{
command='language',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_language',
},
{
command='laddexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='laddbuffer',
flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='laddfile',
flags=bit.bor(TRLBAR, FILE1),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='later',
flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_later',
},
{
command='lbuffer',
flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='lcd',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_cd',
},
{
command='lchdir',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_cd',
},
{
command='lclose',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cclose',
},
{
command='lcscope',
flags=bit.bor(EXTRA, NOTRLCOM, XFILE),
+ addr_type=ADDR_LINES,
func='do_cscope',
},
{
command='left',
flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_align',
},
{
command='leftabove',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='let',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_let',
},
{
command='lexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='lfile',
flags=bit.bor(TRLBAR, FILE1, BANG),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='lfirst',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='lgetfile',
flags=bit.bor(TRLBAR, FILE1),
+ addr_type=ADDR_LINES,
func='ex_cfile',
},
{
command='lgetbuffer',
flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cbuffer',
},
{
command='lgetexpr',
flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cexpr',
},
{
command='lgrep',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='lgrepadd',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='lhelpgrep',
flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG),
+ addr_type=ADDR_LINES,
func='ex_helpgrep',
},
{
command='ll',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='llast',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='llist',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='qf_list',
},
{
command='lmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='lmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='lmake',
flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='lnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='lnext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='lnewer',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='qf_age',
},
{
command='lnfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='loadview',
flags=bit.bor(FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_loadview',
},
{
command='loadkeymap',
flags=bit.bor(CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_loadkeymap',
},
{
command='lockmarks',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='lockvar',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_lockvar',
},
{
command='lolder',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='qf_age',
},
{
command='lopen',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_copen',
},
{
command='lprevious',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='lpfile',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cnext',
},
{
command='lrewind',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG),
+ addr_type=ADDR_LINES,
func='ex_cc',
},
{
command='ltag',
flags=bit.bor(NOTADR, TRLBAR, BANG, WORD1),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='lunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='lua',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_script_ni',
},
{
command='luado',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='luafile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='lvimgrep',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_vimgrep',
},
{
command='lvimgrepadd',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_vimgrep',
},
{
command='lwindow',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_cwindow',
},
{
command='ls',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='buflist_list',
},
{
command='move',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_copymove',
},
{
command='mark',
flags=bit.bor(RANGE, WORD1, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mark',
},
{
command='make',
flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_make',
},
{
command='map',
flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='mapclear',
flags=bit.bor(EXTRA, BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='marks',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='do_marks',
},
{
command='match',
flags=bit.bor(RANGE, NOTADR, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_match',
},
{
command='menu',
flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='menutranslate',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menutranslate',
},
{
command='messages',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_messages',
},
{
command='mkexrc',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mkrc',
},
{
command='mksession',
flags=bit.bor(BANG, FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_mkrc',
},
{
command='mkspell',
flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_mkspell',
},
{
command='mkvimrc',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mkrc',
},
{
command='mkview',
flags=bit.bor(BANG, FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_mkrc',
},
{
command='mode',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mode',
},
{
command='mzscheme',
flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN, SBOXOK),
+ addr_type=ADDR_LINES,
func='ex_script_ni',
},
{
command='mzfile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='next',
flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_next',
},
{
command='nbkey',
flags=bit.bor(EXTRA, NOTADR, NEEDARG),
+ addr_type=ADDR_LINES,
func='ex_nbkey',
},
{
command='nbclose',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_nbclose',
},
{
command='nbstart',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_nbstart',
},
{
command='new',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='nmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='nmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='nmenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='nnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='nnoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='noremap',
flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='noautocmd',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='nohlsearch',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_nohlsearch',
},
{
command='noreabbrev',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='noremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='noswapfile',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='normal',
flags=bit.bor(RANGE, BANG, EXTRA, NEEDARG, NOTRLCOM, USECTRLV, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_normal',
},
{
command='number',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_print',
},
{
command='nunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='nunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='open',
flags=bit.bor(RANGE, BANG, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_open',
},
{
command='oldfiles',
flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_oldfiles',
},
{
command='omap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='omapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='omenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='only',
- flags=bit.bor(BANG, TRLBAR),
+ flags=bit.bor(BANG, NOTADR, RANGE, COUNT, TRLBAR),
+ addr_type=ADDR_WINDOWS,
func='ex_only',
},
{
command='onoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='onoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='options',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_options',
},
{
command='ounmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='ounmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='ownsyntax',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ownsyntax',
},
{
command='print',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, SBOXOK),
+ addr_type=ADDR_LINES,
func='ex_print',
},
{
command='pclose',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_pclose',
},
{
command='perl',
flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_script_ni',
},
{
command='perldo',
flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='pedit',
flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_pedit',
},
{
command='pop',
flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='popup',
flags=bit.bor(NEEDARG, EXTRA, BANG, TRLBAR, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_popup',
},
{
command='ppop',
flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='preserve',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_preserve',
},
{
command='previous',
flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_previous',
},
{
command='promptfind',
flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='gui_mch_find_dialog',
},
{
command='promptrepl',
flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='gui_mch_replace_dialog',
},
{
command='profile',
flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_profile',
},
{
command='profdel',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_breakdel',
},
{
command='psearch',
flags=bit.bor(BANG, RANGE, WHOLEFOLD, DFLALL, EXTRA),
+ addr_type=ADDR_LINES,
func='ex_psearch',
},
{
command='ptag',
flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptNext',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptfirst',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptlast',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptnext',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptprevious',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptrewind',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='ptselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_ptag',
},
{
command='put',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, REGSTR, TRLBAR, ZEROR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_put',
},
{
command='pwd',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_pwd',
},
{
command='python',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_python',
},
{
command='pydo',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_pydo',
},
{
command='pyfile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_pyfile',
},
{
command='py3',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_python3',
},
{
command='py3do',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_pydo3',
},
{
command='python3',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_python3',
},
{
command='py3file',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_py3file',
},
{
command='quit',
- flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, COUNT, NOTADR, TRLBAR, CMDWIN),
+ addr_type=ADDR_WINDOWS,
func='ex_quit',
},
{
command='quitall',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_quit_all',
},
{
command='qall',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_quit_all',
},
{
command='read',
flags=bit.bor(BANG, RANGE, WHOLEFOLD, FILE1, ARGOPT, TRLBAR, ZEROR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_read',
},
{
command='recover',
flags=bit.bor(BANG, FILE1, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_recover',
},
{
command='redo',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_redo',
},
{
command='redir',
flags=bit.bor(BANG, FILES, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_redir',
},
{
command='redraw',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_redraw',
},
{
command='redrawstatus',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_redrawstatus',
},
{
command='registers',
flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_display',
},
{
command='resize',
flags=bit.bor(RANGE, NOTADR, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_resize',
},
{
command='retab',
flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, DFLALL, BANG, WORD1, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_retab',
},
{
command='return',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_return',
},
{
command='rewind',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_rewind',
},
{
command='right',
flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_align',
},
{
command='rightbelow',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='runtime',
flags=bit.bor(BANG, NEEDARG, FILES, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_runtime',
},
{
command='rundo',
flags=bit.bor(NEEDARG, FILE1),
+ addr_type=ADDR_LINES,
func='ex_rundo',
},
{
command='ruby',
flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_script_ni',
},
{
command='rubydo',
flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='rubyfile',
flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='rviminfo',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_viminfo',
},
{
command='substitute',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='do_sub',
},
{
command='sNext',
flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_previous',
},
{
command='sargument',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_ARGUMENTS,
func='ex_argument',
},
{
command='sall',
flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_all',
},
{
command='sandbox',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='saveas',
flags=bit.bor(BANG, DFLALL, FILE1, ARGOPT, CMDWIN, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_write',
},
{
command='sbuffer',
flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR),
+ addr_type=ADDR_BUFFERS,
func='ex_buffer',
},
{
command='sbNext',
flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bprevious',
},
{
command='sball',
flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_buffer_all',
},
{
command='sbfirst',
flags=bit.bor(EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_brewind',
},
{
command='sblast',
flags=bit.bor(EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_blast',
},
{
command='sbmodified',
flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bmodified',
},
{
command='sbnext',
flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bnext',
},
{
command='sbprevious',
flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_bprevious',
},
{
command='sbrewind',
flags=bit.bor(EDITCMD, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_brewind',
},
{
command='scriptnames',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_scriptnames',
},
{
command='scriptencoding',
flags=bit.bor(WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_scriptencoding',
},
{
command='scscope',
flags=bit.bor(EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='do_scscope',
},
{
command='set',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
+ addr_type=ADDR_LINES,
func='ex_set',
},
{
command='setfiletype',
flags=bit.bor(TRLBAR, EXTRA, NEEDARG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_setfiletype',
},
{
command='setglobal',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
+ addr_type=ADDR_LINES,
func='ex_set',
},
{
command='setlocal',
flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK),
+ addr_type=ADDR_LINES,
func='ex_set',
},
{
command='sfind',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='sfirst',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_rewind',
},
{
command='simalt',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_simalt',
},
{
command='sign',
flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_sign',
},
{
command='silent',
flags=bit.bor(NEEDARG, EXTRA, BANG, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='sleep',
flags=bit.bor(RANGE, NOTADR, COUNT, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_sleep',
},
{
command='slast',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_last',
},
{
command='smagic',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_submagic',
},
{
command='smap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='smapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='smenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='snext',
flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_next',
},
{
command='snomagic',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_submagic',
},
{
command='snoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='snoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='source',
flags=bit.bor(BANG, FILE1, TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_source',
},
{
command='sort',
flags=bit.bor(RANGE, DFLALL, WHOLEFOLD, BANG, EXTRA, NOTRLCOM, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_sort',
},
{
command='split',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='spellgood',
flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spell',
},
{
command='spelldump',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spelldump',
},
{
command='spellinfo',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spellinfo',
},
{
command='spellrepall',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spellrepall',
},
{
command='spellundo',
flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spell',
},
{
command='spellwrong',
flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_spell',
},
{
command='sprevious',
flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_previous',
},
{
command='srewind',
flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_rewind',
},
{
command='stop',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_stop',
},
{
command='stag',
flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_stag',
},
{
command='startinsert',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_startinsert',
},
{
command='startgreplace',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_startinsert',
},
{
command='startreplace',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_startinsert',
},
{
command='stopinsert',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_stopinsert',
},
{
command='stjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_stag',
},
{
command='stselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_stag',
},
{
command='sunhide',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_buffer_all',
},
{
command='sunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='sunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='suspend',
flags=bit.bor(TRLBAR, BANG, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_stop',
},
{
command='sview',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='swapname',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_swapname',
},
{
command='syntax',
flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_syntax',
},
{
command='syntime',
flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_syntime',
},
{
command='syncbind',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_syncbind',
},
{
command='t',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_copymove',
},
{
command='tNext',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tag',
flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tags',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='do_tags',
},
{
command='tab',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='tabclose',
flags=bit.bor(RANGE, NOTADR, COUNT, BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_TABS,
func='ex_tabclose',
},
{
command='tabdo',
- flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ addr_type=ADDR_TABS,
func='ex_listdo',
},
{
command='tabedit',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_TABS,
func='ex_splitview',
},
{
command='tabfind',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, NEEDARG, TRLBAR),
+ addr_type=ADDR_TABS,
func='ex_splitview',
},
{
command='tabfirst',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabmove',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR),
+ addr_type=ADDR_TABS,
func='ex_tabmove',
},
{
command='tablast',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabnext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabnew',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_TABS,
func='ex_splitview',
},
{
command='tabonly',
- flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ flags=bit.bor(BANG, RANGE, NOTADR, TRLBAR, CMDWIN),
+ addr_type=ADDR_TABS,
func='ex_tabonly',
},
{
command='tabprevious',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabNext',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabrewind',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tabnext',
},
{
command='tabs',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_tabs',
},
{
command='tcl',
flags=bit.bor(RANGE,EXTRA,NEEDARG,CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_script_ni',
},
{
command='tcldo',
flags=bit.bor(RANGE,DFLALL,EXTRA,NEEDARG,CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='tclfile',
flags=bit.bor(RANGE,FILE1,NEEDARG,CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='tearoff',
flags=bit.bor(NEEDARG, EXTRA, TRLBAR, NOTRLCOM, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_tearoff',
},
{
command='terminal',
flags=bit.bor(BANG, FILES, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_terminal',
},
{
command='tfirst',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='throw',
flags=bit.bor(EXTRA, NEEDARG, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_throw',
},
{
command='tjump',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tlast',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='tmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='tmenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='tnext',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='topleft',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='tprevious',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='trewind',
flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='try',
flags=bit.bor(TRLBAR, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_try',
},
{
command='tselect',
flags=bit.bor(BANG, TRLBAR, WORD1),
+ addr_type=ADDR_LINES,
func='ex_tag',
},
{
command='tunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='tunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='undo',
flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_undo',
},
{
command='undojoin',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_undojoin',
},
{
command='undolist',
flags=bit.bor(TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_undolist',
},
{
command='unabbreviate',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_abbreviate',
},
{
command='unhide',
flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_buffer_all',
},
{
command='unlet',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unlet',
},
{
command='unlockvar',
flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_lockvar',
},
{
command='unmap',
flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='unmenu',
flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='unsilent',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='update',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_update',
},
{
command='vglobal',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, DFLALL, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_global',
},
{
command='version',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_version',
},
{
command='verbose',
flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='vertical',
flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM),
+ addr_type=ADDR_LINES,
func='ex_wrongmodifier',
},
{
command='visual',
flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='view',
flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_edit',
},
{
command='vimgrep',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_vimgrep',
},
{
command='vimgrepadd',
flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE),
+ addr_type=ADDR_LINES,
func='ex_vimgrep',
},
{
command='viusage',
flags=bit.bor(TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_viusage',
},
{
command='vmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='vmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='vmenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='vnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='vnew',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='vnoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='vsplit',
flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_splitview',
},
{
command='vunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='vunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='write',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_write',
},
{
command='wNext',
flags=bit.bor(RANGE, WHOLEFOLD, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_wnext',
},
{
command='wall',
flags=bit.bor(BANG, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='do_wqall',
},
{
command='while',
flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_while',
},
{
command='winsize',
flags=bit.bor(EXTRA, NEEDARG, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_winsize',
},
{
command='wincmd',
flags=bit.bor(NEEDARG, WORD1, RANGE, NOTADR),
+ addr_type=ADDR_WINDOWS,
func='ex_wincmd',
},
{
command='windo',
- flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM),
+ flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL),
+ addr_type=ADDR_WINDOWS,
func='ex_listdo',
},
{
command='winpos',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_ni',
},
{
command='wnext',
flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_wnext',
},
{
command='wprevious',
flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_wnext',
},
{
command='wq',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_exit',
},
{
command='wqall',
flags=bit.bor(BANG, FILE1, ARGOPT, DFLALL, TRLBAR),
+ addr_type=ADDR_LINES,
func='do_wqall',
},
{
command='wsverb',
flags=bit.bor(EXTRA, NOTADR, NEEDARG),
+ addr_type=ADDR_LINES,
func='ex_wsverb',
},
{
command='wundo',
flags=bit.bor(BANG, NEEDARG, FILE1),
+ addr_type=ADDR_LINES,
func='ex_wundo',
},
{
command='wviminfo',
flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_viminfo',
},
{
command='xit',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_exit',
},
{
command='xall',
flags=bit.bor(BANG, TRLBAR),
+ addr_type=ADDR_LINES,
func='do_wqall',
},
{
command='xmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='xmapclear',
flags=bit.bor(EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_mapclear',
},
{
command='xmenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='xnoremap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_map',
},
{
command='xnoremenu',
flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='xunmap',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_unmap',
},
{
command='xunmenu',
flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_menu',
},
{
command='yank',
flags=bit.bor(RANGE, WHOLEFOLD, REGSTR, COUNT, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_operators',
},
{
command='z',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, EXFLAGS, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_z',
},
{
command='!',
enum='CMD_bang',
flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILES, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_bang',
},
{
command='#',
enum='CMD_pound',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_print',
},
{
command='&',
enum='CMD_and',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='do_sub',
},
{
command='*',
enum='CMD_star',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_at',
},
{
command='<',
enum='CMD_lshift',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_operators',
},
{
command='=',
enum='CMD_equal',
flags=bit.bor(RANGE, TRLBAR, DFLALL, EXFLAGS, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_equal',
},
{
command='>',
enum='CMD_rshift',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='ex_operators',
},
{
command='@',
enum='CMD_at',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_at',
},
{
command='Next',
flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR),
+ addr_type=ADDR_LINES,
func='ex_previous',
},
{
command='Print',
flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN),
+ addr_type=ADDR_LINES,
func='ex_print',
},
{
command='~',
enum='CMD_tilde',
flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY),
+ addr_type=ADDR_LINES,
func='do_sub',
},
}
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index 98e6d87196..e453d68247 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -1844,13 +1844,33 @@ void ex_listdo(exarg_T *eap)
|| !check_changed(curbuf, CCGD_AW
| (eap->forceit ? CCGD_FORCEIT : 0)
| CCGD_EXCMD)) {
- /* start at the first argument/window/buffer */
i = 0;
+ /* start at the eap->line1 argument/window/buffer */
wp = firstwin;
tp = first_tabpage;
+ switch (eap->cmdidx) {
+ case CMD_windo:
+ for (; wp != NULL && i + 1 < eap->line1; wp = wp->w_next) {
+ i++;
+ }
+ break;
+ case CMD_tabdo:
+ for (; tp != NULL && i + 1 < eap->line1; tp = tp->tp_next) {
+ i++;
+ }
+ break;
+ case CMD_argdo:
+ i = eap->line1 - 1;
+ break;
+ case CMD_bufdo:
+ i = eap->line1;
+ break;
+ default:
+ break;
+ }
/* set pcmark now */
if (eap->cmdidx == CMD_bufdo)
- goto_buffer(eap, DOBUF_FIRST, FORWARD, 0);
+ goto_buffer(eap, DOBUF_FIRST, FORWARD, i);
else
setpcmark();
listcmd_busy = TRUE; /* avoids setting pcmark below */
@@ -1873,7 +1893,6 @@ void ex_listdo(exarg_T *eap)
}
if (curwin->w_arg_idx != i)
break;
- ++i;
} else if (eap->cmdidx == CMD_windo) {
/* go to window "wp" */
if (!win_valid(wp))
@@ -1899,13 +1918,14 @@ void ex_listdo(exarg_T *eap)
}
}
+ ++i;
/* execute the command */
do_cmdline(eap->arg, eap->getline, eap->cookie,
DOCMD_VERBOSE + DOCMD_NOWAIT);
if (eap->cmdidx == CMD_bufdo) {
/* Done? */
- if (next_fnum < 0)
+ if (next_fnum < 0 || next_fnum > eap->line2)
break;
/* Check if the buffer still exists. */
@@ -1939,6 +1959,14 @@ void ex_listdo(exarg_T *eap)
if (curwin->w_p_scb)
do_check_scrollbind(TRUE);
}
+ if (eap->cmdidx == CMD_windo || eap->cmdidx == CMD_tabdo) {
+ if (i + 1 > eap->line2) {
+ break;
+ }
+ }
+ if (eap->cmdidx == CMD_argdo && i >= eap->line2) {
+ break;
+ }
}
listcmd_busy = FALSE;
}
diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h
index 1b920511b6..4065cc2fdc 100644
--- a/src/nvim/ex_cmds_defs.h
+++ b/src/nvim/ex_cmds_defs.h
@@ -71,6 +71,14 @@
#define WORD1 (EXTRA | NOSPC) /* one extra word allowed */
#define FILE1 (FILES | NOSPC) /* 1 file allowed, defaults to current file */
+// values for cmd_addr_type
+#define ADDR_LINES 0
+#define ADDR_WINDOWS 1
+#define ADDR_ARGUMENTS 2
+#define ADDR_LOADED_BUFFERS 3
+#define ADDR_BUFFERS 4
+#define ADDR_TABS 5
+
typedef struct exarg exarg_T;
/* behavior for bad character, "++bad=" argument */
@@ -87,6 +95,7 @@ typedef struct cmdname {
char_u *cmd_name; ///< Name of the command.
ex_func_T cmd_func; ///< Function with implementation of this command.
uint32_t cmd_argt; ///< Relevant flags from the declared above.
+ int cmd_addr_type; ///< Flag for address type
} CommandDefinition;
/// Arguments used for Ex commands.
@@ -102,6 +111,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
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 51010983bb..646d64f9f8 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -85,6 +85,7 @@ typedef struct ucmd {
char_u *uc_rep; /* The command's replacement string */
long uc_def; /* The default value for a range/count */
int uc_compl; /* completion type */
+ int uc_addr_type; /* The command's address type */
scid_T uc_scriptID; /* SID where the command was defined */
char_u *uc_compl_arg; /* completion argument if any */
} ucmd_T;
@@ -1066,16 +1067,178 @@ void * getline_cookie(LineGetter fgetline,
}
/*
+ * Helper function to apply an offset for buffer commands, i.e. ":bdelete",
+ * ":bwipeout", etc.
+ * Returns the buffer number.
+ */
+static int compute_buffer_local_count(int addr_type, int lnum, int offset)
+{
+ buf_T *buf;
+ buf_T *nextbuf;
+ int count = offset;
+
+ buf = firstbuf;
+ while (buf->b_next != NULL && buf->b_fnum < lnum)
+ buf = buf->b_next;
+ while (count != 0) {
+ count += (count < 0) ? 1 : -1;
+ nextbuf = (offset < 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL)
+ break;
+ buf = nextbuf;
+ if (addr_type == ADDR_LOADED_BUFFERS)
+ /* skip over unloaded buffers */
+ while (buf->b_ml.ml_mfp == NULL) {
+ nextbuf = (offset < 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL) {
+ break;
+ }
+ buf = nextbuf;
+ }
+ }
+ // we might have gone too far, last buffer is not loaded
+ if (addr_type == ADDR_LOADED_BUFFERS) {
+ while (buf->b_ml.ml_mfp == NULL) {
+ nextbuf = (offset >= 0) ? buf->b_prev : buf->b_next;
+ if (nextbuf == NULL)
+ break;
+ buf = nextbuf;
+ }
+ }
+ return buf->b_fnum;
+}
+
+static int current_win_nr(win_T *win)
+{
+ int nr = 0;
+
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ ++nr;
+ if (wp == win)
+ break;
+ }
+ return nr;
+}
+
+static int current_tab_nr(tabpage_T *tab)
+{
+ int nr = 0;
+
+ FOR_ALL_TABS(tp) {
+ ++nr;
+ if (tp == tab)
+ break;
+ }
+ return nr;
+}
+
+#define CURRENT_WIN_NR current_win_nr(curwin)
+#define LAST_WIN_NR current_win_nr(NULL)
+#define CURRENT_TAB_NR current_tab_nr(curtab)
+#define LAST_TAB_NR current_tab_nr(NULL)
+
+/*
+* Figure out the address type for ":wincmd".
+*/
+static void get_wincmd_addr_type(char_u *arg, exarg_T *eap)
+{
+ switch (*arg) {
+ case 'S':
+ case Ctrl_S:
+ case 's':
+ case Ctrl_N:
+ case 'n':
+ case 'j':
+ case Ctrl_J:
+ case 'k':
+ case Ctrl_K:
+ case 'T':
+ case Ctrl_R:
+ case 'r':
+ case 'R':
+ case 'K':
+ case 'J':
+ case '+':
+ case '-':
+ case Ctrl__:
+ case '_':
+ case '|':
+ case ']':
+ case Ctrl_RSB:
+ case 'g':
+ case Ctrl_G:
+ case Ctrl_V:
+ case 'v':
+ case 'h':
+ case Ctrl_H:
+ case 'l':
+ case Ctrl_L:
+ case 'H':
+ case 'L':
+ case '>':
+ case '<':
+ case '}':
+ case 'f':
+ case 'F':
+ case Ctrl_F:
+ case 'i':
+ case Ctrl_I:
+ case 'd':
+ case Ctrl_D:
+ /* window size or any count */
+ eap->addr_type = ADDR_LINES;
+ break;
+
+ case Ctrl_HAT:
+ case '^':
+ /* buffer number */
+ eap->addr_type = ADDR_BUFFERS;
+ break;
+
+ case Ctrl_Q:
+ case 'q':
+ case Ctrl_C:
+ case 'c':
+ case Ctrl_O:
+ case 'o':
+ case Ctrl_W:
+ case 'w':
+ case 'W':
+ case 'x':
+ case Ctrl_X:
+ /* window number */
+ eap->addr_type = ADDR_WINDOWS;
+ break;
+
+ case Ctrl_Z:
+ case 'z':
+ case 'P':
+ case 't':
+ case Ctrl_T:
+ case 'b':
+ case Ctrl_B:
+ case 'p':
+ case Ctrl_P:
+ case '=':
+ case CAR:
+ /* no count */
+ eap->addr_type = 0;
+ break;
+ }
+}
+
+/*
* Execute one Ex command.
*
* If 'sourcing' is TRUE, the command will be included in the error message.
*
* 1. skip comment lines and leading space
* 2. handle command modifiers
- * 3. parse range
- * 4. parse command
- * 5. parse arguments
- * 6. switch on command name
+ * 3. skip over the range to find the command
+ * 4. parse the range
+ * 5. parse the command
+ * 6. parse arguments
+ * 7. switch on command name
*
* Note: "fgetline" can be NULL.
*
@@ -1100,6 +1263,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
int did_sandbox = FALSE;
cmdmod_T save_cmdmod;
int ni; /* set when Not Implemented */
+ char_u *cmd;
memset(&ea, 0, sizeof(ea));
ea.line1 = 1;
@@ -1132,7 +1296,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.cmd = *cmdlinep;
for (;; ) {
/*
- * 1. skip comment lines and leading white space and colons
+ * 1. Skip comment lines and leading white space and colons.
*/
while (*ea.cmd == ' ' || *ea.cmd == '\t' || *ea.cmd == ':')
++ea.cmd;
@@ -1155,7 +1319,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
/*
- * 2. handle command modifiers.
+ * 2. Handle command modifiers.
*/
p = ea.cmd;
if (ascii_isdigit(*ea.cmd))
@@ -1319,8 +1483,18 @@ static char_u * do_one_cmd(char_u **cmdlinep,
(void)do_intthrow(cstack);
}
+ // 3. Skip over the range to find the command. Let "p" point to after it.
+ //
+ // We need the command to know what kind of range it uses.
+
+ cmd = ea.cmd;
+ ea.cmd = skip_range(ea.cmd, NULL);
+ if (*ea.cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL)
+ ea.cmd = skipwhite(ea.cmd + 1);
+ p = find_command(&ea, NULL);
+
/*
- * 3. parse a range specifier of the form: addr [,addr] [;addr] ..
+ * 4. Parse a range specifier of the form: addr [,addr] [;addr] ..
*
* where 'addr' is:
*
@@ -1336,25 +1510,109 @@ static char_u * do_one_cmd(char_u **cmdlinep,
* is equal to the lower.
*/
+ // ea.addr_type for user commands is set by find_ucmd
+ if (!IS_USER_CMDIDX(ea.cmdidx)) {
+ if (ea.cmdidx != CMD_SIZE) {
+ ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
+ } else {
+ ea.addr_type = ADDR_LINES;
+ }
+ // :wincmd range depends on the argument
+ if (ea.cmdidx == CMD_wincmd && p != NULL) {
+ get_wincmd_addr_type(skipwhite(p), &ea);
+ }
+ }
+
/* repeat for all ',' or ';' separated addresses */
+ ea.cmd = cmd;
for (;; ) {
ea.line1 = ea.line2;
- ea.line2 = curwin->w_cursor.lnum; /* default is current line number */
+ switch (ea.addr_type) {
+ case ADDR_LINES:
+ // default is current line number
+ ea.line2 = curwin->w_cursor.lnum;
+ break;
+ case ADDR_WINDOWS:
+ lnum = CURRENT_WIN_NR;
+ ea.line2 = lnum;
+ break;
+ case ADDR_ARGUMENTS:
+ ea.line2 = curwin->w_arg_idx + 1;
+ if (ea.line2 > ARGCOUNT) {
+ ea.line2 = ARGCOUNT;
+ }
+ break;
+ case ADDR_LOADED_BUFFERS:
+ case ADDR_BUFFERS:
+ ea.line2 = curbuf->b_fnum;
+ break;
+ case ADDR_TABS:
+ lnum = CURRENT_TAB_NR;
+ ea.line2 = lnum;
+ break;
+ }
ea.cmd = skipwhite(ea.cmd);
- lnum = get_address(&ea.cmd, ea.skip, ea.addr_count == 0);
+ lnum = get_address(&ea.cmd, ea.addr_type, ea.skip, ea.addr_count == 0);
if (ea.cmd == NULL) /* error detected */
goto doend;
if (lnum == MAXLNUM) {
if (*ea.cmd == '%') { /* '%' - all lines */
++ea.cmd;
- ea.line1 = 1;
- ea.line2 = curbuf->b_ml.ml_line_count;
+ switch (ea.addr_type) {
+ case ADDR_LINES:
+ ea.line1 = 1;
+ ea.line2 = curbuf->b_ml.ml_line_count;
+ break;
+ case ADDR_LOADED_BUFFERS: {
+ buf_T *buf = firstbuf;
+ while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) {
+ buf = buf->b_next;
+ }
+ ea.line1 = buf->b_fnum;
+ buf = lastbuf;
+ while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL) {
+ buf = buf->b_prev;
+ }
+ ea.line2 = buf->b_fnum;
+ break;
+ }
+ case ADDR_BUFFERS:
+ ea.line1 = firstbuf->b_fnum;
+ ea.line2 = lastbuf->b_fnum;
+ break;
+ case ADDR_WINDOWS:
+ case ADDR_TABS:
+ if (IS_USER_CMDIDX(ea.cmdidx)) {
+ ea.line1 = 1;
+ ea.line2 =
+ ea.addr_type == ADDR_WINDOWS ? LAST_WIN_NR : LAST_TAB_NR;
+ } else {
+ // there is no Vim command which uses '%' and
+ // ADDR_WINDOWS or ADDR_TABS
+ errormsg = (char_u *)_(e_invrange);
+ goto doend;
+ }
+ break;
+ case ADDR_ARGUMENTS:
+ if (ARGCOUNT == 0) {
+ ea.line1 = ea.line2 = 0;
+ } else {
+ ea.line1 = 1;
+ ea.line2 = ARGCOUNT;
+ }
+ break;
+ }
++ea.addr_count;
}
/* '*' - visual area */
else if (*ea.cmd == '*' && vim_strchr(p_cpo, CPO_STAR) == NULL) {
pos_T *fp;
+ if (ea.addr_type != ADDR_LINES) {
+ errormsg = (char_u *)_(e_invrange);
+ goto doend;
+ }
+
++ea.cmd;
if (!ea.skip) {
fp = getmark('<', FALSE);
@@ -1392,7 +1650,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
check_cursor_lnum();
/*
- * 4. parse command
+ * 5. Parse the command.
*/
/*
@@ -1446,9 +1704,6 @@ static char_u * do_one_cmd(char_u **cmdlinep,
goto doend;
}
- /* Find the command and let "p" point to after it. */
- p = find_command(&ea, NULL);
-
// If this looks like an undefined user command and there are CmdUndefined
// autocommands defined, trigger the matching autocommands.
if (p != NULL && ea.cmdidx == CMD_SIZE && !ea.skip
@@ -1502,7 +1757,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
ea.forceit = FALSE;
/*
- * 5. parse arguments
+ * 6. Parse arguments.
*/
if (!IS_USER_CMDIDX(ea.cmdidx)) {
ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt;
@@ -1695,8 +1950,43 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
if ((ea.argt & DFLALL) && ea.addr_count == 0) {
+ buf_T *buf;
+
ea.line1 = 1;
- ea.line2 = curbuf->b_ml.ml_line_count;
+ switch (ea.addr_type) {
+ case ADDR_LINES:
+ ea.line2 = curbuf->b_ml.ml_line_count;
+ break;
+ case ADDR_LOADED_BUFFERS:
+ buf = firstbuf;
+ while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL) {
+ buf = buf->b_next;
+ }
+ ea.line1 = buf->b_fnum;
+ buf = lastbuf;
+ while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL) {
+ buf = buf->b_prev;
+ }
+ ea.line2 = buf->b_fnum;
+ break;
+ case ADDR_BUFFERS:
+ ea.line1 = firstbuf->b_fnum;
+ ea.line2 = lastbuf->b_fnum;
+ break;
+ case ADDR_WINDOWS:
+ ea.line2 = LAST_WIN_NR;
+ break;
+ case ADDR_TABS:
+ ea.line2 = LAST_TAB_NR;
+ break;
+ case ADDR_ARGUMENTS:
+ if (ARGCOUNT == 0) {
+ ea.line1 = ea.line2 = 0;
+ } else {
+ ea.line2 = ARGCOUNT;
+ }
+ break;
+ }
}
/* accept numbered register only when no count allowed (:put) */
@@ -1888,7 +2178,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
/*
- * 6. switch on command name
+ * 7. Switch on command name.
*
* The "ea" structure holds the arguments that can be used.
*/
@@ -2057,7 +2347,7 @@ static char_u *find_command(exarg_T *eap, int *full)
* Exceptions:
* - the 'k' command can directly be followed by any character.
* - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r'
- * but :sre[wind] is another command, as are :scrip[tnames],
+ * but :sre[wind] is another command, as are :scr[iptnames],
* :scs[cope], :sim[alt], :sig[ns] and :sil[ent].
* - the "d" command can directly be followed by 'l' or 'p' flag.
*/
@@ -2195,6 +2485,7 @@ find_ucmd (
eap->cmdidx = CMD_USER_BUF;
eap->argt = uc->uc_argt;
eap->useridx = j;
+ eap->addr_type = uc->uc_addr_type;
if (compl != NULL)
*compl = uc->uc_compl;
@@ -2734,9 +3025,8 @@ set_one_cmd_context (
return NULL;
}
- /* For the -complete and -nargs attributes, we complete
- * their arguments as well.
- */
+ // For the -complete, -nargs and -addr attributes, we complete
+ // their arguments as well.
if (STRNICMP(arg, "complete", p - arg) == 0) {
xp->xp_context = EXPAND_USER_COMPLETE;
xp->xp_pattern = p + 1;
@@ -2745,6 +3035,10 @@ set_one_cmd_context (
xp->xp_context = EXPAND_USER_NARGS;
xp->xp_pattern = p + 1;
return NULL;
+ } else if (STRNICMP(arg, "addr", p - arg) == 0) {
+ xp->xp_context = EXPAND_USER_ADDR_TYPE;
+ xp->xp_pattern = p + 1;
+ return NULL;
}
return NULL;
}
@@ -3098,12 +3392,11 @@ skip_range (
*
* Return MAXLNUM when no Ex address was found.
*/
-static linenr_T
-get_address (
- char_u **ptr,
- int skip, /* only skip the address, don't use it */
- int to_other_file /* flag: may jump to other file */
-)
+static linenr_T get_address(char_u **ptr,
+ int addr_type, // flag: one of ADDR_LINES, ...
+ int skip, // only skip the address, don't use it
+ int to_other_file // flag: may jump to other file
+ )
{
int c;
int i;
@@ -3112,6 +3405,7 @@ get_address (
pos_T pos;
pos_T *fp;
linenr_T lnum;
+ buf_T *buf;
cmd = skipwhite(*ptr);
lnum = MAXLNUM;
@@ -3119,12 +3413,55 @@ get_address (
switch (*cmd) {
case '.': /* '.' - Cursor position */
++cmd;
- lnum = curwin->w_cursor.lnum;
+ switch (addr_type) {
+ case ADDR_LINES:
+ lnum = curwin->w_cursor.lnum;
+ break;
+ case ADDR_WINDOWS:
+ lnum = CURRENT_WIN_NR;
+ break;
+ case ADDR_ARGUMENTS:
+ lnum = curwin->w_arg_idx + 1;
+ break;
+ case ADDR_LOADED_BUFFERS:
+ case ADDR_BUFFERS:
+ lnum = curbuf->b_fnum;
+ break;
+ case ADDR_TABS:
+ lnum = CURRENT_TAB_NR;
+ break;
+ }
break;
case '$': /* '$' - last line */
++cmd;
- lnum = curbuf->b_ml.ml_line_count;
+ switch (addr_type) {
+ case ADDR_LINES:
+ lnum = curbuf->b_ml.ml_line_count;
+ break;
+ case ADDR_WINDOWS:
+ lnum = LAST_WIN_NR;
+ break;
+ case ADDR_ARGUMENTS:
+ lnum = ARGCOUNT;
+ break;
+ case ADDR_LOADED_BUFFERS:
+ buf = lastbuf;
+ while (buf->b_ml.ml_mfp == NULL) {
+ if (buf->b_prev == NULL) {
+ break;
+ }
+ buf = buf->b_prev;
+ }
+ lnum = buf->b_fnum;
+ break;
+ case ADDR_BUFFERS:
+ lnum = lastbuf->b_fnum;
+ break;
+ case ADDR_TABS:
+ lnum = LAST_TAB_NR;
+ break;
+ }
break;
case '\'': /* ''' - mark */
@@ -3132,6 +3469,10 @@ get_address (
cmd = NULL;
goto error;
}
+ if (addr_type != ADDR_LINES) {
+ EMSG(_(e_invaddr));
+ goto error;
+ }
if (skip)
++cmd;
else {
@@ -3155,6 +3496,10 @@ get_address (
case '/':
case '?': /* '/' or '?' - search */
c = *cmd++;
+ if (addr_type != ADDR_LINES) {
+ EMSG(_(e_invaddr));
+ goto error;
+ }
if (skip) { /* skip "/pat/" */
cmd = skip_regexp(cmd, c, p_magic, NULL);
if (*cmd == c)
@@ -3194,6 +3539,10 @@ get_address (
case '\\': /* "\?", "\/" or "\&", repeat search */
++cmd;
+ if (addr_type != ADDR_LINES) {
+ EMSG(_(e_invaddr));
+ goto error;
+ }
if (*cmd == '&')
i = RE_SUBST;
else if (*cmd == '?' || *cmd == '/')
@@ -3233,8 +3582,27 @@ get_address (
if (*cmd != '-' && *cmd != '+' && !ascii_isdigit(*cmd))
break;
- if (lnum == MAXLNUM)
- lnum = curwin->w_cursor.lnum; /* "+1" is same as ".+1" */
+ if (lnum == MAXLNUM) {
+ switch (addr_type) {
+ case ADDR_LINES:
+ lnum = curwin->w_cursor.lnum; /* "+1" is same as ".+1" */
+ break;
+ case ADDR_WINDOWS:
+ lnum = CURRENT_WIN_NR;
+ break;
+ case ADDR_ARGUMENTS:
+ lnum = curwin->w_arg_idx + 1;
+ break;
+ case ADDR_LOADED_BUFFERS:
+ case ADDR_BUFFERS:
+ lnum = curbuf->b_fnum;
+ break;
+ case ADDR_TABS:
+ lnum = CURRENT_TAB_NR;
+ break;
+ }
+ }
+
if (ascii_isdigit(*cmd))
i = '+'; /* "number" is same as "+number" */
else
@@ -3242,8 +3610,10 @@ get_address (
if (!ascii_isdigit(*cmd)) /* '+' is '+1', but '+0' is not '+1' */
n = 1;
else
- n = getdigits_long(&cmd);
- if (i == '-')
+ n = getdigits(&cmd);
+ if (addr_type == ADDR_LOADED_BUFFERS || addr_type == ADDR_BUFFERS)
+ lnum = compute_buffer_local_count(addr_type, lnum, (i == '-') ? -1 * n : n);
+ else if (i == '-')
lnum -= n;
else
lnum += n;
@@ -3295,15 +3665,65 @@ static void ex_script_ni(exarg_T *eap)
*/
static char_u *invalid_range(exarg_T *eap)
{
- if ( eap->line1 < 0
- || eap->line2 < 0
- || eap->line1 > eap->line2
- || ((eap->argt & RANGE)
- && !(eap->argt & NOTADR)
- && eap->line2 > curbuf->b_ml.ml_line_count
- + (eap->cmdidx == CMD_diffget)
- ))
+ buf_T *buf;
+ if (eap->line1 < 0 || eap->line2 < 0 || eap->line1 > eap->line2) {
return (char_u *)_(e_invrange);
+ }
+
+ if (eap->argt & RANGE) {
+ switch(eap->addr_type) {
+ case ADDR_LINES:
+ if (!(eap->argt & NOTADR)
+ && eap->line2 > curbuf->b_ml.ml_line_count
+ + (eap->cmdidx == CMD_diffget)) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_ARGUMENTS:
+ if (eap->line2 > ARGCOUNT + (!ARGCOUNT)) { // add 1 if ARGCOUNT is 0
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_BUFFERS:
+ if (eap->line1 < firstbuf->b_fnum
+ || eap->line2 > lastbuf->b_fnum) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_LOADED_BUFFERS:
+ buf = firstbuf;
+ while (buf->b_ml.ml_mfp == NULL) {
+ if (buf->b_next == NULL) {
+ return (char_u *)_(e_invrange);
+ }
+ buf = buf->b_next;
+ }
+ if (eap->line1 < buf->b_fnum) {
+ return (char_u *)_(e_invrange);
+ }
+ buf = lastbuf;
+ while (buf->b_ml.ml_mfp == NULL) {
+ if (buf->b_prev == NULL) {
+ return (char_u *)_(e_invrange);
+ }
+ buf = buf->b_prev;
+ }
+ if (eap->line2 > buf->b_fnum) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_WINDOWS:
+ if (eap->line2 > LAST_WIN_NR) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ case ADDR_TABS:
+ if (eap->line2 > LAST_TAB_NR) {
+ return (char_u *)_(e_invrange);
+ }
+ break;
+ }
+ }
return NULL;
}
@@ -4091,10 +4511,9 @@ char_u *get_command_name(expand_T *xp, int idx)
return cmdnames[idx].cmd_name;
}
-
static int uc_add_command(char_u *name, size_t name_len, char_u *rep,
uint32_t argt, long def, int flags, int compl,
- char_u *compl_arg, int force)
+ char_u *compl_arg, int addr_type, int force)
{
ucmd_T *cmd = NULL;
char_u *p;
@@ -4169,6 +4588,7 @@ static int uc_add_command(char_u *name, size_t name_len, char_u *rep,
cmd->uc_compl = compl;
cmd->uc_scriptID = current_SID;
cmd->uc_compl_arg = compl_arg;
+ cmd->uc_addr_type = addr_type;
return OK;
@@ -4178,6 +4598,21 @@ fail:
return FAIL;
}
+
+static struct {
+ int expand;
+ char *name;
+} addr_type_complete[] =
+{
+ {ADDR_ARGUMENTS, "arguments"},
+ {ADDR_LINES, "lines"},
+ {ADDR_LOADED_BUFFERS, "loaded_buffers"},
+ {ADDR_TABS, "tabs"},
+ {ADDR_BUFFERS, "buffers"},
+ {ADDR_WINDOWS, "windows"},
+ {-1, NULL}
+};
+
/*
* List of names for completion for ":command" with the EXPAND_ flag.
* Must be alphabetical for completion.
@@ -4226,6 +4661,7 @@ static struct {
static void uc_list(char_u *name, size_t name_len)
{
+ int i, j;
int found = FALSE;
ucmd_T *cmd;
int len;
@@ -4234,7 +4670,6 @@ static void uc_list(char_u *name, size_t name_len)
gap = &curbuf->b_ucmds;
for (;; ) {
- int i;
for (i = 0; i < gap->ga_len; ++i) {
cmd = USER_CMD_GA(gap, i);
a = cmd->uc_argt;
@@ -4245,7 +4680,7 @@ static void uc_list(char_u *name, size_t name_len)
/* Put out the title first time */
if (!found)
- MSG_PUTS_TITLE(_("\n Name Args Range Complete Definition"));
+ MSG_PUTS_TITLE(_("\n Name Args Address Complete Definition"));
found = TRUE;
msg_putchar('\n');
if (got_int)
@@ -4300,8 +4735,21 @@ static void uc_list(char_u *name, size_t name_len)
IObuff[len++] = ' ';
} while (len < 11);
+ /* Address Type */
+ for (j = 0; addr_type_complete[j].expand != -1; ++j)
+ if (addr_type_complete[j].expand != ADDR_LINES &&
+ addr_type_complete[j].expand == cmd->uc_addr_type) {
+ STRCPY(IObuff + len, addr_type_complete[j].name);
+ len += (int)STRLEN(IObuff + len);
+ break;
+ }
+
+ do {
+ IObuff[len++] = ' ';
+ } while (len < 21);
+
/* Completion */
- for (int j = 0; command_complete[j].expand != 0; ++j)
+ for (j = 0; command_complete[j].expand != 0; ++j)
if (command_complete[j].expand == cmd->uc_compl) {
STRCPY(IObuff + len, command_complete[j].name);
len += (int)STRLEN(IObuff + len);
@@ -4310,7 +4758,7 @@ static void uc_list(char_u *name, size_t name_len)
do {
IObuff[len++] = ' ';
- } while (len < 21);
+ } while (len < 35);
IObuff[len] = '\0';
msg_outtrans(IObuff);
@@ -4346,7 +4794,9 @@ static char_u *uc_fun_cmd(void)
return IObuff;
}
-static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def, int *flags, int *compl, char_u **compl_arg)
+static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def,
+ int *flags, int * compl, char_u **compl_arg,
+ int *addr_type_arg)
{
char_u *p;
@@ -4445,6 +4895,18 @@ invalid_count:
if (parse_compl_arg(val, (int)vallen, compl, argt, compl_arg)
== FAIL)
return FAIL;
+ } else if (STRNICMP(attr, "addr", attrlen) == 0) {
+ *argt |= 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) {
+ return FAIL;
+ }
+ if (addr_type_arg != ADDR_LINES) {
+ *argt |= (ZEROR | NOTADR);
+ }
} else {
char_u ch = attr[len];
attr[len] = '\0';
@@ -4470,6 +4932,7 @@ static void ex_command(exarg_T *eap)
int flags = 0;
int compl = EXPAND_NOTHING;
char_u *compl_arg = NULL;
+ int addr_type_arg = ADDR_LINES;
int has_attr = (eap->arg[0] == '-');
int name_len;
@@ -4479,7 +4942,7 @@ static void ex_command(exarg_T *eap)
while (*p == '-') {
++p;
end = skiptowhite(p);
- if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg)
+ if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, &addr_type_arg)
== FAIL)
return;
p = skipwhite(end);
@@ -4513,7 +4976,7 @@ static void ex_command(exarg_T *eap)
return;
} else
uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
- eap->forceit);
+ addr_type_arg, eap->forceit);
}
/*
@@ -4941,6 +5404,13 @@ static char_u *get_user_command_name(int idx)
{
return get_user_commands(NULL, idx - (int)CMD_SIZE);
}
+/*
+ * Function given to ExpandGeneric() to obtain the list of user address type names.
+ */
+char_u *get_user_cmd_addr_type(expand_T *xp, int idx)
+{
+ return (char_u *)addr_type_complete[idx].name;
+}
/*
* Function given to ExpandGeneric() to obtain the list of user command names.
@@ -4961,9 +5431,9 @@ char_u *get_user_commands(expand_T *xp, int idx)
*/
char_u *get_user_cmd_flags(expand_T *xp, int idx)
{
- static char *user_cmd_flags[] =
- {"bang", "bar", "buffer", "complete", "count",
- "nargs", "range", "register"};
+ static char *user_cmd_flags[] = {"addr", "bang", "bar",
+ "buffer", "complete", "count",
+ "nargs", "range", "register"};
if (idx >= (int)ARRAY_SIZE(user_cmd_flags))
return NULL;
@@ -4990,6 +5460,36 @@ char_u *get_user_cmd_complete(expand_T *xp, int idx)
return (char_u *)command_complete[idx].name;
}
+/*
+ * Parse address type argument
+ */
+int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt,
+ int *addr_type_arg)
+{
+ int i, a, b;
+ for (i = 0; addr_type_complete[i].expand != -1; ++i) {
+ a = (int)STRLEN(addr_type_complete[i].name) == vallen;
+ b = STRNCMP(value, addr_type_complete[i].name, vallen) == 0;
+ if (a && b) {
+ *addr_type_arg = addr_type_complete[i].expand;
+ break;
+ }
+ }
+
+ if (addr_type_complete[i].expand == -1) {
+ char_u *err = value;
+ for (i = 0; err[i] == NUL || !ascii_iswhite(err[i]); i++)
+ ;
+ err[i] = NUL;
+ EMSG2(_("E180: Invalid address type value: %s"), err);
+ return FAIL;
+ }
+
+ if (*addr_type_arg != ADDR_LINES)
+ *argt |= NOTADR;
+
+ return OK;
+}
/*
* Parse a completion argument "value[vallen]".
@@ -5089,7 +5589,7 @@ void not_exiting(void)
}
/*
- * ":quit": quit current window, quit Vim if closed the last window.
+ * ":quit": quit current window, quit Vim if the last window is closed.
*/
static void ex_quit(exarg_T *eap)
{
@@ -5102,10 +5602,25 @@ static void ex_quit(exarg_T *eap)
text_locked_msg();
return;
}
+
+ win_T *wp;
+
+ if (eap->addr_count > 0) {
+ int wnr = eap->line2;
+
+ for (wp = firstwin; wp->w_next != NULL; wp = wp->w_next) {
+ if (--wnr <= 0)
+ break;
+ }
+ } else {
+ wp = curwin;
+ }
+
apply_autocmds(EVENT_QUITPRE, NULL, NULL, FALSE, curbuf);
/* Refuse to quit when locked or when the buffer in the last window is
* being closed (can only happen in autocommands). */
- if (curbuf_locked() || (curbuf->b_nwindows == 1 && curbuf->b_closing))
+ if (curbuf_locked() ||
+ (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_closing))
return;
@@ -5127,7 +5642,7 @@ static void ex_quit(exarg_T *eap)
getout(0);
}
/* close window; may free buffer */
- win_close(curwin, !P_HID(curwin->w_buffer) || eap->forceit);
+ win_close(wp, !P_HID(wp->w_buffer) || eap->forceit);
}
}
@@ -5174,12 +5689,24 @@ static void ex_quit_all(exarg_T *eap)
*/
static void ex_close(exarg_T *eap)
{
+ win_T *win;
+ int winnr = 0;
if (cmdwin_type != 0)
cmdwin_result = Ctrl_C;
- else if (!text_locked()
- && !curbuf_locked()
- )
- ex_win_close(eap->forceit, curwin, NULL);
+ else if (!text_locked() && !curbuf_locked()) {
+ if (eap->addr_count == 0)
+ ex_win_close(eap->forceit, curwin, NULL);
+ else {
+ for (win = firstwin; win != NULL; win = win->w_next) {
+ winnr++;
+ if (winnr == eap->line2)
+ break;
+ }
+ if (win == NULL)
+ win = lastwin;
+ ex_win_close(eap->forceit, win, NULL);
+ }
+ }
}
/*
@@ -5271,6 +5798,8 @@ static void ex_tabonly(exarg_T *eap)
else if (first_tabpage->tp_next == NULL)
MSG(_("Already only one tab page"));
else {
+ if (eap->addr_count > 0)
+ goto_tabpage(eap->line2);
/* Repeat this up to a 1000 times, because autocommands may mess
* up the lists. */
for (int done = 0; done < 1000; ++done) {
@@ -5341,6 +5870,18 @@ void tabpage_close_other(tabpage_T *tp, int forceit)
*/
static void ex_only(exarg_T *eap)
{
+ win_T *wp;
+ int wnr;
+ if (eap->addr_count > 0) {
+ wnr = eap->line2;
+ for (wp = firstwin; --wnr > 0;) {
+ if (wp->w_next == NULL)
+ break;
+ else
+ wp = wp->w_next;
+ }
+ win_goto(wp);
+ }
close_others(TRUE, eap->forceit);
}
@@ -5363,7 +5904,21 @@ static void ex_hide(exarg_T *eap)
/* ":hide" or ":hide | cmd": hide current window */
eap->nextcmd = check_nextcmd(eap->arg);
if (!eap->skip) {
- win_close(curwin, FALSE); /* don't free buffer */
+ if (eap->addr_count == 0)
+ win_close(curwin, FALSE); /* don't free buffer */
+ else {
+ int winnr = 0;
+ win_T *win;
+
+ for (win = firstwin; win != NULL; win = win->w_next) {
+ winnr++;
+ if (winnr == eap->line2)
+ break;
+ }
+ if (win == NULL)
+ win = lastwin;
+ win_close(win, FALSE);
+ }
}
}
}
@@ -6518,7 +7073,7 @@ static void ex_copymove(exarg_T *eap)
{
long n;
- n = get_address(&eap->arg, FALSE, FALSE);
+ n = get_address(&eap->arg, eap->addr_type, FALSE, FALSE);
if (eap->arg == NULL) { /* error detected */
eap->nextcmd = NULL;
return;
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index b54ae5fe11..1a04f1bd91 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -3701,6 +3701,7 @@ ExpandFromContext (
{EXPAND_BEHAVE, get_behave_arg, TRUE, TRUE},
{EXPAND_HISTORY, get_history_arg, TRUE, TRUE},
{EXPAND_USER_COMMANDS, get_user_commands, FALSE, TRUE},
+ {EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, FALSE, TRUE},
{EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
{EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE},
{EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE},
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index 0a7c16e2cb..2dedc3db12 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -29,7 +29,11 @@ SCRIPTS := test_autoformat_join.out \
test86.out test87.out test88.out \
test96.out \
test_listlbr.out \
- test_breakindent.out
+ test_breakindent.out \
+ test_argument_count.out \
+ test_close_count.out \
+ test_command_count.out \
+ test_argument_0count.out
SCRIPTS_GUI := test16.out
diff --git a/src/nvim/testdir/test62.in b/src/nvim/testdir/test62.in
index 93d968b33e..c201fe7137 100644
--- a/src/nvim/testdir/test62.in
+++ b/src/nvim/testdir/test62.in
@@ -13,7 +13,7 @@ STARTTEST
:" Open three tab pages and use ":tabdo"
:0tabnew
:1tabnew
-:888tabnew
+:$tabnew
:tabdo call append(line('$'), 'this is tab page ' . tabpagenr())
:tabclose! 2
:tabrewind
diff --git a/src/nvim/testdir/test_argument_0count.in b/src/nvim/testdir/test_argument_0count.in
new file mode 100644
index 0000000000..88317fa1fc
--- /dev/null
+++ b/src/nvim/testdir/test_argument_0count.in
@@ -0,0 +1,28 @@
+Tests for :0argadd and :0argedit vim: set ft=vim :
+
+STARTTEST
+:so small.vim
+:let arglists = []
+:%argd
+:arga a b c d
+:2argu
+:0arga added
+:call add(arglists, argv())
+:2argu
+:arga third
+:call add(arglists, argv())
+:%argd
+:arga a b c d
+:2argu
+:0arge edited
+:call add(arglists, argv())
+:2argu
+:arga third
+:call add(arglists, argv())
+:e! test.out
+:call append(0, map(copy(arglists), 'join(v:val, " ")'))
+:w
+:qa!
+ENDTEST
+
+
diff --git a/src/nvim/testdir/test_argument_0count.ok b/src/nvim/testdir/test_argument_0count.ok
new file mode 100644
index 0000000000..ee5daea812
--- /dev/null
+++ b/src/nvim/testdir/test_argument_0count.ok
@@ -0,0 +1,5 @@
+added a b c d
+added a third b c d
+edited a b c d
+edited a third b c d
+
diff --git a/src/nvim/testdir/test_argument_count.in b/src/nvim/testdir/test_argument_count.in
new file mode 100644
index 0000000000..af91f38375
--- /dev/null
+++ b/src/nvim/testdir/test_argument_count.in
@@ -0,0 +1,46 @@
+Tests for :[count]argument! and :[count]argdelete vim: set ft=vim :
+
+STARTTEST
+:%argd
+:argadd a b c d
+:set hidden
+:let buffers = []
+:augroup TEST
+:au BufEnter * call add(buffers, expand('%:t'))
+:augroup END
+:$argu
+:$-argu
+:-argu
+:1argu
+:+2argu
+:augroup TEST
+:au!
+:augroup END
+:let arglists = []
+:.argd
+:call add(arglists, argv())
+:-argd
+:call add(arglists, argv())
+:$argd
+:call add(arglists, argv())
+:1arga c
+:1arga b
+:$argu
+:$arga x
+:call add(arglists, argv())
+:0arga Y
+:call add(arglists, argv())
+:%argd
+:call add(arglists, argv())
+:arga a b c d e f
+:2,$-argd
+:call add(arglists, argv())
+:e! test.out
+:call append(0, buffers)
+:let lnr = line('$')
+:call append(lnr, map(copy(arglists), 'join(v:val, " ")'))
+:w
+:qa!
+ENDTEST
+
+
diff --git a/src/nvim/testdir/test_argument_count.ok b/src/nvim/testdir/test_argument_count.ok
new file mode 100644
index 0000000000..f51562620d
--- /dev/null
+++ b/src/nvim/testdir/test_argument_count.ok
@@ -0,0 +1,13 @@
+d
+c
+b
+a
+c
+
+a b d
+a d
+a
+a b c x
+Y a b c x
+
+a f
diff --git a/src/nvim/testdir/test_close_count.in b/src/nvim/testdir/test_close_count.in
new file mode 100644
index 0000000000..58dfb425ce
--- /dev/null
+++ b/src/nvim/testdir/test_close_count.in
@@ -0,0 +1,156 @@
+Tests for :[count]close! and :[count]hide vim: set ft=vim :
+
+STARTTEST
+:let tests = []
+:so tiny.vim
+:for i in range(5)
+:new
+:endfor
+:4wincmd w
+:close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:$close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+:2close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+:new
+:new
+:2wincmd w
+:-1close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:2wincmd w
+:+1close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:e! test.out
+:call append(0, map(copy(tests), 'join(v:val, " ")'))
+:w
+:only!
+:b1
+ENDTEST
+
+STARTTEST
+:let tests = []
+:so tiny.vim
+:for i in range(5)
+:new
+:endfor
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:4wincmd w
+:.hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:$hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+:2hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+:new
+:new
+:3wincmd w
+:-hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:2wincmd w
+:+hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:e! test.out
+:call append(line('$'), map(copy(tests), 'join(v:val, " ")'))
+Go
+:w
+:only!
+:b1
+ENDTEST
+
+STARTTEST
+:let tests = []
+:so tiny.vim
+:set hidden
+:for i in range(5)
+:new
+:endfor
+:1wincmd w
+:$ hide
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:$-1 close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+:.+close!
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:e! test.out
+:call append(line('$'), map(copy(tests), 'join(v:val, " ")'))
+Go
+:w
+:only!
+:b1
+ENDTEST
+
+STARTTEST
+:let tests = []
+:so tiny.vim
+:set hidden
+:for i in range(5)
+:new
+:endfor
+:4wincmd w
+c
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+1c
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+9c
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:1wincmd w
+2c
+:let buffers = []
+:windo call add(buffers, bufnr('%'))
+:call add(tests, buffers)
+:only!
+:e! test.out
+:call append(line('$'), map(copy(tests), 'join(v:val, " ")'))
+:w
+:qa!
+ENDTEST
+
+
diff --git a/src/nvim/testdir/test_close_count.ok b/src/nvim/testdir/test_close_count.ok
new file mode 100644
index 0000000000..1cee870487
--- /dev/null
+++ b/src/nvim/testdir/test_close_count.ok
@@ -0,0 +1,23 @@
+6 5 4 2 1
+5 4 2 1
+5 4 2
+5 2
+7 5 2
+7 5
+
+13 12 11 10 9 1
+13 12 11 9 1
+12 11 9 1
+12 11 9
+12 9
+15 12 9
+15 12
+
+20 19 18 17 16
+20 19 18 16
+20 18 16
+
+25 24 23 21 1
+24 23 21 1
+24 23 21
+24 21
diff --git a/src/nvim/testdir/test_command_count.in b/src/nvim/testdir/test_command_count.in
new file mode 100644
index 0000000000..dd3c108360
--- /dev/null
+++ b/src/nvim/testdir/test_command_count.in
@@ -0,0 +1,157 @@
+Test for user command counts vim: set ft=vim :
+
+STARTTEST
+:so tiny.vim
+:lang C
+:let g:lines = []
+:com -range=% RangeLines :call add(g:lines, 'RangeLines '.<line1>.' '.<line2>)
+:com -range -addr=arguments RangeArguments :call add(g:lines, 'RangeArguments '.<line1>.' '.<line2>)
+:com -range=% -addr=arguments RangeArgumentsAll :call add(g:lines, 'RangeArgumentsAll '.<line1>.' '.<line2>)
+:com -range -addr=loaded_buffers RangeLoadedBuffers :call add(g:lines, 'RangeLoadedBuffers '.<line1>.' '.<line2>)
+:com -range=% -addr=loaded_buffers RangeLoadedBuffersAll :call add(g:lines, 'RangeLoadedBuffersAll '.<line1>.' '.<line2>)
+:com -range -addr=buffers RangeBuffers :call add(g:lines, 'RangeBuffers '.<line1>.' '.<line2>)
+:com -range=% -addr=buffers RangeBuffersAll :call add(g:lines, 'RangeBuffersAll '.<line1>.' '.<line2>)
+:com -range -addr=windows RangeWindows :call add(g:lines, 'RangeWindows '.<line1>.' '.<line2>)
+:com -range=% -addr=windows RangeWindowsAll :call add(g:lines, 'RangeWindowsAll '.<line1>.' '.<line2>)
+:com -range -addr=tabs RangeTabs :call add(g:lines, 'RangeTabs '.<line1>.' '.<line2>)
+:com -range=% -addr=tabs RangeTabsAll :call add(g:lines, 'RangeTabsAll '.<line1>.' '.<line2>)
+:set hidden
+:arga a b c d
+:argdo echo "loading buffers"
+:argu 3
+:.-,$-RangeArguments
+:%RangeArguments
+:RangeArgumentsAll
+:N
+:.RangeArguments
+:split|split|split|split
+:3wincmd w
+:.,$RangeWindows
+:%RangeWindows
+:RangeWindowsAll
+:only
+:blast|bd
+:.,$RangeLoadedBuffers
+:%RangeLoadedBuffers
+:RangeLoadedBuffersAll
+:.,$RangeBuffers
+:%RangeBuffers
+:RangeBuffersAll
+:tabe|tabe|tabe|tabe
+:normal 2gt
+:.,$RangeTabs
+:%RangeTabs
+:RangeTabsAll
+:1tabonly
+:s/\n/\r\r\r\r\r/
+:2ma<
+:$-ma>
+:'<,'>RangeLines
+:com -range=% -buffer LocalRangeLines :call add(g:lines, 'LocalRangeLines '.<line1>.' '.<line2>)
+:'<,'>LocalRangeLines
+:b1
+ENDTEST
+
+STARTTEST
+:call add(g:lines, '')
+:%argd
+:arga a b c d
+:let v:errmsg = ''
+:5argu
+:call add(g:lines, '5argu ' . v:errmsg)
+:$argu
+:call add(g:lines, '4argu ' . expand('%:t'))
+:let v:errmsg = ''
+:1argu
+:call add(g:lines, '1argu ' . expand('%:t'))
+:let v:errmsg = ''
+:100b
+:call add(g:lines, '100b ' . v:errmsg)
+:split|split|split|split
+:let v:errmsg = ''
+:0close
+:call add(g:lines, '0close ' . v:errmsg)
+:$wincmd w
+:$close
+:call add(g:lines, '$close ' . winnr())
+:let v:errmsg = ''
+:$+close
+:call add(g:lines, '$+close ' . v:errmsg)
+:$tabe
+:call add(g:lines, '$tabe ' . tabpagenr())
+:let v:errmsg = ''
+:$+tabe
+:call add(g:lines, '$+tabe ' . v:errmsg)
+:only!
+:e x
+:0tabm
+:normal 1gt
+:call add(g:lines, '0tabm ' . expand('%:t'))
+:tabonly!
+:only!
+:e! test.out
+:call append(0, g:lines)
+:unlet g:lines
+:w|bd
+:b1
+ENDTEST
+
+STARTTEST
+:let g:lines = []
+:func BufStatus()
+: call add(g:lines, 'aaa: ' . buflisted(g:buf_aaa) . ' bbb: ' . buflisted(g:buf_bbb) . ' ccc: ' . buflisted(g:buf_ccc))
+:endfunc
+:se nohidden
+:e aaa
+:let buf_aaa = bufnr('%')
+:e bbb
+:let buf_bbb = bufnr('%')
+:e ccc
+:let buf_ccc = bufnr('%')
+:b1
+:call BufStatus()
+:exe buf_bbb . "," . buf_ccc . "bdelete"
+:call BufStatus()
+:exe buf_aaa . "bdelete"
+:call BufStatus()
+:e! test.out
+:call append('$', g:lines)
+:unlet g:lines
+:delfunc BufStatus
+:w|bd
+:b1
+ENDTEST
+
+STARTTEST
+:se hidden
+:only!
+:let g:lines = []
+:%argd
+:arga a b c d e f
+:3argu
+:let args = ''
+:.,$-argdo let args .= ' '.expand('%')
+:call add(g:lines, 'argdo:' . args)
+:split|split|split|split
+:2wincmd w
+:let windows = ''
+:.,$-windo let windows .= ' '.winnr()
+:call add(g:lines, 'windo:'. windows)
+:b2
+:let buffers = ''
+:.,$-bufdo let buffers .= ' '.bufnr('%')
+:call add(g:lines, 'bufdo:' . buffers)
+:let buffers = ''
+:3,7bufdo let buffers .= ' '.bufnr('%')
+:call add(g:lines, 'bufdo:' . buffers)
+:tabe|tabe|tabe|tabe
+:normal! 2gt
+:let tabpages = ''
+:.,$-tabdo let tabpages .= ' '.tabpagenr()
+:call add(g:lines, 'tabdo:' . tabpages)
+:e! test.out
+:call append('$', g:lines)
+:w|qa!
+ENDTEST
+
+
diff --git a/src/nvim/testdir/test_command_count.ok b/src/nvim/testdir/test_command_count.ok
new file mode 100644
index 0000000000..8fdbc7748d
--- /dev/null
+++ b/src/nvim/testdir/test_command_count.ok
@@ -0,0 +1,38 @@
+RangeArguments 2 4
+RangeArguments 1 5
+RangeArgumentsAll 1 5
+RangeArguments 2 2
+RangeWindows 3 5
+RangeWindows 1 5
+RangeWindowsAll 1 5
+RangeLoadedBuffers 2 4
+RangeLoadedBuffers 1 4
+RangeLoadedBuffersAll 1 4
+RangeBuffers 2 5
+RangeBuffers 1 5
+RangeBuffersAll 1 5
+RangeTabs 2 5
+RangeTabs 1 5
+RangeTabsAll 1 5
+RangeLines 2 5
+LocalRangeLines 2 5
+
+5argu E16: Invalid range
+4argu d
+1argu a
+100b E16: Invalid range
+0close
+$close 3
+$+close E16: Invalid range
+$tabe 2
+$+tabe E16: Invalid range
+0tabm x
+
+aaa: 1 bbb: 1 ccc: 1
+aaa: 1 bbb: 0 ccc: 0
+aaa: 0 bbb: 0 ccc: 0
+argdo: c d e
+windo: 2 3 4
+bufdo: 2 3 4 5 6 7 8 9 10 15
+bufdo: 3 4 5 6 7
+tabdo: 2 3 4
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 8622f9fe8a..3ca0b254f4 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -184,22 +184,22 @@ static int included_patches[] = {
//598,
//597,
//596,
- //595,
+ 595,
//594,
//593,
//592,
//591 NA
//590,
//589 NA
- //588,
+ 588,
//587,
//586 NA
- //585,
+ 585,
//584 NA
//583 NA
//582,
//581,
- //580,
+ 580,
//579,
578,
//577,
@@ -207,18 +207,18 @@ static int included_patches[] = {
//575,
//574,
//573,
- //572,
+ 572,
//571 NA
//570 NA
//569,
- //568,
+ 568,
567,
- //566,
- //565,
+ 566,
+ 565,
//564,
563,
//562,
- //561,
+ 561,
//560 NA
559,
//558 NA
@@ -233,14 +233,14 @@ static int included_patches[] = {
549,
//548 NA
547,
- //546,
+ 546,
545,
//544 NA
543,
- //542,
+ 542,
541,
//540 NA
- //539,
+ 539,
538,
537,
536,
diff --git a/src/nvim/vim.h b/src/nvim/vim.h
index 41fcff129c..127e385619 100644
--- a/src/nvim/vim.h
+++ b/src/nvim/vim.h
@@ -182,6 +182,7 @@ enum {
EXPAND_HISTORY,
EXPAND_USER,
EXPAND_SYNTIME,
+ EXPAND_USER_ADDR_TYPE,
};
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 4f31c09eeb..f93e88deb2 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -124,10 +124,7 @@ do_window (
case Ctrl_HAT:
case '^':
CHECK_CMDWIN reset_VIsual_and_resel(); /* stop Visual mode */
- STRCPY(cbuf, "split #");
- if (Prenum)
- vim_snprintf((char *)cbuf + 7, sizeof(cbuf) - 7,
- "%" PRId64, (int64_t)Prenum);
+ cmd_with_count("split #", cbuf, sizeof(cbuf), Prenum);
do_cmdline_cmd(cbuf);
break;
@@ -151,14 +148,16 @@ newwindow:
case Ctrl_Q:
case 'q':
reset_VIsual_and_resel(); /* stop Visual mode */
- do_cmdline_cmd((char_u *)"quit");
+ cmd_with_count("quit", cbuf, sizeof(cbuf), Prenum);
+ do_cmdline_cmd(cbuf);
break;
/* close current window */
case Ctrl_C:
case 'c':
reset_VIsual_and_resel(); /* stop Visual mode */
- do_cmdline_cmd((char_u *)"close");
+ cmd_with_count("close", cbuf, sizeof(cbuf), Prenum);
+ do_cmdline_cmd(cbuf);
break;
/* close preview window */
@@ -183,7 +182,8 @@ newwindow:
case Ctrl_O:
case 'o':
CHECK_CMDWIN reset_VIsual_and_resel(); /* stop Visual mode */
- do_cmdline_cmd((char_u *)"only");
+ cmd_with_count("only", cbuf, sizeof(cbuf), Prenum);
+ do_cmdline_cmd(cbuf);
break;
/* cursor to next window with wrap around */
@@ -487,6 +487,16 @@ wingotofile:
}
}
+static void cmd_with_count(char *cmd, char_u *bufp, size_t bufsize,
+ long Prenum)
+{
+ size_t len = xstrlcpy((char *)bufp, cmd, bufsize);
+
+ if (Prenum > 0 && len < bufsize) {
+ vim_snprintf((char *)bufp + len, bufsize - len, "%" PRId64, Prenum);
+ }
+}
+
/*
* split the current window, implements CTRL-W s and :split
*