3ef2ca
To: vim_dev@googlegroups.com
3ef2ca
Subject: Patch 7.4.5
3ef2ca
Fcc: outbox
3ef2ca
From: Bram Moolenaar <Bram@moolenaar.net>
3ef2ca
Mime-Version: 1.0
3ef2ca
Content-Type: text/plain; charset=UTF-8
3ef2ca
Content-Transfer-Encoding: 8bit
3ef2ca
------------
3ef2ca
3ef2ca
Patch 7.4.542
3ef2ca
Problem:    Using a range for window and buffer commands has a few problems.
3ef2ca
	    Cannot specify the type of range for a user command.
3ef2ca
Solution:   Add the -addr argument for user commands.  Fix problems. (Marcin
3ef2ca
	    Szamotulski)
3ef2ca
Files:	    src/testdir/test_command_count.in,
3ef2ca
	    src/testdir/test_command_count.ok src/testdir/Make_amiga.mak
3ef2ca
	    src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
3ef2ca
	    src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
3ef2ca
	    src/testdir/Makefile, runtime/doc/map.txt, src/Makefile,
3ef2ca
	    src/ex_cmds.h, src/ex_docmd.c, src/ex_getln.c,
3ef2ca
	    src/proto/ex_docmd.pro, src/vim.h,
3ef2ca
3ef2ca
3ef2ca
*** ../vim-7.4.541/src/testdir/test_command_count.in	2014-12-08 04:12:53.163981827 +0100
3ef2ca
--- src/testdir/test_command_count.in	2014-12-08 03:25:41.562266976 +0100
3ef2ca
***************
3ef2ca
*** 0 ****
3ef2ca
--- 1,50 ----
3ef2ca
+ Test for user command counts	    vim: set ft=vim :
3ef2ca
+ 
3ef2ca
+ STARTTEST
3ef2ca
+ :let g:lines = []
3ef2ca
+ :so tiny.vim
3ef2ca
+ :com -range RangeLines :call add(g:lines, 'Rangeg:Lines '.<line1>.' '.<line2>)
3ef2ca
+ :com -range -addr=arguments RangeArguments :call add(g:lines, 'RangeArguments '.<line1>.' '.<line2>)
3ef2ca
+ :com -range=% -addr=arguments RangeArgumentsAll :call add(g:lines, 'RangeArgumentsAll '.<line1>.' '.<line2>)
3ef2ca
+ :com -range -addr=loaded_buffers RangeLoadedBuffers :call add(g:lines, 'RangeLoadedBuffers '.<line1>.' '.<line2>)
3ef2ca
+ :com -range=% -addr=loaded_buffers RangeLoadedBuffersAll :call add(g:lines, 'RangeLoadedBuffersAll '.<line1>.' '.<line2>)
3ef2ca
+ :com -range -addr=buffers RangeBuffers :call add(g:lines, 'RangeBuffers '.<line1>.' '.<line2>)
3ef2ca
+ :com -range=% -addr=buffers RangeBuffersAll :call add(g:lines, 'RangeBuffersAll '.<line1>.' '.<line2>)
3ef2ca
+ :com -range -addr=windows RangeWindows :call add(g:lines, 'RangeWindows '.<line1>.' '.<line2>)
3ef2ca
+ :com -range=% -addr=windows RangeWindowsAll :call add(g:lines, 'RangeWindowsAll '.<line1>.' '.<line2>)
3ef2ca
+ :com -range -addr=tabs RangeTabs :call add(g:lines, 'RangeTabs '.<line1>.' '.<line2>)
3ef2ca
+ :com -range=% -addr=tabs RangeTabsAll :call add(g:lines, 'RangeTabsAll '.<line1>.' '.<line2>)
3ef2ca
+ :set hidden
3ef2ca
+ :arga a b c d
3ef2ca
+ :argdo echo "loading buffers"
3ef2ca
+ :argu 3
3ef2ca
+ :.-,$-RangeArguments
3ef2ca
+ :%RangeArguments
3ef2ca
+ :RangeArgumentsAll
3ef2ca
+ :N
3ef2ca
+ :.RangeArguments
3ef2ca
+ :split|split|split|split
3ef2ca
+ :3wincmd w
3ef2ca
+ :.,$RangeWindows
3ef2ca
+ :%RangeWindows
3ef2ca
+ :RangeWindowsAll
3ef2ca
+ :only
3ef2ca
+ :blast|bd
3ef2ca
+ :.,$RangeLoadedBuffers
3ef2ca
+ :%RangeLoadedBuffers
3ef2ca
+ :RangeLoadedBuffersAll
3ef2ca
+ :.,$RangeBuffers
3ef2ca
+ :%RangeBuffers
3ef2ca
+ :RangeBuffersAll
3ef2ca
+ :tabe|tabe|tabe|tabe
3ef2ca
+ :normal 2gt
3ef2ca
+ :.,$RangeTabs
3ef2ca
+ :%RangeTabs
3ef2ca
+ :RangeTabsAll
3ef2ca
+ :1tabonly
3ef2ca
+ :e! test.out
3ef2ca
+ :call append(0, g:lines)
3ef2ca
+ :w|qa!
3ef2ca
+ ENDTEST
3ef2ca
+ 
3ef2ca
+ 
3ef2ca
*** ../vim-7.4.541/src/testdir/test_command_count.ok	2014-12-08 04:12:53.163981827 +0100
3ef2ca
--- src/testdir/test_command_count.ok	2014-12-08 03:26:11.769943969 +0100
3ef2ca
***************
3ef2ca
*** 0 ****
3ef2ca
--- 1,17 ----
3ef2ca
+ RangeArguments 2 4
3ef2ca
+ RangeArguments 1 5
3ef2ca
+ RangeArgumentsAll 1 5
3ef2ca
+ RangeArguments 2 2
3ef2ca
+ RangeWindows 3 5
3ef2ca
+ RangeWindows 1 5
3ef2ca
+ RangeWindowsAll 1 5
3ef2ca
+ RangeLoadedBuffers 2 4
3ef2ca
+ RangeLoadedBuffers 1 4
3ef2ca
+ RangeLoadedBuffersAll 1 4
3ef2ca
+ RangeBuffers 2 5
3ef2ca
+ RangeBuffers 1 5
3ef2ca
+ RangeBuffersAll 1 5
3ef2ca
+ RangeTabs 2 5
3ef2ca
+ RangeTabs 1 5
3ef2ca
+ RangeTabsAll 1 5
3ef2ca
+ 
3ef2ca
*** ../vim-7.4.541/src/testdir/Make_amiga.mak	2014-11-27 16:22:42.742413039 +0100
3ef2ca
--- src/testdir/Make_amiga.mak	2014-12-08 03:28:30.984456524 +0100
3ef2ca
***************
3ef2ca
*** 41,46 ****
3ef2ca
--- 41,47 ----
3ef2ca
  		test_breakindent.out \
