changeset 651:bc95c6c4bac1 v7.0191

updated for version 7.0191
author vimboss
date Wed, 01 Feb 2006 21:56:25 +0000
parents 662e40bd2be1
children 14fc0209d8c8
files runtime/autoload/ccomplete.vim runtime/autoload/javascriptcomplete.vim runtime/autoload/spellfile.vim runtime/doc/pattern.txt runtime/doc/quickfix.txt runtime/doc/spell.txt runtime/doc/tagsrch.txt runtime/doc/todo.txt runtime/doc/version7.txt runtime/ftplugin/javascript.vim runtime/scripts.vim src/eval.c src/ex_cmds.h src/fold.c
diffstat 14 files changed, 709 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/autoload/ccomplete.vim
+++ b/runtime/autoload/ccomplete.vim
@@ -1,7 +1,7 @@
 " Vim completion script
 " Language:	C
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2006 Jan 29
+" Last Change:	2006 Jan 30
 
 
 " This function is used for the 'omnifunc' option.
new file mode 100644
--- /dev/null
+++ b/runtime/autoload/javascriptcomplete.vim
@@ -0,0 +1,495 @@
+" Vim completion script
+" Language:	Java Script
+" Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change:	2006 Jan 30
+
+function! javascriptcomplete#CompleteJS(findstart, base)
+  if a:findstart
+    " locate the start of the word
+    let line = getline('.')
+    let start = col('.') - 1
+	let curline = line('.')
+	let compl_begin = col('.') - 2
+	" Bit risky but JS is rather limited language and local chars shouldn't
+	" fint way into names
+    while start >= 0 && line[start - 1] =~ '\w'
+		let start -= 1
+    endwhile
+	let b:compl_context = getline('.')[0:compl_begin]
+    return start
+  else
+	" Initialize base return lists
+    let res = []
+    let res2 = []
+	" a:base is very short - we need context
+	let context = b:compl_context
+	" Shortcontext is context without a:base, useful for checking if we are
+	" looking for objects
+	let shortcontext = substitute(context, a:base.'$', '', '')
+	unlet! b:compl_context
+
+	if shortcontext =~ '\.$'
+		" Complete methods and properties for objects
+		" DOM separate
+		let doms = ['style.']
+		" Arrays
+		let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
+		let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 
+					\ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
+					\ 'watch', 'unwatch']
+		call map(arraymeth, 'v:val."("')
+		let arrays = arrayprop + arraymeth
+
+		" Boolean - complete subset of array values
+		" properties - constructor, prototype
+		" methods    - toSource, toString, valueOf
+
+		" Date
+		" properties - constructor, prototype
+		let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
+					\ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
+					\ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
+					\ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
+					\ 'getYear', 'parse', 'parse',
+					\ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
+					\ 'setMinutes', 'setMonth', 'setSeconds',
+					\ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
+					\ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
+					\ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
+					\ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
+		call map(datemeth, 'v:val."("')
+		let dates = datemeth
+
+		" Function
+		let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
+					\ 'arity', 'constructor', 'length', 'prototype']
+		let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
+		call map(funcmeth, 'v:val."("')
+		let funcs = funcprop + funcmeth
+
+		" Math
+		let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
+		let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
+					\ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
+					\ 'watch', 'unwatch']
+		call map(mathmeth, 'v:val."("')
+		let maths = mathprop + mathmeth
+
+		" Number
+		let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 
+					\ 'constructor', 'prototype']
+		let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
+					\ 'watch', 'unwatch']
+		call map(numbmeth, 'v:val."("')
+		let numbs = numbprop + numbmeth
+
+		" Object
+		let objeprop = ['constructor', 'prototype']
+		let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
+		call map(objemeth, 'v:val."("')
+		let objes = objeprop + objemeth
+
+		" RegExp
+		let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
+		let regemeth = ['exec', 'toSource', 'toString', 'test', 'watch', 'unwatch']
+		call map(regemeth, 'v:val."("')
+		let reges = regeprop + regemeth
+
+		" String
+		let striprop = ['constructor', 'length', 'prototype']
+		let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
+					\ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
+					\ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
+					\ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
+					\ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
+		call map(strimeth, 'v:val."("')
+		let stris = striprop + strimeth
+
+		" User created properties
+		if exists("b:jsrange")
+			let file = getline(b:jsrange[0],b:jsrange[1])
+			unlet! b:jsrange
+		else
+			let file = getline(1, '$')
+		endif
+		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"')
+		let juser_props1 = join(user_props1, ' ')
+		let user_props1 = split(juser_props1, '\zethis\.')
+		unlet! juser_props1
+		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")')
+		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"')
+		call map(user_props2, 'matchstr(v:val, "\\.prototype\\.\\zs\\w\\+\\ze")')
+		let user_props = user_props1 + user_props2
+
+		" HTML DOM properties
+		" Anchors - anchor.
+		let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
+					\ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
+		let anchmeth = ['blur', 'focus']
+		call map(anchmeth, 'v:val."("')
+		let anths = anchprop + anchmeth
+		" Area - area.
+		let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
+					\ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
+		let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
+		call map(areameth, 'v:val."("')
+		let areas = areaprop + areameth
+		" Base - base.
+		let baseprop = ['href', 'id', 'target']
+		let bases = baseprop
+		" Body - body.
+		let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
+					\ 'text', 'vLink']
+		let bodys = bodyprop
+		" Document - document.
+		let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
+					\ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
+		let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
+					\ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
+					\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
+					\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
+		call map(documeth, 'v:val."("')
+		let docus = docuprop + documeth
+		" Form - form.
+		let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
+					\ 'method', 'name', 'tabIndex', 'target']
+		let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
+		call map(formmeth, 'v:val."("')
+		let forms = formprop + formmeth
+		" Frame - frame.
+		let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+					\ 'name', 'noResize', 'scrolling', 'src']
+		let frammeth = ['blur', 'focus']
+		call map(frammeth, 'v:val."("')
+		let frams = framprop + frammeth
+		" Frameset - frameset.
+		let fsetprop = ['cols', 'id', 'rows']
+		let fsetmeth = ['blur', 'focus']
+		call map(fsetmeth, 'v:val."("')
+		let fsets = fsetprop + fsetmeth
+		" History - history.
+		let histprop = ['length']
+		let histmeth = ['back', 'forward', 'go']
+		call map(histmeth, 'v:val."("')
+		let hists = histprop + histmeth
+		" Iframe - iframe.
+		let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+					\ 'name', 'scrolling', 'src', 'width']
+		let ifras = ifraprop
+		" Image - image.
+		let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
+					\ 'lowsrc', 'name', 'src', 'useMap', 'vspace', 'width']
+		let imagmeth = ['onAbort', 'onError', 'onLoad']
+		call map(imagmeth, 'v:val."("')
+		let imags = histprop + imagmeth
+		" Button - accessible only by other properties
+		let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+		let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(buttmeth, 'v:val."("')
+		let butts = buttprop + buttmeth
+		" Checkbox - accessible only by other properties
+		let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(checmeth, 'v:val."("')
+		let checs = checprop + checmeth
+		" File upload - accessible only by other properties
+		let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(filemeth, 'v:val."("')
+		let files = fileprop + filemeth
+		" Hidden - accessible only by other properties
+		let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value'] 
+		let hidds = hiddprop
+		" Password - accessible only by other properties
+		let passprop = ['accept', 'accessKey', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex', 
+					\ 'type', 'value'] 
+		let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown', 
+					\ 'onKeyPress', 'onKeyUp']
+		call map(passmeth, 'v:val."("')
+		let passs = passprop + passmeth
+		" Radio - accessible only by other properties
+		let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+		call map(radimeth, 'v:val."("')
+		let radis = radiprop + radimeth
+		" Reset - accessible only by other properties
+		let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
+		let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+		call map(resemeth, 'v:val."("')
+		let reses = reseprop + resemeth
+		" Submit - accessible only by other properties
+		let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
+		let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
+		call map(submmeth, 'v:val."("')
+		let subms = submprop + submmeth
+		" Text - accessible only by other properties
+		let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 
+					\ 'size', 'tabIndex', 'type', 'value'] 
+		let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
+					\ 'onKeyPress', 'onKeyUp', 'onSelect']
+		call map(textmeth, 'v:val."("')
+		let texts = textprop + textmeth
+		" Link - link.
+		let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
+					\ 'rel', 'rev', 'target', 'type']
+		let linkmeth = ['onLoad']
+		call map(linkmeth, 'v:val."("')
+		let links = linkprop + linkmeth
+		" Location - location.
+		let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
+					\ 'search']
+		let locameth = ['assign', 'reload', 'replace']
+		call map(locameth, 'v:val."("')
+		let locas = locaprop + locameth
+		" Meta - meta.
+		let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
+		let metas = metaprop
+		" Navigator - navigator.
+		let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
+					\ 'platform', 'userAgent']
+		let navimeth = ['javaEnabled', 'taintEnabled']
+		call map(navimeth, 'v:val."("')
+		let navis = naviprop + navimeth
+		" Object - object.
+		let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
+					\ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
+					\ 'type', 'useMap', 'vspace', 'width']
+		let objes = objeprop
+		" Option - accessible only by other properties
+		let optiprop = ['defaultSelected', 
+					\ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
+		let optis = optiprop
+		" Screen - screen.
+		let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
+		let scres = screprop
+		" Select - accessible only by other properties
+		let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name', 
+					\ 'selectedIndex', 'size', 'tabIndex', 'type', 'value'] 
+		let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
+		call map(selemeth, 'v:val."("')
+		let seles = seleprop + selemeth
+		" Style - style.
+		let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
+					\ 'backgroundPosition', 'backgroundRepeat',
+					\ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
+					\ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
+					\ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
+					\ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
+                    \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
+                    \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
+                    \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
+                    \ 'paddingLeft', 'paddingRight', 'paddingTop',
+                    \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
+                    \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
+                    \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
+					\ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
+					\ 'width',
+					\ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
+					\ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
+					\ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
+					\ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
+					\ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
+					\ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
+					\ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
+					\ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
+		let styls = stylprop
+		" Table - table.
+		let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
+					\ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
+		let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
+					\ 'deleteTFoot', 'deleteTHead', 'insertRow']
+		call map(tablmeth, 'v:val."("')
+		let tabls = tablprop + tablmeth
+		" Table data - TableData.
+		let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
+					\ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
+		let tdats = tdatprop
+		" Table row - TableRow.
+		let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
+					\ 'vAlign']
+		let trowmeth = ['deleteCell', 'insertCell']
+		call map(trowmeth, 'v:val."("')
+		let trows = trowprop + trowmeth
+		" Textarea - accessible only by other properties
+		let tareprop = ['accessKey', 'cols', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows', 
+					\ 'tabIndex', 'type', 'value'] 
+		let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
+		call map(taremeth, 'v:val."("')
+		let tares = tareprop + taremeth
+		" Window - window.
+		let windprop = ['frames', 'closed', 'defaultStatus', 'length', 'name', 'opener', 'parent',
+					\ 'self', 'status', 'top']
+		let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
+					\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
+					\ 'setTimeout']
+		call map(windmeth, 'v:val."("')
+		let winds = windprop + windmeth
+		" XMLHttpRequest - access by new xxx()
+		let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
+					\ 'status', 'statusText']
+		let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
+					\ 'send', 'setRequestHeader']
+		call map(xmlhmeth, 'v:val."("')
+		let xmlhs = xmlhprop + xmlhmeth
+
+		let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$')
+		let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
+		let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
+
+		if object_type == 'Date'
+			let values = dates
+		elseif object_type == 'Image'
+			let values = imags
+		elseif object_type == 'Array'
+			let values = arrays
+		elseif object_type == 'Boolean'
+			" TODO: a bit more than real boolean
+			let values = arrays
+		elseif object_type == 'XMLHttpRequest'
+			let values = xmlhs
+		elseif object_type == 'String'
+			let values = stris
+		endif
+
+		if !exists('values')
+		" List of properties
+		if shortcontext =~ 'Math\.$'
+			let values = maths
+		elseif shortcontext =~ 'anchor\.$'
+			let values = anths
+		elseif shortcontext =~ 'area\.$'
+			let values = areas
+		elseif shortcontext =~ 'base\.$'
+			let values = bases
+		elseif shortcontext =~ 'body\.$'
+			let values = bodys
+		elseif shortcontext =~ 'document\.$'
+			let values = docus
+		elseif shortcontext =~ 'form\.$'
+			let values = forms
+		elseif shortcontext =~ 'frameset\.$'
+			let values = fsets
+		elseif shortcontext =~ 'history\.$'
+			let values = hists
+		elseif shortcontext =~ 'iframe\.$'
+			let values = ifras
+		elseif shortcontext =~ 'image\.$'
+			let values = imags
+		elseif shortcontext =~ 'link\.$'
+			let values = links
+		elseif shortcontext =~ 'location\.$'
+			let values = locas
+		elseif shortcontext =~ 'meta\.$'
+			let values = metas
+		elseif shortcontext =~ 'navigator\.$'
+			let values = navis
+		elseif shortcontext =~ 'object\.$'
+			let values = objes
+		elseif shortcontext =~ 'screen\.$'
+			let values = scres
+		elseif shortcontext =~ 'style\.$'
+			let values = styls
+		elseif shortcontext =~ 'table\.$'
+			let values = tabls
+		elseif shortcontext =~ 'TableData\.$'
+			let values = tdats
+		elseif shortcontext =~ 'TableRow\.$'
+			let values = trows
+		elseif shortcontext =~ 'window\.$'
+			let values = winds
+		else
+			let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
+			let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
+			let values += ifras + imags + links + locas + metas + navis + objes + scres + styls
+			let values += tabls + trows + winds
+		endif
+		endif
+
+		for m in values
+			if m =~? '^'.a:base
+				call add(res, m)
+			elseif m =~? a:base
+				call add(res2, m)
+			endif
+		endfor
+
+		unlet! values
+		return res + res2
+
+	endif
+
+	if exists("b:jsrange")
+		let file = getline(b:jsrange[0],b:jsrange[1])
+		unlet! b:jsrange
+	else
+		let file = getline(1, '$')
+	endif
+
+	" Get variables data.
+	let variables = filter(copy(file), 'v:val =~ "var\\s"')
+	call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
+	call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
+	let vars = []
+	" This loop is necessary to get variable names from constructs like:
+	" var var1, var2, var3 = "something";
+	for i in range(len(variables))
+		let comma_separated = split(variables[i], ',\s*')
+		call map(comma_separated, 'matchstr(v:val, "\\w\\+")')
+		let vars += comma_separated
+	endfor
+
+	let variables = sort(vars)
+
+	" Add undeclared variables.
+	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
+	call map(undeclared_variables, 'matchstr(v:val, "^\\s*\\zs\\w\\+\\ze")')
+
+	let variables += sort(undeclared_variables)
+
+	" Get functions
+	let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
+	let arguments = copy(functions)
+	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")')
+	call map(functions, 'v:val."("')
+
+	" Get functions arguments
+	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
+	let jargs = join(arguments, ',')
+	let jargs = substitute(jargs, '\s', '', 'g')
+	let arguments = split(jargs, ',')
+
+	" Built-in functions
+	let builtin = []
+
+	" Top-level HTML DOM objects
+	let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window']
+	call map(htmldom, 'v:val."."')
+
+	" Top-level properties
+	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
+				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
+				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
+
+	" Keywords
+	let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"]
+
+	let values = variables + functions + htmldom + arguments + builtin + properties + keywords
+
+	for m in values
+		if m =~? '^'.a:base
+			call add(res, m)
+		elseif m =~? a:base
+			call add(res2, m)
+		endif
+	endfor
+
+	return res + res2
+endfunction
new file mode 100644
--- /dev/null
+++ b/runtime/autoload/spellfile.vim
@@ -0,0 +1,111 @@
+" Vim script to download a missing spell file
+" Maintainer:	Bram Moolenaar <Bram@vim.org>
+" Last Change:	2006 Feb 01
+
+if !exists('g:spellfile_URL')
+  let g:spellfile_URL = 'ftp://ftp.vim.org/pub/vim/unstable/runtime/spell'
+endif
+let s:spellfile_URL = ''    " Start with nothing so that s:donedict is reset.
+
+" This function is used for the spellfile plugin.
+function! spellfile#LoadFile(lang)
+  " If the netrw plugin isn't loaded we silently skip everything.
+  if !exists(":Nread")
+    if &verbose
+      echomsg 'spellfile#LoadFile(): Nread command is not available.'
+    endif
+    return
+  endif
+
+  " If the URL changes we try all files again.
+  if s:spellfile_URL != g:spellfile_URL
+    let s:donedict = {}
+    let s:spellfile_URL = g:spellfile_URL
+  endif
+
+  " I will say this only once!
+  if has_key(s:donedict, a:lang . &enc)
+    if &verbose
+      echomsg 'spellfile#LoadFile(): Tried this language/encoding before.'
+    endif
+    return
+  endif
+  let s:donedict[a:lang . &enc] = 1
+
+  " Find spell directories we can write in.
+  let dirlist = []
+  let dirchoices = '&Cancel'
+  for dir in split(globpath(&rtp, 'spell'), "\n")
+    if filewritable(dir) == 2
+      call add(dirlist, dir)
+      let dirchoices .= "\n&" . len(dirlist)
+    endif
+  endfor
+  if len(dirlist) == 0
+    if &verbose
+      echomsg 'spellfile#LoadFile(): There is no writable spell directory.'
+    endif
+    return
+  endif
+
+  let msg = 'Cannot find spell file for "' . a:lang . '" in ' . &enc
+  let msg .= "\nDo you want me to try downloading it?"
+  if confirm(msg, "&Yes\n&No", 2) == 1
+    let enc = &encoding
+    if enc == 'iso-8859-15'
+      let enc = 'latin1'
+    endif
+    let fname = a:lang . '.' . enc . '.spl'
+
+    " Split the window, read the file into a new buffer.
+    new
+    setlocal bin
+    echo 'Downloading ' . fname . '...'
+    exe 'Nread ' g:spellfile_URL . '/' . fname
+    if getline(2) !~ 'VIMspell'
+      " Didn't work, perhaps there is an ASCII one.
+      g/^/d
+      let fname = a:lang . '.ascii.spl'
+      echo 'Could not find it, trying ' . fname . '...'
+      exe 'Nread ' g:spellfile_URL . '/' . fname
+      if getline(2) !~ 'VIMspell'
+	echo 'Sorry, downloading failed'
+	bwipe!
+	return
+      endif
+    endif
+
+    " Delete the empty first line and mark the file unmodified.
+    1d
+    set nomod
+
+    let msg = "In which directory do you want to write the file:"
+    for i in range(len(dirlist))
+      let msg .= "\n" . (i + 1) . '. ' . dirlist[i]
+    endfor
+    let dirchoice = confirm(msg, dirchoices) - 2
+    if dirchoice >= 0
+      exe "write " . escape(dirlist[dirchoice], ' ') . '/' . fname
+
+      " Also download the .sug file, if the user wants to.
+      let msg = "Do you want me to try getting the .sug file?\n"
+      let msg .= "This will improve making suggestions for spelling mistakes,\n"
+      let msg .= "but it uses quite a bit of memory."
+      if confirm(msg, "&No\n&Yes") == 2
+	g/^/d
+	let fname = substitute(fname, '\.spl$', '.sug', '')
+	echo 'Downloading ' . fname . '...'
+	exe 'Nread ' g:spellfile_URL . '/' . fname
+	if getline(2) !~ 'VIMsug'
+	  echo 'Sorry, downloading failed'
+	else
+	  1d
+	  exe "write " . escape(dirlist[dirchoice], ' ') . '/' . fname
+	endif
+	set nomod
+      endif
+    endif
+
+    bwipe
+  endif
+endfunc
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt*   For Vim version 7.0aa.  Last change: 2006 Jan 22
+*pattern.txt*   For Vim version 7.0aa.  Last change: 2006 Feb 01
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -821,7 +821,7 @@ An ordinary atom can be:
 	{not in Vi}
 	WARNING: When the mark is moved after the pattern was used, the result
 	becomes invalid.  Vim doesn't automatically update the matches.
