changeset 55:225cc00b2eda

updated for version 7.0029
author vimboss
date Mon, 03 Jan 2005 21:02:03 +0000
parents 6bfddb1d126a
children dbf53ece2e23
files runtime/doc/eval.txt runtime/doc/tags runtime/lang/menu_chinese(taiwan)_taiwan.950.vim src/ops.c src/proto/eval.pro src/version.h
diffstat 6 files changed, 276 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*      For Vim version 7.0aa.  Last change: 2004 Dec 10
+*eval.txt*      For Vim version 7.0aa.  Last change: 2005 Jan 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -29,12 +29,15 @@ 11. The sandbox		|eval-sandbox|
 ==============================================================================
 1. Variables						*variables*
 
-There are two types of variables:
-
-Number		a 32 bit signed number.
-String		a NUL terminated string of 8-bit unsigned characters.
-
-These are converted automatically, depending on how they are used.
+There are three types of variables:
+
+Number		a 32 bit signed number
+String		a NUL terminated string of 8-bit unsigned characters (bytes)
+Funcref		a reference to a function |Funcref|
+List		an ordered sequence of items |List|
+
+The Number and String types are converted automatically, depending on how they
+are used.
 
 Conversion from a Number to a String is by making the ASCII representation of
 the Number.  Examples: >
@@ -64,6 +67,63 @@ Note that in the command >
 use strlen(): >
 	:if strlen("foo")
 
+
+Function references ~
+								*Funcref*
+
+A Funcref variable is obtained with the |function()| function.  It can be used
+in an expression to invoke the function it refers to by using it in the place
+of a function name, before the parenthesis around the arguments.  Example: >
+
+	:let Fn = function("MyFunc")
+	:echo Fn()
+
+Note that this doesn't work with |:call|, because its argument is not an
+expression.
+The name of the referenced function can be obtained with |string()|.  A
+Funcref variable must start with a capital, "s:", "w:" or "b:".
+
+
+Lists ~
+								*List*
+A List is an ordered sequence of items.  An item can be of any type.  Items
+can be accessed by their index number.  Items can be added and removed at any
+position in the sequence.
+
+A List is created with a comma separated list of items in square brackets.
+Example: >
+	:let mylist = [1, 'two', 3, "four"]
+
+An item can be any expression.  Using a List for an item creates a
+two-dimensional List: >
+	:let mylist = [[11, 12], [21, 22], [31, 32]]
+
+An extra comma after the last item is ignored.
+
+An item in the List can be accessed by putting the index in square brackets
+after the List: >
+	:let item = mylist[2]		" get the third item: 3
+<
+								*list-index*
+Indexes are zero-based, thus the first item has index zero.  A negative index
+is counted from the end.  Index -1 refers to the last item in the List, -2 to
+the last but one item, etc. >
+	:let last = mylist[-1]		" get the last item: "four"
+
+A part of the List can be obtained by specifying the first and last index,
+separated by a colon in square brackets: >
+	:let smalllist = mylist[2:-1]	" get List [3, "four"]
+
+Omitting the first index is similar to zero.  Omitting the last index is
+similar to -1.  The difference is that there is no error if the items are not
+available. >
+	:let endlist = [2:]		" from item 2 to the end: [3, "four"]
+	:let shortlist = [1:1]		" List with one item: ['two']
+	:let otherlist = [:]		" make a copy
+
+
+More about variables ~
+
 If you need to know the type of a variable or expression, use the |type()|
 function.
 
@@ -122,11 +182,13 @@ Expression syntax summary, from least to
 	+ expr7			unary plus
 	expr8
 
-|expr8|	expr9[expr1]		index in String
+|expr8|	expr9[expr1]		byte of a String or item of a List
+	expr9[expr1 : expr2]	substring of a String or sublist of a List
 
 |expr9|	number			number constant
 	"string"		string constant, backslash is special
 	'string'		string constant
