1" Vim filetype plugin file
2" Language:     Javascript
3" Maintainer:   Doug Kearns <[email protected]>
4" Last Change:  2020 Jun 23
5" Contributor:  Romain Lafourcade <[email protected]>
6
7if exists("b:did_ftplugin")
8    finish
9endif
10let b:did_ftplugin = 1
11
12let s:cpo_save = &cpo
13set cpo-=C
14
15" Set 'formatoptions' to break comment lines but not other lines,
16" and insert the comment leader when hitting <CR> or using "o".
17setlocal formatoptions-=t formatoptions+=croql
18
19" Set completion with CTRL-X CTRL-O to autoloaded function.
20if exists('&ofu')
21    setlocal omnifunc=javascriptcomplete#CompleteJS
22endif
23
24" Set 'comments' to format dashed lists in comments.
25setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
26
27setlocal commentstring=//%s
28
29" Change the :browse e filter to primarily show JavaScript-related files.
30if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
31    let b:browsefilter =
32                \ "JavaScript Files (*.js)\t*.js\n"
33                \ .. "JSX Files (*.jsx)\t*.jsx\n"
34                \ .. "JavaScript Modules (*.es, *.es6, *.cjs, *.mjs, *.jsm)\t*.es;*.es6;*.cjs;*.mjs;*.jsm\n"
35                \ .. "Vue Templates (*.vue)\t*.vue\n"
36                \ .. "JSON Files (*.json)\t*.json\n"
37                \ .. "All Files (*.*)\t*.*\n"
38endif
39
40" The following suffixes should be implied when resolving filenames
41setlocal suffixesadd+=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json
42
43" The following suffixes should have low priority
44"   .snap    jest snapshot
45setlocal suffixes+=.snap
46
47" Remove irrelevant part of 'path'.
48" User is expected to augment it with contextually-relevant paths
49setlocal path-=/usr/include
50
51" Matchit configuration
52if exists("loaded_matchit")
53    let b:match_ignorecase = 0
54    let b:match_words =
55                \ '\<do\>:\<while\>,'
56                \ .. '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'
57                \ .. '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
58endif
59
60" Set 'define' to a comprehensive value
61let &l:define =
62            \ '\(^\s*(*async\s\+function\|(*function\)'
63            \ .. '\|^\s*\(\*\|static\|async\|get\|set\|\i\+\.\)'
64            \ .. '\|^\s*\(\ze\i\+\)\(([^)]*).*{$\|\s*[:=,]\)'
65            \ .. '\|^\s*\(export\s\+\|export\s\+default\s\+\)*\(var\|let\|const\|function\|class\)'
66            \ .. '\|\<as\>'
67
68let b:undo_ftplugin =
69            \ "setl fo< ofu< com< cms< sua< su< def< pa<"
70            \ .. "| unlet! b:browsefilter b:match_ignorecase b:match_words"
71
72let &cpo = s:cpo_save
73unlet s:cpo_save
74
75" vim: textwidth=78 tabstop=8 shiftwidth=4 softtabstop=4 expandtab
76