changeset 6398:5a76e36f07b1 v7.4.530

updated for version 7.4.530 Problem: Many commands take a count or range that is not using line numbers. Solution: For each command specify what kind of count it uses. For windows, buffers and arguments have "$" and "." have a relevant meaning. (Marcin Szamotulski)
author Bram Moolenaar <bram@vim.org>
date Thu, 27 Nov 2014 16:22:48 +0100
parents 7f8c4ace6f97
children bf6366277dc9
files runtime/doc/tabpage.txt runtime/doc/windows.txt src/Makefile src/ex_cmds.h src/ex_docmd.c src/testdir/Make_amiga.mak src/testdir/Make_dos.mak src/testdir/Make_ming.mak src/testdir/Make_os2.mak src/testdir/Make_vms.mms src/testdir/Makefile src/version.c src/window.c
diffstat 13 files changed, 1665 insertions(+), 705 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -61,16 +61,25 @@ In the GUI tab pages line you can use th
 :[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 tab page [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 one
+		    :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,17 @@ 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
+
+:{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,7 +201,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 begining of the tab
+				" list
+		    :$tabmove	" move the tab page to the end of the tab list
+<
 
 :tabm[ove] +[N]
 :tabm[ove] -[N]
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -263,28 +263,56 @@ 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 previews 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 {count} is
+		given close the {count} 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).
+		
 		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
@@ -298,14 +326,19 @@ CTRL-W CTRL-C						*CTRL-W_CTRL-C*
 		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|
-		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]
+:{count}hid[e]
+		Quit the current window, unless it is the last window on the
+		screen.  For {count} see |:quit| command.
+		
+		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
 		'hidden' is restored after {cmd} has been executed.
@@ -314,12 +347,16 @@ CTRL-W CTRL-C						*CTRL-W_CTRL-C*
 <		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| command.
+		
 		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
--- a/src/Makefile
+++ b/src/Makefile
@@ -1890,10 +1890,12 @@ unittest unittests: $(UNITTEST_TARGETS)
 	done
 
 # Run individual test, assuming that Vim was already compiled.
-test1 test2 test3 test4 test5 test6 test7 test8 test9 \
+test1 \
+	test_argument_count \
 	test_autoformat_join \
 	test_breakindent \
 	test_changelist \
+	test_close_count \
 	test_eval \
 	test_insertcount \
 	test_listlbr \
@@ -1904,6 +1906,7 @@ test1 test2 test3 test4 test5 test6 test
 	test_signs \
 	test_utf8 \
 	test_writefile \
+	test2 test3 test4 test5 test6 test7 test8 test9 \
 	test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 \
 	test20 test21 test22 test23 test24 test25 test26 test27 test28 test29 \
 	test30 test31 test32 test33 test34 test35 test36 test37 test38 test39 \
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -58,6 +58,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_UNLOADED_BUFFERS	4
+#define ADDR_TABS		5
+
 #ifndef DO_DECLARE_EXCMD
 typedef struct exarg exarg_T;
 #endif
@@ -74,7 +82,7 @@ typedef struct exarg exarg_T;
 # undef EX	    /* just in case */
 #endif
 #ifdef DO_DECLARE_EXCMD
-# define EX(a, b, c, d)  {(char_u *)b, c, (long_u)(d)}
+# define EX(a, b, c, d, e)  {(char_u *)b, c, (long_u)(d), e}
 
 typedef void (*ex_func_T) __ARGS((exarg_T *eap));
 
@@ -83,1064 +91,1588 @@ static struct cmdname
     char_u	*cmd_name;	/* name of the command */
     ex_func_T   cmd_func;	/* function for this command */
     long_u	cmd_argt;	/* flags declared above */
+    int		cmd_addr_type;	/* flag for address type */
 }
 # if defined(FEAT_GUI_W16)
 _far
 # endif
 cmdnames[] =
 #else
-# define EX(a, b, c, d)  a
+# define EX(a, b, c, d, e)  a
 enum CMD_index
 #endif
 {
 EX(CMD_append,		"append",	ex_append,
-			BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY),
+			BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_abbreviate,	"abbreviate",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_abclear,		"abclear",	ex_abclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_aboveleft,	"aboveleft",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_all,		"all",		ex_all,
-			BANG|RANGE|NOTADR|COUNT|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_amenu,		"amenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_anoremenu,	"anoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_args,		"args",		ex_args,
-			BANG|FILES|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_argadd,		"argadd",	ex_argadd,
-			BANG|NEEDARG|RANGE|NOTADR|ZEROR|FILES|TRLBAR),
+			BANG|NEEDARG|RANGE|NOTADR|ZEROR|FILES|TRLBAR,
+			ADDR_ARGUMENTS),
 EX(CMD_argdelete,	"argdelete",	ex_argdelete,
-			BANG|RANGE|NOTADR|FILES|TRLBAR),
+			BANG|RANGE|NOTADR|FILES|TRLBAR,
+			ADDR_ARGUMENTS),
 EX(CMD_argdo,		"argdo",	ex_listdo,
-			BANG|NEEDARG|EXTRA|NOTRLCOM),
+			BANG|NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_argedit,		"argedit",	ex_argedit,
-			BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_ARGUMENTS),
 EX(CMD_argglobal,	"argglobal",	ex_args,
-			BANG|FILES|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_arglocal,	"arglocal",	ex_args,
-			BANG|FILES|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_argument,	"argument",	ex_argument,
-			BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_ARGUMENTS),
 EX(CMD_ascii,		"ascii",	do_ascii,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_autocmd,		"autocmd",	ex_autocmd,
-			BANG|EXTRA|NOTRLCOM|USECTRLV|CMDWIN),
+			BANG|EXTRA|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_augroup,		"augroup",	ex_autocmd,
-			BANG|WORD1|TRLBAR|CMDWIN),
+			BANG|WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_aunmenu,		"aunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_buffer,		"buffer",	ex_buffer,
-			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
+			ADDR_UNLOADED_BUFFERS),
 EX(CMD_bNext,		"bNext",	ex_bprevious,
-			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_ball,		"ball",		ex_buffer_all,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_badd,		"badd",		ex_edit,
-			NEEDARG|FILE1|EDITCMD|TRLBAR|CMDWIN),
+			NEEDARG|FILE1|EDITCMD|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_bdelete,		"bdelete",	ex_bunload,
-			BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
+			ADDR_LOADED_BUFFERS),
 EX(CMD_behave,		"behave",	ex_behave,
-			NEEDARG|WORD1|TRLBAR|CMDWIN),
+			NEEDARG|WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_belowright,	"belowright",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_bfirst,		"bfirst",	ex_brewind,
-			BANG|RANGE|NOTADR|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_blast,		"blast",	ex_blast,
-			BANG|RANGE|NOTADR|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_bmodified,	"bmodified",	ex_bmodified,
-			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_bnext,		"bnext",	ex_bnext,
-			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_botright,	"botright",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_bprevious,	"bprevious",	ex_bprevious,
-			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_brewind,		"brewind",	ex_brewind,
-			BANG|RANGE|NOTADR|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_break,		"break",	ex_break,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_breakadd,	"breakadd",	ex_breakadd,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_breakdel,	"breakdel",	ex_breakdel,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_breaklist,	"breaklist",	ex_breaklist,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_browse,		"browse",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM|CMDWIN),
+			NEEDARG|EXTRA|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_buffers,		"buffers",	buflist_list,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_bufdo,		"bufdo",	ex_listdo,
-			BANG|NEEDARG|EXTRA|NOTRLCOM),
+			BANG|NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_bunload,		"bunload",	ex_bunload,
-			BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
+			ADDR_LOADED_BUFFERS),
 EX(CMD_bwipeout,	"bwipeout",	ex_bunload,
-			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR,
+			ADDR_UNLOADED_BUFFERS),
 EX(CMD_change,		"change",	ex_change,
-			BANG|WHOLEFOLD|RANGE|COUNT|TRLBAR|CMDWIN|MODIFY),
+			BANG|WHOLEFOLD|RANGE|COUNT|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_cNext,		"cNext",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cNfile,		"cNfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cabbrev,		"cabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cabclear,	"cabclear",	ex_abclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_caddbuffer,	"caddbuffer",	ex_cbuffer,
-			RANGE|NOTADR|WORD1|TRLBAR),
+			RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_caddexpr,	"caddexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR,
+			ADDR_LINES),
 EX(CMD_caddfile,	"caddfile",	ex_cfile,
-			TRLBAR|FILE1),
+			TRLBAR|FILE1,
+			ADDR_LINES),
 EX(CMD_call,		"call",		ex_call,
-			RANGE|NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			RANGE|NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_catch,		"catch",	ex_catch,
-			EXTRA|SBOXOK|CMDWIN),
+			EXTRA|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cbuffer,		"cbuffer",	ex_cbuffer,
-			BANG|RANGE|NOTADR|WORD1|TRLBAR),
+			BANG|RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_cc,		"cc",		ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cclose,		"cclose",	ex_cclose,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_cd,		"cd",		ex_cd,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_center,		"center",	ex_align,
-			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_cexpr,		"cexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cfile,		"cfile",	ex_cfile,
-			TRLBAR|FILE1|BANG),
+			TRLBAR|FILE1|BANG,
+			ADDR_LINES),
 EX(CMD_cfirst,		"cfirst",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cgetfile,	"cgetfile",	ex_cfile,
-			TRLBAR|FILE1),
+			TRLBAR|FILE1,
+			ADDR_LINES),
 EX(CMD_cgetbuffer,	"cgetbuffer",	ex_cbuffer,
-			RANGE|NOTADR|WORD1|TRLBAR),
+			RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_cgetexpr,	"cgetexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR,
+			ADDR_LINES),
 EX(CMD_chdir,		"chdir",	ex_cd,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_changes,		"changes",	ex_changes,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_checkpath,	"checkpath",	ex_checkpath,
-			TRLBAR|BANG|CMDWIN),
+			TRLBAR|BANG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_checktime,	"checktime",	ex_checktime,
-			RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR),
+			RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_clist,		"clist",	qf_list,
-			BANG|EXTRA|TRLBAR|CMDWIN),
+			BANG|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_clast,		"clast",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_close,		"close",	ex_close,
-			BANG|TRLBAR|CMDWIN),
+			BANG|RANGE|NOTADR|COUNT|TRLBAR|CMDWIN,
+			ADDR_WINDOWS),
 EX(CMD_cmap,		"cmap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cmapclear,	"cmapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cmenu,		"cmenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cnext,		"cnext",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cnewer,		"cnewer",	qf_age,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_cnfile,		"cnfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cnoremap,	"cnoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cnoreabbrev,	"cnoreabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cnoremenu,	"cnoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_copy,		"copy",		ex_copymove,
-			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_colder,		"colder",	qf_age,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_colorscheme,	"colorscheme",	ex_colorscheme,
-			WORD1|TRLBAR|CMDWIN),
+			WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_command,		"command",	ex_command,
-			EXTRA|BANG|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|BANG|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_comclear,	"comclear",	ex_comclear,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_compiler,	"compiler",	ex_compiler,
-			BANG|TRLBAR|WORD1|CMDWIN),
+			BANG|TRLBAR|WORD1|CMDWIN,
+			ADDR_LINES),
 EX(CMD_continue,	"continue",	ex_continue,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_confirm,		"confirm",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM|CMDWIN),