3ef2ca
  		test_changelist.out \
3ef2ca
  		test_close_count.out \
3ef2ca
+ 		test_command_count.out \
3ef2ca
  		test_eval.out \
3ef2ca
  		test_insertcount.out \
3ef2ca
  		test_listlbr.out \
3ef2ca
***************
3ef2ca
*** 178,183 ****
3ef2ca
--- 179,185 ----
3ef2ca
  test_breakindent.out: test_breakindent.in
3ef2ca
  test_changelist.out: test_changelist.in
3ef2ca
  test_close_count.out: test_close_count.in
3ef2ca
+ test_command_count.out: test_command_count.in
3ef2ca
  test_eval.out: test_eval.in
3ef2ca
  test_insertcount.out: test_insertcount.in
3ef2ca
  test_listlbr.out: test_listlbr.in
3ef2ca
*** ../vim-7.4.541/src/testdir/Make_dos.mak	2014-11-27 16:22:42.742413039 +0100
3ef2ca
--- src/testdir/Make_dos.mak	2014-12-08 03:28:43.168326713 +0100
3ef2ca
***************
3ef2ca
*** 40,45 ****
3ef2ca
--- 40,46 ----
3ef2ca
  		test_breakindent.out \
3ef2ca
  		test_changelist.out \
3ef2ca
  		test_close_count.out \
3ef2ca
+ 		test_command_count.out \
3ef2ca
  		test_eval.out \
3ef2ca
  		test_insertcount.out \
3ef2ca
  		test_listlbr.out \
3ef2ca
*** ../vim-7.4.541/src/testdir/Make_ming.mak	2014-11-27 16:22:42.742413039 +0100
3ef2ca
--- src/testdir/Make_ming.mak	2014-12-08 03:28:54.020208323 +0100
3ef2ca
***************
3ef2ca
*** 62,67 ****
3ef2ca
--- 62,68 ----
3ef2ca
  		test_breakindent.out \
3ef2ca
  		test_changelist.out \
3ef2ca
  		test_close_count.out \
3ef2ca
+ 		test_command_count.out \
3ef2ca
  		test_eval.out \
3ef2ca
  		test_insertcount.out \
3ef2ca
  		test_listlbr.out \
3ef2ca
*** ../vim-7.4.541/src/testdir/Make_os2.mak	2014-11-27 16:22:42.742413039 +0100
3ef2ca
--- src/testdir/Make_os2.mak	2014-12-08 03:29:03.304108543 +0100
3ef2ca
***************
3ef2ca
*** 42,47 ****
3ef2ca
--- 42,48 ----
3ef2ca
  		test_breakindent.out \
3ef2ca
  		test_changelist.out \
3ef2ca
  		test_close_count.out \
3ef2ca
+ 		test_command_count.out \
3ef2ca
  		test_eval.out \
3ef2ca
  		test_insertcount.out \
3ef2ca
  		test_listlbr.out \
3ef2ca
*** ../vim-7.4.541/src/testdir/Make_vms.mms	2014-11-27 16:22:42.746412995 +0100
3ef2ca
--- src/testdir/Make_vms.mms	2014-12-08 03:29:12.596009487 +0100
3ef2ca
***************
3ef2ca
*** 4,10 ****
3ef2ca
  # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
3ef2ca
  #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
3ef2ca
  #
3ef2ca
! # Last change:  2014 Nov 27
3ef2ca
  #
3ef2ca
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
3ef2ca
  # Edit the lines in the Configuration section below to select.
3ef2ca
--- 4,10 ----
3ef2ca
  # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
3ef2ca
  #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
3ef2ca
  #
3ef2ca
! # Last change:  2014 Dec 08
3ef2ca
  #
3ef2ca
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
3ef2ca
  # Edit the lines in the Configuration section below to select.
3ef2ca
***************
3ef2ca
*** 101,106 ****
3ef2ca
--- 101,107 ----
3ef2ca
  	 test_breakindent.out \
3ef2ca
  	 test_changelist.out \
3ef2ca
  	 test_close_count.out \
3ef2ca
+ 	 test_command_count.out \
3ef2ca
  	 test_eval.out \
3ef2ca
  	 test_insertcount.out \
3ef2ca
  	 test_listlbr.out \
3ef2ca
*** ../vim-7.4.541/src/testdir/Makefile	2014-11-27 16:22:42.746412995 +0100
3ef2ca
--- src/testdir/Makefile	2014-12-08 03:29:36.519753429 +0100
3ef2ca
***************
3ef2ca
*** 38,43 ****
3ef2ca
--- 38,44 ----
3ef2ca
  		test_breakindent.out \
3ef2ca
  		test_changelist.out \
3ef2ca
  		test_close_count.out \
3ef2ca
+ 		test_command_count.out \
3ef2ca
  		test_eval.out \
3ef2ca
  		test_insertcount.out \
3ef2ca
  		test_listlbr.out \
3ef2ca
*** ../vim-7.4.541/runtime/doc/map.txt	2014-02-23 23:38:58.820760280 +0100
3ef2ca
--- runtime/doc/map.txt	2014-12-08 03:33:48.569056762 +0100
3ef2ca
***************
3ef2ca
*** 1344,1349 ****
3ef2ca
--- 1358,1376 ----
3ef2ca
  Note that -range=N and -count=N are mutually exclusive - only one should be
3ef2ca
  specified.
3ef2ca
  
3ef2ca
+ 					*E889* *:command-addr*
3ef2ca
+ It is possible that the special characters in the range like ., $ or % which
3ef2ca
+ by default correspond to the current line, last line and the whole buffer,
3ef2ca
+ relate to arguments, (loaded) buffers, windows or tab pages.
3ef2ca
+ 
3ef2ca
+ Possible values are:
3ef2ca
+ 	-addr=lines		Range of lines (this is the default)
3ef2ca
+ 	-addr=arguments		Range for arguments
3ef2ca
+ 	-addr=buffers		Range for buffers (also not loaded buffers)
3ef2ca
+ 	-addr=loaded_buffers	Range for loaded buffers
3ef2ca
+ 	-addr=windows		Range for windows
3ef2ca
+ 	-addr=tabs		Range for tab pages
3ef2ca
+ 
3ef2ca
  Special cases				*:command-bang* *:command-bar*