-	Similar to moving the cursor for |\%#|.
+	Similar to moving the cursor for "\%#" |/\%#|.
 
 						*/\%l* */\%>l* */\%<l*
 \%23l	Matches in a specific line.
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -1,4 +1,4 @@
-*quickfix.txt*  For Vim version 7.0aa.  Last change: 2006 Jan 29
+*quickfix.txt*  For Vim version 7.0aa.  Last change: 2006 Jan 30
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -311,14 +311,17 @@ You can use CTRL-W <Enter> to open a new
 
 When the quickfix window has been filled, two autocommand events are
 triggered.  First the 'filetype' option is set to "qf", which triggers the
-FileType event.  Then the BufReadPost event is triggered.  This can be used to
-perform some action on the listed errors.  Example: >
+FileType event.  Then the BufReadPost event is triggered, using "quickfix" for
+the buffer name.  This can be used to perform some action on the listed
+errors.  Example: >
 	au BufReadPost quickfix  setlocal modifiable
 		\ | silent exe 'g/^/s//\=line(".")." "/'
 		\ | setlocal nomodifiable
 This prepends the line number to each line.  Note the use of "\=" in the
 substitute string of the ":s" command, which is used to evaluate an
 expression.
+The BufWinEnter event is also triggered, again using "quickfix" for the buffer
+name.
 
 Note: Making changes in the quickfix window has no effect on the list of
 errors.  'modifiable' is off to avoid making changes.  If you delete or insert