+	[expr1, ...]		List
 	&option			option value
 	(expr1)			nested expression
 	variable		internal variable
@@ -134,6 +196,7 @@ Expression syntax summary, from least to
 	$VAR			environment variable
 	@r			contents of register 'r'
 	function(expr1, ...)	function call
+	Funcref(expr1, ...)	function call with Funcref variable
 	func{ti}on(expr1, ...)	function call with curly braces
 
 
@@ -301,19 +364,59 @@ These three can be repeated and mixed.  
 
 expr8							*expr8*
 -----
-expr9[expr1]		index in String		*expr-[]* *E111*
-
-This results in a String that contains the expr1'th single byte from expr9.
-expr9 is used as a String, expr1 as a Number.  Note that this doesn't work for
-multi-byte encodings.
-
-Note that index zero gives the first character.  This is like it works in C.
-Careful: text column numbers start with one!  Example, to get the character
-under the cursor: >
+expr9[expr1]		item of String or List		*expr-[]* *E111*
+
+If expr9 is a Number or String this results in a String that contains the
+expr1'th single byte from expr9.  expr9 is used as a String, expr1 as a
+Number.  Note that this doesn't recognize multi-byte encodings.
+
+Index zero gives the first character.  This is like it works in C.  Careful:
+text column numbers start with one!  Example, to get the character under the
+cursor: >
 	:let c = getline(line("."))[col(".") - 1]
 
 If the length of the String is less than the index, the result is an empty
-String.
+String.  A negative index always results in an empty string (reason: backwards
+compatibility).  Use [-1:] to get the last byte.
+
+If expr9 is a List then it results the item at index expr1.  See |list-index|
+for possible index values.  If the index is out of range this results in an
+error.  Example: >
+	:let item = mylist[-1]		" get last item
+
+Generally, if a List index is equal to or higher than the length of the List,
+or more negative than the length of the List, this results in an error.
+
+expr9[expr1a : expr1b]	substring or sublist		*expr-[:]*
+
+If expr9 is a Number or String this results in the substring with the bytes
+from expr1a to and including expr1b.  expr9 is used as a String, expr1a and
+expr1b are used as a Number.  Note that this doesn't recognize multi-byte
+encodings.
+
+If expr1a is omitted zero is used.  If expr1b is omitted the length of the
+string minus one is used.
+
+A negative number can be used to measure from the end of the string.  -1 is
+the last character, -2 the last but one, etc.
+
+If an index goes out of range for the string characters are omitted.  If
+expr1b is smaller than expr1a the result is an empty string.
+
+Examples: >
+	:let c = name[-1:]		" last byte of a string
+	:let c = name[-2:-2]		" last but one byte of a string
+	:let s = line(".")[4:]		" from the fifth byte to the end
+	:let s = s[:-3]			" remove last two bytes
+
+If expr9 is a List this results in a new List with the items indicated by the
+indexes expr1a and expr1b.  This works like with a String, as explained just
+above, except that indexes out of range cause an error.  Examples: >
+	:let l = mylist[:3]		" first four items
+	:let l = mylist[4:4]		" List with one item
+	:let l = mylist[:]		" shallow copy of a List
+
+Using expr9[expr1] or expr9[expr1a : expr1b] on a Funcref results in an error.
 
 						*expr9*
 number
@@ -806,50 +909,54 @@ See |function-list| for a list grouped b
 
 USAGE				RESULT	DESCRIPTION	~
 
-append( {lnum}, {string})	Number  append {string} below line {lnum}
+append( {lnum}, {string})	Number	append {string} below line {lnum}
+append( {list}, {item})		List	append {item} to List {list}
 argc()				Number	number of files in the argument list
-argidx()			Number  current index in the argument list
+argidx()			Number	current index in the argument list
 argv( {nr})			String	{nr} entry of the argument list
 browse( {save}, {title}, {initdir}, {default})
 				String	put up a file requester
 browsedir( {title}, {initdir})  String	put up a directory requester
 bufexists( {expr})		Number	TRUE if buffer {expr} exists