3ef2ca
  					*:command-register* *:command-buffer*
3ef2ca
  There are some special cases as well:
3ef2ca
*** ../vim-7.4.541/src/Makefile	2014-11-27 16:22:42.738413084 +0100
3ef2ca
--- src/Makefile	2014-12-08 03:30:06.167435718 +0100
3ef2ca
***************
3ef2ca
*** 1896,1901 ****
3ef2ca
--- 1896,1902 ----
3ef2ca
  	test_breakindent \
3ef2ca
  	test_changelist \
3ef2ca
  	test_close_count \
3ef2ca
+ 	test_command_count \
3ef2ca
  	test_eval \
3ef2ca
  	test_insertcount \
3ef2ca
  	test_listlbr \
3ef2ca
*** ../vim-7.4.541/src/ex_cmds.h	2014-11-27 16:22:42.742413039 +0100
3ef2ca
--- src/ex_cmds.h	2014-12-08 03:30:59.278867940 +0100
3ef2ca
***************
3ef2ca
*** 63,69 ****
3ef2ca
  #define ADDR_WINDOWS		1
3ef2ca
  #define ADDR_ARGUMENTS		2
3ef2ca
  #define ADDR_LOADED_BUFFERS	3
3ef2ca
! #define ADDR_UNLOADED_BUFFERS	4
3ef2ca
  #define ADDR_TABS		5
3ef2ca
  
3ef2ca
  #ifndef DO_DECLARE_EXCMD
3ef2ca
--- 63,69 ----
3ef2ca
  #define ADDR_WINDOWS		1
3ef2ca
  #define ADDR_ARGUMENTS		2
3ef2ca
  #define ADDR_LOADED_BUFFERS	3
3ef2ca
! #define ADDR_BUFFERS	4
3ef2ca
  #define ADDR_TABS		5
3ef2ca
  
3ef2ca
  #ifndef DO_DECLARE_EXCMD
3ef2ca
***************
3ef2ca
*** 161,167 ****
3ef2ca
  			ADDR_LINES),
3ef2ca
  EX(CMD_buffer,		"buffer",	ex_buffer,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
3ef2ca
! 			ADDR_UNLOADED_BUFFERS),
3ef2ca
  EX(CMD_bNext,		"bNext",	ex_bprevious,
3ef2ca
  			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
3ef2ca
  			ADDR_LINES),
3ef2ca
--- 161,167 ----
3ef2ca
  			ADDR_LINES),
3ef2ca
  EX(CMD_buffer,		"buffer",	ex_buffer,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
3ef2ca
! 			ADDR_BUFFERS),
3ef2ca
  EX(CMD_bNext,		"bNext",	ex_bprevious,
3ef2ca
  			BANG|RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
3ef2ca
  			ADDR_LINES),
3ef2ca
***************
3ef2ca
*** 227,233 ****
3ef2ca
  			ADDR_LOADED_BUFFERS),
3ef2ca
  EX(CMD_bwipeout,	"bwipeout",	ex_bunload,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR,
3ef2ca
! 			ADDR_UNLOADED_BUFFERS),
3ef2ca
  EX(CMD_change,		"change",	ex_change,
3ef2ca
  			BANG|WHOLEFOLD|RANGE|COUNT|TRLBAR|CMDWIN|MODIFY,
3ef2ca
  			ADDR_LINES),
3ef2ca
--- 227,233 ----
3ef2ca
  			ADDR_LOADED_BUFFERS),
3ef2ca
  EX(CMD_bwipeout,	"bwipeout",	ex_bunload,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR,
3ef2ca
! 			ADDR_BUFFERS),
3ef2ca
  EX(CMD_change,		"change",	ex_change,
3ef2ca
  			BANG|WHOLEFOLD|RANGE|COUNT|TRLBAR|CMDWIN|MODIFY,
3ef2ca
  			ADDR_LINES),
3ef2ca
***************
3ef2ca
*** 1184,1190 ****
3ef2ca
  			ADDR_LINES),
3ef2ca
  EX(CMD_sbuffer,		"sbuffer",	ex_buffer,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
3ef2ca
! 			ADDR_UNLOADED_BUFFERS),
3ef2ca
  EX(CMD_sbNext,		"sbNext",	ex_bprevious,
3ef2ca
  			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
3ef2ca
  			ADDR_LINES),
3ef2ca
--- 1184,1190 ----
3ef2ca
  			ADDR_LINES),
3ef2ca
  EX(CMD_sbuffer,		"sbuffer",	ex_buffer,
3ef2ca
  			BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|EDITCMD|TRLBAR,
3ef2ca
! 			ADDR_BUFFERS),
3ef2ca
  EX(CMD_sbNext,		"sbNext",	ex_bprevious,
3ef2ca
  			RANGE|NOTADR|COUNT|EDITCMD|TRLBAR,
3ef2ca
  			ADDR_LINES),
3ef2ca
*** ../vim-7.4.541/src/ex_docmd.c	2014-11-30 22:51:00.629191482 +0100
3ef2ca
--- src/ex_docmd.c	2014-12-08 04:00:14.540095591 +0100
3ef2ca
***************
3ef2ca
*** 27,32 ****
3ef2ca
--- 27,33 ----
3ef2ca
      char_u	*uc_rep;	/* The command's replacement string */
3ef2ca
      long	uc_def;		/* The default value for a range/count */
3ef2ca
      int		uc_compl;	/* completion type */
3ef2ca
+     int		uc_addr_type;	/* The command's address type */
3ef2ca
  # ifdef FEAT_EVAL
3ef2ca
      scid_T	uc_scriptID;	/* SID where the command was defined */
3ef2ca
  #  ifdef FEAT_CMDL_COMPL
3ef2ca
***************
3ef2ca
*** 2136,2142 ****
3ef2ca
--- 2137,2147 ----
3ef2ca
         )
3ef2ca
  	ea.addr_type = cmdnames[(int)ea.cmdidx].cmd_addr_type;
3ef2ca
      else
3ef2ca
+ #ifdef FEAT_USR_CMDS
3ef2ca
+ 	if (ea.cmdidx != CMD_USER)
3ef2ca
+ #endif
3ef2ca
  	ea.addr_type = ADDR_LINES;
3ef2ca
+     /* ea.addr_type for user commands is set by find_ucmd */
3ef2ca
      ea.cmd = cmd;
3ef2ca
  
3ef2ca
      /* repeat for all ',' or ';' separated addresses */