@@ -332,7 +335,8 @@ The location list window displays the en
 open a location list window, it is created below the current window and
 displays the location list for the current window.  The location list window
 is similar to the quickfix window, except that you can have more than one
-location list window open at a time.
+location list window open at a time. When you use a location list command in
+this window, the displayed location list is used.
 
 When you select a file from the location list window, the following steps are
 used to find a window to edit the file:
--- a/runtime/doc/spell.txt
+++ b/runtime/doc/spell.txt
@@ -1,4 +1,4 @@
-*spell.txt*	For Vim version 7.0aa.  Last change: 2006 Jan 25
+*spell.txt*	For Vim version 7.0aa.  Last change: 2006 Feb 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -261,6 +261,10 @@ Only the first file is loaded, the one t
 this succeeds then additionally files with the name LL.EEE.add.spl are loaded.
 All the ones that are found are used.
 
+If no spell file is found the |SpellFileMissing| autocommand event is
+triggered.  This may trigger the |spellfile.vim| plugin to offer you
+downloading the spell file.
+
 Additionally, the files related to the names in 'spellfile' are loaded.  These
 are the files that |zg| and |zw| add good and wrong words to.
 
@@ -560,6 +564,48 @@ for the current region are included and 
 Comment lines with the name of the .spl file are used as a header above the
 words that were generated from that .spl file.
 