+			NEEDARG|EXTRA|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_copen,		"copen",	ex_copen,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_cprevious,	"cprevious",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cpfile,		"cpfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cquit,		"cquit",	ex_cquit,
-			TRLBAR|BANG),
+			TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_crewind,		"crewind",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_cscope,		"cscope",	do_cscope,
-			EXTRA|NOTRLCOM|XFILE),
+			EXTRA|NOTRLCOM|XFILE,
+			ADDR_LINES),
 EX(CMD_cstag,		"cstag",	do_cstag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_cunmap,		"cunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cunabbrev,	"cunabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cunmenu,		"cunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_cwindow,		"cwindow",	ex_cwindow,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_delete,		"delete",	ex_operators,
-			RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_delmarks,	"delmarks",	ex_delmarks,
-			BANG|EXTRA|TRLBAR|CMDWIN),
+			BANG|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_debug,		"debug",	ex_debug,
-			NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_debuggreedy,	"debuggreedy",	ex_debuggreedy,
-			RANGE|NOTADR|ZEROR|TRLBAR|CMDWIN),
+			RANGE|NOTADR|ZEROR|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_delcommand,	"delcommand",	ex_delcommand,
-			NEEDARG|WORD1|TRLBAR|CMDWIN),
+			NEEDARG|WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_delfunction,	"delfunction",	ex_delfunction,
-			NEEDARG|WORD1|CMDWIN),
+			NEEDARG|WORD1|CMDWIN,
+			ADDR_LINES),
 EX(CMD_display,		"display",	ex_display,
-			EXTRA|NOTRLCOM|TRLBAR|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_diffupdate,	"diffupdate",	ex_diffupdate,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_diffget,		"diffget",	ex_diffgetput,
-			RANGE|EXTRA|TRLBAR|MODIFY),
+			RANGE|EXTRA|TRLBAR|MODIFY,
+			ADDR_LINES),
 EX(CMD_diffoff,		"diffoff",	ex_diffoff,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_diffpatch,	"diffpatch",	ex_diffpatch,
-			EXTRA|FILE1|TRLBAR|MODIFY),
+			EXTRA|FILE1|TRLBAR|MODIFY,
+			ADDR_LINES),
 EX(CMD_diffput,		"diffput",	ex_diffgetput,
-			RANGE|EXTRA|TRLBAR),
+			RANGE|EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_diffsplit,	"diffsplit",	ex_diffsplit,
-			EXTRA|FILE1|TRLBAR),
+			EXTRA|FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_diffthis,	"diffthis",	ex_diffthis,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_digraphs,	"digraphs",	ex_digraphs,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_djump,		"djump",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA,
+			ADDR_LINES),
 EX(CMD_dlist,		"dlist",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_doautocmd,	"doautocmd",	ex_doautocmd,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_doautoall,	"doautoall",	ex_doautoall,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_drop,		"drop",		ex_drop,
-			FILES|EDITCMD|NEEDARG|ARGOPT|TRLBAR),
+			FILES|EDITCMD|NEEDARG|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_dsearch,		"dsearch",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_dsplit,		"dsplit",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA,
+			ADDR_LINES),
 EX(CMD_edit,		"edit",		ex_edit,
-			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_earlier,		"earlier",	ex_later,
-			TRLBAR|EXTRA|NOSPC|CMDWIN),
+			TRLBAR|EXTRA|NOSPC|CMDWIN,
+			ADDR_LINES),
 EX(CMD_echo,		"echo",		ex_echo,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_echoerr,		"echoerr",	ex_execute,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_echohl,		"echohl",	ex_echohl,
-			EXTRA|TRLBAR|SBOXOK|CMDWIN),
+			EXTRA|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_echomsg,		"echomsg",	ex_execute,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_echon,		"echon",	ex_echo,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_else,		"else",		ex_else,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_elseif,		"elseif",	ex_else,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_emenu,		"emenu",	ex_emenu,
-			NEEDARG|EXTRA|TRLBAR|NOTRLCOM|RANGE|NOTADR|CMDWIN),
+			NEEDARG|EXTRA|TRLBAR|NOTRLCOM|RANGE|NOTADR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_endif,		"endif",	ex_endif,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_endfunction,	"endfunction",	ex_endfunction,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_endfor,		"endfor",	ex_endwhile,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_endtry,		"endtry",	ex_endtry,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_endwhile,	"endwhile",	ex_endwhile,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_enew,		"enew",		ex_edit,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_ex,		"ex",		ex_edit,
-			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_execute,		"execute",	ex_execute,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_exit,		"exit",		ex_exit,
-			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_exusage,		"exusage",	ex_exusage,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_file,		"file",		ex_file,
-			RANGE|NOTADR|ZEROR|BANG|FILE1|TRLBAR),
+			RANGE|NOTADR|ZEROR|BANG|FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_files,		"files",	buflist_list,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_filetype,	"filetype",	ex_filetype,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_find,		"find",		ex_find,
-			RANGE|NOTADR|BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			RANGE|NOTADR|BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_finally,		"finally",	ex_finally,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_finish,		"finish",	ex_finish,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_first,		"first",	ex_rewind,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_fixdel,		"fixdel",	do_fixdel,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_fold,		"fold",		ex_fold,
-			RANGE|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_foldclose,	"foldclose",	ex_foldopen,
-			RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_folddoopen,	"folddoopen",	ex_folddo,
-			RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM),
+			RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_folddoclosed,	"folddoclosed",	ex_folddo,
-			RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM),
+			RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_foldopen,	"foldopen",	ex_foldopen,
-			RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_for,		"for",		ex_while,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_function,	"function",	ex_function,
-			EXTRA|BANG|CMDWIN),
+			EXTRA|BANG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_global,		"global",	ex_global,
-			RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN),
+			RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_goto,		"goto",		ex_goto,
-			RANGE|NOTADR|COUNT|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|NOTADR|COUNT|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_grep,		"grep",		ex_make,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_grepadd,		"grepadd",	ex_make,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_gui,		"gui",		ex_gui,
-			BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN),
+			BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_gvim,		"gvim",		ex_gui,
-			BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN),
+			BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_help,		"help",		ex_help,
-			BANG|EXTRA|NOTRLCOM),
+			BANG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_helpclose,	"helpclose",	ex_helpclose,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_helpfind,	"helpfind",	ex_helpfind,
-			EXTRA|NOTRLCOM),
+			EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_helpgrep,	"helpgrep",	ex_helpgrep,
-			EXTRA|NOTRLCOM|NEEDARG),
+			EXTRA|NOTRLCOM|NEEDARG,
+			ADDR_LINES),
 EX(CMD_helptags,	"helptags",	ex_helptags,
-			NEEDARG|FILES|TRLBAR|CMDWIN),
+			NEEDARG|FILES|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_hardcopy,	"hardcopy",	ex_hardcopy,
-			RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG),
+			RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG,
+			ADDR_LINES),
 EX(CMD_highlight,	"highlight",	ex_highlight,
-			BANG|EXTRA|TRLBAR|SBOXOK|CMDWIN),
+			BANG|EXTRA|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_hide,		"hide",		ex_hide,
-			BANG|EXTRA|NOTRLCOM),
+			BANG|RANGE|NOTADR|COUNT|EXTRA|NOTRLCOM,
+			ADDR_WINDOWS),
 EX(CMD_history,		"history",	ex_history,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_insert,		"insert",	ex_append,
-			BANG|RANGE|TRLBAR|CMDWIN|MODIFY),
+			BANG|RANGE|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_iabbrev,		"iabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_iabclear,	"iabclear",	ex_abclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_if,		"if",		ex_if,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_ijump,		"ijump",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA,
+			ADDR_LINES),
 EX(CMD_ilist,		"ilist",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_imap,		"imap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_imapclear,	"imapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_imenu,		"imenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_inoremap,	"inoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_inoreabbrev,	"inoreabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_inoremenu,	"inoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_intro,		"intro",	ex_intro,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_isearch,		"isearch",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_isplit,		"isplit",	ex_findpat,
-			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA),
+			BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA,
+			ADDR_LINES),
 EX(CMD_iunmap,		"iunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_iunabbrev,	"iunabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_iunmenu,		"iunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_join,		"join",		ex_join,
-			BANG|RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY),
+			BANG|RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_jumps,		"jumps",	ex_jumps,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_k,		"k",		ex_mark,
-			RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_keepmarks,	"keepmarks",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_keepjumps,	"keepjumps",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_keeppatterns,	"keeppatterns",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_keepalt,		"keepalt",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_list,		"list",		ex_print,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lNext,		"lNext",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lNfile,		"lNfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_last,		"last",		ex_last,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_language,	"language",	ex_language,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_laddexpr,	"laddexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR,
+			ADDR_LINES),
 EX(CMD_laddbuffer,	"laddbuffer",	ex_cbuffer,
-			RANGE|NOTADR|WORD1|TRLBAR),
+			RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_laddfile,	"laddfile",	ex_cfile,
-			TRLBAR|FILE1),
+			TRLBAR|FILE1,
+			ADDR_LINES),
 EX(CMD_later,		"later",	ex_later,
-			TRLBAR|EXTRA|NOSPC|CMDWIN),
+			TRLBAR|EXTRA|NOSPC|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lbuffer,		"lbuffer",	ex_cbuffer,
-			BANG|RANGE|NOTADR|WORD1|TRLBAR),
+			BANG|RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lcd,		"lcd",		ex_cd,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lchdir,		"lchdir",	ex_cd,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lclose,		"lclose",	ex_cclose,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lcscope,		"lcscope",	do_cscope,
-			EXTRA|NOTRLCOM|XFILE),
+			EXTRA|NOTRLCOM|XFILE,
+			ADDR_LINES),
 EX(CMD_left,		"left",		ex_align,
-			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_leftabove,	"leftabove",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_let,		"let",		ex_let,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lexpr,		"lexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lfile,		"lfile",	ex_cfile,
-			TRLBAR|FILE1|BANG),
+			TRLBAR|FILE1|BANG,
+			ADDR_LINES),
 EX(CMD_lfirst,		"lfirst",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lgetfile,	"lgetfile",	ex_cfile,
-			TRLBAR|FILE1),
+			TRLBAR|FILE1,
+			ADDR_LINES),
 EX(CMD_lgetbuffer,	"lgetbuffer",	ex_cbuffer,
-			RANGE|NOTADR|WORD1|TRLBAR),
+			RANGE|NOTADR|WORD1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lgetexpr,	"lgetexpr",	ex_cexpr,
-			NEEDARG|WORD1|NOTRLCOM|TRLBAR),
+			NEEDARG|WORD1|NOTRLCOM|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lgrep,		"lgrep",	ex_make,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_lgrepadd,	"lgrepadd",	ex_make,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_lhelpgrep,	"lhelpgrep",	ex_helpgrep,
-			EXTRA|NOTRLCOM|NEEDARG),
+			EXTRA|NOTRLCOM|NEEDARG,
+			ADDR_LINES),
 EX(CMD_ll,		"ll",		ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_llast,		"llast",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_llist,		"llist",	qf_list,
-			BANG|EXTRA|TRLBAR|CMDWIN),
+			BANG|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lmap,		"lmap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lmapclear,	"lmapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lmake,		"lmake",	ex_make,
-			BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_lnoremap,	"lnoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lnext,		"lnext",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lnewer,		"lnewer",	qf_age,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lnfile,		"lnfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_loadview,	"loadview",	ex_loadview,
-			FILE1|TRLBAR),
+			FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_loadkeymap,	"loadkeymap",	ex_loadkeymap,
-			CMDWIN),
+			CMDWIN,
+			ADDR_LINES),
 EX(CMD_lockmarks,	"lockmarks",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_lockvar,		"lockvar",	ex_lockvar,
-			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
+			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lolder,		"lolder",	qf_age,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lopen,		"lopen",	ex_copen,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_lprevious,	"lprevious",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lpfile,		"lpfile",	ex_cnext,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_lrewind,		"lrewind",	ex_cc,
-			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+			RANGE|NOTADR|COUNT|TRLBAR|BANG,
+			ADDR_LINES),
 EX(CMD_ltag,		"ltag",	ex_tag,
-			NOTADR|TRLBAR|BANG|WORD1),
+			NOTADR|TRLBAR|BANG|WORD1,
+			ADDR_LINES),
 EX(CMD_lunmap,		"lunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lua,		"lua",		ex_lua,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_luado,		"luado",	ex_luado,
-			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
+			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_luafile,		"luafile",	ex_luafile,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lvimgrep,	"lvimgrep",	ex_vimgrep,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_lvimgrepadd,	"lvimgrepadd",	ex_vimgrep,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_lwindow,		"lwindow",	ex_cwindow,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_ls,		"ls",		buflist_list,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_move,		"move",		ex_copymove,
-			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_mark,		"mark",		ex_mark,
-			RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN),
+			RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_make,		"make",		ex_make,
-			BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_map,		"map",		ex_map,
-			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_mapclear,	"mapclear",	ex_mapclear,
-			EXTRA|BANG|TRLBAR|CMDWIN),
+			EXTRA|BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_marks,		"marks",	do_marks,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_match,		"match",	ex_match,
-			RANGE|NOTADR|EXTRA|CMDWIN),
+			RANGE|NOTADR|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_menu,		"menu",		ex_menu,
-			RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_menutranslate,	"menutranslate", ex_menutranslate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_messages,	"messages",	ex_messages,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_mkexrc,		"mkexrc",	ex_mkrc,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_mksession,	"mksession",	ex_mkrc,
-			BANG|FILE1|TRLBAR),
+			BANG|FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_mkspell,		"mkspell",	ex_mkspell,
-			BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_mkvimrc,		"mkvimrc",	ex_mkrc,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_mkview,		"mkview",	ex_mkrc,
-			BANG|FILE1|TRLBAR),
+			BANG|FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_mode,		"mode",		ex_mode,
-			WORD1|TRLBAR|CMDWIN),
+			WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_mzscheme,	"mzscheme",	ex_mzscheme,
-			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN|SBOXOK),
+			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN|SBOXOK,
+			ADDR_LINES),
 EX(CMD_mzfile,		"mzfile",	ex_mzfile,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_next,		"next",		ex_next,
-			RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR),
+			RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_nbkey,		"nbkey",	ex_nbkey,
-			EXTRA|NOTADR|NEEDARG),
+			EXTRA|NOTADR|NEEDARG,
+			ADDR_LINES),
 EX(CMD_nbclose,		"nbclose",	ex_nbclose,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nbstart,		"nbstart",	ex_nbstart,
-			WORD1|TRLBAR|CMDWIN),
+			WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_new,		"new",		ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_nmap,		"nmap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nmapclear,	"nmapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nmenu,		"nmenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nnoremap,	"nnoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nnoremenu,	"nnoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_noremap,		"noremap",	ex_map,
-			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_noautocmd,	"noautocmd",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_nohlsearch,	"nohlsearch",	ex_nohlsearch,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_noreabbrev,	"noreabbrev",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_noremenu,	"noremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_noswapfile,	"noswapfile",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_normal,		"normal",	ex_normal,
-			RANGE|BANG|EXTRA|NEEDARG|NOTRLCOM|USECTRLV|SBOXOK|CMDWIN),
+			RANGE|BANG|EXTRA|NEEDARG|NOTRLCOM|USECTRLV|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_number,		"number",	ex_print,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nunmap,		"nunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_nunmenu,		"nunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_open,		"open",		ex_open,
-			RANGE|BANG|EXTRA),
+			RANGE|BANG|EXTRA,
+			ADDR_LINES),
 EX(CMD_oldfiles,	"oldfiles",	ex_oldfiles,
-			BANG|TRLBAR|SBOXOK|CMDWIN),
+			BANG|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_omap,		"omap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_omapclear,	"omapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_omenu,		"omenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_only,		"only",		ex_only,
-			BANG|TRLBAR),
+			BANG|NOTADR|RANGE|COUNT|TRLBAR,
+			ADDR_WINDOWS),
 EX(CMD_onoremap,	"onoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_onoremenu,	"onoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_options,		"options",	ex_options,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_ounmap,		"ounmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_ounmenu,		"ounmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_ownsyntax,	"ownsyntax",	ex_ownsyntax,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_print,		"print",	ex_print,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|SBOXOK),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|SBOXOK,