3ef2ca
***************
3ef2ca
*** 2157,2163 ****
3ef2ca
  		ea.line2 = curwin->w_arg_idx + 1;
3ef2ca
  		break;
3ef2ca
  	    case ADDR_LOADED_BUFFERS:
3ef2ca
! 	    case ADDR_UNLOADED_BUFFERS:
3ef2ca
  		ea.line2 = curbuf->b_fnum;
3ef2ca
  		break;
3ef2ca
  	    case ADDR_TABS:
3ef2ca
--- 2162,2168 ----
3ef2ca
  		ea.line2 = curwin->w_arg_idx + 1;
3ef2ca
  		break;
3ef2ca
  	    case ADDR_LOADED_BUFFERS:
3ef2ca
! 	    case ADDR_BUFFERS:
3ef2ca
  		ea.line2 = curbuf->b_fnum;
3ef2ca
  		break;
3ef2ca
  	    case ADDR_TABS:
3ef2ca
***************
3ef2ca
*** 2191,2208 ****
3ef2ca
  			    buf = buf->b_prev;
3ef2ca
  			ea.line2 = buf->b_fnum;
3ef2ca
  			break;
3ef2ca
! 		    case ADDR_UNLOADED_BUFFERS:
3ef2ca
  			ea.line1 = firstbuf->b_fnum;
3ef2ca
  			ea.line2 = lastbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_WINDOWS:
3ef2ca
  		    case ADDR_TABS:
3ef2ca
! 			errormsg = (char_u *)_(e_invrange);
3ef2ca
! 			goto doend;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_ARGUMENTS:
3ef2ca
! 			ea.line1 = 1;
3ef2ca
! 			ea.line2 = ARGCOUNT;
3ef2ca
  			break;
3ef2ca
  		}
3ef2ca
  		++ea.addr_count;
3ef2ca
--- 2196,2229 ----
3ef2ca
  			    buf = buf->b_prev;
3ef2ca
  			ea.line2 = buf->b_fnum;
3ef2ca
  			break;
3ef2ca
! 		    case ADDR_BUFFERS:
3ef2ca
  			ea.line1 = firstbuf->b_fnum;
3ef2ca
  			ea.line2 = lastbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_WINDOWS:
3ef2ca
  		    case ADDR_TABS:
3ef2ca
! 			if (IS_USER_CMDIDX(ea.cmdidx))
3ef2ca
! 			{
3ef2ca
! 			    ea.line1 = 1;
3ef2ca
! 			    ea.line2 = ea.addr_type == ADDR_WINDOWS
3ef2ca
! 						  ? LAST_WIN_NR : LAST_TAB_NR;
3ef2ca
! 			}
3ef2ca
! 			else
3ef2ca
! 			{
3ef2ca
! 			    /* there is no Vim command which uses '%' and
3ef2ca
! 			     * ADDR_WINDOWS or ADDR_TABS */
3ef2ca
! 			    errormsg = (char_u *)_(e_invrange);
3ef2ca
! 			    goto doend;
3ef2ca
! 			}
3ef2ca
  			break;
3ef2ca
  		    case ADDR_ARGUMENTS:
3ef2ca
! 			if (ARGCOUNT == 0)
3ef2ca
! 			    ea.line1 = ea.line2 = 0;
3ef2ca
! 			else
3ef2ca
! 			{
3ef2ca
! 			    ea.line1 = 1;
3ef2ca
! 			    ea.line2 = ARGCOUNT;
3ef2ca
! 			}
3ef2ca
  			break;
3ef2ca
  		}
3ef2ca
  		++ea.addr_count;
3ef2ca
***************
3ef2ca
*** 2629,2636 ****
3ef2ca
  
3ef2ca
      if ((ea.argt & DFLALL) && ea.addr_count == 0)
3ef2ca
      {
3ef2ca
  	ea.line1 = 1;
3ef2ca
! 	ea.line2 = curbuf->b_ml.ml_line_count;
3ef2ca
      }
3ef2ca
  
3ef2ca
      /* accept numbered register only when no count allowed (:put) */
3ef2ca
--- 2650,2690 ----
3ef2ca
  
3ef2ca
      if ((ea.argt & DFLALL) && ea.addr_count == 0)
3ef2ca
      {
3ef2ca
+ 	buf_T	    *buf;
3ef2ca
+ 
3ef2ca
  	ea.line1 = 1;
3ef2ca
! 	switch (ea.addr_type)
3ef2ca
! 	{
3ef2ca
! 	    case ADDR_LINES:
3ef2ca
! 		ea.line2 = curbuf->b_ml.ml_line_count;
3ef2ca
! 		break;
3ef2ca
! 	    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		buf = firstbuf;
3ef2ca
! 		while (buf->b_next != NULL && buf->b_ml.ml_mfp == NULL)
3ef2ca
! 		    buf = buf->b_next;
3ef2ca
! 		ea.line1 = buf->b_fnum;
3ef2ca
! 		buf = lastbuf;
3ef2ca
! 		while (buf->b_prev != NULL && buf->b_ml.ml_mfp == NULL)
3ef2ca
! 		    buf = buf->b_prev;
3ef2ca
! 		ea.line2 = buf->b_fnum;
3ef2ca
! 		break;
3ef2ca
! 	    case ADDR_BUFFERS:
3ef2ca
! 		ea.line1 = firstbuf->b_fnum;
3ef2ca
! 		ea.line2 = lastbuf->b_fnum;
3ef2ca
! 		break;
3ef2ca
! 	    case ADDR_WINDOWS:
3ef2ca
! 		ea.line2 = LAST_WIN_NR;
3ef2ca
! 		break;
3ef2ca
! 	    case ADDR_TABS:
3ef2ca
! 		ea.line2 = LAST_TAB_NR;
3ef2ca
! 		break;
3ef2ca
! 	    case ADDR_ARGUMENTS:
3ef2ca
! 		if (ARGCOUNT == 0)
3ef2ca
! 		    ea.line1 = ea.line2 = 0;
3ef2ca
! 		else
3ef2ca
! 		    ea.line2 = ARGCOUNT;
3ef2ca
! 		break;
3ef2ca
! 	}
3ef2ca
      }
3ef2ca
  
3ef2ca
      /* accept numbered register only when no count allowed (:put) */
3ef2ca
***************
3ef2ca
*** 3211,3216 ****
3ef2ca
--- 3265,3271 ----
3ef2ca
  			eap->cmdidx = CMD_USER_BUF;
3ef2ca
  		    eap->argt = (long)uc->uc_argt;
3ef2ca
  		    eap->useridx = j;
