uiua
change
commit e40324df41930354785d7e9b968bee3a1da531a8
author Alpha Chen <alpha@kejadlen.dev>
date
parent 436e8d01
diff --git a/.config/nvim/fnl/init.fnl b/.config/nvim/fnl/init.fnl
index d1a3f771..954cf28f 100644
--- a/.config/nvim/fnl/init.fnl
+++ b/.config/nvim/fnl/init.fnl
@@ -91,6 +91,7 @@
 ;;; filetype
 
 (set vim.g.do_filetype_lua true)
+(vim.filetype.add {:extension {:ua :uiua}})
 
 ;;; ftplugins in fennel
 
diff --git a/.config/nvim/syntax/uiua.vim b/.config/nvim/syntax/uiua.vim
new file mode 100644
index 00000000..234a21c8
--- /dev/null
+++ b/.config/nvim/syntax/uiua.vim
@@ -0,0 +1,117 @@
+" https://github.com/Apeiros-46B/nvim/blob/main/after/syntax/uiua.vim
+
+" uiua 0.8.0
+
+if exists("b:current_syntax")
+	finish
+endif
+
+let b:current_syntax = "uiua"
+syn iskeyword a-z
+
+syn keyword uiuaIdentifier e os Family Arch ExeExt DllExt Sep NumProcs MaxInt
+syn match   uiuaIdentifier '\a\+!*'
+
+" {{{ functions and modifiers
+" constants and recur
+syn keyword uiuaNoadic eta pi tau inf[inity] rand[om] recu[r] tag now
+syn match   uiuaNoadic '[ηπ∞τ⚂↫]'
+
+" monadic and dyadic pervasive functions
+syn keyword uiuaPervasive not sig[n] abs[olute] sqr[t] sin[e] flo[or] cei[ling] rou[nd] add subtract multiply divide mod[ulus] pow[er] log[arithm] min[imum] max[imum] ata[ngent] com[plex]
+syn match   uiuaPervasive '[¬±`¯⌵√○⌊⌈⁅]\|!=\|<=\|>=\|[=≠<≤>≥+\-×*÷%◿ⁿₙ↧↥∠ℂ]'
+
+" monadic non-pervasive functions
+syn keyword uiuaMonadic len[gth] sha[pe] rang[e] fir[st] rev[erse] des[hape] fix bit[s] tran[spose] ris[e] fal[e] whe[re] cla[ssify] ded[uplicate] box par[se] wait recv tryrecv gen utf type memo comptime
+syn match   uiuaMonadic '[⧻△⇡⊢⇌♭¤⋯⍉⍏⍖⊚⊛⊝□⋕↬]'
+
+" dyadic non-pervasive functions
+syn keyword uiuaDyadic joi[n] cou[ple] mat[ch] pic[k] sel[ect] res[hape] rer[ank] tak[e] dro[p] rot[ate] win[dows] kee[p] fin[d] mem[ber] ind[exof] ass[ert] send deal regex map has get insert remove
+syn match   uiuaDyadic '[⊂⊟≍⊡⊏↯☇↙↘↻◫▽⌕∊⊗⍤]'
+
+" monadic modifiers
+" gap, dip, and identity single-letter spellings aren't accounted for
+" 1. it's not very useful since adjacent ones won't be highlighted
+" 2. it'll get formatted anyways
+syn keyword uiuaMonadicMod gap dip eac[h] row[s] tab[le] cro[ss] rep[eat] fol[d] reduce scan gro[up] par[tition] un bot[h] unp[ack] rect[ify] thi[s] spawn
+syn match   uiuaMonadicMod '[⋅⊙∵≡⊞⊠⍥∧/\\⊕⊜°∩⊐⌅↬]'
+
+" non-monadic modifiers
+syn keyword uiuaOtherMod do und[er] fil[l] bra[cket] for[k] cas[cade] all try setinv setund
+syn match   uiuaOtherMod /[⍢⍜⬚⊓⊃⪾⋔⍣]/
+" }}}
+
+" {{{ system functions
+" defined in inverse order so precedence for e.g.
+" &i and &ime, &s and &sc, etc. is correct
+
+" modules
+syn match   uiuaModuleSF   '&i'
+
+syn match   uiuaDyadicSF   '\v\&(rs|rb|ru|w|fwa|ime|ae|tcpsrt|tcpswt|httpsw)'
+syn match   uiuaMonadicSF  '\v\&(sl|s|pf|p|raw|var|runi|runc|cd|cl|fo|fc|fde|ftr|fe|fld|fif|fras|frab|fwa|imd|ims|gifd|gife|ad|ap|tcpl|tcpa|tcpc|tcpsnb|tcpaddr|invk)'
+syn match   uiuaNoadicSF   '\v\&(sc|ts|args|asr)'
+syn match   uiuaModifierSF '&ast'
+" }}}
+
+" {{{ literals
+" numeric literal
+syn match   uiuaNum 'NaN\|[¯`]\?\d\+\(\.\d\+\)\?\(e[¯`]\?\d\+\)\?'
+
+" escape sequence and format placeholder
+syn match   uiuaEsc contained /\\[\\'"_0nrt]/
+syn match   uiuaFmt contained '_'
+
+" character literal
+syn match   uiuaChar '@.' contains=uiuaEsc
+
+" string literal (plain, format, and multiline)
+syn region  uiuaStr start='"' end='"' skip='\\"' contains=uiuaEsc
+syn region  uiuaStr start='\$"' end='"' skip='\\"' contains=uiuaEsc,uiuaFmt
+syn region  uiuaStr start='\$ ' end='$' contains=uiuaEsc,uiuaFmt
+" }}}
+
+" {{{ misc
+" function signatures
+syn match   uiuaSignature '|\d\+\(\.\d\+\)\?'
+
+" function placeholders in custom modifiers
+syn match   uiuaFunctionPlaceholder '\^\d\+\(\.\d\+\)\?'
+
+" test scopes, <- assignments, stranded arrays, and ' or '' line joining
+syn match   uiuaFaded '^---$\|[←_']'
+
+" debug functions
+syn keyword uiuaDebug dump stack trac[e]
+syn match   uiuaDebug '[⸮?]'
+
+" comments
+syn match   uiuaComment '#.*$'
+" }}}
+
+" {{{ highlight groups
+hi def link uiuaNoadic              Keyword
+hi def link uiuaNoadicSF            Keyword
+hi def link uiuaPervasive           Operator
+hi def link uiuaMonadic             Function
+hi def link uiuaMonadicSF           Function
+hi def link uiuaDyadic              Identifier
+hi def link uiuaDyadicSF            Identifier
+hi def link uiuaMonadicMod          Type
+hi def link uiuaOtherMod            Number
+hi def link uiuaModifierSF          Type
+hi def link uiuaOcean               String
+hi def link uiuaModuleSF            Keyword
+
+hi def link uiuaNum                 Number
+hi def link uiuaEsc                 SpecialChar
+hi def link uiuaChar                String
+hi def link uiuaFmt                 Operator
+hi def link uiuaStr                 String
+
+hi def link uiuaSignature           Type
+hi def link uiuaFunctionPlaceholder Keyword
+hi def link uiuaDebug               Operator
+hi def link uiuaFaded               Comment
+hi def link uiuaComment             Comment
+" }}}