-buflisted( {expr})		Number  TRUE if buffer {expr} is listed
-bufloaded( {expr})		Number  TRUE if buffer {expr} is loaded
+buflisted( {expr})		Number	TRUE if buffer {expr} is listed
+bufloaded( {expr})		Number	TRUE if buffer {expr} is loaded
 bufname( {expr})		String	Name of the buffer {expr}
 bufnr( {expr})			Number	Number of the buffer {expr}
 bufwinnr( {expr})		Number	window number of buffer {expr}
 byte2line( {byte})		Number	line number at byte count {byte}
-byteidx( {expr}, {nr})		Number  byte index of {nr}'th char in {expr}
+byteidx( {expr}, {nr})		Number	byte index of {nr}'th char in {expr}
 char2nr( {expr})		Number	ASCII value of first char in {expr}
-cindent( {lnum})		Number  C indent for line {lnum}
+cindent( {lnum})		Number	C indent for line {lnum}
 col( {expr})			Number	column nr of cursor or mark
 confirm( {msg} [, {choices} [, {default} [, {type}]]])
 				Number	number of choice picked by user
+copy( {expr})			any	make a shallow copy of {expr}
 cscope_connection( [{num} , {dbpath} [, {prepend}]])
 				Number	checks existence of cscope connection
-cursor( {lnum}, {col})		Number  position cursor at {lnum}, {col}
+cursor( {lnum}, {col})		Number	position cursor at {lnum}, {col}
+deepcopy( {expr})		any	make a full copy of {expr}
 delete( {fname})		Number	delete file {fname}
 did_filetype()			Number	TRUE if FileType autocommand event used
-diff_filler( {lnum})		Number  diff filler lines about {lnum}
-diff_hlID( {lnum}, {col})	Number  diff highlighting at {lnum}/{col}
+diff_filler( {lnum})		Number	diff filler lines about {lnum}
+diff_hlID( {lnum}, {col})	Number	diff highlighting at {lnum}/{col}
 escape( {string}, {chars})	String	escape {chars} in {string} with '\'
-eventhandler( )			Number  TRUE if inside an event handler
+eventhandler( )			Number	TRUE if inside an event handler
 executable( {expr})		Number	1 if executable {expr} exists
 exists( {expr})			Number	TRUE if {expr} exists
 expand( {expr})			String	expand special keywords in {expr}
 filereadable( {file})		Number	TRUE if {file} is a readable file
 findfile( {name}[, {path}[, {count}]])
-				String  Find fine {name} in {path}
+				String	Find fine {name} in {path}
 filewritable( {file})		Number	TRUE if {file} is a writable file
 fnamemodify( {fname}, {mods})	String	modify file name
-foldclosed( {lnum})		Number  first line of fold at {lnum} if closed
-foldclosedend( {lnum})		Number  last line of fold at {lnum} if closed
+foldclosed( {lnum})		Number	first line of fold at {lnum} if closed
+foldclosedend( {lnum})		Number	last line of fold at {lnum} if closed
 foldlevel( {lnum})		Number	fold level at {lnum}
-foldtext( )			String  line displayed for closed fold
+foldtext( )			String	line displayed for closed fold
 foreground( )			Number	bring the Vim window to the foreground
-getchar( [expr])		Number  get one character from the user
-getcharmod( )			Number  modifiers for the last typed character
+function( {name})		Funcref reference to function {name}
+getchar( [expr])		Number	get one character from the user
+getcharmod( )			Number	modifiers for the last typed character
 getbufvar( {expr}, {varname})		variable {varname} in buffer {expr}
 getcmdline()			String	return the current command-line
 getcmdpos()			Number	return cursor position in command-line
@@ -860,8 +967,8 @@ getfontname( [{name}])		String	name of f
 getftime( {fname})		Number	last modification time of file
 getftype( {fname})		String	description of type of file {fname}
 getline( {lnum})		String	line {lnum} from current buffer