3ef2ca
+ 		    eap->addr_type = uc->uc_addr_type;
3ef2ca
  
3ef2ca
  # ifdef FEAT_CMDL_COMPL
3ef2ca
  		    if (compl != NULL)
3ef2ca
***************
3ef2ca
*** 3839,3845 ****
3ef2ca
  			return NULL;
3ef2ca
  		    }
3ef2ca
  
3ef2ca
! 		    /* For the -complete and -nargs attributes, we complete
3ef2ca
  		     * their arguments as well.
3ef2ca
  		     */
3ef2ca
  		    if (STRNICMP(arg, "complete", p - arg) == 0)
3ef2ca
--- 3894,3900 ----
3ef2ca
  			return NULL;
3ef2ca
  		    }
3ef2ca
  
3ef2ca
! 		    /* For the -complete, -nargs and -addr attributes, we complete
3ef2ca
  		     * their arguments as well.
3ef2ca
  		     */
3ef2ca
  		    if (STRNICMP(arg, "complete", p - arg) == 0)
3ef2ca
***************
3ef2ca
*** 3854,3859 ****
3ef2ca
--- 3909,3920 ----
3ef2ca
  			xp->xp_pattern = p + 1;
3ef2ca
  			return NULL;
3ef2ca
  		    }
3ef2ca
+ 		    else if (STRNICMP(arg, "addr", p - arg) == 0)
3ef2ca
+ 		    {
3ef2ca
+ 			xp->xp_context = EXPAND_USER_ADDR_TYPE;
3ef2ca
+ 			xp->xp_pattern = p + 1;
3ef2ca
+ 			return NULL;
3ef2ca
+ 		    }
3ef2ca
  		    return NULL;
3ef2ca
  		}
3ef2ca
  		arg = skipwhite(p);
3ef2ca
***************
3ef2ca
*** 4264,4269 ****
3ef2ca
--- 4325,4331 ----
3ef2ca
      pos_T	pos;
3ef2ca
      pos_T	*fp;
3ef2ca
      linenr_T	lnum;
3ef2ca
+     buf_T	*buf;
3ef2ca
  
3ef2ca
      cmd = skipwhite(*ptr);
3ef2ca
      lnum = MAXLNUM;
3ef2ca
***************
3ef2ca
*** 4285,4291 ****
3ef2ca
  			lnum = curwin->w_arg_idx + 1;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		    case ADDR_UNLOADED_BUFFERS:
3ef2ca
  			lnum = curbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
--- 4347,4353 ----
3ef2ca
  			lnum = curwin->w_arg_idx + 1;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		    case ADDR_BUFFERS:
3ef2ca
  			lnum = curbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
***************
3ef2ca
*** 4308,4314 ****
3ef2ca
  			lnum = ARGCOUNT;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		    case ADDR_UNLOADED_BUFFERS:
3ef2ca
  			lnum = lastbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
--- 4370,4385 ----
3ef2ca
  			lnum = ARGCOUNT;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 			buf = lastbuf;
3ef2ca
! 			while (buf->b_ml.ml_mfp == NULL)
3ef2ca
! 			{
3ef2ca
! 			    if (buf->b_prev == NULL)
3ef2ca
! 				break;
3ef2ca
! 			    buf = buf->b_prev;
3ef2ca
! 			}
3ef2ca
! 			lnum = buf->b_fnum;
3ef2ca
! 			break;
3ef2ca
! 		    case ADDR_BUFFERS:
3ef2ca
  			lnum = lastbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
***************
3ef2ca
*** 4477,4483 ****
3ef2ca
  			lnum = curwin->w_arg_idx + 1;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		    case ADDR_UNLOADED_BUFFERS:
3ef2ca
  			lnum = curbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
--- 4548,4554 ----
3ef2ca
  			lnum = curwin->w_arg_idx + 1;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_LOADED_BUFFERS:
3ef2ca
! 		    case ADDR_BUFFERS:
3ef2ca
  			lnum = curbuf->b_fnum;
3ef2ca
  			break;
3ef2ca
  		    case ADDR_TABS:
3ef2ca
***************
3ef2ca
*** 4495,4501 ****
3ef2ca
  	    else
3ef2ca
  		n = getdigits(&cmd);
3ef2ca
  	    if (addr_type == ADDR_LOADED_BUFFERS
3ef2ca
! 		    || addr_type == ADDR_UNLOADED_BUFFERS)
3ef2ca
  		lnum = compute_buffer_local_count(addr_type, lnum, (i == '-') ? -1 * n : n);
3ef2ca
  	    else if (i == '-')
3ef2ca
  		lnum -= n;
3ef2ca
--- 4566,4572 ----
3ef2ca
  	    else
3ef2ca
  		n = getdigits(&cmd);
3ef2ca
  	    if (addr_type == ADDR_LOADED_BUFFERS
3ef2ca
! 		    || addr_type == ADDR_BUFFERS)
3ef2ca
  		lnum = compute_buffer_local_count(addr_type, lnum, (i == '-') ? -1 * n : n);
3ef2ca
  	    else if (i == '-')
3ef2ca
  		lnum -= n;
3ef2ca
***************
3ef2ca
*** 4531,4537 ****
3ef2ca
  			lnum = LAST_WIN_NR;
3ef2ca
  		    break;
3ef2ca
  		case ADDR_LOADED_BUFFERS:
3ef2ca
! 		case ADDR_UNLOADED_BUFFERS:
3ef2ca
  		    if (lnum < firstbuf->b_fnum)
