189 lines
8.2 KiB
VimL
189 lines
8.2 KiB
VimL
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
|||
|
|
|||
|
function! julia#set_syntax_version(jvers)
|
|||
|
if &filetype != "julia"
|
|||
|
echo "Not a Julia file"
|
|||
|
return
|
|||
|
endif
|
|||
|
syntax clear
|
|||
|
let b:julia_syntax_version = a:jvers
|
|||
|
set filetype=julia
|
|||
|
endfunction
|
|||
|
|
|||
|
function! julia#toggle_deprecated_syntax()
|
|||
|
if &filetype != "julia"
|
|||
|
echo "Not a Julia file"
|
|||
|
return
|
|||
|
endif
|
|||
|
syntax clear
|
|||
|
let hd = get(b:, "julia_syntax_highlight_deprecated",
|
|||
|
\ get(g:, "julia_syntax_highlight_deprecated", 0))
|
|||
|
let b:julia_syntax_highlight_deprecated = hd ? 0 : 1
|
|||
|
set filetype=julia
|
|||
|
if b:julia_syntax_highlight_deprecated
|
|||
|
echo "Highlighting of deprecated syntax enabled"
|
|||
|
else
|
|||
|
echo "Highlighting of deprecated syntax disabled"
|
|||
|
endif
|
|||
|
endfunction
|
|||
|
|
|||
|
if exists("loaded_matchit")
|
|||
|
|
|||
|
function! julia#toggle_function_blockassign()
|
|||
|
let sav_pos = getcurpos()
|
|||
|
let l = getline('.')
|
|||
|
let c = match(l, '\C\m\<function\s\+.\+(')
|
|||
|
if c != -1
|
|||
|
return julia#function_block2assign()
|
|||
|
endif
|
|||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
|
|||
|
if c == -1
|
|||
|
echohl WarningMsg | echo "Not on a function definition or assignment line" | echohl None
|
|||
|
return
|
|||
|
endif
|
|||
|
return julia#function_assign2block()
|
|||
|
endfunction
|
|||
|
|
|||
|
function! julia#function_block2assign()
|
|||
|
let sav_pos = getcurpos()
|
|||
|
let l = getline('.')
|
|||
|
let c = match(l, '\C\m\<function\s\+.\+(')
|
|||
|
if c == -1
|
|||
|
echohl WarningMsg | echo "Not on a function definition line" | echohl None
|
|||
|
return
|
|||
|
endif
|
|||
|
let fpos = copy(sav_pos)
|
|||
|
let fpos[2] = c+1
|
|||
|
call setpos('.', fpos)
|
|||
|
normal %
|
|||
|
if line('.') != fpos[1]+2 || match(getline('.'), '\C\m^\s*end\s*$') == -1
|
|||
|
echohl WarningMsg | echo "Only works with 3-lines functions" | echohl None
|
|||
|
call setpos('.', sav_pos)
|
|||
|
return
|
|||
|
endif
|
|||
|
call setpos('.', fpos)
|
|||
|
normal! f(
|
|||
|
normal %
|
|||
|
while line('.') == fpos[1] && match(l[col('.')-1:], '\C\m)(') == 0
|
|||
|
normal! l
|
|||
|
normal %
|
|||
|
endwhile
|
|||
|
if line('.') != fpos[1] || match(l[(col('.')-1):], '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*$') != 0
|
|||
|
echohl WarningMsg | echo "Unrecognized function definition format" | echohl None
|
|||
|
call setpos('.', sav_pos)
|
|||
|
return
|
|||
|
endif
|
|||
|
|
|||
|
call setpos('.', fpos)
|
|||
|
normal! dwA = J
|
|||
|
if match(getline('.')[(col('.')-1):], '\C\mreturn\>') == 0
|
|||
|
normal! dw
|
|||
|
endif
|
|||
|
if match(getline('.')[(col('.')-1):], '\C\m\s*$') == 0
|
|||
|
normal! F=C= nothing
|
|||
|
endif
|
|||
|
normal! jddk^
|
|||
|
return
|
|||
|
endfunction
|
|||
|
|
|||
|
function! julia#function_assign2block()
|
|||
|
let sav_pos = getcurpos()
|
|||
|
let l = getline('.')
|
|||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
|
|||
|
if c == -1
|
|||
|
echohl WarningMsg | echo "Not on a function assignment-definition line" | echohl None
|
|||
|
return
|
|||
|
endif
|
|||
|
normal ^
|
|||
|
while match(l[(col('.')-1):], '\%(\S\+\.\)*@') == 0
|
|||
|
normal! W
|
|||
|
endwhile
|
|||
|
normal! ifunction
|
|||
|
let l = getline('.')
|
|||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*\zs=\s*')
|
|||
|
let eqpos = copy(sav_pos)
|
|||
|
let eqpos[2] = c+1
|
|||
|
call setpos('.', eqpos)
|
|||
|
normal! cw
oend
|
|||
|
normal %
|
|||
|
s/\s*$// | noh
|
|||
|
return
|
|||
|
endfunction
|
|||
|
|
|||
|
|
|||
|
let s:nonid_chars = "\U01-\U07" . "\U0E-\U1F" .
|
|||
|
\ "\"#$'(,.:;=?@`\\U5B{" .
|
|||
|
\ "\U80-\UA1" . "\UA7\UA8\UAB\UAD\UAF\UB4" . "\UB6-\UB8" . "\UBB\UBF"
|
|||
|
|
|||
|
let s:nonidS_chars = "[:space:])\\U5D}" . s:nonid_chars
|
|||
|
|
|||
|
" the following excludes '!' since it can be used as an identifier,
|
|||
|
" and '$' since it can be used in interpolations
|
|||
|
" note that \U2D is '-'
|
|||
|
let s:uniop_chars = "+\\U2D~¬√∛∜"
|
|||
|
|
|||
|
let s:binop_chars = "=+\\U2D*/\\%÷^&|⊻<>≤≥≡≠≢∈∉⋅×∪∩⊆⊈⊂⊄⊊←→∋∌⊕⊖⊞⊟∘∧⊗⊘↑↓∨⊠±"
|
|||
|
|
|||
|
" the following is a list of all remainig valid operator chars,
|
|||
|
" but it's more efficient when expressed with ranges (see below)
|
|||
|
" let s:binop_chars_extra = "↔↚↛↠↣↦↮⇎⇏⇒⇔⇴⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿⟵⟶⟷⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤌⤍⤎⤏⤐⤑⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥊⥋⥎⥐⥒⥓⥖⥗⥚⥛⥞⥟⥢⥤⥦⥧⥨⥩⥪⥫⥬⥭⥰⧴⬱⬰⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←→" .
|
|||
|
" \ "∝∊∍∥∦∷∺∻∽∾≁≃≄≅≆≇≈≉≊≋≌≍≎≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≣≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊃⊅⊇⊉⊋⊏⊐⊑⊒⊜⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⋍⋐⋑⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⟈⟉⟒⦷⧀⧁⧡⧣⧤⧥⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫷⫸⫹⫺⊢⊣" .
|
|||
|
" \ "⊔∓∔∸≂≏⊎⊽⋎⋓⧺⧻⨈⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨹⨺⩁⩂⩅⩊⩌⩏⩐⩒⩔⩖⩗⩛⩝⩡⩢⩣" .
|
|||
|
" \ "⊙⊚⊛⊡⊓∗∙∤⅋≀⊼⋄⋆⋇⋉⋊⋋⋌⋏⋒⟑⦸⦼⦾⦿⧶⧷⨇⨰⨱⨲⨳⨴⨵⨶⨷⨸⨻⨼⨽⩀⩃⩄⩋⩍⩎⩑⩓⩕⩘⩚⩜⩞⩟⩠⫛⊍▷⨝⟕⟖⟗" .
|
|||
|
" \ "⇵⟰⟱⤈⤉⤊⤋⤒⤓⥉⥌⥍⥏⥑⥔⥕⥘⥙⥜⥝⥠⥡⥣⥥⥮⥯↑↓"
|
|||
|
|
|||
|
" same as above, but with character ranges, for performance
|
|||
|
let s:binop_chars_extra = "\\U214B\\U2190-\\U2194\\U219A\\U219B\\U21A0\\U21A3\\U21A6\\U21AE\\U21CE\\U21CF\\U21D2\\U21D4\\U21F4-\\U21FF\\U2208-\\U220D\\U2213\\U2214\\U2217-\\U2219\\U221D\\U2224-\\U222A\\U2237\\U2238\\U223A\\U223B\\U223D\\U223E\\U2240-\\U228B\\U228D-\\U229C\\U229E-\\U22A3\\U22A9\\U22AC\\U22AE\\U22B0-\\U22B7\\U22BB-\\U22BD\\U22C4-\\U22C7\\U22C9-\\U22D3\\U22D5-\\U22ED\\U22F2-\\U22FF\\U25B7\\U27C8\\U27C9\\U27D1\\U27D2\\U27D5-\\U27D7\\U27F0\\U27F1\\U27F5-\\U27F7\\U27F7\\U27F9-\\U27FF\\U2900-\\U2918\\U291D-\\U2920\\U2944-\\U2970\\U29B7\\U29B8\\U29BC\\U29BE-\\U29C1\\U29E1\\U29E3-\\U29E5\\U29F4\\U29F6\\U29F7\\U29FA\\U29FB\\U2A07\\U2A08\\U2A1D\\U2A22-\\U2A2E\\U2A30-\\U2A3D\\U2A40-\\U2A45\\U2A4A-\\U2A58\\U2A5A-\\U2A63\\U2A66\\U2A67\\U2A6A-\\U2AD9\\U2ADB\\U2AF7-\\U2AFA\\U2B30-\\U2B44\\U2B47-\\U2B4C\\UFFE9-\\UFFEC"
|
|||
|
|
|||
|
" a Julia identifier, sort of
|
|||
|
let s:idregex = '[^' . s:nonidS_chars . '0-9!' . s:uniop_chars . s:binop_chars . '][^' . s:nonidS_chars . s:uniop_chars . s:binop_chars . s:binop_chars_extra . ']*'
|
|||
|
|
|||
|
let s:operators = '\%(' . '\.\%([-+*/^÷%|&!]\|//\|\\\|<<\|>>>\?\)\?=' .
|
|||
|
\ '\|' . '[:$<>]=\|||\|&&\||>\|<|\|<:\|:>\|::\|<<\|>>>\?\|//\|[-=]>\|\.\{3\}' .
|
|||
|
\ '\|' . '[' . s:uniop_chars . '!$]' .
|
|||
|
\ '\|' . '\.\?[' . s:binop_chars . s:binop_chars_extra . ']' .
|
|||
|
\ '\)'
|
|||
|
|
|||
|
function! julia#idundercursor()
|
|||
|
" TODO...
|
|||
|
let w = expand('<cword>')
|
|||
|
" let [l,c] = [line('.'),col('.')]
|
|||
|
" let ll = getline(l)
|
|||
|
return w
|
|||
|
endfunction
|
|||
|
|
|||
|
function! julia#gotodefinition()
|
|||
|
let w = julia#idundercursor()
|
|||
|
if empty(w)
|
|||
|
return ''
|
|||
|
endif
|
|||
|
let [l,c] = [line('.'),col('.')]
|
|||
|
let st = map(synstack(l,c), 'synIDattr(v:val, "name")')
|
|||
|
let n = len(st)
|
|||
|
if n > 0 && st[-1] =~# '^julia\%(\%(Range\|Ternary\|CTrans\)\?Operator\|\%(Possible\)\?SymbolS\?\|\%(Bl\|Rep\)\?Keyword\|Conditional\|ParDelim\|Char\|Colon\|Typedef\|Number\|Float\|Const\%(Generic\|Bool\)\|ComplexUnit\|\%(Special\|\%(Octal\|Hex\)Escape\)Char\|UniChar\%(Small\|Large\)\|Comment[LM]\|Todo\|Semicolon\)$'
|
|||
|
return ''
|
|||
|
endif
|
|||
|
|
|||
|
let comprehension = 0
|
|||
|
let indollar = 0
|
|||
|
for i in range(n-1, 0, -1)
|
|||
|
if st[i] =~# '^juliaDollar\%(Var\|Par\|SqBra\)$'
|
|||
|
let indollar = 1
|
|||
|
endif
|
|||
|
if !indollar && st[i] =~# '^julia\%(\a*String\|QuotedParBlockS\?\)$'
|
|||
|
return ''
|
|||
|
endif
|
|||
|
if st[i] =~# '^julia\%(ParBlock\%(InRange\)\?\|SqBraBlock\|\%(Dollar\|StringVars\)\%(Par\|SqBra\)\)$'
|
|||
|
let comprehension = 1
|
|||
|
endif
|
|||
|
endfor
|
|||
|
|
|||
|
let s1 = search('\C\<' . w . '\s*=[^=]', 'bcWzs')
|
|||
|
|
|||
|
return
|
|||
|
endfunction
|
|||
|
|
|||
|
endif
|
|||
|
|
|||
|
endif
|