-getreg( [{regname}])		String  contents of register
-getregtype( [{regname}])	String  type of register
+getreg( [{regname}])		String	contents of register
+getregtype( [{regname}])	String	type of register
 getwinposx()			Number	X coord in pixels of GUI Vim window
 getwinposy()			Number	Y coord in pixels of GUI Vim window
 getwinvar( {nr}, {varname})		variable {varname} in window {nr}
@@ -876,19 +983,21 @@ histnr( {history})		Number	highest index
 hlexists( {name})		Number	TRUE if highlight group {name} exists
 hlID( {name})			Number	syntax ID of highlight group {name}
 hostname()			String	name of the machine Vim is running on
-iconv( {expr}, {from}, {to})	String  convert encoding of {expr}
-indent( {lnum})			Number  indent of line {lnum}
+iconv( {expr}, {from}, {to})	String	convert encoding of {expr}
+indent( {lnum})			Number	indent of line {lnum}
 input( {prompt} [, {text}])	String	get input from the user
 inputdialog( {p} [, {t} [, {c}]]) String  like input() but in a GUI dialog
-inputrestore()			Number  restore typeahead
-inputsave()			Number  save and clear typeahead
+inputrestore()			Number	restore typeahead
+inputsave()			Number	save and clear typeahead
 inputsecret( {prompt} [, {text}]) String  like input() but hiding the text
+insert( {list}, {item} [, {idx}]) List	insert {item} in {list} [before {idx}]
 isdirectory( {directory})	Number	TRUE if {directory} is a directory
-libcall( {lib}, {func}, {arg})	String  call {func} in library {lib} with {arg}
+len( {expr})			Number	the length of {expr}
+libcall( {lib}, {func}, {arg})	String	call {func} in library {lib} with {arg}
 libcallnr( {lib}, {func}, {arg})  Number  idem, but return a Number
 line( {expr})			Number	line nr of cursor, last line or mark
 line2byte( {lnum})		Number	byte count of line {lnum}
-lispindent( {lnum})		Number  Lisp indent for line {lnum}
+lispindent( {lnum})		Number	Lisp indent for line {lnum}
 localtime()			Number	current time
 maparg( {name}[, {mode}])	String	rhs of mapping {name} in mode {mode}
 mapcheck( {name}[, {mode}])	String	check for mappings matching {name}