3ef2ca
  		    {
3ef2ca
  			lnum = firstbuf->b_fnum;
3ef2ca
--- 4602,4608 ----
3ef2ca
  			lnum = LAST_WIN_NR;
3ef2ca
  		    break;
3ef2ca
  		case ADDR_LOADED_BUFFERS:
3ef2ca
! 		case ADDR_BUFFERS:
3ef2ca
  		    if (lnum < firstbuf->b_fnum)
3ef2ca
  		    {
3ef2ca
  			lnum = firstbuf->b_fnum;
3ef2ca
***************
3ef2ca
*** 5585,5598 ****
3ef2ca
  #endif
3ef2ca
  
3ef2ca
  #if defined(FEAT_USR_CMDS) || defined(PROTO)
3ef2ca
! static int	uc_add_command __ARGS((char_u *name, size_t name_len, char_u *rep, long argt, long def, int flags, int compl, char_u *compl_arg, int force));
3ef2ca
  static void	uc_list __ARGS((char_u *name, size_t name_len));
3ef2ca
! static int	uc_scan_attr __ARGS((char_u *attr, size_t len, long *argt, long *def, int *flags, int *compl, char_u **compl_arg));
3ef2ca
  static char_u	*uc_split_args __ARGS((char_u *arg, size_t *lenp));
3ef2ca
  static size_t	uc_check_code __ARGS((char_u *code, size_t len, char_u *buf, ucmd_T *cmd, exarg_T *eap, char_u **split_buf, size_t *split_len));
3ef2ca
  
3ef2ca
      static int
3ef2ca
! uc_add_command(name, name_len, rep, argt, def, flags, compl, compl_arg, force)
3ef2ca
      char_u	*name;
3ef2ca
      size_t	name_len;
3ef2ca
      char_u	*rep;
3ef2ca
--- 5656,5669 ----
3ef2ca
  #endif
3ef2ca
  
3ef2ca
  #if defined(FEAT_USR_CMDS) || defined(PROTO)
3ef2ca
! static int	uc_add_command __ARGS((char_u *name, size_t name_len, char_u *rep, long argt, long def, int flags, int compl, char_u *compl_arg, int addr_type, int force));
3ef2ca
  static void	uc_list __ARGS((char_u *name, size_t name_len));
3ef2ca
! static int	uc_scan_attr __ARGS((char_u *attr, size_t len, long *argt, long *def, int *flags, int *compl, char_u **compl_arg, int* attr_type_arg));
3ef2ca
  static char_u	*uc_split_args __ARGS((char_u *arg, size_t *lenp));
3ef2ca
  static size_t	uc_check_code __ARGS((char_u *code, size_t len, char_u *buf, ucmd_T *cmd, exarg_T *eap, char_u **split_buf, size_t *split_len));
3ef2ca
  
3ef2ca
      static int
3ef2ca
! uc_add_command(name, name_len, rep, argt, def, flags, compl, compl_arg, addr_type, force)
3ef2ca
      char_u	*name;
3ef2ca
      size_t	name_len;
3ef2ca
      char_u	*rep;
3ef2ca
***************
3ef2ca
*** 5601,5606 ****
3ef2ca
--- 5672,5678 ----
3ef2ca
      int		flags;
3ef2ca
      int		compl;
3ef2ca
      char_u	*compl_arg;
3ef2ca
+     int		addr_type;
3ef2ca
      int		force;
3ef2ca
  {
3ef2ca
      ucmd_T	*cmd = NULL;
3ef2ca
***************
3ef2ca
*** 5695,5700 ****
3ef2ca
--- 5767,5773 ----
3ef2ca
      cmd->uc_compl_arg = compl_arg;
3ef2ca
  # endif
3ef2ca
  #endif
3ef2ca
+     cmd->uc_addr_type = addr_type;
3ef2ca
  
3ef2ca
      return OK;
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 5707,5712 ****
3ef2ca
--- 5780,5802 ----
3ef2ca
  }
3ef2ca
  #endif
3ef2ca
  
3ef2ca
+ #if defined(FEAT_USR_CMDS)
3ef2ca
+ static struct
3ef2ca
+ {
3ef2ca
+     int	    expand;
3ef2ca
+     char    *name;
3ef2ca
+ } addr_type_complete[] =
3ef2ca
+ {
3ef2ca
+     {ADDR_ARGUMENTS, "arguments"},
3ef2ca
+     {ADDR_LINES, "lines"},
3ef2ca
+     {ADDR_LOADED_BUFFERS, "loaded_buffers"},
3ef2ca
+     {ADDR_TABS, "tabs"},
3ef2ca
+     {ADDR_BUFFERS, "buffers"},
3ef2ca
+     {ADDR_WINDOWS, "windows"},
3ef2ca
+     {-1, NULL}
3ef2ca
+ };
3ef2ca
+ #endif
3ef2ca
+ 
3ef2ca
  #if defined(FEAT_USR_CMDS) || defined(FEAT_EVAL) || defined(PROTO)
3ef2ca
  /*
3ef2ca
   * List of names for completion for ":command" with the EXPAND_ flag.
3ef2ca
***************
3ef2ca
*** 5794,5800 ****
3ef2ca
  
3ef2ca
  	    /* Put out the title first time */
3ef2ca
  	    if (!found)
3ef2ca
! 		MSG_PUTS_TITLE(_("\n    Name        Args Range Complete  Definition"));
3ef2ca
  	    found = TRUE;
3ef2ca
  	    msg_putchar('\n');
3ef2ca
  	    if (got_int)
3ef2ca
--- 5884,5890 ----
3ef2ca
  
3ef2ca
  	    /* Put out the title first time */
3ef2ca
  	    if (!found)
3ef2ca
! 		MSG_PUTS_TITLE(_("\n    Name        Args       Address   Complete  Definition"));
3ef2ca
  	    found = TRUE;
3ef2ca
  	    msg_putchar('\n');
3ef2ca
  	    if (got_int)
3ef2ca
***************
3ef2ca
*** 5855,5860 ****
3ef2ca
--- 5945,5964 ----
3ef2ca
  		IObuff[len++] = ' ';
3ef2ca
  	    } while (len < 11);
3ef2ca
  
3ef2ca
+ 	    /* Address Type */
3ef2ca
+ 	    for (j = 0; addr_type_complete[j].expand != -1; ++j)
3ef2ca
+ 		if (addr_type_complete[j].expand != ADDR_LINES
3ef2ca
+ 			&& addr_type_complete[j].expand == cmd->uc_addr_type)
3ef2ca
+ 		{
3ef2ca
+ 		    STRCPY(IObuff + len, addr_type_complete[j].name);
3ef2ca
+ 		    len += (int)STRLEN(IObuff + len);
3ef2ca
+ 		    break;
3ef2ca
+ 		}
3ef2ca
+ 
3ef2ca
+ 	    do {
3ef2ca
+ 		IObuff[len++] = ' ';
3ef2ca
+ 	    } while (len < 21);
3ef2ca
+ 
3ef2ca
  	    /* Completion */
3ef2ca
  	    for (j = 0; command_complete[j].expand != 0; ++j)
3ef2ca
  		if (command_complete[j].expand == cmd->uc_compl)
3ef2ca
***************
3ef2ca
*** 5866,5872 ****
3ef2ca
  
3ef2ca
  	    do {
3ef2ca
  		IObuff[len++] = ' ';
3ef2ca
! 	    } while (len < 21);
3ef2ca
  
3ef2ca
  	    IObuff[len] = '\0';
3ef2ca
  	    msg_outtrans(IObuff);
3ef2ca
--- 5970,5976 ----
3ef2ca
  
3ef2ca
  	    do {
3ef2ca
  		IObuff[len++] = ' ';
3ef2ca
! 	    } while (len < 35);
3ef2ca
  
3ef2ca
  	    IObuff[len] = '\0';
3ef2ca
  	    msg_outtrans(IObuff);
3ef2ca
***************
3ef2ca
*** 5906,5912 ****
3ef2ca
  }