+			ADDR_LINES),
 EX(CMD_pclose,		"pclose",	ex_pclose,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_perl,		"perl",		ex_perl,
-			RANGE|EXTRA|DFLALL|NEEDARG|SBOXOK|CMDWIN),
+			RANGE|EXTRA|DFLALL|NEEDARG|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_perldo,		"perldo",	ex_perldo,
-			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN),
+			RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_pedit,		"pedit",	ex_pedit,
-			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_pop,		"pop",		ex_tag,
-			RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_popup,		"popup",	ex_popup,
-			NEEDARG|EXTRA|BANG|TRLBAR|NOTRLCOM|CMDWIN),
+			NEEDARG|EXTRA|BANG|TRLBAR|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_ppop,		"ppop",		ex_ptag,
-			RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_preserve,	"preserve",	ex_preserve,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_previous,	"previous",	ex_previous,
-			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_promptfind,	"promptfind",	gui_mch_find_dialog,
-			EXTRA|NOTRLCOM|CMDWIN),
+			EXTRA|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_promptrepl,	"promptrepl",	gui_mch_replace_dialog,
-			EXTRA|NOTRLCOM|CMDWIN),
+			EXTRA|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_profile,		"profile",	ex_profile,
-			BANG|EXTRA|TRLBAR|CMDWIN),
+			BANG|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_profdel,		"profdel",	ex_breakdel,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_psearch,		"psearch",	ex_psearch,
-			BANG|RANGE|WHOLEFOLD|DFLALL|EXTRA),
+			BANG|RANGE|WHOLEFOLD|DFLALL|EXTRA,
+			ADDR_LINES),
 EX(CMD_ptag,		"ptag",		ex_ptag,
-			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptNext,		"ptNext",	ex_ptag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptfirst,		"ptfirst",	ex_ptag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptjump,		"ptjump",	ex_ptag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_ptlast,		"ptlast",	ex_ptag,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_ptnext,		"ptnext",	ex_ptag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptprevious,	"ptprevious",	ex_ptag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptrewind,	"ptrewind",	ex_ptag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_ptselect,	"ptselect",	ex_ptag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_put,		"put",		ex_put,
-			RANGE|WHOLEFOLD|BANG|REGSTR|TRLBAR|ZEROR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|BANG|REGSTR|TRLBAR|ZEROR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_pwd,		"pwd",		ex_pwd,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_python,		"python",	ex_python,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_pydo,		"pydo",		ex_pydo,
-			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
+			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_pyfile,		"pyfile",	ex_pyfile,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_py3,		"py3",		ex_py3,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_py3do,		"py3do",	ex_py3do,
-			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
+			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_python3,		"python3",	ex_py3,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_py3file,		"py3file",	ex_py3file,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_quit,		"quit",		ex_quit,
-			BANG|TRLBAR|CMDWIN),
+			BANG|RANGE|COUNT|NOTADR|TRLBAR|CMDWIN,
+			ADDR_WINDOWS),
 EX(CMD_quitall,		"quitall",	ex_quit_all,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_qall,		"qall",		ex_quit_all,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_read,		"read",		ex_read,
-			BANG|RANGE|WHOLEFOLD|FILE1|ARGOPT|TRLBAR|ZEROR|CMDWIN|MODIFY),
+			BANG|RANGE|WHOLEFOLD|FILE1|ARGOPT|TRLBAR|ZEROR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_recover,		"recover",	ex_recover,
-			BANG|FILE1|TRLBAR),
+			BANG|FILE1|TRLBAR,
+			ADDR_LINES),
 EX(CMD_redo,		"redo",		ex_redo,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_redir,		"redir",	ex_redir,
-			BANG|FILES|TRLBAR|CMDWIN),
+			BANG|FILES|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_redraw,		"redraw",	ex_redraw,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_redrawstatus,	"redrawstatus",	ex_redrawstatus,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_registers,	"registers",	ex_display,
-			EXTRA|NOTRLCOM|TRLBAR|CMDWIN),
+			EXTRA|NOTRLCOM|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_resize,		"resize",	ex_resize,
-			RANGE|NOTADR|TRLBAR|WORD1),
+			RANGE|NOTADR|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_retab,		"retab",	ex_retab,
-			TRLBAR|RANGE|WHOLEFOLD|DFLALL|BANG|WORD1|CMDWIN|MODIFY),
+			TRLBAR|RANGE|WHOLEFOLD|DFLALL|BANG|WORD1|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_return,		"return",	ex_return,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_rewind,		"rewind",	ex_rewind,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_right,		"right",	ex_align,
-			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+			TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_rightbelow,	"rightbelow",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_runtime,		"runtime",	ex_runtime,
-			BANG|NEEDARG|FILES|TRLBAR|SBOXOK|CMDWIN),
+			BANG|NEEDARG|FILES|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_ruby,		"ruby",		ex_ruby,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_rubydo,		"rubydo",	ex_rubydo,
-			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
+			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_rubyfile,	"rubyfile",	ex_rubyfile,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_rundo,		"rundo",	ex_rundo,
-			NEEDARG|FILE1),
+			NEEDARG|FILE1,
+			ADDR_LINES),
 EX(CMD_rviminfo,	"rviminfo",	ex_viminfo,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_substitute,	"substitute",	do_sub,
-			RANGE|WHOLEFOLD|EXTRA|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sNext,		"sNext",	ex_previous,
-			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sargument,	"sargument",	ex_argument,
-			BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_ARGUMENTS),
 EX(CMD_sall,		"sall",		ex_all,
-			BANG|RANGE|NOTADR|COUNT|TRLBAR),
+			BANG|RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sandbox,		"sandbox",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_saveas,		"saveas",	ex_write,
-			BANG|DFLALL|FILE1|ARGOPT|CMDWIN|TRLBAR),
+			BANG|DFLALL|FILE1|ARGOPT|CMDWIN|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbuffer,		"sbuffer",	ex_buffer,
-			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR),
+			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
+			ADDR_UNLOADED_BUFFERS),
 EX(CMD_sbNext,		"sbNext",	ex_bprevious,
-			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sball,		"sball",	ex_buffer_all,
-			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbfirst,		"sbfirst",	ex_brewind,
-			EDITCMD|TRLBAR),
+			EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sblast,		"sblast",	ex_blast,
-			EDITCMD|TRLBAR),
+			EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbmodified,	"sbmodified",	ex_bmodified,
-			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbnext,		"sbnext",	ex_bnext,
-			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbprevious,	"sbprevious",	ex_bprevious,
-			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR),
+			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sbrewind,	"sbrewind",	ex_brewind,
-			EDITCMD|TRLBAR),
+			EDITCMD|TRLBAR,
+			ADDR_LINES),
 EX(CMD_scriptnames,	"scriptnames",	ex_scriptnames,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_scriptencoding,	"scriptencoding", ex_scriptencoding,
-			WORD1|TRLBAR|CMDWIN),
+			WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_scscope,		"scscope",	do_scscope,
-			EXTRA|NOTRLCOM),
+			EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_set,		"set",		ex_set,
-			TRLBAR|EXTRA|CMDWIN|SBOXOK),
+			TRLBAR|EXTRA|CMDWIN|SBOXOK,
+			ADDR_LINES),
 EX(CMD_setfiletype,	"setfiletype",	ex_setfiletype,
-			TRLBAR|EXTRA|NEEDARG|CMDWIN),
+			TRLBAR|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_setglobal,	"setglobal",	ex_set,
-			TRLBAR|EXTRA|CMDWIN|SBOXOK),
+			TRLBAR|EXTRA|CMDWIN|SBOXOK,
+			ADDR_LINES),
 EX(CMD_setlocal,	"setlocal",	ex_set,
-			TRLBAR|EXTRA|CMDWIN|SBOXOK),
+			TRLBAR|EXTRA|CMDWIN|SBOXOK,
+			ADDR_LINES),
 EX(CMD_sfind,		"sfind",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sfirst,		"sfirst",	ex_rewind,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_shell,		"shell",	ex_shell,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_simalt,		"simalt",	ex_simalt,
-			NEEDARG|WORD1|TRLBAR|CMDWIN),
+			NEEDARG|WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sign,		"sign",		ex_sign,
-			NEEDARG|RANGE|NOTADR|EXTRA|CMDWIN),
+			NEEDARG|RANGE|NOTADR|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_silent,		"silent",	ex_wrongmodifier,
-			NEEDARG|EXTRA|BANG|NOTRLCOM|SBOXOK|CMDWIN),
+			NEEDARG|EXTRA|BANG|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sleep,		"sleep",	ex_sleep,
-			RANGE|NOTADR|COUNT|EXTRA|TRLBAR|CMDWIN),
+			RANGE|NOTADR|COUNT|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_slast,		"slast",	ex_last,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_smagic,		"smagic",	ex_submagic,
-			RANGE|WHOLEFOLD|EXTRA|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_smap,		"smap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_smapclear,	"smapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_smenu,		"smenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_snext,		"snext",	ex_next,
-			RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR),
+			RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sniff,		"sniff",	ex_sniff,
-			EXTRA|TRLBAR),
+			EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_snomagic,	"snomagic",	ex_submagic,
-			RANGE|WHOLEFOLD|EXTRA|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|CMDWIN,
+			ADDR_LINES),
 EX(CMD_snoremap,	"snoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_snoremenu,	"snoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_source,		"source",	ex_source,
-			BANG|FILE1|TRLBAR|SBOXOK|CMDWIN),
+			BANG|FILE1|TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sort,		"sort",		ex_sort,
-			RANGE|DFLALL|WHOLEFOLD|BANG|EXTRA|NOTRLCOM|MODIFY),
+			RANGE|DFLALL|WHOLEFOLD|BANG|EXTRA|NOTRLCOM|MODIFY,
+			ADDR_LINES),
 EX(CMD_split,		"split",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_spellgood,	"spellgood",	ex_spell,
-			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_spelldump,	"spelldump",	ex_spelldump,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_spellinfo,	"spellinfo",	ex_spellinfo,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_spellrepall,	"spellrepall",	ex_spellrepall,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_spellundo,	"spellundo",	ex_spell,
-			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_spellwrong,	"spellwrong",	ex_spell,
-			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR),
+			BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sprevious,	"sprevious",	ex_previous,
-			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_srewind,		"srewind",	ex_rewind,
-			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_stop,		"stop",		ex_stop,
-			TRLBAR|BANG|CMDWIN),
+			TRLBAR|BANG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_stag,		"stag",		ex_stag,
-			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_startinsert,	"startinsert",	ex_startinsert,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_startgreplace,	"startgreplace", ex_startinsert,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_startreplace,	"startreplace",	ex_startinsert,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_stopinsert,	"stopinsert",	ex_stopinsert,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_stjump,		"stjump",	ex_stag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_stselect,	"stselect",	ex_stag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_sunhide,		"sunhide",	ex_buffer_all,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_sunmap,		"sunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sunmenu,		"sunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_suspend,		"suspend",	ex_stop,
-			TRLBAR|BANG|CMDWIN),
+			TRLBAR|BANG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_sview,		"sview",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_swapname,	"swapname",	ex_swapname,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_syntax,		"syntax",	ex_syntax,
-			EXTRA|NOTRLCOM|CMDWIN),
+			EXTRA|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_syntime,		"syntime",	ex_syntime,
-			NEEDARG|WORD1|TRLBAR|CMDWIN),
+			NEEDARG|WORD1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_syncbind,	"syncbind",	ex_syncbind,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_t,		"t",		ex_copymove,
-			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_tNext,		"tNext",	ex_tag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_tag,		"tag",		ex_tag,
-			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_tags,		"tags",		do_tags,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tab,		"tab",		ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_tabclose,	"tabclose",	ex_tabclose,
-			RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN),
+			RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN,
+			ADDR_TABS),
 EX(CMD_tabdo,		"tabdo",	ex_listdo,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_tabedit,		"tabedit",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_TABS),
 EX(CMD_tabfind,		"tabfind",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|NEEDARG|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|NEEDARG|TRLBAR,
+			ADDR_TABS),
 EX(CMD_tabfirst,	"tabfirst",	ex_tabnext,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabmove,		"tabmove",	ex_tabmove,
-			RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR),
+			RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR,
+			ADDR_TABS),
 EX(CMD_tablast,		"tablast",	ex_tabnext,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabnext,		"tabnext",	ex_tabnext,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabnew,		"tabnew",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_TABS),
 EX(CMD_tabonly,		"tabonly",	ex_tabonly,
-			BANG|TRLBAR|CMDWIN),
+			BANG|RANGE|NOTADR|TRLBAR|CMDWIN,
+			ADDR_TABS),
 EX(CMD_tabprevious,	"tabprevious",	ex_tabnext,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabNext,		"tabNext",	ex_tabnext,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabrewind,	"tabrewind",	ex_tabnext,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_tabs,		"tabs",		ex_tabs,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tcl,		"tcl",		ex_tcl,
-			RANGE|EXTRA|NEEDARG|CMDWIN),
+			RANGE|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tcldo,		"tcldo",	ex_tcldo,
-			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
+			RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tclfile,		"tclfile",	ex_tclfile,
-			RANGE|FILE1|NEEDARG|CMDWIN),
+			RANGE|FILE1|NEEDARG|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tearoff,		"tearoff",	ex_tearoff,
-			NEEDARG|EXTRA|TRLBAR|NOTRLCOM|CMDWIN),
+			NEEDARG|EXTRA|TRLBAR|NOTRLCOM|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tfirst,		"tfirst",	ex_tag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_throw,		"throw",	ex_throw,
-			EXTRA|NEEDARG|SBOXOK|CMDWIN),
+			EXTRA|NEEDARG|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tjump,		"tjump",	ex_tag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_tlast,		"tlast",	ex_tag,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_tmenu,		"tmenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tnext,		"tnext",	ex_tag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_topleft,		"topleft",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_tprevious,	"tprevious",	ex_tag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_trewind,		"trewind",	ex_tag,
-			RANGE|NOTADR|BANG|TRLBAR|ZEROR),
+			RANGE|NOTADR|BANG|TRLBAR|ZEROR,
+			ADDR_LINES),
 EX(CMD_try,		"try",		ex_try,
-			TRLBAR|SBOXOK|CMDWIN),
+			TRLBAR|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_tselect,		"tselect",	ex_tag,
-			BANG|TRLBAR|WORD1),
+			BANG|TRLBAR|WORD1,
+			ADDR_LINES),
 EX(CMD_tunmenu,		"tunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_undo,		"undo",		ex_undo,
-			RANGE|NOTADR|COUNT|ZEROR|TRLBAR|CMDWIN),
+			RANGE|NOTADR|COUNT|ZEROR|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_undojoin,	"undojoin",	ex_undojoin,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_undolist,	"undolist",	ex_undolist,
-			TRLBAR|CMDWIN),
+			TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unabbreviate,	"unabbreviate",	ex_abbreviate,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unhide,		"unhide",	ex_buffer_all,
-			RANGE|NOTADR|COUNT|TRLBAR),
+			RANGE|NOTADR|COUNT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_unlet,		"unlet",	ex_unlet,
-			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
+			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unlockvar,	"unlockvar",	ex_lockvar,
-			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
+			BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unmap,		"unmap",	ex_unmap,
-			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unmenu,		"unmenu",	ex_menu,
-			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_unsilent,	"unsilent",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_update,		"update",	ex_update,
-			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR),
+			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR,
+			ADDR_LINES),
 EX(CMD_vglobal,		"vglobal",	ex_global,
-			RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN,
+			ADDR_LINES),
 EX(CMD_version,		"version",	ex_version,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_verbose,		"verbose",	ex_wrongmodifier,
-			NEEDARG|RANGE|NOTADR|EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			NEEDARG|RANGE|NOTADR|EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vertical,	"vertical",	ex_wrongmodifier,
-			NEEDARG|EXTRA|NOTRLCOM),
+			NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_visual,		"visual",	ex_edit,
-			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_view,		"view",		ex_edit,
-			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_vimgrep,		"vimgrep",	ex_vimgrep,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_vimgrepadd,	"vimgrepadd",	ex_vimgrep,
-			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE),
+			RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE,
+			ADDR_LINES),
 EX(CMD_viusage,		"viusage",	ex_viusage,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_vmap,		"vmap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vmapclear,	"vmapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vmenu,		"vmenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vnoremap,	"vnoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vnew,		"vnew",		ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_vnoremenu,	"vnoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vsplit,		"vsplit",	ex_splitview,
-			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
+			BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_vunmap,		"vunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_vunmenu,		"vunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_write,		"write",	ex_write,
-			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_wNext,		"wNext",	ex_wnext,
-			RANGE|WHOLEFOLD|NOTADR|BANG|FILE1|ARGOPT|TRLBAR),
+			RANGE|WHOLEFOLD|NOTADR|BANG|FILE1|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wall,		"wall",		do_wqall,
-			BANG|TRLBAR|CMDWIN),
+			BANG|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_while,		"while",	ex_while,
-			EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
+			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
+			ADDR_LINES),
 EX(CMD_winsize,		"winsize",	ex_winsize,
-			EXTRA|NEEDARG|TRLBAR),
+			EXTRA|NEEDARG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wincmd,		"wincmd",	ex_wincmd,
-			NEEDARG|WORD1|RANGE|NOTADR),
+			NEEDARG|WORD1|RANGE|NOTADR,
+			ADDR_LINES),
 EX(CMD_windo,		"windo",	ex_listdo,
-			BANG|NEEDARG|EXTRA|NOTRLCOM),
+			BANG|NEEDARG|EXTRA|NOTRLCOM,
+			ADDR_LINES),
 EX(CMD_winpos,		"winpos",	ex_winpos,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_wnext,		"wnext",	ex_wnext,
-			RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR),
+			RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wprevious,	"wprevious",	ex_wnext,
-			RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR),
+			RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wq,		"wq",		ex_exit,
-			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR),
+			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wqall,		"wqall",	do_wqall,
-			BANG|FILE1|ARGOPT|DFLALL|TRLBAR),
+			BANG|FILE1|ARGOPT|DFLALL|TRLBAR,
+			ADDR_LINES),
 EX(CMD_wsverb,		"wsverb",	ex_wsverb,
-			EXTRA|NOTADR|NEEDARG),
+			EXTRA|NOTADR|NEEDARG,
+			ADDR_LINES),
 EX(CMD_wundo,		"wundo",	ex_wundo,
-			BANG|NEEDARG|FILE1),
+			BANG|NEEDARG|FILE1,
+			ADDR_LINES),
 EX(CMD_wviminfo,	"wviminfo",	ex_viminfo,
-			BANG|FILE1|TRLBAR|CMDWIN),
+			BANG|FILE1|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xit,		"xit",		ex_exit,
-			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xall,		"xall",		do_wqall,
-			BANG|TRLBAR),
+			BANG|TRLBAR,
+			ADDR_LINES),
 EX(CMD_xmap,		"xmap",		ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xmapclear,	"xmapclear",	ex_mapclear,
-			EXTRA|TRLBAR|CMDWIN),
+			EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xmenu,		"xmenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xnoremap,	"xnoremap",	ex_map,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xnoremenu,	"xnoremenu",	ex_menu,
-			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xunmap,		"xunmap",	ex_unmap,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_xunmenu,		"xunmenu",	ex_menu,
-			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
+			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
+			ADDR_LINES),
 EX(CMD_yank,		"yank",		ex_operators,
-			RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_z,		"z",		ex_z,
-			RANGE|WHOLEFOLD|EXTRA|EXFLAGS|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|EXFLAGS|TRLBAR|CMDWIN,
+			ADDR_LINES),
 
 /* commands that don't start with a lowercase letter */
 EX(CMD_bang,		"!",		ex_bang,
-			RANGE|WHOLEFOLD|BANG|FILES|CMDWIN),
+			RANGE|WHOLEFOLD|BANG|FILES|CMDWIN,
+			ADDR_LINES),
 EX(CMD_pound,		"#",		ex_print,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_and,		"&",		do_sub,
-			RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_star,		"*",		ex_at,
-			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_lshift,		"<",		ex_operators,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_equal,		"=",		ex_equal,
-			RANGE|TRLBAR|DFLALL|EXFLAGS|CMDWIN),
+			RANGE|TRLBAR|DFLALL|EXFLAGS|CMDWIN,
+			ADDR_LINES),
 EX(CMD_rshift,		">",		ex_operators,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY,
+			ADDR_LINES),
 EX(CMD_at,		"@",		ex_at,
-			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_Next,		"Next",		ex_previous,
-			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR),
+			EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR,
+			ADDR_LINES),
 EX(CMD_Print,		"Print",	ex_print,
-			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN),
+			RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN,
+			ADDR_LINES),
 EX(CMD_X,		"X",		ex_X,
-			TRLBAR),
+			TRLBAR,
+			ADDR_LINES),
 EX(CMD_tilde,		"~",		do_sub,
-			RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
+			RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
+			ADDR_LINES),
 
 #ifndef DO_DECLARE_EXCMD
 #ifdef FEAT_USR_CMDS