+
+SPELL FILE MISSING		*spell-SpellFileMissing* *spellfile.vim*
+
+If the spell file for the language you are using is not available, you will
+get an error message.  But if the "spellfile.vim" plugin is active it will
+offer you to download the spell file.  Just follow the instructions, it will
+ask you where to write the file.
+
+The plugin has a default place where to look for spell files, on the Vim ftp
+server.  If you want to use another location or another protocol, set the
+g:spellfile_URL variable to the directory that holds the spell files.  The
+|netrw| plugin is used for getting the file, look there for the speficic
+syntax of the URL.  Example: >
+	let g:spellfile_URL = 'http://ftp.vim.org/vim/runtime/spell'
+You may need to escape special characters.
+
+The plugin will only ask about downloading a language once.  If you want to
+try again anyway restart Vim, or set g:spellfile_URL to another value (e.g.,
+prepend a space).
+
+To avoid using the "spellfile.vim" plugin do this in your vimrc file: >
+
+	let loaded_spellfile_plugin = 1
+
+Instead of using the plugin you can define a |SpellFileMissing| autocommand to
+handle the missing file yourself.  You can use it like this: >
+
+	:au SpellFileMissing * call Download_spell_file(expand('<amatch>'))
+
+Thus the <amatch> item contains the name of the language.  Another important
+value is 'encoding', since every encoding has its own spell file.  With two
+exceptions:
+- For ISO-8859-15 (latin9) the name "latin1" is used (the encodings only
+  differ in characters not used in dictionary words).
+- The name "ascii" may also be used for some languages where the words use
+  only ASCII letters for most of the words.
+
+The default "spellfile.vim" plugin uses this autocommand, if you define your
+autocommand afterwars you may want to use ":au! SpellFileMissing" to overrule
+it.  If you define your autocommand before the plugin is loaded it will notice
+this and not do anything.
+
 ==============================================================================
 4. Spell file format					*spell-file-format*
 