@@ -898,7 +1007,7 @@ matchend( {expr}, {pat}[, {start}[, {cou
 				Number	position where {pat} ends in {expr}
 matchstr( {expr}, {pat}[, {start}[, {count}]])
 				String	{count}'th match of {pat} in {expr}
-mode()				String  current editing mode
+mode()				String	current editing mode
 nextnonblank( {lnum})		Number	line nr of non-blank line >= {lnum}
 nr2char( {expr})		String	single char with ASCII value {expr}
 prevnonblank( {lnum})		Number	line nr of non-blank line <= {lnum}
@@ -910,29 +1019,31 @@ remote_peek( {serverid} [, {retvar}])
 remote_read( {serverid})	String	read reply string
 remote_send( {server}, {string} [, {idvar}])
 				String	send key sequence
-rename( {from}, {to})		Number  rename (move) file from {from} to {to}
-repeat( {expr}, {count})	String  repeat {expr} {count} times
-resolve( {filename})		String  get filename a shortcut points to
-search( {pattern} [, {flags}])	Number  search for {pattern}
+remove( {list}, {idx})		any	remove item {idx} from {list}
+rename( {from}, {to})		Number	rename (move) file from {from} to {to}
+repeat( {expr}, {count})	String	repeat {expr} {count} times
+resolve( {filename})		String	get filename a shortcut points to
+search( {pattern} [, {flags}])	Number	search for {pattern}
 searchpair( {start}, {middle}, {end} [, {flags} [, {skip}]])
-				Number  search for other end of start/end pair
+				Number	search for other end of start/end pair
 server2client( {clientid}, {string})
 				Number	send reply string
 serverlist()			String	get a list of available servers
 setbufvar( {expr}, {varname}, {val})	set {varname} in buffer {expr} to {val}
 setcmdpos( {pos})		Number	set cursor position in command-line
 setline( {lnum}, {line})	Number	set line {lnum} to {line}
-setreg( {n}, {v}[, {opt}])	Number  set register to value and type
+setreg( {n}, {v}[, {opt}])	Number	set register to value and type
 setwinvar( {nr}, {varname}, {val})	set {varname} in window {nr} to {val}
-simplify( {filename})		String  simplify filename as much as possible
+simplify( {filename})		String	simplify filename as much as possible
 strftime( {format}[, {time}])	String	time in specified format
 stridx( {haystack}, {needle})	Number	first index of {needle} in {haystack}
+string( {expr})			String	{expr} converted to a String
 strlen( {expr})			Number	length of the String {expr}
 strpart( {src}, {start}[, {len}])
 				String	{len} characters of {src} at {start}
 strridx( {haystack}, {needle})	Number	last index of {needle} in {haystack}
 strtrans( {expr})		String	translate string to make it printable
-submatch( {nr})			String  specific match in ":substitute"
+submatch( {nr})			String	specific match in ":substitute"
 substitute( {expr}, {pat}, {sub}, {flags})
 				String	all {pat} in {expr} replaced with {sub}
 synID( {lnum}, {col}, {trans})	Number	syntax ID at {lnum} and {col}
@@ -953,15 +1064,23 @@ wincol()			Number	window column of the c
 winheight( {nr})		Number	height of window {nr}
 winline()			Number	window line of the cursor
 winnr()				Number	number of current window
-winrestcmd()			String  returns command to restore window sizes
+winrestcmd()			String	returns command to restore window sizes
 winwidth( {nr})			Number	width of window {nr}
 
-append({lnum}, {string})				*append()*
-		Append the text {string} after line {lnum} in the current
-		buffer.  {lnum} can be zero, to insert a line before the first
-		one.  Returns 1 for failure ({lnum} out of range) or 0 for
-		success.
-
+append({expr1}, {expr2})				*append()*
+		If {expr1} is a List: Append the item {expr2} to List {expr1}.
+		Returns the resulting List. Examples: >
+			:let alist = append([1, 2, 3], item)
+			:call append(mylist, "woodstock")
+<		Note that when {expr2} is a List it is appended as a single
+		item.  Use |extend()| to concatenate Lists.
+
+		When {expr1} is not a List: Append the text {expr2} after line
+		{expr1} in the current buffer.  {expr1} can be zero, to insert
+		a line before the first one.  Returns 1 for failure ({expr1}
+		out of range or out of memory), 0 for success.  Example: >
+			:let failed = append(line('$'), "# THE END")
+<
 							*argc()*
 argc()		The result is the number of files in the argument list of the
 		current window.  See |arglist|.
@@ -1205,6 +1324,15 @@ confirm({msg} [, {choices} [, {default} 
 		don't fit, a vertical layout is used anyway.  For some systems
 		the horizontal layout is always used.
 
+							*copy()*
+copy({expr})	Make a copy of {expr}.  For Numbers and Strings this isn't
+		different from using {expr} directly.
+		When {expr} is a List a shallow copy is created.  This means
+		that the original List can be changed without changing the
+		copy, and vise versa.  But the items are identical, thus
+		changing an item changes the contents of both Lists.  Also see
+		|deepcopy()|.
+
 							*cscope_connection()*
 cscope_connection([{num} , {dbpath} [, {prepend}]])
 		Checks for the existence of a |cscope| connection.  If no
@@ -1257,10 +1385,22 @@ cursor({lnum}, {col})					*cursor()*
 		line.
 		If {col} is zero, the cursor will stay in the current column.
 
-							*delete()*
-delete({fname})	Deletes the file by the name {fname}.  The result is a Number,
+
+deepcopy({expr})					*deepcopy()*
+		Make a copy of {expr}.  For Numbers and Strings this isn't
+		different from using {expr} directly.
+		When {expr} is a List a full copy is created.  This means
+		that the original List can be changed without changing the
+		copy, and vise versa.  When an item is a List, a copy for it
+		is made, recursively.  Thus changing an item in the copy does
+		not change the contents of the original List.
+		Also see |copy()|.
+
+delete({fname})							*delete()*
+		Deletes the file by the name {fname}.  The result is a Number,
 		which is 0 if the file was deleted successfully, and non-zero
 		when the deletion failed.
+		Use |remove()| to delete an item from a List.
 
 							*did_filetype()*
 did_filetype()	Returns non-zero when autocommands are being executed and the
@@ -1545,6 +1685,10 @@ foreground()	Move the Vim window to the 
 		{only in the Win32, Athena, Motif and GTK GUI versions and the
 		Win32 console version}
 
+function({name})					*function()*
+		Return a Funcref variable that refers to function {name}.
+		{name} can be a user defined function or an internal function.
+
 getchar([expr])						*getchar()*
 		Get a single character from the user.  If it is an 8-bit
 		character, the result is a number.  Otherwise a String is
@@ -1995,12 +2139,34 @@ inputsecret({prompt} [, {text}])			*inpu
 		The result is a String, which is whatever the user actually
 		typed on the command-line in response to the issued prompt.
 
+insert({list}, {item} [, {idx}])			*insert()*
+		Insert {item} at the start of List {list}.
+		If {idx} is specified insert {item} before the item with index
+		{idx}.  If {idx} is zero it goes before the first item, just
+		like omitting {idx}.  A negative {idx} is also possible, see
+		|list-index|.  -1 inserts just before the last item.
+		Returns the resulting List. Examples: >
+			:let mylist = insert([2, 3, 5], 1)
+			:call insert(mylist, 4, -1)
+			:call insert(mylist, 6, len(mylist))
+<		The last example can be done simpler with |append()|.
+		Note that when {item} is a List it is inserted as a single
+		item.  Use |extend()| to concatenate Lists.
+
 isdirectory({directory})				*isdirectory()*
 		The result is a Number, which is non-zero when a directory
 		with the name {directory} exists.  If {directory} doesn't
 		exist, or isn't a directory, the result is FALSE.  {directory}
 		is any expression, which is used as a String.
 
+							*len()*
+len({expr})	The result is a Number, which is the length of the argument.
+		When {expr} is a String or a Number the length in bytes is
+		used, as with |strlen()|.
+		When {expr} is a List the number of items in the List is
+		returned.
+		Otherwise an error is given.
+
 						*libcall()* *E364* *E368*
 libcall({libname}, {funcname}, {argument})
 		Call function {funcname} in the run-time library {libname}
@@ -2318,6 +2484,13 @@ remote_send({server}, {string} [, {idvar
 		 \ 'server2client(expand("<client>"), "HELLO")<CR>')
 
 
+remove({list}, {idx})					*remove()*
+		Remove the item at {idx} from List {list} and return it.
+		See |list-index| for possible values of {idx}.
+		Example: >
+			:echo "last item: " . remove(mylist, -1)
+<		Use |delete()| to remove a file.
+
 rename({from}, {to})					*rename()*
 		Rename the file by the name {from} to the name {to}.  This
 		should also work to move files across file systems.  The
@@ -2595,6 +2768,13 @@ stridx({haystack}, {needle})				*stridx(
 		  :echo stridx("Starting point", "Start")    0
 		  :echo stridx("Starting point", "start")   -1
 <
+							*string()*
+string({expr})	Return {expr} converted to a String.
+			{expr} type	result ~
+			String		identical
+			Number		decimal representation
+			Funcref		name of the function
+
 							*strlen()*
 strlen({expr})	The result is a Number, which is the length of the String
 		{expr} in bytes.  If you want to count the number of
@@ -2603,6 +2783,9 @@ strlen({expr})	The result is a Number, w
 			:let len = strlen(substitute(str, ".", "x", "g"))
 
 <		Composing characters are not counted.
+		If the argument is a Number it is first converted to a String.
+		For other types an error is given.
+		Also see |len()|.
 
 strpart({src}, {start}[, {len}])			*strpart()*
 		The result is a String, which is part of {src}, starting from
@@ -3359,7 +3542,11 @@ 7. Commands						*expression-commands*
 :let {var-name}	..	List the value of variable {var-name}.  Several
 			variable names may be given.
 
-:let			List the values of all variables.
+:let			List the values of all variables.  The type of the
+			variable is indicated before the value:
+			    <nothing>	String
+				#	Number
+			    	*	Funcref
 
 							*:unlet* *:unl* *E108*
 :unl[et][!] {var-name} ...
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -3632,6 +3632,7 @@ FocusGained	autocmd.txt	/*FocusGained*
 FocusLost	autocmd.txt	/*FocusLost*
 Folding	fold.txt	/*Folding*
 FuncUndefined	autocmd.txt	/*FuncUndefined*
+Funcref	eval.txt	/*Funcref*
 G	motion.txt	/*G*
 GNOME	gui_x11.txt	/*GNOME*
 GTK	gui_x11.txt	/*GTK*
@@ -3658,6 +3659,7 @@ KVim	gui_x11.txt	/*KVim*
 Korean	mbyte.txt	/*Korean*
 L	motion.txt	/*L*
 Linux-backspace	options.txt	/*Linux-backspace*
+List	eval.txt	/*List*
 M	motion.txt	/*M*
 MDI	starting.txt	/*MDI*
 MS-DOS	os_msdos.txt	/*MS-DOS*
@@ -4277,6 +4279,7 @@ conversion-server	mbyte.txt	/*conversion
 convert-to-HTML	syntax.txt	/*convert-to-HTML*
 convert-to-XHTML	syntax.txt	/*convert-to-XHTML*
 convert-to-XML	syntax.txt	/*convert-to-XML*
+copy()	eval.txt	/*copy()*
 copy-diffs	diff.txt	/*copy-diffs*
 copy-move	change.txt	/*copy-move*
 copying	uganda.txt	/*copying*
@@ -4409,6 +4412,7 @@ debugger-integration	debugger.txt	/*debu
 debugger-support	debugger.txt	/*debugger-support*
 debugger.txt	debugger.txt	/*debugger.txt*
 dec-mouse	options.txt	/*dec-mouse*
+deepcopy()	eval.txt	/*deepcopy()*
 definition-search	tagsrch.txt	/*definition-search*
 definitions	intro.txt	/*definitions*
 delete()	eval.txt	/*delete()*
@@ -4610,6 +4614,7 @@ expr->=	eval.txt	/*expr->=*
 expr->=#	eval.txt	/*expr->=#*
 expr->=?	eval.txt	/*expr->=?*
 expr->?	eval.txt	/*expr->?*
+expr-[:]	eval.txt	/*expr-[:]*
 expr-[]	eval.txt	/*expr-[]*
 expr-barbar	eval.txt	/*expr-barbar*
 expr-env	eval.txt	/*expr-env*
@@ -4744,6 +4749,7 @@ ftplugin-name	usr_05.txt	/*ftplugin-name
 ftplugin-overrule	filetype.txt	/*ftplugin-overrule*
 ftplugin-special	usr_41.txt	/*ftplugin-special*
 ftplugins	usr_05.txt	/*ftplugins*
+function()	eval.txt	/*function()*
 function-argument	eval.txt	/*function-argument*
 function-key	intro.txt	/*function-key*
 function-list	usr_41.txt	/*function-list*
@@ -4955,6 +4961,7 @@ hebrew	hebrew.txt	/*hebrew*
 hebrew.txt	hebrew.txt	/*hebrew.txt*
 help	various.txt	/*help*
 help-context	help.txt	/*help-context*
+help-tags	tags	1
 help-translated	various.txt	/*help-translated*
 help-xterm-window	various.txt	/*help-xterm-window*
 help.txt	help.txt	/*help.txt*
@@ -5201,6 +5208,7 @@ ins-special-keys	insert.txt	/*ins-specia
 ins-special-special	insert.txt	/*ins-special-special*
 ins-textwidth	insert.txt	/*ins-textwidth*
 insert	insert.txt	/*insert*
+insert()	eval.txt	/*insert()*
 insert-index	index.txt	/*insert-index*
 insert.txt	insert.txt	/*insert.txt*
 insert_expand	insert.txt	/*insert_expand*
@@ -5271,6 +5279,7 @@ last-position-jump	eval.txt	/*last-posit
 last_buffer_nr()	eval.txt	/*last_buffer_nr()*
 lc_time-variable	eval.txt	/*lc_time-variable*
 left-right-motions	motion.txt	/*left-right-motions*
+len()	eval.txt	/*len()*
 less	various.txt	/*less*
 letter	print.txt	/*letter*
 lex-syntax	syntax.txt	/*lex-syntax*
@@ -6056,6 +6065,7 @@ status-line	windows.txt	/*status-line*
 statusmsg-variable	eval.txt	/*statusmsg-variable*
 strftime()	eval.txt	/*strftime()*
 stridx()	eval.txt	/*stridx()*
+string()	eval.txt	/*string()*
 string-match	eval.txt	/*string-match*
 strlen()	eval.txt	/*strlen()*
 strpart()	eval.txt	/*strpart()*
@@ -6483,6 +6493,7 @@ v_:	cmdline.txt	/*v_:*
 v_<	change.txt	/*v_<*
 v_<BS>	change.txt	/*v_<BS>*
 v_<Del>	change.txt	/*v_<Del>*
+v_<Esc>	visual.txt	/*v_<Esc>*
 v_=	change.txt	/*v_=*
 v_>	change.txt	/*v_>*
 v_C	change.txt	/*v_C*
new file mode 100644
--- /dev/null
+++ b/runtime/lang/menu_chinese(taiwan)_taiwan.950.vim
@@ -0,0 +1,7 @@
+" Menu Translations:	Traditional Chinese (for UNIX/Big5 Windows)
+" Last Change:		2000 Nov 11
+
+" $LANG  on Windows 95/98/NT is Chinese(Taiwan)_Taiwan.950
+" $LANG  on Windows 2000/ME is Chinese_Taiwan.950
+" Source the other one from here.
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
--- a/src/ops.c
+++ b/src/ops.c
@@ -5149,7 +5149,13 @@ write_viminfo_registers(fp)
 	if (i == TILDE_REGISTER)
 	    continue;
 #endif
+	/* Skip empty registers. */
 	num_lines = y_regs[i].y_size;
+	if (num_lines == 0
+		|| (num_lines == 1 && y_regs[i].y_type == MCHAR
+					&& STRLEN(y_regs[i].y_array[0]) == 0))
+	    continue;
+
 	if (max_kbyte > 0)
 	{
 	    /* Skip register if there is more text than the maximum size. */
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -38,8 +38,8 @@ char_u *v_throwpoint __ARGS((char_u *old
 char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg));
 char_u *get_var_value __ARGS((char_u *name));
 void new_script_vars __ARGS((scid_T id));
-void var_init __ARGS((garray_T *gap));
-void var_clear __ARGS((garray_T *gap));
+void vars_init __ARGS((garray_T *gap));
+void vars_clear __ARGS((garray_T *gap));
 void ex_echo __ARGS((exarg_T *eap));
 void ex_echohl __ARGS((exarg_T *eap));
 void ex_execute __ARGS((exarg_T *eap));
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 29)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 Dec 29, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 3)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2004 Jan 3, compiled "