@@ -1172,6 +1704,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 */
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -60,6 +60,7 @@ static char_u *get_user_command_name __A
 # define IS_USER_CMDIDX(idx) (FALSE)
 #endif
 
+static int compute_buffer_local_count __ARGS((int addr_type, int lnum, int local));
 #ifdef FEAT_EVAL
 static char_u	*do_one_cmd __ARGS((char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int), void *cookie));
 #else
@@ -133,7 +134,7 @@ static int	getargopt __ARGS((exarg_T *ea
 #endif
 
 static int	check_more __ARGS((int, int));
-static linenr_T get_address __ARGS((char_u **, int skip, int to_other_file));
+static linenr_T get_address __ARGS((char_u **, int addr_type, int skip, int to_other_file));
 static void	get_flags __ARGS((exarg_T *eap));
 #if !defined(FEAT_PERL) \
 	|| !defined(FEAT_PYTHON) || !defined(FEAT_PYTHON3) \
@@ -1680,6 +1681,39 @@ getline_cookie(fgetline, cookie)
 }
 #endif
 
+
+/*
+ * Helper function to apply an offset for buffer commands, i.e. ":bdelete",
+ * ":bwipeout", etc.
+ * Returns the buffer number.
+ */
+    static int
+compute_buffer_local_count(addr_type, lnum, offset)
+    int	    addr_type;
+    int	    lnum;
+    int	    offset;
+{
+    buf_T   *buf;
+    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;
+	if (buf->b_prev == NULL)
+	    break;
+	buf = (count < 0) ? buf->b_prev : buf->b_next;
+	if (addr_type == ADDR_LOADED_BUFFERS)
+	    /* skip over unloaded buffers */
+	    while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL)
+		buf = (count < 0) ? buf->b_prev : buf->b_next;
+    }
+    return buf->b_fnum;
+}
+
+
 /*
  * Execute one Ex command.
  *
@@ -1687,10 +1721,10 @@ getline_cookie(fgetline, cookie)
  *
  * 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. parse command
+ * 4. parse range
+ * 6. parse arguments
+ * 7. switch on command name
  *
  * Note: "fgetline" can be NULL.
  *
@@ -1730,6 +1764,9 @@ do_one_cmd(cmdlinep, sourcing,
 #endif
     cmdmod_T		save_cmdmod;
     int			ni;			/* set when Not Implemented */