--- a/runtime/doc/tagsrch.txt
+++ b/runtime/doc/tagsrch.txt
@@ -257,6 +257,17 @@ g CTRL-]		Like CTRL-], but use ":tjump" 
 :tl[ast][!]		Jump to last matching tag.  See |tag-!| for [!].  {not
 			in Vi}
 
+							*:lt* *:ltag*
+:lt[ag][!] [ident]	Jump to tag [ident] and add the matching tags to a new
+			location list for the current window.  [ident] can be
+			a regexp pattern, see |tag-regexp|.  When [ident] is
+			not given, the last tag name from the tag stack is
+			used.  The search pattern to locate the tag line is
+			prefixed with "\V" to escape all the special
+			characters (very nomagic). The location list showing
+			the matching tags is independent of the tag stack.
+			See |tag-!| for [!].
+			{not in Vi}
 
 When there is no other message, Vim shows which matching tag has been jumped
 to, and the number of matching tags: >
@@ -275,6 +286,7 @@ skipped and the next matching tag is use
 missing files.  When the end of the list of matches has been reached, an error
 message is given.
 
+							*tag-preview*
 The tag match list can also be used in the preview window.  The commands are
 the same as above, with a "p" prepended.
 {not available when compiled without the |+quickfix| feature}
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0aa.  Last change: 2006 Jan 29
+*todo.txt*      For Vim version 7.0aa.  Last change: 2006 Feb 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -30,8 +30,6 @@ be worked on, but only if you sponsor Vi
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Truncating error message keeps one char too many, causes an empty line.
-
 Variant of ":helpgrep" that uses a location list?  How about:
     :lhelpgrep  (use local list in help window, not current window)
     :lgrep
