summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2006-02-08 09:20:24 +0000
committerBram Moolenaar <Bram@vim.org>2006-02-08 09:20:24 +0000
commit8b6144bdfe9efccab5045ebef9f3d5dcf5ee9d00 (patch)
tree51d8d6df519d53d4124f3155bb2c3bcbca450226 /runtime
parent9f2c6e1deb931db29f9d3d6e1113cd1ccc835d21 (diff)
updated for version 7.0194v7.0194
Diffstat (limited to 'runtime')
-rw-r--r--runtime/autoload/ccomplete.vim17
-rw-r--r--runtime/autoload/htmlcomplete.vim130
-rw-r--r--runtime/autoload/javascriptcomplete.vim207
-rw-r--r--runtime/autoload/xmlcomplete.vim6
-rw-r--r--runtime/doc/index.txt1
-rw-r--r--runtime/doc/insert.txt95
-rw-r--r--runtime/doc/netbeans.txt12
-rw-r--r--runtime/doc/tags3
-rw-r--r--runtime/doc/todo.txt21
-rw-r--r--runtime/doc/various.txt9
-rw-r--r--runtime/doc/version7.txt36
-rw-r--r--runtime/ftplugin/lprolog.vim6
-rw-r--r--runtime/ftplugin/ocaml.vim3
-rw-r--r--runtime/syntax/dot.vim6
-rw-r--r--runtime/syntax/lprolog.vim6
-rw-r--r--runtime/syntax/sh.vim8
-rw-r--r--runtime/syntax/sml.vim6
-rw-r--r--runtime/syntax/vim.vim19
18 files changed, 431 insertions, 160 deletions
diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim
index 5e0c2aea35..7a840b12e5 100644
--- 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 Feb 03
+" Last Change: 2006 Feb 06
" This function is used for the 'omnifunc' option.
@@ -213,22 +213,29 @@ endfunction
" If it is a variable we may add "." or "->". Don't do it for other types,
" such as a typedef, by not including the info that s:GetAddition() uses.
function! s:Tag2item(val)
+ let x = substitute(a:val['cmd'], '^/^', '', '')
+ let x = substitute(x, '$/$', '', '')
+ let x = substitute(x, a:val['name'], '@@', '')
if has_key(a:val, "kind")
if a:val["kind"] == 'v'
- return {'match': a:val['name'], 'tagline': "\t" . a:val['cmd'], 'dict': a:val}
+ return {'match': a:val['name'], 'tagline': "\t" . a:val['cmd'], 'dict': a:val, 'extra': x}
endif
if a:val["kind"] == 'f'
- return {'match': a:val['name'] . '(', 'tagline': ""}
+ return {'match': a:val['name'] . '(', 'tagline': "", 'extra': x}
endif
endif
- return {'match': a:val['name'], 'tagline': ''}
+ return {'match': a:val['name'], 'tagline': '', 'extra': x}
endfunction
" Turn a match item "val" into an item for completion.
" "val['match']" is the matching item.
" "val['tagline']" is the tagline in which the last part was found.
function! s:Tagline2item(val, brackets)
- return a:val['match'] . a:brackets . s:GetAddition(a:val['tagline'], a:val['match'], [a:val], a:brackets == '')
+ let word = a:val['match'] . a:brackets . s:GetAddition(a:val['tagline'], a:val['match'], [a:val], a:brackets == '')
+ if has_key(a:val, 'extra')
+ return {'word': word, 'menu': a:val['extra']}
+ endif
+ return {'word': word, 'menu': substitute(a:val['tagline'], word, '@@', '')}
endfunction
diff --git a/runtime/autoload/htmlcomplete.vim b/runtime/autoload/htmlcomplete.vim
index cf76e69cc8..a6295373ed 100644
--- a/runtime/autoload/htmlcomplete.vim
+++ b/runtime/autoload/htmlcomplete.vim
@@ -1,7 +1,7 @@
" Vim completion script
" Language: XHTML 1.0 Strict
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2006 Jan 30
+" Last Change: 2006 Feb 6
function! htmlcomplete#CompleteTags(findstart, base)
if a:findstart
@@ -13,11 +13,14 @@ function! htmlcomplete#CompleteTags(findstart, base)
while start >= 0 && line[start - 1] =~ '\(\k\|[:.-]\)'
let start -= 1
endwhile
+ " Handling of entities {{{
if start >= 0 && line[start - 1] =~ '&'
let b:entitiescompl = 1
let b:compl_context = ''
return start
endif
+ " }}}
+ " Handling of <style> tag {{{
let stylestart = searchpair('<style\>', '', '<\/style\>', "bnW")
let styleend = searchpair('<style\>', '', '<\/style\>', "nW")
if stylestart != 0 && styleend != 0
@@ -29,6 +32,8 @@ function! htmlcomplete#CompleteTags(findstart, base)
endwhile
endif
endif
+ " }}}
+ " Handling of <script> tag {{{
let scriptstart = searchpair('<script\>', '', '<\/script\>', "bnW")
let scriptend = searchpair('<script\>', '', '<\/script\>', "nW")
if scriptstart != 0 && scriptend != 0
@@ -36,16 +41,44 @@ function! htmlcomplete#CompleteTags(findstart, base)
let start = col('.') - 1
let b:jscompl = 1
let b:jsrange = [scriptstart, scriptend]
- while start >= 0 && line[start - 1] =~ '\(\k\|-\)'
+ while start >= 0 && line[start - 1] =~ '\w'
let start -= 1
endwhile
+ " We are inside of <script> tag. But we should also get contents
+ " of all linked external files and (secondary, less probably) other <script> tags
+ " This logic could possible be done in separate function - may be
+ " reused in events scripting (also with option could be reused for
+ " CSS
+ let b:js_extfiles = []
+ let l = line('.')
+ let c = col('.')
+ call cursor(1,1)
+ while search('<\@<=script\>', 'W') && line('.') <= l
+ if synIDattr(synID(line('.'),col('.')-1,0),"name") !~? 'comment'
+ let sname = matchstr(getline('.'), '<script[^>]*src\s*=\s*\([''"]\)\zs.\{-}\ze\1')
+ if filereadable(sname)
+ let b:js_extfiles += readfile(sname)
+ endif
+ endif
+ endwhile
+ call cursor(1,1)
+ let js_scripttags = []
+ while search('<script\>', 'W') && line('.') < l
+ if matchstr(getline('.'), '<script[^>]*src') == ''
+ let js_scripttag = getline(line('.'), search('</script>', 'W'))
+ let js_scripttags += js_scripttag
+ endif
+ endwhile
+ let b:js_extfiles += js_scripttags
+ call cursor(l,c)
+ unlet! l c
endif
endif
+ " }}}
if !exists("b:csscompl") && !exists("b:jscompl")
let b:compl_context = getline('.')[0:(compl_begin)]
if b:compl_context !~ '<[^>]*$'
- " Look like we may have broken tag. Check previous lines. Up to
- " 10?
+ " Look like we may have broken tag. Check previous lines.
let i = 1
while 1
let context_line = getline(curline-i)
@@ -65,6 +98,14 @@ function! htmlcomplete#CompleteTags(findstart, base)
unlet! i
endif
let b:compl_context = matchstr(b:compl_context, '.*\zs<.*')
+ " Return proper start for on-events. Without that beginning of
+ " completion will be badly reported
+ if b:compl_context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
+ let start = col('.') - 1
+ while start >= 0 && line[start - 1] =~ '\w'
+ let start -= 1
+ endwhile
+ endif
else
let b:compl_context = getline('.')[0:compl_begin]
endif
@@ -76,14 +117,15 @@ function! htmlcomplete#CompleteTags(findstart, base)
" a:base is very short - we need context
let context = b:compl_context
" Check if we should do CSS completion inside of <style> tag
+ " or JS completion inside of <script> tag
if exists("b:csscompl")
unlet! b:csscompl
let context = b:compl_context
+ unlet! b:compl_context
return csscomplete#CompleteCSS(0, context)
elseif exists("b:jscompl")
unlet! b:jscompl
- let context = b:compl_context
- return javascriptcomplete#CompleteJS(0, context)
+ return javascriptcomplete#CompleteJS(0, a:base)
else
if len(b:compl_context) == 0 && !exists("b:entitiescompl")
return []
@@ -91,7 +133,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
let context = matchstr(b:compl_context, '.\zs.*')
endif
unlet! b:compl_context
- " Make entities completion
+ " Entities completion {{{
if exists("b:entitiescompl")
unlet! b:entitiescompl
@@ -122,6 +164,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
endif
+ " }}}
if context =~ '>'
" Generally if context contains > it means we are outside of tag and
" should abandon action - with one exception: <style> span { bo
@@ -142,13 +185,11 @@ function! htmlcomplete#CompleteTags(findstart, base)
\ "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup"]
let focus = ["accesskey", "tabindex", "onfocus", "onblur"]
let coregroup = coreattrs + i18n + events
- " find tags matching with "context"
" If context contains > it means we are already outside of tag and we
" should abandon action
" If context contains white space it is attribute.
- " It could be also value of attribute...
- " We have to get first word to offer
- " proper completions
+ " It can be also value of attribute.
+ " We have to get first word to offer proper completions
if context == ''
let tag = ''
else
@@ -160,11 +201,12 @@ function! htmlcomplete#CompleteTags(findstart, base)
" 1. Events attributes
if context =~ '\s'
" Sort out style, class, and on* cases
- if context =~ "\\(on[a-z]*\\|id\\|style\\|class\\)\\s*=\\s*[\"']"
- if context =~ "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
- if context =~ "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ if context =~? "\\(on[a-z]*\\|id\\|style\\|class\\)\\s*=\\s*[\"']"
+ " Id, class completion {{{
+ if context =~? "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ if context =~? "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
let search_for = "class"
- elseif context =~ "id\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ elseif context =~? "id\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
let search_for = "id"
endif
" Handle class name completion
@@ -327,17 +369,59 @@ function! htmlcomplete#CompleteTags(findstart, base)
return res + res2
- elseif context =~ "style\\s*=\\s*[\"'][^\"']*$"
+ elseif context =~? "style\\s*=\\s*[\"'][^\"']*$"
return csscomplete#CompleteCSS(0, context)
endif
- let stripbase = matchstr(context, ".*\\(on[a-z]*\\|style\\|class\\)\\s*=\\s*[\"']\\zs.*")
+ " }}}
+ " Complete on-events {{{
+ if context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
+ " We have to:
+ " 1. Find external files
+ let b:js_extfiles = []
+ let l = line('.')
+ let c = col('.')
+ call cursor(1,1)
+ while search('<\@<=script\>', 'W') && line('.') <= l
+ if synIDattr(synID(line('.'),col('.')-1,0),"name") !~? 'comment'
+ let sname = matchstr(getline('.'), '<script[^>]*src\s*=\s*\([''"]\)\zs.\{-}\ze\1')
+ if filereadable(sname)
+ let b:js_extfiles += readfile(sname)
+ endif
+ endif
+ endwhile
+ " 2. Find at least one <script> tag
+ call cursor(1,1)
+ let js_scripttags = []
+ while search('<script\>', 'W') && line('.') < l
+ if matchstr(getline('.'), '<script[^>]*src') == ''
+ let js_scripttag = getline(line('.'), search('</script>', 'W'))
+ let js_scripttags += js_scripttag
+ endif
+ endwhile
+ let b:js_extfiles += js_scripttags
+
+ " 3. Proper call for javascriptcomplete#CompleteJS
+ call cursor(l,c)
+ let js_context = matchstr(a:base, '\w\+$')
+ let js_shortcontext = substitute(a:base, js_context.'$', '', '')
+ let b:compl_context = context
+ let b:jsrange = [l, l]
+ unlet! l c
+ "return map(javascriptcomplete#CompleteJS(0, js_context), 'js_shortcontext.v:val')
+ return javascriptcomplete#CompleteJS(0, js_context)
+
+ endif
+
+ " }}}
+ let stripbase = matchstr(context, ".*\\(on[a-zA-Z]*\\|style\\|class\\)\\s*=\\s*[\"']\\zs.*")
" Now we have context stripped from all chars up to style/class.
" It may fail with some strange style value combinations.
if stripbase !~ "[\"']"
return []
endif
endif
+ " Value of attribute completion {{{
" If attr contains =\s*[\"'] we catched value of attribute
if attr =~ "=\s*[\"']"
" Let do attribute specific completion
@@ -413,6 +497,8 @@ function! htmlcomplete#CompleteTags(findstart, base)
return res + res2
endif
+ " }}}
+ " Attribute completion {{{
" Shorten context to not include last word
let sbase = matchstr(context, '.*\ze\s.*')
if tag =~ '^\(abbr\|acronym\|address\|b\|bdo\|big\|caption\|cite\|code\|dd\|dfn\|div\|dl\|dt\|em\|fieldset\|h\d\|hr\|i\|kbd\|li\|noscript\|ol\|p\|samp\|small\|span\|strong\|sub\|sup\|tt\|ul\|var\)$'
@@ -506,7 +592,8 @@ function! htmlcomplete#CompleteTags(findstart, base)
return res + res2
endif
- " Close tag
+ " }}}
+ " Close tag {{{
let b:unaryTagsStack = "base meta link hr br param img area input col"
if context =~ '^\/'
let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
@@ -521,10 +608,13 @@ function! htmlcomplete#CompleteTags(findstart, base)
" If returns empty string assume <body>. Safe bet.
let opentag = 'body'
endif
-
+ " }}}
+ " Load data {{{
if !exists("g:xmldata_xhtml10s")
runtime! autoload/xml/xhtml10s.vim
endif
+ " }}}
+ " Tag completion {{{
let tags = g:xmldata_xhtml10s[opentag][0]
@@ -538,5 +628,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
return res + res2
+ " }}}
endif
endfunction
+" vim:set foldmethod=marker:
diff --git a/runtime/autoload/javascriptcomplete.vim b/runtime/autoload/javascriptcomplete.vim
index 2853fbade1..0163fd9b7e 100644
--- a/runtime/autoload/javascriptcomplete.vim
+++ b/runtime/autoload/javascriptcomplete.vim
@@ -1,33 +1,47 @@
" Vim completion script
" Language: Java Script
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2006 Jan 30
+" Last Change: 2006 Feb 6
function! javascriptcomplete#CompleteJS(findstart, base)
if a:findstart
- " locate the start of the word
- let line = getline('.')
- let start = col('.') - 1
+ " 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'
+ while start >= 0 && line[start - 1] =~ '\w'
let start -= 1
- endwhile
+ endwhile
let b:compl_context = getline('.')[0:compl_begin]
- return start
+ return start
else
" Initialize base return lists
- let res = []
- let res2 = []
+ 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
+ " looking for objects and for what objects we are looking for
+ let context = b:compl_context
let shortcontext = substitute(context, a:base.'$', '', '')
unlet! b:compl_context
+ if exists("b:jsrange")
+ let file = getline(b:jsrange[0],b:jsrange[1])
+ unlet! b:jsrange
+
+ if len(b:js_extfiles) > 0
+ let file = b:js_extfiles + file
+ endif
+
+ else
+ let file = getline(1, '$')
+ endif
+
+
+ " Completion of properties, methods, etc. {{{
if shortcontext =~ '\.$'
" Complete methods and properties for objects
" DOM separate
@@ -91,7 +105,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
" RegExp
let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
- let regemeth = ['exec', 'toSource', 'toString', 'test', 'watch', 'unwatch']
+ let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
call map(regemeth, 'v:val."("')
let reges = regeprop + regemeth
@@ -106,19 +120,17 @@ function! javascriptcomplete#CompleteJS(findstart, base)
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 juser_props2 = join(user_props2, ' ')
+ let user_props2 = split(juser_props2, '\zeprototype\.')
+ unlet! juser_props2
+ call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\w\\+\\ze")')
let user_props = user_props1 + user_props2
" HTML DOM properties
@@ -149,7 +161,15 @@ function! javascriptcomplete#CompleteJS(findstart, base)
\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
call map(documeth, 'v:val."("')
- let docus = docuprop + documeth
+ let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
+ \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
+ \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
+ let docuxmeth = ['createAttribute', 'createCDATASection',
+ \ 'createComment', 'createDocument', 'createDocumentFragment',
+ \ 'createElement', 'createEntityReference', 'createProcessingInstruction',
+ \ 'createTextNode']
+ call map(docuxmeth, 'v:val."("')
+ let docus = docuprop + docuxprop + documeth + docuxmeth
" Form - form.
let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
\ 'method', 'name', 'tabIndex', 'target']
@@ -178,7 +198,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let ifras = ifraprop
" Image - image.
let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
- \ 'lowsrc', 'name', 'src', 'useMap', 'vspace', 'width']
+ \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
let imagmeth = ['onAbort', 'onError', 'onLoad']
call map(imagmeth, 'v:val."("')
let imags = histprop + imagmeth
@@ -282,13 +302,13 @@ function! javascriptcomplete#CompleteJS(findstart, base)
\ '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',
+ \ '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',
@@ -320,13 +340,14 @@ function! javascriptcomplete#CompleteJS(findstart, base)
" Textarea - accessible only by other properties
let tareprop = ['accessKey', 'cols', 'defaultValue',
\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
- \ 'tabIndex', 'type', 'value']
+ \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']
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 windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
+ \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
+ \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
\ 'setTimeout']
@@ -334,15 +355,81 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let winds = windprop + windmeth
" XMLHttpRequest - access by new xxx()
let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
- \ 'status', 'statusText']
+ \ 'status', 'statusText', 'parseError']
let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
\ 'send', 'setRequestHeader']
call map(xmlhmeth, 'v:val."("')
let xmlhs = xmlhprop + xmlhmeth
+ " XML DOM
+ " Attributes - element.attributes[x].
+ let xdomattrprop = ['name', 'specified', 'value']
+ " Element - anyelement.
+ let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
+ \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
+ \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
+ let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
+ \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
+ \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
+ \ 'setAttribute', 'setAttributeNode']
+ call map(xdomelemmeth, 'v:val."("')
+ let xdomelems = xdomelemprop + xdomelemmeth
+ " Node - anynode.
+ let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
+ \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
+ \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
+ let xdomnodemeth = ['appendChild', 'cloneNode',
+ \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
+ call map(xdomnodemeth, 'v:val."("')
+ let xdomnodes = xdomnodeprop + xdomnodemeth
+ " NodeList
+ let xdomnliss = ['length', 'item(']
+ " Error - parseError.
+ let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
+
+ " Find object type declaration to reduce number of suggestions. {{{
+ " 1. Get object name
+ " 2. Find object declaration line
+ " 3. General declaration follows "= new Type" syntax, additional else
+ " for regexp "= /re/"
+ " 4. Make correction for Microsoft.XMLHTTP ActiveXObject
+ " 5. Repeat for external files
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 len(object) > 0
+ let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
+ if decl_line > 0
+ let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
+ if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
+ let object_type = 'XMLHttpRequest'
+ endif
+ else
+ let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
+ if decl_line > 0
+ let object_type = 'RegExp'
+ endif
+ endif
+ " We didn't find var declaration in current file but we may have
+ " something in external files.
+ if decl_line == 0 && exists("b:js_extfiles")
+ let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
+ if len(dext_line) > 0
+ let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\w\+\ze')
+ if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
+ let object_type = 'XMLHttpRequest'
+ endif
+ else
+ let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
+ if len(dext_line) > 0
+ let object_type = 'RegExp'
+ endif
+ endif
+ endif
+ endif
+ " }}}
+
+ if !exists('object_type')
+ let object_type = ''
+ endif
if object_type == 'Date'
let values = dates
@@ -357,13 +444,17 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let values = xmlhs
elseif object_type == 'String'
let values = stris
+ elseif object_type == 'RegExp'
+ let values = reges
+ elseif object_type == 'Math'
+ let values = maths
endif
if !exists('values')
" List of properties
if shortcontext =~ 'Math\.$'
let values = maths
- elseif shortcontext =~ 'anchor\.$'
+ elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
let values = anths
elseif shortcontext =~ 'area\.$'
let values = areas
@@ -373,7 +464,7 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let values = bodys
elseif shortcontext =~ 'document\.$'
let values = docus
- elseif shortcontext =~ 'form\.$'
+ elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
let values = forms
elseif shortcontext =~ 'frameset\.$'
let values = fsets
@@ -381,9 +472,9 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let values = hists
elseif shortcontext =~ 'iframe\.$'
let values = ifras
- elseif shortcontext =~ 'image\.$'
+ elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
let values = imags
- elseif shortcontext =~ 'link\.$'
+ elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
let values = links
elseif shortcontext =~ 'location\.$'
let values = locas
@@ -405,11 +496,16 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let values = trows
elseif shortcontext =~ 'window\.$'
let values = winds
+ elseif shortcontext =~ 'parseError\.$'
+ let values = xdomerror
+ elseif shortcontext =~ 'attributes\[\d\+\]\.$'
+ let values = xdomattrprop
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
+ let values += ifras + imags + links + locas + metas + navis + objes + scres
+ let values += tabls + trows + tares + winds
+ let values += xdomnodes + xdomnliss + xdomelems
endif
endif
@@ -425,21 +521,15 @@ function! javascriptcomplete#CompleteJS(findstart, base)
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";
+ " This loop (and next one) 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\\+")')
@@ -447,27 +537,36 @@ function! javascriptcomplete#CompleteJS(findstart, base)
endfor
let variables = sort(vars)
+ unlet! vars
- " Add undeclared variables.
+ " Add "no var" variables.
let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
- call map(undeclared_variables, 'matchstr(v:val, "^\\s*\\zs\\w\\+\\ze")')
+ let u_vars = []
+ for i in range(len(undeclared_variables))
+ let split_equal = split(undeclared_variables[i], '\s*=')
+ call map(split_equal, 'matchstr(v:val, "\\w\\+$")')
+ let u_vars += split_equal
+ endfor
- let variables += sort(undeclared_variables)
+ let variables += sort(u_vars)
+ unlet! u_vars
" 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."("')
+ let functions = sort(functions)
" 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, ',')
+ let arguments = sort(arguments)
" Built-in functions
- let builtin = []
+ let builtin = ['alert(', 'confirm(']
" 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']
@@ -493,3 +592,5 @@ function! javascriptcomplete#CompleteJS(findstart, base)
return res + res2
endfunction
+
+" vim:set foldmethod=marker:
diff --git a/runtime/autoload/xmlcomplete.vim b/runtime/autoload/xmlcomplete.vim
index fc4ad7844e..0d104a0e9a 100644
--- a/runtime/autoload/xmlcomplete.vim
+++ b/runtime/autoload/xmlcomplete.vim
@@ -1,7 +1,7 @@
" Vim completion script
" Language: XML
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2006 Jan 24
+" Last Change: 2006 Feb 6
" This function will create Dictionary with users namespace strings and values
" canonical (system) names of data files. Names should be lowercase,
@@ -396,11 +396,11 @@ return ''
endfunction
function! s:InComment()
- return synIDattr(synID(line('.'), col('.'), 0), 'name') =~ 'Comment'
+ return synIDattr(synID(line('.'), col('.'), 0), 'name') =~ 'Comment\|String'
endfunction
function! s:InCommentAt(line, col)
- return synIDattr(synID(a:line, a:col, 0), 'name') =~ 'Comment'
+ return synIDattr(synID(a:line, a:col, 0), 'name') =~ 'Comment\|String'
endfunction
function! s:SetKeywords()
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index 567758669b..a229f9d091 100644
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1235,6 +1235,7 @@ The commands are sorted on the non-optional part of their name.
|:lgetfile| :lg[etfile] read file with locations
|:lgrep| :lgr[ep] run 'grepprg' and jump to first match
|:lgrepadd| :lgrepa[dd] like :grep, but append to current list
+|:lhelpgrep| :lh[elpgrep] like ":helpgrep" but uses location list
|:ll| :ll go to specific location
|:llast| :lla[st] go to the specified location, default last one
|:llist| :lli[st] list all locations
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index 88be8cbf31..d1e01049a3 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt* For Vim version 7.0aa. Last change: 2006 Jan 30
+*insert.txt* For Vim version 7.0aa. Last change: 2006 Feb 07
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -956,39 +956,61 @@ FUNCTIONS FOR FINDING COMPLETIONS *complete-functions*
This applies to 'completefunc' and 'omnifunc'.
-The function will be invoked with two arguments. First the function is called
-to find the start of the text to be completed. Secondly the function is
-called to actually find the matches.
+The function is called in two different ways:
+- First the function is called to find the start of the text to be completed.
+- Later the function is called to actually find the matches.
On the first invocation the arguments are:
a:findstart 1
a:base empty
-The function must return the column of where the completion starts. It must
-be a number between zero and the cursor column "col('.')". This involves
-looking at the characters just before the cursor and including those
-characters that could be part of the completed item. The text between this
-column and the cursor column will be replaced with the matches. Return -1 if
-no completion can be done.
+The function must return the column where the completion starts. It must be a
+number between zero and the cursor column "col('.')". This involves looking
+at the characters just before the cursor and including those characters that
+could be part of the completed item. The text between this column and the
+cursor column will be replaced with the matches. Return -1 if no completion
+can be done.
On the second invocation the arguments are:
a:findstart 0
- a:base the text with which matches should match, what was
+ a:base the text with which matches should match; the text that was
located in the first call (can be empty)
The function must return a List with the matching words. These matches
usually include the "a:base" text. When there are no matches return an empty
-List. When one of the items in the list cannot be used as a string (e.g., a
-Dictionary) then an error message is given and further items in the list are
-not used.
+List.
+
+Each list item can either be a string or a Dictionary. When it is a string it
+is used as the completion. When it is a Dictionary it can contain these
+items:
+ word the completion, mandatory
+ menu extra text for the popup menu
+ info more information about the item
+ kind single letter indicating the type of completion
+
+All of these must be a string. If an item does not meet these requirements
+then an error message is given and further items in the list are not used.
+You can mix string and Dictionary items in the returned list.
+
+The "menu" item is used in the popup menu and may be truncated, thus it should
+be relatively short. The "info" item can be longer, it may be displayed in a
+balloon.
+
+The "kind" item uses a single letter to indicate the kind of completion. This
+may be used to show the completion differently (different color or icon).
+Currently these types can be used:
+ v variable
+ f function or method
+ c composite (struct, object)
When searching for matches takes some time call |complete_add()| to add each
match to the total list. These matches should then not appear in the returned
list! Call |complete_check()| now and then to allow the user to press a key
while still searching for matches. Stop searching when it returns non-zero.
-The function may move the cursor, it is restored afterwards. This opti