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