3ef2ca
  
3ef2ca
      static int
3ef2ca
! uc_scan_attr(attr, len, argt, def, flags, compl, compl_arg)
3ef2ca
      char_u	*attr;
3ef2ca
      size_t	len;
3ef2ca
      long	*argt;
3ef2ca
--- 6010,6016 ----
3ef2ca
  }
3ef2ca
  
3ef2ca
      static int
3ef2ca
! uc_scan_attr(attr, len, argt, def, flags, compl, compl_arg, addr_type_arg)
3ef2ca
      char_u	*attr;
3ef2ca
      size_t	len;
3ef2ca
      long	*argt;
3ef2ca
***************
3ef2ca
*** 5914,5919 ****
3ef2ca
--- 6018,6024 ----
3ef2ca
      int		*flags;
3ef2ca
      int		*compl;
3ef2ca
      char_u	**compl_arg;
3ef2ca
+     int		*addr_type_arg;
3ef2ca
  {
3ef2ca
      char_u	*p;
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 6032,6037 ****
3ef2ca
--- 6137,6156 ----
3ef2ca
  								      == FAIL)
3ef2ca
  		return FAIL;
3ef2ca
  	}
3ef2ca
+ 	else if (STRNICMP(attr, "addr", attrlen) == 0)
3ef2ca
+ 	{
3ef2ca
+ 	    *argt |= RANGE;
3ef2ca
+ 	    if (val == NULL)
3ef2ca
+ 	    {
3ef2ca
+ 		EMSG(_("E179: argument required for -addr"));
3ef2ca
+ 		return FAIL;
3ef2ca
+ 	    }
3ef2ca
+ 	    if (parse_addr_type_arg(val, (int)vallen, argt, addr_type_arg)
3ef2ca
+ 								      == FAIL)
3ef2ca
+ 		return FAIL;
3ef2ca
+ 	    if (addr_type_arg != ADDR_LINES)
3ef2ca
+ 		*argt |= (ZEROR | NOTADR) ;
3ef2ca
+ 	}
3ef2ca
  	else
3ef2ca
  	{
3ef2ca
  	    char_u ch = attr[len];
3ef2ca
***************
3ef2ca
*** 6060,6065 ****
3ef2ca
--- 6179,6185 ----
3ef2ca
      int	    flags = 0;
3ef2ca
      int	    compl = EXPAND_NOTHING;
3ef2ca
      char_u  *compl_arg = NULL;
3ef2ca
+     int	    addr_type_arg = ADDR_LINES;
3ef2ca
      int	    has_attr = (eap->arg[0] == '-');
3ef2ca
      int	    name_len;
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 6070,6076 ****
3ef2ca
      {
3ef2ca
  	++p;
3ef2ca
  	end = skiptowhite(p);
3ef2ca
! 	if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg)
3ef2ca
  		== FAIL)
3ef2ca
  	    return;
3ef2ca
  	p = skipwhite(end);
3ef2ca
--- 6190,6196 ----
3ef2ca
      {
3ef2ca
  	++p;
3ef2ca
  	end = skiptowhite(p);
3ef2ca
! 	if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, &addr_type_arg)
3ef2ca
  		== FAIL)
3ef2ca
  	    return;
3ef2ca
  	p = skipwhite(end);
3ef2ca
***************
3ef2ca
*** 6111,6117 ****
3ef2ca
      }
3ef2ca
      else
3ef2ca
  	uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
3ef2ca
! 								eap->forceit);
3ef2ca
  }
3ef2ca
  
3ef2ca
  /*
3ef2ca
--- 6231,6237 ----
3ef2ca
      }
3ef2ca
      else
3ef2ca
  	uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
3ef2ca
! 								addr_type_arg, eap->forceit);
3ef2ca
  }
3ef2ca
  
3ef2ca
  /*
3ef2ca
***************
3ef2ca
*** 6652,6657 ****
3ef2ca
--- 6772,6788 ----
3ef2ca
  }
3ef2ca
  
3ef2ca
  /*
3ef2ca
+  * Function given to ExpandGeneric() to obtain the list of user address type names.
3ef2ca
+  */
3ef2ca
+     char_u *
3ef2ca
+ get_user_cmd_addr_type(xp, idx)
3ef2ca
+     expand_T	*xp UNUSED;
3ef2ca
+     int		idx;
3ef2ca
+ {
3ef2ca
+     return (char_u *)addr_type_complete[idx].name;
3ef2ca
+ }
3ef2ca
+ 
3ef2ca
+ /*
3ef2ca
   * Function given to ExpandGeneric() to obtain the list of user command
3ef2ca
   * attributes.
3ef2ca
   */
3ef2ca
***************
3ef2ca
*** 6661,6668 ****
3ef2ca
      int		idx;
3ef2ca
  {
3ef2ca
      static char *user_cmd_flags[] =
3ef2ca
! 	{"bang", "bar", "buffer", "complete", "count",
3ef2ca
! 	    "nargs", "range", "register"};
3ef2ca
  
3ef2ca
      if (idx >= (int)(sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0])))
3ef2ca
  	return NULL;
3ef2ca
--- 6792,6799 ----
3ef2ca
      int		idx;
3ef2ca
  {
3ef2ca
      static char *user_cmd_flags[] =
3ef2ca
! 	{"addr", "bang", "bar", "buffer", "complete",
3ef2ca
! 	    "count", "nargs", "range", "register"};
3ef2ca
  
3ef2ca
      if (idx >= (int)(sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0])))
3ef2ca
  	return NULL;
3ef2ca
***************
3ef2ca
*** 6696,6701 ****
3ef2ca
--- 6827,6869 ----
3ef2ca
  }
3ef2ca
  # endif /* FEAT_CMDL_COMPL */
3ef2ca
  
