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