+    win_T		*wp;
+    tabpage_T		*tp;
+    char_u		*cmd;
 
     vim_memset(&ea, 0, sizeof(ea));
     ea.line1 = 1;
@@ -1769,7 +1806,7 @@ do_one_cmd(cmdlinep, sourcing,
     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;
@@ -1794,7 +1831,7 @@ do_one_cmd(cmdlinep, sourcing,
 	}
 
 /*
- * 2. handle command modifiers.
+ * 2. Handle command modifiers.
  */
 	p = ea.cmd;
 	if (VIM_ISDIGIT(*ea.cmd))
@@ -2003,7 +2040,18 @@ do_one_cmd(cmdlinep, sourcing,
 #endif
 
 /*
- * 3. parse a range specifier of the form: addr [,addr] [;addr] ..
+ * 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);
+
+/*
+ * 4. parse a range specifier of the form: addr [,addr] [;addr] ..
  *
  * where 'addr' is:
  *
@@ -2019,13 +2067,52 @@ do_one_cmd(cmdlinep, sourcing,
  * is equal to the lower.
  */
 
+    if (ea.cmdidx != CMD_SIZE)
+	ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
+    else
+	ea.addr_type = ADDR_LINES;
+    ea.cmd = cmd;
+
     /* repeat for all ',' or ';' separated addresses */
     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 = 0;
+		for (wp = firstwin; wp != NULL; wp = wp->w_next)
+		{
+		    lnum++;
+		    if (wp == curwin)
+			break;
+		}
+		ea.line2 = lnum;
+		break;
+	    case ADDR_ARGUMENTS:
+		ea.line2 = curwin->w_arg_idx + 1;
+		break;
+	    case ADDR_LOADED_BUFFERS:
+	    case ADDR_UNLOADED_BUFFERS:
+		ea.line2 = curbuf->b_fnum;
+		break;
+	    case ADDR_TABS:
+		lnum = 0;
+		for(tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+		{
+		    lnum++;
+		    if (tp == curtab)
+			break;
+		}
+		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)
@@ -2033,8 +2120,24 @@ do_one_cmd(cmdlinep, sourcing,
 	    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_WINDOWS:
+		    case ADDR_LOADED_BUFFERS:
+		    case ADDR_UNLOADED_BUFFERS:
+		    case ADDR_TABS:
+			errormsg = (char_u *)_(e_invrange);
+			goto doend;
+			break;
+		    case ADDR_ARGUMENTS:
+			ea.line1 = 1;
+			ea.line2 = ARGCOUNT;
+			break;
+		}
 		++ea.addr_count;
 	    }
 					    /* '*' - visual area */
@@ -2042,6 +2145,12 @@ do_one_cmd(cmdlinep, sourcing,
 	    {
 		pos_T	    *fp;
 
+		if (ea.addr_type != ADDR_LINES)
+		{
+		    errormsg = (char_u *)_(e_invrange);
+		    goto doend;
+		}
+
 		++ea.cmd;
 		if (!ea.skip)
 		{
@@ -2084,7 +2193,7 @@ do_one_cmd(cmdlinep, sourcing,
     check_cursor_lnum();
 
 /*
- * 4. parse command
+ * 5. Parse the command.
  */
 
     /*
@@ -2098,8 +2207,8 @@ do_one_cmd(cmdlinep, sourcing,
      * If we got a line, but no command, then go to the line.
      * If we find a '|' or '\n' we set ea.nextcmd.
      */
-    if (*ea.cmd == NUL || *ea.cmd == '"' ||
-			       (ea.nextcmd = check_nextcmd(ea.cmd)) != NULL)
+    if (*ea.cmd == NUL || *ea.cmd == '"'
+			      || (ea.nextcmd = check_nextcmd(ea.cmd)) != NULL)
     {
 	/*
 	 * strange vi behaviour:
@@ -2145,9 +2254,6 @@ do_one_cmd(cmdlinep, sourcing,
 	goto doend;
     }
 
-    /* Find the command and let "p" point to after it. */
-    p = find_command(&ea, NULL);
-
 #ifdef FEAT_AUTOCMD
     /* If this looks like an undefined user command and there are CmdUndefined
      * autocommands defined, trigger the matching autocommands. */
@@ -2229,7 +2335,7 @@ do_one_cmd(cmdlinep, sourcing,
 	ea.forceit = FALSE;
 
 /*
- * 5. parse arguments
+ * 5. Parse arguments.
  */
     if (!IS_USER_CMDIDX(ea.cmdidx))
 	ea.argt = (long)cmdnames[(int)ea.cmdidx].cmd_argt;
@@ -2676,7 +2782,7 @@ do_one_cmd(cmdlinep, sourcing,
 #endif
 
 /*
- * 6. switch on command name
+ * 6. Switch on command name.
  *
  * The "ea" structure holds the arguments that can be used.
  */
@@ -4082,8 +4188,9 @@ skip_range(cmd, ctx)
  * Return MAXLNUM when no Ex address was found.
  */
     static linenr_T
-get_address(ptr, skip, to_other_file)
+get_address(ptr, addr_type, skip, to_other_file)
     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 */
 {
@@ -4094,6 +4201,8 @@ get_address(ptr, skip, to_other_file)
     pos_T	pos;
     pos_T	*fp;
     linenr_T	lnum;
+    win_T	*wp;
+    tabpage_T	*tp;
 
     cmd = skipwhite(*ptr);
     lnum = MAXLNUM;
@@ -4102,137 +4211,204 @@ get_address(ptr, skip, to_other_file)
 	switch (*cmd)
 	{
 	    case '.':			    /* '.' - Cursor position */
-			++cmd;
+		++cmd;
+		switch (addr_type)
+		{
+		    case ADDR_LINES:
 			lnum = curwin->w_cursor.lnum;
 			break;
+		    case ADDR_WINDOWS:
+			lnum = 0;
+			for (wp = firstwin; wp != NULL; wp = wp->w_next)
+			{
+			    lnum++;
+			    if (wp == curwin)
+				break;
+			}
+			break;
+		    case ADDR_ARGUMENTS:
+			lnum = curwin->w_arg_idx + 1;
+			break;
+		    case ADDR_LOADED_BUFFERS:
+		    case ADDR_UNLOADED_BUFFERS:
+			lnum = curbuf->b_fnum;
+			break;
+		    case ADDR_TABS:
+			lnum = 0;
+			for(tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+			{
+			    lnum++;
+			    if (tp == curtab)
+				break;
+			}
+			break;
+		}
+		break;
 
 	    case '$':			    /* '$' - last line */
-			++cmd;
+		++cmd;
+		switch (addr_type)
+		{
+		    case ADDR_LINES:
 			lnum = curbuf->b_ml.ml_line_count;
 			break;
+		    case ADDR_WINDOWS:
+			lnum = 0;
+			for (wp = firstwin; wp != NULL; wp = wp->w_next)
+			    lnum++;
+			break;
+		    case ADDR_ARGUMENTS:
+			lnum = ARGCOUNT;
+			break;
+		    case ADDR_LOADED_BUFFERS:
+		    case ADDR_UNLOADED_BUFFERS:
+			lnum = lastbuf->b_fnum;
+			break;
+		    case ADDR_TABS:
+			lnum = 0;
+			for(tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+			    lnum++;
+			break;
+		}
+		break;
 
 	    case '\'':			    /* ''' - mark */
-			if (*++cmd == NUL)
+		if (*++cmd == NUL)
+		{
+		    cmd = NULL;
+		    goto error;
+		}
+		if (addr_type != ADDR_LINES)
+		{
+		    EMSG(_(e_invaddr));
+		    goto error;
+		}
+		if (skip)
+		    ++cmd;
+		else
+		{
+		    /* Only accept a mark in another file when it is
+		     * used by itself: ":'M". */
+		    fp = getmark(*cmd, to_other_file && cmd[1] == NUL);
+		    ++cmd;
+		    if (fp == (pos_T *)-1)
+			/* Jumped to another file. */
+			lnum = curwin->w_cursor.lnum;
+		    else
+		    {
+			if (check_mark(fp) == FAIL)
 			{
 			    cmd = NULL;
 			    goto error;
 			}
-			if (skip)
-			    ++cmd;
-			else
-			{
-			    /* Only accept a mark in another file when it is
-			     * used by itself: ":'M". */
-			    fp = getmark(*cmd, to_other_file && cmd[1] == NUL);
-			    ++cmd;
-			    if (fp == (pos_T *)-1)
-				/* Jumped to another file. */
-				lnum = curwin->w_cursor.lnum;
-			    else
-			    {
-				if (check_mark(fp) == FAIL)
-				{
-				    cmd = NULL;
-				    goto error;
-				}
-				lnum = fp->lnum;
-			    }
-			}
-			break;
+			lnum = fp->lnum;
+		    }
+		}
+		break;
 
 	    case '/':
 	    case '?':			/* '/' or '?' - search */
-			c = *cmd++;
-			if (skip)	/* skip "/pat/" */
-			{
-			    cmd = skip_regexp(cmd, c, (int)p_magic, NULL);
-			    if (*cmd == c)
-				++cmd;
-			}
-			else
-			{
-			    pos = curwin->w_cursor; /* save curwin->w_cursor */
-			    /*
-			     * When '/' or '?' follows another address, start
-			     * from there.
-			     */
-			    if (lnum != MAXLNUM)
-				curwin->w_cursor.lnum = lnum;
-			    /*
-			     * Start a forward search at the end of the line.
-			     * Start a backward search at the start of the line.
-			     * This makes sure we never match in the current
-			     * line, and can match anywhere in the
-			     * next/previous line.
-			     */
-			    if (c == '/')
-				curwin->w_cursor.col = MAXCOL;
-			    else
-				curwin->w_cursor.col = 0;
-			    searchcmdlen = 0;
-			    if (!do_search(NULL, c, cmd, 1L,
-					       SEARCH_HIS | SEARCH_MSG, NULL))
-			    {
-				curwin->w_cursor = pos;
-				cmd = NULL;
-				goto error;
-			    }
-			    lnum = curwin->w_cursor.lnum;
-			    curwin->w_cursor = pos;
-			    /* adjust command string pointer */
-			    cmd += searchcmdlen;
-			}
-			break;
+		c = *cmd++;
+		if (addr_type != ADDR_LINES)
+		{
+		    EMSG(_(e_invaddr));
+		    goto error;
+		}
+		if (skip)	/* skip "/pat/" */
+		{
+		    cmd = skip_regexp(cmd, c, (int)p_magic, NULL);
+		    if (*cmd == c)
+			++cmd;
+		}
+		else
+		{
+		    pos = curwin->w_cursor; /* save curwin->w_cursor */
+		    /*
+		     * When '/' or '?' follows another address, start
+		     * from there.
+		     */
+		    if (lnum != MAXLNUM)
+			curwin->w_cursor.lnum = lnum;
+		    /*
+		     * Start a forward search at the end of the line.
+		     * Start a backward search at the start of the line.
+		     * This makes sure we never match in the current
+		     * line, and can match anywhere in the
+		     * next/previous line.
+		     */
+		    if (c == '/')
+			curwin->w_cursor.col = MAXCOL;
+		    else
+			curwin->w_cursor.col = 0;
+		    searchcmdlen = 0;
+		    if (!do_search(NULL, c, cmd, 1L,
+				       SEARCH_HIS | SEARCH_MSG, NULL))
+		    {
+			curwin->w_cursor = pos;
+			cmd = NULL;
+			goto error;
+		    }
+		    lnum = curwin->w_cursor.lnum;
+		    curwin->w_cursor = pos;
+		    /* adjust command string pointer */
+		    cmd += searchcmdlen;
+		}
+		break;
 
 	    case '\\':		    /* "\?", "\/" or "\&", repeat search */
-			++cmd;
-			if (*cmd == '&')
-			    i = RE_SUBST;
-			else if (*cmd == '?' || *cmd == '/')
-			    i = RE_SEARCH;
-			else
-			{
-			    EMSG(_(e_backslash));
-			    cmd = NULL;
-			    goto error;
-			}
-
-			if (!skip)
-			{
-			    /*
-			     * When search follows another address, start from
-			     * there.
-			     */
-			    if (lnum != MAXLNUM)
-				pos.lnum = lnum;
-			    else
-				pos.lnum = curwin->w_cursor.lnum;
-
-			    /*
-			     * Start the search just like for the above
-			     * do_search().
-			     */
-			    if (*cmd != '?')
-				pos.col = MAXCOL;
-			    else
-				pos.col = 0;
-			    if (searchit(curwin, curbuf, &pos,
-					*cmd == '?' ? BACKWARD : FORWARD,
-					(char_u *)"", 1L, SEARCH_MSG,
-						i, (linenr_T)0, NULL) != FAIL)
-				lnum = pos.lnum;
-			    else
-			    {
-				cmd = NULL;
-				goto error;
-			    }
-			}
-			++cmd;
-			break;
+		++cmd;
+		if (addr_type != ADDR_LINES)
+		{
+		    EMSG(_(e_invaddr));
+		    goto error;
+		}
+		if (*cmd == '&')
+		    i = RE_SUBST;
+		else if (*cmd == '?' || *cmd == '/')
+		    i = RE_SEARCH;
+		else
+		{
+		    EMSG(_(e_backslash));
+		    cmd = NULL;
+		    goto error;
+		}
+
+		if (!skip)
+		{
+		    /*
+		     * When search follows another address, start from
+		     * there.
+		     */
+		    if (lnum != MAXLNUM)
+			pos.lnum = lnum;
+		    else
+			pos.lnum = curwin->w_cursor.lnum;
+
+		    /*
+		     * Start the search just like for the above
+		     * do_search().
+		     */
+		    if (*cmd != '?')
+			pos.col = MAXCOL;
+		    else
+			pos.col = 0;
+		    if (searchit(curwin, curbuf, &pos,
+				*cmd == '?' ? BACKWARD : FORWARD,
+				(char_u *)"", 1L, SEARCH_MSG,
+					i, (linenr_T)0, NULL) != FAIL)
+			lnum = pos.lnum;
+		    else
+		    {
+			cmd = NULL;
+			goto error;
+		    }
+		}
+		++cmd;
+		break;
 
 	    default:
-			if (VIM_ISDIGIT(*cmd))	/* absolute line number */
-			    lnum = getdigits(&cmd);
+		if (VIM_ISDIGIT(*cmd))	/* absolute line number */
+		    lnum = getdigits(&cmd);
 	}
 
 	for (;;)
@@ -4242,7 +4418,40 @@ get_address(ptr, skip, to_other_file)
 		break;
 
 	    if (lnum == MAXLNUM)
-		lnum = curwin->w_cursor.lnum;	/* "+1" is same as ".+1" */
+	    {
+		switch (addr_type)
+		{
+		    case ADDR_LINES:
+			lnum = curwin->w_cursor.lnum;	/* "+1" is same as ".+1" */
+			break;
+		    case ADDR_WINDOWS:
+			lnum = 0;
+			for (wp = firstwin; wp != NULL; wp = wp->w_next)
+			{
+			    lnum++;
+			    if (wp == curwin)
+				break;
+			}
+			break;
+		    case ADDR_ARGUMENTS:
+			lnum = curwin->w_arg_idx + 1;
+			break;
+		    case ADDR_LOADED_BUFFERS:
+		    case ADDR_UNLOADED_BUFFERS:
+			lnum = curbuf->b_fnum;
+			break;
+		    case ADDR_TABS:
+			lnum = 0;
+			for(tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+			{
+			    lnum++;
+			    if (tp == curtab)
+				break;
+			}
+			break;
+		}
+	    }
+
 	    if (VIM_ISDIGIT(*cmd))
 		i = '+';		/* "number" is same as "+number" */
 	    else
@@ -4251,10 +4460,59 @@ get_address(ptr, skip, to_other_file)
 		n = 1;
 	    else
 		n = getdigits(&cmd);
-	    if (i == '-')
+	    if (addr_type == ADDR_LOADED_BUFFERS
+		    || addr_type == ADDR_UNLOADED_BUFFERS)
+		lnum = compute_buffer_local_count(addr_type, lnum, n);
+	    else if (i == '-')
 		lnum -= n;
 	    else
 		lnum += n;
+
+	    switch (addr_type)
+	    {
+		case ADDR_LINES:
+		    break;
+		case ADDR_ARGUMENTS:
+		    if (lnum < 0)
+			lnum = 0;
+		    else if (lnum >= ARGCOUNT)
+			lnum = ARGCOUNT;
+		    break;
+		case ADDR_TABS:
+		    if (lnum < 0)
+		    {
+			lnum = 0;
+			break;
+		    }
+		    c = 0;
+		    for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+			c++;
+		    if (lnum >= c)
+			lnum = c;
+		    break;
+		case ADDR_WINDOWS:
+		    if (lnum < 0)
+		    {
+			lnum = 0;
+			break;
+		    }
+		    c = 0;
+		    for (wp = firstwin; wp != NULL; wp = wp->w_next)
+			c++;
+		    if (lnum > c)
+			lnum = c;
+		    break;
+		case ADDR_LOADED_BUFFERS:
+		case ADDR_UNLOADED_BUFFERS:
+		    if (lnum < firstbuf->b_fnum)
+		    {
+			lnum = firstbuf->b_fnum;
+			break;
+		    }
+		    if (lnum > lastbuf->b_fnum)
+			lnum = lastbuf->b_fnum;
+		    break;
+	    }
 	}
     } while (*cmd == '/' || *cmd == '?');
 
@@ -6556,6 +6814,10 @@ not_exiting()
 ex_quit(eap)
     exarg_T	*eap;
 {
+    win_T	*wp;
+    buf_T	*buf;
+    int		wnr;
+
 #ifdef FEAT_CMDWIN
     if (cmdwin_type != 0)
     {
@@ -6569,11 +6831,28 @@ ex_quit(eap)
 	text_locked_msg();
 	return;
     }
+    if (eap->addr_count > 0)
+    {
+	wnr = eap->line2;
+	for (wp = firstwin; --wnr > 0; )
+	{
+	    if (wp->w_next == NULL)
+		break;
+	    else
+		wp = wp->w_next;
+	}
+	buf = wp->w_buffer;
+    }
+    else
+    {
+	wp = curwin;
+	buf = curbuf;
+    }
 #ifdef FEAT_AUTOCMD
     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() || (buf->b_nwindows == 1 && buf->b_closing))
 	return;
 #endif
 
@@ -6606,7 +6885,7 @@ ex_quit(eap)
 	need_mouse_correct = TRUE;
 # endif
 	/* 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);
 #endif
     }
 }
@@ -6668,6 +6947,8 @@ ex_quit_all(eap)
 ex_close(eap)
     exarg_T	*eap;
 {
+    win_T	*win;
+    int		winnr = 0;
 # ifdef FEAT_CMDWIN
     if (cmdwin_type != 0)
 	cmdwin_result = Ctrl_C;
@@ -6678,7 +6959,21 @@ ex_close(eap)
 		&& !curbuf_locked()
 #endif
 		)
-	    ex_win_close(eap->forceit, curwin, NULL);
+	{
+	    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);
+	    }
+	}
 }
 
 # ifdef FEAT_QUICKFIX
@@ -6804,6 +7099,8 @@ ex_tabonly(eap)
 	    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 (done = 0; done < 1000; ++done)
@@ -6882,9 +7179,23 @@ tabpage_close_other(tp, forceit)
 ex_only(eap)
     exarg_T	*eap;
 {
+    win_T   *wp;
+    int	    wnr;
 # ifdef FEAT_GUI
     need_mouse_correct = TRUE;
 # endif
+    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);
 }
 
@@ -6906,6 +7217,9 @@ ex_all(eap)
 ex_hide(eap)
     exarg_T	*eap;
 {
+    win_T	*win;
+    int		winnr = 0;
+
     if (*eap->arg != NUL && check_nextcmd(eap->arg) == NULL)
 	eap->errmsg = e_invarg;
     else
@@ -6918,7 +7232,19 @@ ex_hide(eap)
 # ifdef FEAT_GUI
 	    need_mouse_correct = TRUE;
 # endif
-	    win_close(curwin, FALSE);	/* don't free buffer */
+	    if (eap->addr_count == 0)
+		win_close(curwin, FALSE);	/* don't free buffer */
+	    else {
+		for (win = firstwin; win != NULL; win = win->w_next)
+		{
+		    winnr++;
+		    if (winnr == eap->line2)
+			break;
+		}
+		if (win == NULL)
+		    win = lastwin;
+		win_close(win, FALSE);
+	    }
 	}
 #endif
     }
@@ -8652,7 +8978,7 @@ ex_copymove(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;
--- a/src/testdir/Make_amiga.mak
+++ b/src/testdir/Make_amiga.mak
@@ -36,9 +36,11 @@ SCRIPTS = test1.out test3.out test4.out 
 		test94.out test95.out test96.out test97.out test98.out \
 		test99.out test100.out test101.out test102.out test103.out \
 		test104.out test105.out test106.out test107.out \
+		test_argument_count.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
 		test_changelist.out \
+		test_close_count.out \
 		test_eval.out \
 		test_insertcount.out \
 		test_listlbr.out \
@@ -171,9 +173,11 @@ test104.out: test104.in
 test105.out: test105.in
 test106.out: test106.in
 test107.out: test107.in
+test_argument_count.out: test_argument_count.in
 test_autoformat_join.out: test_autoformat_join.in
 test_breakindent.out: test_breakindent.in
 test_changelist.out: test_changelist.in
+test_close_count.out: test_close_count.in
 test_eval.out: test_eval.in
 test_insertcount.out: test_insertcount.in
 test_listlbr.out: test_listlbr.in
--- a/src/testdir/Make_dos.mak
+++ b/src/testdir/Make_dos.mak
@@ -35,9 +35,11 @@ SCRIPTS =	test3.out test4.out test5.out 
 		test94.out test95.out test96.out test98.out test99.out \
 		test100.out test101.out test102.out test103.out test104.out \
 		test105.out test106.out  test107.out\
+		test_argument_count.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
 		test_changelist.out \
+		test_close_count.out \
 		test_eval.out \
 		test_insertcount.out \
 		test_listlbr.out \
--- a/src/testdir/Make_ming.mak
+++ b/src/testdir/Make_ming.mak
@@ -57,9 +57,11 @@ SCRIPTS =	test3.out test4.out test5.out 
 		test94.out test95.out test96.out test98.out test99.out \
 		test100.out test101.out test102.out test103.out test104.out \
 		test105.out test106.out test107.out \
+		test_argument_count.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
 		test_changelist.out \
+		test_close_count.out \
 		test_eval.out \
 		test_insertcount.out \
 		test_listlbr.out \
--- a/src/testdir/Make_os2.mak
+++ b/src/testdir/Make_os2.mak
@@ -37,9 +37,11 @@ SCRIPTS = test1.out test3.out test4.out 
 		test94.out test95.out test96.out test98.out test99.out \
 		test100.out test101.out test102.out test103.out test104.out \
 		test105.out test106.out test107.out \
+		test_argument_count.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
 		test_changelist.out \
+		test_close_count.out \
 		test_eval.out \
 		test_insertcount.out \
 		test_listlbr.out \
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -4,7 +4,7 @@
 # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
 #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
 #
-# Last change:  2014 Aug 16
+# Last change:  2014 Nov 27
 #
 # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
 # Edit the lines in the Configuration section below to select.
@@ -45,7 +45,7 @@
 # It fails because VMS does not support this feature yet.
 # WANT_MZSCH = YES
 
-# Comment out if you have ODS-5 file system                                                                                                                 
+# Comment out if you have ODS-5 file system
 # HAVE_ODS5 = YES
 
 # Comment out if you have gzip on your system
@@ -54,10 +54,10 @@
 # Comment out if you have GNU compatible diff on your system
 # HAVE_GDIFF = YES
 
-# Comment out if you have GNU compatible cksum on your system                                                                                                  
+# Comment out if you have GNU compatible cksum on your system
 # HAVE_CKSUM = YES
 
-# Comment out if you have ICONV support                                                                                                  
+# Comment out if you have ICONV support
 # HAVE_ICONV = YES
 
 # Comment out if you have LUA support
@@ -96,9 +96,11 @@ SCRIPT = test1.out  test2.out  test3.out
 	 test95.out test96.out test98.out test99.out \
 	 test100.out test101.out test103.out test104.out \
 	 test105.out test106.out test107.out \
+	 test_argument_count.out \
 	 test_autoformat_join.out \
 	 test_breakindent.out \
 	 test_changelist.out \
+	 test_close_count.out \
 	 test_eval.out \
 	 test_insertcount.out \
 	 test_listlbr.out \
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -33,9 +33,11 @@ SCRIPTS = test1.out test2.out test3.out 
 		test94.out test95.out test96.out test97.out test98.out \
 		test99.out test100.out test101.out test102.out test103.out \
 		test104.out test105.out test106.out test107.out \
+		test_argument_count.out \
 		test_autoformat_join.out \
 		test_breakindent.out \
 		test_changelist.out \
+		test_close_count.out \
 		test_eval.out \
 		test_insertcount.out \
 		test_listlbr.out \
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    530,
+/**/
     529,
 /**/
     528,
--- a/src/window.c
+++ b/src/window.c
@@ -199,14 +199,22 @@ newwindow:
     case Ctrl_Q:
     case 'q':
 		reset_VIsual_and_resel();	/* stop Visual mode */
-		do_cmdline_cmd((char_u *)"quit");
+		STRCPY(cbuf, "quit");
+		if (Prenum)
+		    vim_snprintf((char *)cbuf + 4, sizeof(cbuf) - 5,
+							    "%ld", 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");
+		STRCPY(cbuf, "close");
+		if (Prenum)
+		    vim_snprintf((char *)cbuf + 5, sizeof(cbuf) - 5,
+							       "%ld", Prenum);
+		do_cmdline_cmd(cbuf);
 		break;
 
 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
@@ -235,7 +243,11 @@ newwindow:
     case 'o':
 		CHECK_CMDWIN
 		reset_VIsual_and_resel();	/* stop Visual mode */
-		do_cmdline_cmd((char_u *)"only");
+		STRCPY(cbuf, "only");
+		if (Prenum > 0)
+		    vim_snprintf((char *)cbuf + 4, sizeof(cbuf) - 4,
+								"%ld", Prenum);
+		do_cmdline_cmd(cbuf);
 		break;
 
 /* cursor to next window with wrap around */