@@ -64,18 +62,14 @@ ccomplete / omnicomplete:
 		    struct pointer).
 - Special mappings for when the popup menu is visible?  Would allow for making
   a specific selection (e.g, methods vs variables).
-- Provide a function to popup the menu, so that an insert mode mapping can
-  start it (with a specific selection).
 
 spelling:
 - Also use the spelling dictionary for dictionary completion.
-  When 'dictionary' is  empty and/or when "kspell" is in 'complete'.
+  When 'dictionary' is empty and/or when "kspell" is in 'complete'.
 - Use runtime/cleanadd script to cleanup .add files.  When to invoke it?
   After deleting a word with "zw" and some timestamp difference perhaps?
   Store it as spell/cleanadd.vim.
 - suggestion for "KG" to "kg" when it's keepcase.
-- Autocommand event for when a spell file is missing.  Allows making a plugin
-  that fetches the file over internet.  Pattern == language.
 - Using KEEPCASE flag still allows all-upper word, docs say it doesn't.
   Don't allow it, because there is no other way to do this.
 - Implement NOSUGGEST flag (used for obscene words).
@@ -252,6 +246,8 @@ PLANNED FOR VERSION 7.0:
 	Completion in .NET framework SharpDevelop: http://www.icsharpcode.net
 
         - Pre-expand abbreviations, show which abbrevs would match?
