651
|
1 " Vim completion script
|
|
2 " Language: Java Script
|
|
3 " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
11062
|
4 " Last Change: 2017 Mar 04
|
651
|
5
|
|
6 function! javascriptcomplete#CompleteJS(findstart, base)
|
|
7 if a:findstart
|
659
|
8 " locate the start of the word
|
|
9 let line = getline('.')
|
|
10 let start = col('.') - 1
|
651
|
11 let curline = line('.')
|
|
12 let compl_begin = col('.') - 2
|
|
13 " Bit risky but JS is rather limited language and local chars shouldn't
|
|
14 " fint way into names
|
667
|
15 while start >= 0 && line[start - 1] =~ '\k'
|
651
|
16 let start -= 1
|
659
|
17 endwhile
|
651
|
18 let b:compl_context = getline('.')[0:compl_begin]
|
659
|
19 return start
|
651
|
20 else
|
|
21 " Initialize base return lists
|
659
|
22 let res = []
|
|
23 let res2 = []
|
651
|
24 " a:base is very short - we need context
|
659
|
25 " Shortcontext is context without a:base, useful for checking if we are
|
|
26 " looking for objects and for what objects we are looking for
|
651
|
27 let context = b:compl_context
|
|
28 let shortcontext = substitute(context, a:base.'$', '', '')
|
|
29 unlet! b:compl_context
|
|
30
|
659
|
31 if exists("b:jsrange")
|
|
32 let file = getline(b:jsrange[0],b:jsrange[1])
|
|
33 unlet! b:jsrange
|
|
34
|
|
35 if len(b:js_extfiles) > 0
|
|
36 let file = b:js_extfiles + file
|
|
37 endif
|
|
38
|
|
39 else
|
|
40 let file = getline(1, '$')
|
|
41 endif
|
|
42
|
|
43
|
|
44 " Completion of properties, methods, etc. {{{
|
651
|
45 if shortcontext =~ '\.$'
|
|
46 " Complete methods and properties for objects
|
|
47 " DOM separate
|
|
48 let doms = ['style.']
|
|
49 " Arrays
|
|
50 let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
|
856
|
51 let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
|
651
|
52 \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
|
|
53 \ 'watch', 'unwatch']
|
|
54 call map(arraymeth, 'v:val."("')
|
|
55 let arrays = arrayprop + arraymeth
|
|
56
|
|
57 " Boolean - complete subset of array values
|
|
58 " properties - constructor, prototype
|
|
59 " methods - toSource, toString, valueOf
|
|
60
|
|
61 " Date
|
|
62 " properties - constructor, prototype
|
|
63 let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
|
|
64 \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
|
|
65 \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
|
|
66 \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
|
|
67 \ 'getYear', 'parse', 'parse',
|
|
68 \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
|
|
69 \ 'setMinutes', 'setMonth', 'setSeconds',
|
|
70 \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
|
|
71 \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
|
|
72 \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
|
|
73 \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
|
|
74 call map(datemeth, 'v:val."("')
|
|
75 let dates = datemeth
|
|
76
|
|
77 " Function
|
|
78 let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
|
|
79 \ 'arity', 'constructor', 'length', 'prototype']
|
|
80 let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
|
|
81 call map(funcmeth, 'v:val."("')
|
|
82 let funcs = funcprop + funcmeth
|
|
83
|
|
84 " Math
|
|
85 let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
|
|
86 let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
|
|
87 \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
|
|
88 \ 'watch', 'unwatch']
|
|
89 call map(mathmeth, 'v:val."("')
|
|
90 let maths = mathprop + mathmeth
|
|
91
|
|
92 " Number
|
|
93 let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',
|
|
94 \ 'constructor', 'prototype']
|
|
95 let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
|
|
96 \ 'watch', 'unwatch']
|
|
97 call map(numbmeth, 'v:val."("')
|
|
98 let numbs = numbprop + numbmeth
|
|
99
|
|
100 " Object
|
|
101 let objeprop = ['constructor', 'prototype']
|
|
102 let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
|
|
103 call map(objemeth, 'v:val."("')
|
|
104 let objes = objeprop + objemeth
|
|
105
|
|
106 " RegExp
|
|
107 let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
|
659
|
108 let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
|
651
|
109 call map(regemeth, 'v:val."("')
|
|
110 let reges = regeprop + regemeth
|
|
111
|
|
112 " String
|
|
113 let striprop = ['constructor', 'length', 'prototype']
|
|
114 let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
|
|
115 \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
|
|
116 \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
|
|
117 \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
|
|
118 \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
|
|
119 call map(strimeth, 'v:val."("')
|
|
120 let stris = striprop + strimeth
|
|
121
|
|
122 " User created properties
|
667
|
123 let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
|
651
|
124 let juser_props1 = join(user_props1, ' ')
|
|
125 let user_props1 = split(juser_props1, '\zethis\.')
|
|
126 unlet! juser_props1
|
667
|
127 call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
|
659
|
128
|
667
|
129 let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
|
659
|
130 let juser_props2 = join(user_props2, ' ')
|
|
131 let user_props2 = split(juser_props2, '\zeprototype\.')
|
|
132 unlet! juser_props2
|
667
|
133 call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")')
|
651
|
134 let user_props = user_props1 + user_props2
|
|
135
|
|
136 " HTML DOM properties
|
|
137 " Anchors - anchor.
|
|
138 let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
|
|
139 \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
|
|
140 let anchmeth = ['blur', 'focus']
|
|
141 call map(anchmeth, 'v:val."("')
|
|
142 let anths = anchprop + anchmeth
|
|
143 " Area - area.
|
|
144 let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
|
|
145 \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
|
|
146 let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
|
|
147 call map(areameth, 'v:val."("')
|
|
148 let areas = areaprop + areameth
|
|
149 " Base - base.
|
|
150 let baseprop = ['href', 'id', 'target']
|
|
151 let bases = baseprop
|
|
152 " Body - body.
|
|
153 let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
|
|
154 \ 'text', 'vLink']
|
|
155 let bodys = bodyprop
|
|
156 " Document - document.
|
|
157 let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
|
|
158 \ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
|
|
159 let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
|
|
160 \ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
|
|
161 \ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
|
|
162 \ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
|
|
163 call map(documeth, 'v:val."("')
|
659
|
164 let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
|
|
165 \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
|
|
166 \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
|
|
167 let docuxmeth = ['createAttribute', 'createCDATASection',
|
|
168 \ 'createComment', 'createDocument', 'createDocumentFragment',
|
|
169 \ 'createElement', 'createEntityReference', 'createProcessingInstruction',
|
|
170 \ 'createTextNode']
|
|
171 call map(docuxmeth, 'v:val."("')
|
|
172 let docus = docuprop + docuxprop + documeth + docuxmeth
|
651
|
173 " Form - form.
|
|
174 let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
|
|
175 \ 'method', 'name', 'tabIndex', 'target']
|
|
176 let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
|
|
177 call map(formmeth, 'v:val."("')
|
|
178 let forms = formprop + formmeth
|
|
179 " Frame - frame.
|
|
180 let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
|
|
181 \ 'name', 'noResize', 'scrolling', 'src']
|
|
182 let frammeth = ['blur', 'focus']
|
|
183 call map(frammeth, 'v:val."("')
|
|
184 let frams = framprop + frammeth
|
|
185 " Frameset - frameset.
|
|
186 let fsetprop = ['cols', 'id', 'rows']
|
|
187 let fsetmeth = ['blur', 'focus']
|
|
188 call map(fsetmeth, 'v:val."("')
|
|
189 let fsets = fsetprop + fsetmeth
|
|
190 " History - history.
|
|
191 let histprop = ['length']
|
|
192 let histmeth = ['back', 'forward', 'go']
|
|
193 call map(histmeth, 'v:val."("')
|
|
194 let hists = histprop + histmeth
|
|
195 " Iframe - iframe.
|
|
196 let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
|
|
197 \ 'name', 'scrolling', 'src', 'width']
|
|
198 let ifras = ifraprop
|
|
199 " Image - image.
|
|
200 let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
|
659
|
201 \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
|
651
|
202 let imagmeth = ['onAbort', 'onError', 'onLoad']
|
|
203 call map(imagmeth, 'v:val."("')
|
|
204 let imags = histprop + imagmeth
|
|
205 " Button - accessible only by other properties
|
|
206 let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
|
|
207 let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
|
|
208 call map(buttmeth, 'v:val."("')
|
|
209 let butts = buttprop + buttmeth
|
|
210 " Checkbox - accessible only by other properties
|
|
211 let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
|
|
212 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
|
|
213 let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
|
|
214 call map(checmeth, 'v:val."("')
|
|
215 let checs = checprop + checmeth
|
|
216 " File upload - accessible only by other properties
|
|
217 let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
|
|
218 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
|
|
219 let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
|
|
220 call map(filemeth, 'v:val."("')
|
|
221 let files = fileprop + filemeth
|
|
222 " Hidden - accessible only by other properties
|
|
223 let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']
|
|
224 let hidds = hiddprop
|
|
225 " Password - accessible only by other properties
|
|
226 let passprop = ['accept', 'accessKey', 'defaultValue',
|
|
227 \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',
|
|
228 \ 'type', 'value']
|
|
229 let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',
|
|
230 \ 'onKeyPress', 'onKeyUp']
|
|
231 call map(passmeth, 'v:val."("')
|
|
232 let passs = passprop + passmeth
|
|
233 " Radio - accessible only by other properties
|
|
234 let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
|
|
235 \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
|
|
236 let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
|
|
237 call map(radimeth, 'v:val."("')
|
|
238 let radis = radiprop + radimeth
|
|
239 " Reset - accessible only by other properties
|
|
240 let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
|
|
241 \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
|
|
242 let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
|
|
243 call map(resemeth, 'v:val."("')
|
|
244 let reses = reseprop + resemeth
|
|
245 " Submit - accessible only by other properties
|
|
246 let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
|
|
247 \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
|
|
248 let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
|
|
249 call map(submmeth, 'v:val."("')
|
|
250 let subms = submprop + submmeth
|
|
251 " Text - accessible only by other properties
|
|
252 let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
|
|
253 \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',
|
|
254 \ 'size', 'tabIndex', 'type', 'value']
|
|
255 let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
|
|
256 \ 'onKeyPress', 'onKeyUp', 'onSelect']
|
|
257 call map(textmeth, 'v:val."("')
|
|
258 let texts = textprop + textmeth
|
|
259 " Link - link.
|
|
260 let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
|
|
261 \ 'rel', 'rev', 'target', 'type']
|
|
262 let linkmeth = ['onLoad']
|
|
263 call map(linkmeth, 'v:val."("')
|
|
264 let links = linkprop + linkmeth
|
|
265 " Location - location.
|
|
266 let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
|
|
267 \ 'search']
|
|
268 let locameth = ['assign', 'reload', 'replace']
|
|
269 call map(locameth, 'v:val."("')
|
|
270 let locas = locaprop + locameth
|
|
271 " Meta - meta.
|
|
272 let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
|
|
273 let metas = metaprop
|
|
274 " Navigator - navigator.
|
|
275 let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
|
|
276 \ 'platform', 'userAgent']
|
|
277 let navimeth = ['javaEnabled', 'taintEnabled']
|
|
278 call map(navimeth, 'v:val."("')
|
|
279 let navis = naviprop + navimeth
|
|
280 " Object - object.
|
|
281 let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
|
|
282 \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
|
|
283 \ 'type', 'useMap', 'vspace', 'width']
|
|
284 let objes = objeprop
|
|
285 " Option - accessible only by other properties
|
|
286 let optiprop = ['defaultSelected',
|
|
287 \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
|
|
288 let optis = optiprop
|
|
289 " Screen - screen.
|
|
290 let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
|
|
291 let scres = screprop
|
|
292 " Select - accessible only by other properties
|
|
293 let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',
|
|
294 \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']
|
|
295 let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
|
|
296 call map(selemeth, 'v:val."("')
|
|
297 let seles = seleprop + selemeth
|
|
298 " Style - style.
|
|
299 let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
|
|
300 \ 'backgroundPosition', 'backgroundRepeat',
|
|
301 \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
|
|
302 \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
|
|
303 \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
|
|
304 \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
|
659
|
305 \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
|
|
306 \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
|
|
307 \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
|
|
308 \ 'paddingLeft', 'paddingRight', 'paddingTop',
|
|
309 \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
|
|
310 \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
|
|
311 \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
|
651
|
312 \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
|
|
313 \ 'width',
|
|
314 \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
|
|
315 \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
|
|
316 \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
|
|
317 \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
|
|
318 \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
|
|
319 \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
|
|
320 \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
|
|
321 \ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
|
|
322 let styls = stylprop
|
|
323 " Table - table.
|
|
324 let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
|
|
325 \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
|
|
326 let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
|
|
327 \ 'deleteTFoot', 'deleteTHead', 'insertRow']
|
|
328 call map(tablmeth, 'v:val."("')
|
|
329 let tabls = tablprop + tablmeth
|
|
330 " Table data - TableData.
|
|
331 let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
|
|
332 \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
|
|
333 let tdats = tdatprop
|
|
334 " Table row - TableRow.
|
|
335 let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
|
|
336 \ 'vAlign']
|
|
337 let trowmeth = ['deleteCell', 'insertCell']
|
|
338 call map(trowmeth, 'v:val."("')
|
|
339 let trows = trowprop + trowmeth
|
|
340 " Textarea - accessible only by other properties
|
|
341 let tareprop = ['accessKey', 'cols', 'defaultValue',
|
|
342 \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
|
659
|
343 \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']
|
651
|
344 let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
|
|
345 call map(taremeth, 'v:val."("')
|
|
346 let tares = tareprop + taremeth
|
|
347 " Window - window.
|
659
|
348 let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
|
|
349 \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
|
|
350 \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
|
651
|
351 let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
|
|
352 \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
|
|
353 \ 'setTimeout']
|
|
354 call map(windmeth, 'v:val."("')
|
|
355 let winds = windprop + windmeth
|
|
356 " XMLHttpRequest - access by new xxx()
|
|
357 let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
|
659
|
358 \ 'status', 'statusText', 'parseError']
|
651
|
359 let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
|
|
360 \ 'send', 'setRequestHeader']
|
|
361 call map(xmlhmeth, 'v:val."("')
|
|
362 let xmlhs = xmlhprop + xmlhmeth
|
|
363
|
659
|
364 " XML DOM
|
|
365 " Attributes - element.attributes[x].
|
|
366 let xdomattrprop = ['name', 'specified', 'value']
|
|
367 " Element - anyelement.
|
|
368 let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
|
|
369 \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
|
|
370 \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
|
|
371 let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
|
|
372 \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
|
|
373 \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
|
|
374 \ 'setAttribute', 'setAttributeNode']
|
|
375 call map(xdomelemmeth, 'v:val."("')
|
|
376 let xdomelems = xdomelemprop + xdomelemmeth
|
|
377 " Node - anynode.
|
|
378 let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
|
|
379 \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
|
|
380 \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
|
|
381 let xdomnodemeth = ['appendChild', 'cloneNode',
|
|
382 \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
|
|
383 call map(xdomnodemeth, 'v:val."("')
|
|
384 let xdomnodes = xdomnodeprop + xdomnodemeth
|
|
385 " NodeList
|
|
386 let xdomnliss = ['length', 'item(']
|
|
387 " Error - parseError.
|
|
388 let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
|
|
389
|
|
390 " Find object type declaration to reduce number of suggestions. {{{
|
|
391 " 1. Get object name
|
|
392 " 2. Find object declaration line
|
|
393 " 3. General declaration follows "= new Type" syntax, additional else
|
|
394 " for regexp "= /re/"
|
|
395 " 4. Make correction for Microsoft.XMLHTTP ActiveXObject
|
|
396 " 5. Repeat for external files
|
667
|
397 let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
|
659
|
398 if len(object) > 0
|
|
399 let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
|
|
400 if decl_line > 0
|
667
|
401 let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
|
659
|
402 if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
|
403 let object_type = 'XMLHttpRequest'
|
|
404 endif
|
|
405 else
|
|
406 let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
|
|
407 if decl_line > 0
|
|
408 let object_type = 'RegExp'
|
|
409 endif
|
|
410 endif
|
|
411 " We didn't find var declaration in current file but we may have
|
|
412 " something in external files.
|
|
413 if decl_line == 0 && exists("b:js_extfiles")
|
|
414 let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
|
|
415 if len(dext_line) > 0
|
667
|
416 let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
|
659
|
417 if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
|
|
418 let object_type = 'XMLHttpRequest'
|
|
419 endif
|
|
420 else
|
|
421 let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
|
|
422 if len(dext_line) > 0
|
|
423 let object_type = 'RegExp'
|
|
424 endif
|
|
425 endif
|
|
426 endif
|
|
427 endif
|
|
428 " }}}
|
|
429
|
|
430 if !exists('object_type')
|
|
431 let object_type = ''
|
|
432 endif
|
651
|
433
|
|
434 if object_type == 'Date'
|
|
435 let values = dates
|
|
436 elseif object_type == 'Image'
|
|
437 let values = imags
|
|
438 elseif object_type == 'Array'
|
|
439 let values = arrays
|
|
440 elseif object_type == 'Boolean'
|
|
441 " TODO: a bit more than real boolean
|
|
442 let values = arrays
|
|
443 elseif object_type == 'XMLHttpRequest'
|
|
444 let values = xmlhs
|
|
445 elseif object_type == 'String'
|
|
446 let values = stris
|
659
|
447 elseif object_type == 'RegExp'
|
|
448 let values = reges
|
|
449 elseif object_type == 'Math'
|
|
450 let values = maths
|
651
|
451 endif
|
|
452
|
|
453 if !exists('values')
|
|
454 " List of properties
|
|
455 if shortcontext =~ 'Math\.$'
|
|
456 let values = maths
|
659
|
457 elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
|
651
|
458 let values = anths
|
|
459 elseif shortcontext =~ 'area\.$'
|
|
460 let values = areas
|
|
461 elseif shortcontext =~ 'base\.$'
|
|
462 let values = bases
|
|
463 elseif shortcontext =~ 'body\.$'
|
|
464 let values = bodys
|
|
465 elseif shortcontext =~ 'document\.$'
|
|
466 let values = docus
|
659
|
467 elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
|
651
|
468 let values = forms
|
|
469 elseif shortcontext =~ 'frameset\.$'
|
|
470 let values = fsets
|
|
471 elseif shortcontext =~ 'history\.$'
|
|
472 let values = hists
|
|
473 elseif shortcontext =~ 'iframe\.$'
|
|
474 let values = ifras
|
659
|
475 elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
|
651
|
476 let values = imags
|
659
|
477 elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
|
651
|
478 let values = links
|
|
479 elseif shortcontext =~ 'location\.$'
|
|
480 let values = locas
|
|
481 elseif shortcontext =~ 'meta\.$'
|
|
482 let values = metas
|
|
483 elseif shortcontext =~ 'navigator\.$'
|
|
484 let values = navis
|
|
485 elseif shortcontext =~ 'object\.$'
|
|
486 let values = objes
|
|
487 elseif shortcontext =~ 'screen\.$'
|
|
488 let values = scres
|
|
489 elseif shortcontext =~ 'style\.$'
|
|
490 let values = styls
|
|
491 elseif shortcontext =~ 'table\.$'
|
|
492 let values = tabls
|
|
493 elseif shortcontext =~ 'TableData\.$'
|
|
494 let values = tdats
|
|
495 elseif shortcontext =~ 'TableRow\.$'
|
|
496 let values = trows
|
|
497 elseif shortcontext =~ 'window\.$'
|
|
498 let values = winds
|
659
|
499 elseif shortcontext =~ 'parseError\.$'
|
|
500 let values = xdomerror
|
|
501 elseif shortcontext =~ 'attributes\[\d\+\]\.$'
|
|
502 let values = xdomattrprop
|
651
|
503 else
|
|
504 let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
|
|
505 let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
|
659
|
506 let values += ifras + imags + links + locas + metas + navis + objes + scres
|
|
507 let values += tabls + trows + tares + winds
|
|
508 let values += xdomnodes + xdomnliss + xdomelems
|
651
|
509 endif
|
|
510 endif
|
|
511
|
|
512 for m in values
|
|
513 if m =~? '^'.a:base
|
|
514 call add(res, m)
|
|
515 elseif m =~? a:base
|
|
516 call add(res2, m)
|
|
517 endif
|
|
518 endfor
|
|
519
|
|
520 unlet! values
|
|
521 return res + res2
|
|
522
|
|
523 endif
|
659
|
524 " }}}
|
651
|
525
|
|
526 " Get variables data.
|
|
527 let variables = filter(copy(file), 'v:val =~ "var\\s"')
|
|
528 call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
|
|
529 call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
|
|
530 let vars = []
|
659
|
531 " This loop (and next one) is necessary to get variable names from
|
|
532 " constructs like: var var1, var2, var3 = "something";
|
651
|
533 for i in range(len(variables))
|
|
534 let comma_separated = split(variables[i], ',\s*')
|
667
|
535 call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
|
651
|
536 let vars += comma_separated
|
|
537 endfor
|
|
538
|
|
539 let variables = sort(vars)
|
659
|
540 unlet! vars
|
651
|
541
|
659
|
542 " Add "no var" variables.
|
667
|
543 let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
|
659
|
544 let u_vars = []
|
|
545 for i in range(len(undeclared_variables))
|
|
546 let split_equal = split(undeclared_variables[i], '\s*=')
|
667
|
547 call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
|
659
|
548 let u_vars += split_equal
|
|
549 endfor
|
651
|
550
|
659
|
551 let variables += sort(u_vars)
|
|
552 unlet! u_vars
|
651
|
553
|
|
554 " Get functions
|
|
555 let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
|
|
556 let arguments = copy(functions)
|
667
|
557 call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
|
651
|
558 call map(functions, 'v:val."("')
|
659
|
559 let functions = sort(functions)
|
651
|
560
|
667
|
561 " Create table to keep arguments for additional 'menu' info
|
|
562 let b:js_menuinfo = {}
|
|
563 for i in arguments
|
|
564 let g:ia = i
|
|
565 let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
|
11062
|
566 if len(f_elements) >= 3
|
667
|
567 let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
|
|
568 endif
|
|
569 endfor
|
|
570
|
651
|
571 " Get functions arguments
|
|
572 call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
|
|
573 let jargs = join(arguments, ',')
|
|
574 let jargs = substitute(jargs, '\s', '', 'g')
|
|
575 let arguments = split(jargs, ',')
|
659
|
576 let arguments = sort(arguments)
|
651
|
577
|
|
578 " Built-in functions
|
659
|
579 let builtin = ['alert(', 'confirm(']
|
651
|
580
|
|
581 " Top-level HTML DOM objects
|
|
582 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']
|
|
583 call map(htmldom, 'v:val."."')
|
|
584
|
|
585 " Top-level properties
|
|
586 let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
|
|
587 \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
|
|
588 \ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
|
|
589
|
|
590 " Keywords
|
|
591 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"]
|
|
592
|
|
593 let values = variables + functions + htmldom + arguments + builtin + properties + keywords
|
|
594
|
|
595 for m in values
|
|
596 if m =~? '^'.a:base
|
|
597 call add(res, m)
|
|
598 elseif m =~? a:base
|
|
599 call add(res2, m)
|
|
600 endif
|
|
601 endfor
|
|
602
|
667
|
603 let menu = res + res2
|
|
604 let final_menu = []
|
|
605 for i in range(len(menu))
|
|
606 let item = menu[i]
|
|
607 if item =~ '($'
|
|
608 let kind = 'f'
|
|
609 if has_key(b:js_menuinfo, item)
|
|
610 let m_info = b:js_menuinfo[item]
|
|
611 else
|
|
612 let m_info = ''
|
|
613 endif
|
|
614 else
|
|
615 let kind = 'v'
|
|
616 let m_info = ''
|
|
617 endif
|
|
618 let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
|
|
619 endfor
|
|
620 let g:fm = final_menu
|
|
621 return final_menu
|
|
622
|
651
|
623 endfunction
|
659
|
624
|
|
625 " vim:set foldmethod=marker:
|