3ef2ca
+ /*
3ef2ca
+  * Parse address type argument
3ef2ca
+  */
3ef2ca
+     int
3ef2ca
+ parse_addr_type_arg(value, vallen, argt, addr_type_arg)
3ef2ca
+     char_u	*value;
3ef2ca
+     int		vallen;
3ef2ca
+     long	*argt;
3ef2ca
+     int		*addr_type_arg;
3ef2ca
+ {
3ef2ca
+     int	    i, a, b;
3ef2ca
+     for (i = 0; addr_type_complete[i].expand != -1; ++i)
3ef2ca
+     {
3ef2ca
+ 	a = (int)STRLEN(addr_type_complete[i].name) == vallen;
3ef2ca
+ 	b = STRNCMP(value, addr_type_complete[i].name, vallen) == 0;
3ef2ca
+ 	if (a && b)
3ef2ca
+ 	{
3ef2ca
+ 	    *addr_type_arg = addr_type_complete[i].expand;
3ef2ca
+ 	    break;
3ef2ca
+ 	}
3ef2ca
+     }
3ef2ca
+ 
3ef2ca
+     if (addr_type_complete[i].expand == -1)
3ef2ca
+     {
3ef2ca
+ 	char_u	*err = value;
3ef2ca
+ 	for (i=0; err[i] == NUL || !vim_iswhite(err[i]); i++);
3ef2ca
+ 	err[i] = NUL;
3ef2ca
+ 	EMSG2(_("E180: Invalid address type value: %s"), err);
3ef2ca
+ 	return FAIL;
3ef2ca
+     }
3ef2ca
+ 
3ef2ca
+     if (*addr_type_arg != ADDR_LINES)
3ef2ca
+ 	*argt |= NOTADR;
3ef2ca
+ 
3ef2ca
+     return OK;
3ef2ca
+ }
3ef2ca
+ 
3ef2ca
  #endif	/* FEAT_USR_CMDS */
3ef2ca
  
3ef2ca
  #if defined(FEAT_USR_CMDS) || defined(FEAT_EVAL) || defined(PROTO)
3ef2ca
*** ../vim-7.4.541/src/ex_getln.c	2014-09-09 18:45:45.884551705 +0200
3ef2ca
--- src/ex_getln.c	2014-12-08 03:30:59.286867854 +0100
3ef2ca
***************
3ef2ca
*** 4697,4702 ****
3ef2ca
--- 4697,4703 ----
3ef2ca
  #endif
3ef2ca
  #ifdef FEAT_USR_CMDS
3ef2ca
  	    {EXPAND_USER_COMMANDS, get_user_commands, FALSE, TRUE},
3ef2ca
+ 	    {EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, FALSE, TRUE},
3ef2ca
  	    {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
3ef2ca
  	    {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE},
3ef2ca
  	    {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE},
3ef2ca
*** ../vim-7.4.541/src/proto/ex_docmd.pro	2014-04-01 17:49:40.140891378 +0200
3ef2ca
--- src/proto/ex_docmd.pro	2014-12-08 03:55:53.314888997 +0100
3ef2ca
***************
3ef2ca
*** 19,27 ****
3ef2ca
--- 19,29 ----
3ef2ca
  void ex_comclear __ARGS((exarg_T *eap));
3ef2ca
  void uc_clear __ARGS((garray_T *gap));
3ef2ca
  char_u *get_user_commands __ARGS((expand_T *xp, int idx));
3ef2ca
+ char_u *get_user_cmd_addr_type __ARGS((expand_T *xp, int idx));
3ef2ca
  char_u *get_user_cmd_flags __ARGS((expand_T *xp, int idx));
3ef2ca
  char_u *get_user_cmd_nargs __ARGS((expand_T *xp, int idx));
3ef2ca
  char_u *get_user_cmd_complete __ARGS((expand_T *xp, int idx));
3ef2ca
+ int parse_addr_type_arg __ARGS((char_u *value, int vallen, long *argt, int *addr_type_arg));
3ef2ca
  int parse_compl_arg __ARGS((char_u *value, int vallen, int *complp, long *argt, char_u **compl_arg));
3ef2ca
  void not_exiting __ARGS((void));
3ef2ca
  void tabpage_close __ARGS((int forceit));
3ef2ca
***************
3ef2ca
*** 43,48 ****
3ef2ca
--- 45,51 ----
3ef2ca
  void post_chdir __ARGS((int local));
3ef2ca
  void ex_cd __ARGS((exarg_T *eap));
3ef2ca
  void do_sleep __ARGS((long msec));
3ef2ca
+ void ex_may_print __ARGS((exarg_T *eap));
3ef2ca
  int vim_mkdir_emsg __ARGS((char_u *name, int prot));
3ef2ca
  FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
3ef2ca
  void update_topline_cursor __ARGS((void));
3ef2ca
***************
3ef2ca
*** 54,58 ****
3ef2ca
  int put_line __ARGS((FILE *fd, char *s));
3ef2ca
  void dialog_msg __ARGS((char_u *buff, char *format, char_u *fname));
3ef2ca
  char_u *get_behave_arg __ARGS((expand_T *xp, int idx));
3ef2ca
- void ex_may_print __ARGS((exarg_T *eap));
3ef2ca
  /* vim: set ft=c : */
3ef2ca
--- 57,60 ----
3ef2ca
*** ../vim-7.4.541/src/vim.h	2014-11-27 19:14:45.080940970 +0100
3ef2ca
--- src/vim.h	2014-12-08 03:30:59.290867811 +0100
3ef2ca
***************
3ef2ca
*** 798,803 ****
3ef2ca
--- 798,804 ----
3ef2ca
  #define EXPAND_HISTORY		41
3ef2ca
  #define EXPAND_USER		42
3ef2ca
  #define EXPAND_SYNTIME		43
3ef2ca
+ #define EXPAND_USER_ADDR_TYPE	44
3ef2ca
  
3ef2ca
  /* Values for exmode_active (0 is no exmode) */
3ef2ca
  #define EXMODE_NORMAL		1
3ef2ca
*** ../vim-7.4.541/src/version.c	2014-12-07 00:18:27.528202992 +0100
3ef2ca
--- src/version.c	2014-12-08 03:32:08.402128425 +0100
3ef2ca
***************
3ef2ca
*** 743,744 ****
3ef2ca
--- 743,746 ----
3ef2ca
  {   /* Add new patch number below this line */
3ef2ca
+ /**/
3ef2ca
+     542,
3ef2ca
  /**/
3ef2ca
3ef2ca
-- 
3ef2ca
CRONE:  Who sent you?
3ef2ca
ARTHUR: The Knights Who Say GNU!
3ef2ca
CRONE:  Aaaagh!  (she looks around in rear) No!  We have no licenses here.
3ef2ca
           "Monty Python and the Holy editor wars" PYTHON (MONTY) SOFTWARE LTD
3ef2ca
3ef2ca
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
3ef2ca
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
3ef2ca
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
3ef2ca
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///