+    - Provide a function to popup the menu, so that an insert mode mapping can
+      start it (with a specific selection).
 
 -   UNDO TREE: keep all states of the text, don't delete undo info.
     When making a change, instead of clearing any future undo (thus redo)
@@ -409,10 +405,6 @@ Also place vimtutor.bat in %windir%?
 
 Add gui_mch_browsedir() for Motif, Mac OS/X.
 
-Implement:
-    :ltag	      list of matching tags, like :tselect
-Patch from Yegappan Lakshmanan, Jan 13.
-
 HTML indenting can be slow, find out why.  Any way to do some kind of
 profiling for Vim script?  At least add a function to get the current time in
 usec.  reltime([start, [end]])
@@ -2101,14 +2093,10 @@ 6   Have a look on how Perl handles load
 
 
 Tags:
-8   Add a function that returns the line in the tags file for a matching tag.
-    Can be used to extract more info (class name, inheritance, etc.) (Rico
-    Hendriks)
 7   Count before CTRL-]: jump to N'th match
 8   Scope arguments for ":tag", e.g.: ":tag class:cPage open", like Elvis.
 8   When output of ":tselect" is long, getting the more-prompt, should be able
     to type the tag number directly.
-7   Add a tag-select window.  Works like ":cwindow".  (Michal Malecki)
 7   Add the possibility to use the "-t {tag}" argument multiple times.  Open a
     window for each tag.
 7   Make output of ":tselect" a bit nicer.  Use highlighting?
