xref: /vim-8.2.3635/runtime/ftplugin/julia.vim (revision 6aa57295)
1*6aa57295SBram Moolenaar" Vim filetype plugin file
2*6aa57295SBram Moolenaar" Language:	Julia
3*6aa57295SBram Moolenaar" Maintainer:	Carlo Baldassi <[email protected]>
4*6aa57295SBram Moolenaar" Homepage:	https://github.com/JuliaEditorSupport/julia-vim
5*6aa57295SBram Moolenaar" Last Change:	2021 Aug 04
6*6aa57295SBram Moolenaar" adapted from upstream 2021 Aug 4
7*6aa57295SBram Moolenaar
8*6aa57295SBram Moolenaarif exists("b:did_ftplugin")
9*6aa57295SBram Moolenaar  finish
10*6aa57295SBram Moolenaarendif
11*6aa57295SBram Moolenaarlet b:did_ftplugin = 1
12*6aa57295SBram Moolenaar
13*6aa57295SBram Moolenaarlet s:save_cpo = &cpo
14*6aa57295SBram Moolenaarset cpo-=C
15*6aa57295SBram Moolenaar
16*6aa57295SBram Moolenaarsetlocal include=^\\s*\\%(reload\\\|include\\)\\>
17*6aa57295SBram Moolenaarsetlocal suffixesadd=.jl
18*6aa57295SBram Moolenaarsetlocal comments=:#
19*6aa57295SBram Moolenaarsetlocal commentstring=#\ %s
20*6aa57295SBram Moolenaarsetlocal cinoptions+=#1
21*6aa57295SBram Moolenaarsetlocal define=^\\s*macro\\>
22*6aa57295SBram Moolenaarsetlocal fo-=t fo+=croql
23*6aa57295SBram Moolenaar
24*6aa57295SBram Moolenaarlet b:julia_vim_loaded = 1
25*6aa57295SBram Moolenaar
26*6aa57295SBram Moolenaarlet b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
27*6aa57295SBram Moolenaar      \ . " define< fo< shiftwidth< expandtab< indentexpr< indentkeys< cinoptions< completefunc<"
28*6aa57295SBram Moolenaar      \ . " | unlet! b:julia_vim_loaded"
29*6aa57295SBram Moolenaar
30*6aa57295SBram Moolenaar" MatchIt plugin support
31*6aa57295SBram Moolenaarif exists("loaded_matchit")
32*6aa57295SBram Moolenaar  let b:match_ignorecase = 0
33*6aa57295SBram Moolenaar
34*6aa57295SBram Moolenaar  " note: begin_keywords must contain all blocks, in order
35*6aa57295SBram Moolenaar  " for nested-structures-skipping to work properly
36*6aa57295SBram Moolenaar  " note: 'mutable struct' and 'struct' are defined separately because
37*6aa57295SBram Moolenaar  " using \? puts the cursor on 'struct' instead of 'mutable' for some reason
38*6aa57295SBram Moolenaar  let b:julia_begin_keywords = '\%(\.\s*\|@\)\@<!\<\%(function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
39*6aa57295SBram Moolenaar  " note: the following regex not only recognizes macros, but also local/global keywords.
40*6aa57295SBram Moolenaar  " the purpose is recognizing things like `@inline myfunction()`
41*6aa57295SBram Moolenaar  " or `global myfunction(...)` etc, for matchit and block movement functionality
42*6aa57295SBram Moolenaar  let s:macro_regex = '\%(@\%([#(]\@!\S\)\+\|\<\%(local\|global\)\)\s\+'
43*6aa57295SBram Moolenaar  let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
44*6aa57295SBram Moolenaar  let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
45*6aa57295SBram Moolenaar  let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
46*6aa57295SBram Moolenaar        \ . '\%(' . s:nomacro . b:julia_begin_keywords . '\)'
47*6aa57295SBram Moolenaar  let b:julia_end_keywords = '\<end\>'
48*6aa57295SBram Moolenaar
49*6aa57295SBram Moolenaar  " note: this function relies heavily on the syntax file
50*6aa57295SBram Moolenaar  function! JuliaGetMatchWords()
51*6aa57295SBram Moolenaar    let [l,c] = [line('.'),col('.')]
52*6aa57295SBram Moolenaar    let attr = synIDattr(synID(l, c, 1),"name")
53*6aa57295SBram Moolenaar    let c1 = c
54*6aa57295SBram Moolenaar    while attr == 'juliaMacro' || expand('<cword>') =~# '\<\%(global\|local\)\>'
55*6aa57295SBram Moolenaar      normal! W
56*6aa57295SBram Moolenaar      if line('.') > l || col('.') == c1
57*6aa57295SBram Moolenaar        call cursor(l, c)
58*6aa57295SBram Moolenaar        return ''
59*6aa57295SBram Moolenaar      endif
60*6aa57295SBram Moolenaar      let attr = synIDattr(synID(l, col('.'), 1),"name")
61*6aa57295SBram Moolenaar      let c1 = col('.')
62*6aa57295SBram Moolenaar    endwhile
63*6aa57295SBram Moolenaar    call cursor(l, c)
64*6aa57295SBram Moolenaar    if attr == 'juliaConditional'
65*6aa57295SBram Moolenaar      return b:julia_begin_keywordsm . ':\<\%(elseif\|else\)\>:' . b:julia_end_keywords
66*6aa57295SBram Moolenaar    elseif attr =~# '\<\%(juliaRepeat\|juliaRepKeyword\)\>'
67*6aa57295SBram Moolenaar      return b:julia_begin_keywordsm . ':\<\%(break\|continue\)\>:' . b:julia_end_keywords
68*6aa57295SBram Moolenaar    elseif attr == 'juliaBlKeyword'
69*6aa57295SBram Moolenaar      return b:julia_begin_keywordsm . ':' . b:julia_end_keywords
70*6aa57295SBram Moolenaar    elseif attr == 'juliaException'
71*6aa57295SBram Moolenaar      return b:julia_begin_keywordsm . ':\<\%(catch\|finally\)\>:' . b:julia_end_keywords
72*6aa57295SBram Moolenaar    endif
73*6aa57295SBram Moolenaar    return '\<\>:\<\>'
74*6aa57295SBram Moolenaar  endfunction
75*6aa57295SBram Moolenaar
76*6aa57295SBram Moolenaar  let b:match_words = 'JuliaGetMatchWords()'
77*6aa57295SBram Moolenaar
78*6aa57295SBram Moolenaar  " we need to skip everything within comments, strings and
79*6aa57295SBram Moolenaar  " the 'begin' and 'end' keywords when they are used as a range rather than as
80*6aa57295SBram Moolenaar  " the delimiter of a block
81*6aa57295SBram Moolenaar  let b:match_skip = 'synIDattr(synID(line("."),col("."),0),"name") =~# '
82*6aa57295SBram Moolenaar        \ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeKeyword\\|Comment\\%([LM]\\|Delim\\)\\|\\%([bs]\\|Shell\\|Printf\\|Doc\\)\\?String\\|StringPrefixed\\|DocStringM\\(Raw\\)\\?\\|RegEx\\|SymbolS\\?\\|Dotted\\)\\>"'
83*6aa57295SBram Moolenaar
84*6aa57295SBram Moolenaar  let b:undo_ftplugin = b:undo_ftplugin
85*6aa57295SBram Moolenaar        \ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
86*6aa57295SBram Moolenaar        \ . " | unlet! b:julia_begin_keywords b:julia_end_keywords"
87*6aa57295SBram Moolenaar        \ . " | delfunction JuliaGetMatchWords"
88*6aa57295SBram Moolenaar
89*6aa57295SBram Moolenaarendif
90*6aa57295SBram Moolenaar
91*6aa57295SBram Moolenaarlet &cpo = s:save_cpo
92*6aa57295SBram Moolenaarunlet s:save_cpo
93