@@ -3321,8 +3309,7 @@ 7   [< to move to previous xml/html tag,
     next <li>, ]< to next </li>, [< to previous </li>.
 8   Add ":rename" command: rename the file of the current buffer and rename
     the buffer.  Buffer may be modified.
--   Perhaps ":cexpr" could read errors from a list?
-    Add %b to 'errorformat': buffer number. (Yegappan Lakshmanan / Suresh
+-   Add %b to 'errorformat': buffer number. (Yegappan Lakshmanan / Suresh
     Govindachar)
 6   In the quickfix window statusline add the command used to get the list of
     errors, e.g. ":make foo", ":grep something *.c".
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -1,4 +1,4 @@
-*version7.txt*  For Vim version 7.0aa.  Last change: 2006 Jan 28
+*version7.txt*  For Vim version 7.0aa.  Last change: 2006 Feb 01
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -449,6 +449,8 @@ Win32: The ":winpos" command now also wo
 |:caddexpr|		Add error messages from a Vim expression to an
 			existing quickfix list. (Yegappan Lakshmanan).
 
+|:ltag|			Jump to a tag and add matching tags to a location list.
+
 
 Ex command modifiers: ~
 
@@ -547,6 +549,8 @@ New autocommand events: ~
 |QuickFixCmdPost|	after :make, :grep et al. (Ciaran McCreesh)
 |SessionLoadPost|	after loading a session file. (Yegappan Lakshmanan)
 
+|SpellFileMissing|	when a spell file can't be found
+
 
 New items in search patterns: ~
 |/\%d| \%d123		search for character with decimal number
@@ -1629,4 +1633,7 @@ characters in v:this_session.
 
 ":set sta ts=8 sw=4 sts=2" deleted 4 spaces halfway a line instead of 2.
 
+In a multi-byte file the foldmarker could be recognized in the trail byte.
+(Taro Muraoka)
+
  vim:tw=78:ts=8:ft=help:norl:
new file mode 100644
--- /dev/null
+++ b/runtime/ftplugin/javascript.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin file
+" Language:	Javascript
+" Maintainer:	Bram Moolenaar (for now)
+" Last Change:  2006 Jan 30
+
+if exists("b:did_ftplugin")
+  finish
+endif
+let b:did_ftplugin = 1
+
+if exists('&ofu')
+  setlocal ofu=javascriptcomplete#CompleteJS
+endif
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types in scripts
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last change:	2005 Oct 12
+" Last change:	2006 Feb 01
 
 " This file is called by an autocommand for every file that has just been
 " loaded into a buffer.  It checks if the type of file can be recognized by
@@ -184,7 +184,7 @@ else
     " - "*** " in first line and "--- " in second line (context diff).
     " - "# It was generated by makepatch " in the second line (makepatch diff).
     " - "Index: <filename>" in the first line (CVS file)
-  elseif s:line1 =~ '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\)'
+  elseif s:line1 =~ '^\(diff\>\|Only in \|\d\+\(,\d\+\)\=[cda]\d\+\>\|# It was generated by makepatch \|Index:\s\+\f\+\r\=$\|===== \f\+ \d\+\.\d\+ vs edited\|==== //\f\+#\d\+\)'
 	\ || (s:line1 =~ '^--- ' && s:line2 =~ '^+++ ')
 	\ || (s:line1 =~ '^\* looking for ' && s:line2 =~ '^\* comparing to ')
 	\ || (s:line1 =~ '^\*\*\* ' && s:line2 =~ '^--- ')
--- a/src/eval.c
+++ b/src/eval.c
@@ -400,8 +400,6 @@ static int get_option_tv __ARGS((char_u 
 static int get_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
 static int get_lit_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
 static int get_list_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
-static list_T *list_alloc __ARGS((void));
-static void list_free __ARGS((list_T *l));
 static listitem_T *listitem_alloc __ARGS((void));
 static void listitem_free __ARGS((listitem_T *item));
 static void listitem_remove __ARGS((list_T *l, listitem_T *item));
@@ -5197,7 +5195,7 @@ failret:
  * Allocate an empty header for a list.
  * Caller should take care of the reference count.
  */
-    static list_T *
+    list_T *
 list_alloc()
 {
     list_T  *l;
@@ -5231,7 +5229,7 @@ list_unref(l)
  * Free a list, including all items it points to.
  * Ignores the reference count.
  */
-    static void
+    void
 list_free(l)
     list_T *l;
 {
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -543,6 +543,8 @@ EX(CMD_lpfile,		"lpfile",	ex_cnext,
 			RANGE|NOTADR|COUNT|TRLBAR|BANG),
 EX(CMD_lrewind,		"lrewind",	ex_cc,
 			RANGE|NOTADR|COUNT|TRLBAR|BANG),
+EX(CMD_ltag,		"ltag",	ex_tag,
+			NOTADR|TRLBAR|BANG|WORD1),
 EX(CMD_lunmap,		"lunmap",	ex_unmap,
 			EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
 EX(CMD_lwindow,		"lwindow",	ex_cwindow,
--- a/src/fold.c
+++ b/src/fold.c
@@ -3188,7 +3188,7 @@ foldlevelMarker(flp)
 		--flp->lvl_next;
 	}
 	else
-	    ++s;
+	    mb_ptr_adv(s);
     }
 
     /* The level can't go negative, must be missing a start marker. */