Full Code of kaarmu/typst.vim for AI

main 1d5436c0f554 cached
15 files
103.4 KB
40.0k tokens
1 requests
Download .txt
Repository: kaarmu/typst.vim
Branch: main
Commit: 1d5436c0f554
Files: 15
Total size: 103.4 KB

Directory structure:
gitextract_o5i93ar6/

├── .gitignore
├── LICENSE
├── README.md
├── autoload/
│   ├── typst/
│   │   └── options.vim
│   └── typst.vim
├── compiler/
│   └── typst.vim
├── ftdetect/
│   └── typst.vim
├── ftplugin/
│   └── typst.vim
├── indent/
│   └── typst.vim
├── syntax/
│   ├── typst-embedded.vim
│   ├── typst-emoji.vim
│   ├── typst-symbols.vim
│   └── typst.vim
└── tests/
    ├── italic-bold.typ
    └── leaky-modes.typ

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.swp



================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 Kaj Munhoz Arfvidsson

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# typst.vim

*OBS: Work In Progress*

(Neo)vim plugin for [Typst](https://typst.app).

I am applying the 80/20 rule in this project since I prefer to have
something now rather than waiting for everything later.

## Features

![image](https://user-images.githubusercontent.com/19633647/230785889-0d449fc3-747b-4183-b00b-14c0ea8dd590.png)
*Editing [typst-palette](https://github.com/kaarmu/typst-palette) in Vim with the gruvbox colorscheme*

**Existing**
- Vim syntax highlighting.
- Compile the active document with `:make`.
- Concealing for italic, bold. Can be enabled with `g:typst_conceal`.
- Concealing symbols in math mode. Can be enabled with `g:typst_conceal_math`.
- Emojis! Can be enabled with `g:typst_conceal_emoji`.
- Syntax highlighting of code blocks. See `g:typst_embedded_languages`.

**Possible features**
- Formatting using [this](https://github.com/astrale-sharp/typst-fmt/)?
- Even better highlighting for neovim using treesitter?

Do you miss anything from other packages, e.g. `vimtex`, create an issue
and I'll probably add it! Also feel free to make a PR!

## Installation

### packer.nvim

```lua
require('packer').startup(function(use)

    use {'kaarmu/typst.vim', ft = {'typst'}}

end)
```

- Call `:so %` or restart neovim to reload config
- Call `:PackerSync`

### lazy.nvim
```lua
return {
  'kaarmu/typst.vim',
  ft = 'typst',
  lazy=false,
}
```

### vim-plug

```vim
call plug#begin('~/.vim/plugged')
    Plug 'kaarmu/typst.vim'
call plug#end()
```

- Restart (neo)vim to reload config
- Call `:PlugInstall`

## Usage

### Options

- `g:typst_syntax_highlight`:
    Enable syntax highlighting.
    *Default:* `1`
- `g:typst_cmd`:
    Specifies the location of the Typst executable.
    *Default:* `'typst'`
- `g:typst_pdf_viewer`:
    Specifies pdf viewer that `typst watch --open` will use.
    *Default:* `''`
- `g:typst_output_to_tmp`:
    Redirect compiled PDFs to `/tmp/typst_out/` followed by the file's path relative to `$HOME`.
    *Default:* `0`
- `g:typst_conceal`:
    Enable concealment.
    *Default:* `0`
- `g:typst_conceal_math`:
    Enable concealment for math symbols in math mode (i.e. replaces symbols
    with their actual unicode character). **OBS**: this can affect performance,
    see issue [#64](https://github.com/kaarmu/typst.vim/issues/64).
    *Default:* `g:typst_conceal`
- `g:typst_conceal_emoji`:
    Enable concealing emojis, e.g. `#emoji.alien` becomes 👽.
    *Default:* `g:typst_conceal`
- `g:typst_auto_close_toc`:
    Specifies whether TOC will be automatically closed after using it.
    *Default:* `0`
- `g:typst_auto_open_quickfix`:
    Specifies whether the quickfix list should automatically open when there are errors from typst.
    *Default:* `1`
- `g:typst_embedded_languages`:
    A list of languages that will be highlighted in code blocks. Typst is always highlighted.
    If language name is different from the syntax file name, you can use renaming, e.g. `'rs -> rust'`
    (spaces around the arrow are mandatory).
    *Default:* `[]`
- `g:typst_folding`:
    Enable folding for typst heading
    *Default:* `0`
- `g:typst_foldnested`:
    Enable nested foldings
    *Default:* `1`

### Commands

- `:TypstWatch`:
    Watches your document and recompiles on change; also opens the document with your default pdf viewer.

### Scripting

- `typst#synstack(kwargs)`:
    Detects the inner most syntax group under the cursor by default.
    **Arguments.** Accepts a single argument `kwargs` of dictionary type that can include the following keys (with defaults).
    *pos:* `getcurpos()[1:3]`.
    *only_inner:* `v:true`.
    **Note.** Does not work with treesitter enabled, see [#117].
- `typst#in_markup(...)`:
    Returns true if syntax under the cursor is in "markup" mode.
    **Arguments.** Passes all arguments to `typst#synstack`.
- `typst#in_code(...)`:
    Returns true if syntax under the cursor is in "code" mode.
    **Arguments.** Passes all arguments to `typst#synstack`.
- `typst#in_math(...)`:
    Returns true if syntax under the cursor is in "math" mode.
    **Arguments.** Passes all arguments to `typst#synstack`.
- `typst#in_comment(...)`:
    Returns true if syntax under the cursor is a comment.
    **Arguments.** Passes all arguments to `typst#synstack`.

## Tips

If you are using `neovim` you can install [typst-lsp](https://github.com/nvarner/typst-lsp).
There exist a server configuration in `nvim-lspconfig` so it should be easy to set it up. The
config currently requires that you're working in a git repo. Once the neovim+LSP recognizes
the file the LSP will compile your document while you write (almost like a wysiwyg!). By default
it will compile on save but you can set it to compile-on-write as well.

[#117]: https://github.com/kaarmu/typst.vim/issues/117



================================================
FILE: autoload/typst/options.vim
================================================

let s:initialized = v:false

function! typst#options#init() abort " {{{1
    if s:initialized | return | endif

    call s:declare_option('typst_syntax_highlight', 1)
    call s:declare_option('typst_cmd', 'typst')
    call s:declare_option('typst_pdf_viewer', '')
    call s:declare_option('typst_output_to_tmp', 0)
    call s:declare_option('typst_conceal', 0)
    call s:declare_option('typst_conceal_math', g:typst_conceal)
    call s:declare_option('typst_conceal_emoji', g:typst_conceal)
    call s:declare_option('typst_auto_close_toc', 0)
    call s:declare_option('typst_auto_open_quickfix', 1)
    call s:declare_option('typst_embedded_languages', [])
    call s:declare_option('typst_folding', 0)
    call s:declare_option('typst_foldnested', 1)

    let s:initialized = v:true
endfunction " }}}1

function! s:declare_option(option, default) " {{{1
    let l:option = 'g:' . a:option
    if !exists(l:option)
        let {l:option} = a:default
    endif
endfunction " }}}1

" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab


================================================
FILE: autoload/typst.vim
================================================
function! typst#TypstWatch(...)
    " Prepare command
    " NOTE: added arguments #23 but they will always be like
    " `typst <args> watch <file> --open` so in the future this might be
    " sensitive to in which order typst options should come.
    let l:cmd = g:typst_cmd
        \ . ' watch'
        \ . ' ' . join(a:000)
        \ . ' --diagnostic-format short'
        \ . " '" . expand('%') . "'"

    " Add custom output directory if enabled
    if g:typst_output_to_tmp
        let l:file_path = expand('%:p')
        let l:home_dir = expand('$HOME')
        " Remove HOME directory prefix if present
        if l:file_path =~# '^' . l:home_dir
            let l:relative_path = substitute(l:file_path, '^' . l:home_dir . '/', '', '')
        else
            let l:relative_path = l:file_path
        endif
        " Strip .typ or .typst extension before adding .pdf
        let l:relative_path = substitute(l:relative_path, '\.\(typ\|typst\)$', '', '')
        let l:output_path = '/tmp/typst_out/' . l:relative_path . '.pdf'
        " Create output directory if it doesn't exist
        let l:output_dir = fnamemodify(l:output_path, ':h')
        call mkdir(l:output_dir, 'p')
        let l:cmd = l:cmd . ' "' . l:output_path . '"'
    endif

    if !empty(g:typst_pdf_viewer)
        let l:cmd = l:cmd . ' --open ' . g:typst_pdf_viewer
    else
        let l:cmd = l:cmd . ' --open'
    endif

    " Write message
    echom 'Starting: ' . l:cmd

    let l:str = has('win32')
              \ ? 'cmd /s /c "' . l:cmd . '"'
              \ : 'sh -c "' . l:cmd . '"'

    if has('nvim')
        let l:JobStart = function('jobstart')
        let l:JobStop = function('jobstop')
        let l:options = {'on_stderr': 'typst#TypstWatcherCb'}
    else
        let l:JobStart = function('job_start')
        let l:JobStop = function('job_stop')
        let l:options = {'err_mode': 'raw',
                        \'err_cb': 'typst#TypstWatcherCb'}
    endif

    if exists('s:watcher') " && job_status(s:watcher) == 'run'
        " echoerr 'TypstWatch is already running.'
        call l:JobStop(s:watcher)
    endif

    let s:watcher = l:JobStart(l:str, l:options)

endfunction

" Callback function for job exit
function! typst#TypstWatcherCb(channel, content, ...)
    let l:errors = []
    let l:lines = a:content
    if !has('nvim')
	let l:lines = split(l:lines, "\n")
    endif
    for l:line in l:lines
        " Probably this match can be done using errorformat.
	" Maybe do something like vim-dispatch.
        let l:match = matchlist(l:line, '\v^([^:]+):(\d+):(\d+):\s*(.+)$')
        if 0 < len(l:match)
            let l:error = {'filename': l:match[1],
                          \'lnum': l:match[2],
                          \'col': l:match[3],
                          \'text': l:match[4]}
            call add(l:errors, l:error)
        endif
    endfor
    call setqflist(l:errors)
    if g:typst_auto_open_quickfix
        execute empty(l:errors) ? 'cclose' : 'copen | wincmd p'
    endif
endfunction

" Below are adapted from preservim/vim-markdown
" They have their own MIT License at https://github.com/preservim/vim-markdown#license
let s:headersRegexp = '^='

" For each level, contains the regexp that matches at that level only.
"
let s:levelRegexpDict = {
    \ 1: '^=[^=]',
    \ 2: '^==[^=]',
    \ 3: '^===[^=]',
    \ 4: '^====[^=]',
    \ 5: '^=====[^=]',
    \ 6: '^======[^=]'
\ }


" Returns the level of the header at the given line.
"
" If there is no header at the given line, returns `0`.
"
function! s:GetLevelOfHeaderAtLine(linenum)
    let l:lines = join(getline(a:linenum, a:linenum + 1), "\n")
    for l:key in keys(s:levelRegexpDict)
        if l:lines =~ get(s:levelRegexpDict, l:key)
            return l:key
        endif
    endfor
    return 0
endfunction

function! s:GetHeaderLineNum(...)
    if a:0 == 0
        let l:l = line('.')
    else
        let l:l = a:1
    endif
    while(l:l > 0)
        if join(getline(l:l, l:l + 1), "\n") =~ s:headersRegexp
            return l:l
        endif
        let l:l -= 1
    endwhile
    return 0
endfunction

function! s:GetHeaderLevel(...)
    if a:0 == 0
        let l:line = line('.')
    else
        let l:line = a:1
    endif
    let l:linenum = s:GetHeaderLineNum(l:line)
    if l:linenum !=# 0
        return s:GetLevelOfHeaderAtLine(l:linenum)
    else
        return 0
    endif
endfunction

function! s:GetHeaderList()
    let l:bufnr = bufnr('%')
    let l:fenced_block = 0
    let l:front_matter = 0
    let l:header_list = []
    let l:vim_markdown_frontmatter = get(g:, 'vim_markdown_frontmatter', 0)
    for i in range(1, line('$'))
        let l:lineraw = getline(i)
        let l:l1 = getline(i+1)
        let l:line = substitute(l:lineraw, '#', "\\\#", 'g')
        if join(getline(i, i + 1), "\n") =~# s:headersRegexp && l:line =~# '^\S'
            let l:is_header = 1
        else
            let l:is_header = 0
        endif
        if l:is_header ==# 1 && l:fenced_block ==# 0 && l:front_matter ==# 0
            if match(l:line, '^#') > -1
                let l:line = substitute(l:line, '\v^#*[ ]*', '', '')
                let l:line = substitute(l:line, '\v[ ]*#*$', '', '')
            endif
            let l:level = s:GetHeaderLevel(i)
            let l:item = {'level': l:level, 'text': l:line, 'lnum': i, 'bufnr': bufnr}
            let l:header_list = l:header_list + [l:item]
        endif
    endfor
    return l:header_list
endfunction

function! typst#Toc(...)
    if a:0 > 0
        let l:window_type = a:1
    else
        let l:window_type = 'vertical'
    endif

    let l:cursor_line = line('.')
    let l:cursor_header = 0
    let l:header_list = s:GetHeaderList()
    let l:indented_header_list = []
    if len(l:header_list) == 0
        echom 'Toc: No headers.'
        return
    endif
    let l:header_max_len = 0
    let l:vim_markdown_toc_autofit = get(g:, 'vim_markdown_toc_autofit', 0)
    for h in l:header_list
        if l:cursor_header == 0
            let l:header_line = h.lnum
            if l:header_line == l:cursor_line
                let l:cursor_header = index(l:header_list, h) + 1
            elseif l:header_line > l:cursor_line
                let l:cursor_header = index(l:header_list, h)
            endif
        endif
        let l:text = repeat('  ', h.level-1) . h.text
        let l:total_len = strdisplaywidth(l:text)
        if l:total_len > l:header_max_len
            let l:header_max_len = l:total_len
        endif
        let l:item = {'lnum': h.lnum, 'text': l:text, 'valid': 1, 'bufnr': h.bufnr, 'col': 1}
        let l:indented_header_list = l:indented_header_list + [l:item]
    endfor

    " Open the TOC buffer in a new window
    let l:orig_winid = win_getid()
    let l:toc_bufnr = bufnr('TOC', 1)
    " execute 'sbuffer ' . l:toc_bufnr
    if a:0 > 0
        if a:1 == 'vertical'
            execute 'vsplit +buffer' . l:toc_bufnr
            if (&columns/2) > l:header_max_len && l:vim_markdown_toc_autofit == 1
                execute 'vertical resize ' . (l:header_max_len + 1 + 3)
            else
                execute 'vertical resize ' . (&columns/2)
            endif
        elseif a:1 == 'tab'
            execute 'tabnew | buffer' . l:toc_bufnr
        else
            execute 'sbuffer ' . l:toc_bufnr
        endif
    else
        execute 'sbuffer ' . l:toc_bufnr
    endif

    setlocal buftype=nofile
    setlocal bufhidden=delete
    call setbufline(l:toc_bufnr, 1, map(copy(l:indented_header_list), 'v:val.text'))
    let b:indented_header_list = l:indented_header_list
    let b:orig_winid = l:orig_winid

    " Define a mapping to jump to the corresponding line in the original file when a line is clicked
    nnoremap <buffer> <silent> <Enter> :call <SID>JumpToHeader()<CR>

    " Move the cursor to the current header in the TOC
    execute 'normal! ' . l:cursor_header . 'G'

endfunction

function! s:JumpToHeader()
    let l:lnum = line('.')
    let l:header_info = b:indented_header_list[l:lnum - 1]
    let l:orig_winid = b:orig_winid
    call win_execute(l:orig_winid, 'buffer ' . l:header_info.bufnr)
    call win_execute(l:orig_winid, 'normal! ' . l:header_info.lnum . 'G')
    if g:typst_auto_close_toc
        bwipeout!
    endif
    call win_gotoid(l:orig_winid)
endfunction

" Detect context for #51
" Detects the inner most syntax group under the cursor by default.
function! typst#synstack(kwargs = {}) abort 
    let l:pos = get(a:kwargs, 'pos', getcurpos()[1:3])
    let l:only_inner = get(a:kwargs, 'only_inner', v:true)
    if mode() ==# 'i'
        let l:pos[1] -= 1
    endif
    call map(l:pos, 'max([v:val, 1])')

    let l:stack = map(synstack(l:pos[0], l:pos[1]), "synIDattr(v:val, 'name')")
    return l:only_inner ? l:stack[-1:] : l:stack
endfunction

function! typst#in_markup(...) abort
    let l:stack = call('typst#synstack', a:000)
    let l:ret = empty(l:stack)
    for l:name in l:stack
        let l:ret = l:ret 
            \ || l:name =~? '^typstMarkup'
            \ || l:name =~? 'Bracket$'
    endfor
    return l:ret
endfunction

function! typst#in_code(...) abort
    let l:ret = v:false
    for l:name in call('typst#synstack', a:000)
        let l:ret = l:ret 
            \ || l:name =~? '^typstCode'
            \ || l:name =~? 'Brace$'
    endfor 
    return l:ret
endfunction

function! typst#in_math(...) abort
    let l:ret = v:false
    for l:name in call('typst#synstack', a:000)
        let l:ret = l:ret 
            \ || l:name =~? '^typstMath'
            \ || l:name =~? 'Dollar$'
    endfor
    return l:ret
endfunction

function! typst#in_comment(...) abort
    let l:ret = v:false
    for l:name in call('typst#synstack', a:000)
        let l:ret = l:ret 
            \ || l:name =~? '^typstComment'
    endfor
    return l:ret
endfunction


function! typst#foldexpr()
    let line = getline(v:lnum)

    " Whenever the user wants to fold nested headers under the parent
    let nested = g:typst_folding

    " Regular headers
    let depth = match(line, '\(^=\+\)\@<=\( .*$\)\@=')

    " Do not fold nested regular headers
    if depth > 1 && !nested
        let depth = 1
    endif

    if depth > 0
        " check syntax, it should be typstMarkupHeading
        let syncode = synstack(v:lnum, 1)
        if len(syncode) > 0 && synIDattr(syncode[0], 'name') ==# 'typstMarkupHeading'
            return ">" . depth
        endif
    endif

    return "="
endfunction


================================================
FILE: compiler/typst.vim
================================================
" Vim compiler file
" Compiler: typst

if exists("current_compiler")
    finish
endif
let current_compiler = g:typst_cmd

let s:save_cpo = &cpo
set cpo&vim

if exists(":CompilerSet") != 2
    command -nargs=* CompilerSet setlocal <args>
endif

" With `--diagnostic-format` we can use the default errorformat
let s:makeprg = [current_compiler, 'compile',
              \  '--diagnostic-format', 'short']

if has('patch-7.4.191')
    call add(s:makeprg, '%:S')
else
    call add(s:makeprg, '%')
endif

" This style of `CompilerSet makeprg` is non-typical.  The reason is that I
" want to avoid a long string of escaped spaces and we can very succinctly
" build makeprg.  You cannot write something like this `CompilerSet
" makeprg=s:makeprg`.
execute 'CompilerSet makeprg=' . join(s:makeprg, '\ ')

let &cpo = s:save_cpo
unlet s:save_cpo
" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab


================================================
FILE: ftdetect/typst.vim
================================================
autocmd! BufRead,BufNewFile *.typ set filetype=typst


================================================
FILE: ftplugin/typst.vim
================================================
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1

let s:cpo_orig = &cpo
set cpo&vim

call typst#options#init()

compiler typst

" " If you're on typst <v0.8, workaround for https://github.com/typst/typst/issues/1937
" set errorformat^=\/%f:%l:%c:%m

if !exists("g:typst_recommended_style") || g:typst_recommended_style != 0
    setlocal expandtab
    setlocal tabstop=8
    setlocal softtabstop=2
    setlocal shiftwidth=2
endif

if g:typst_folding
    setlocal foldexpr=typst#foldexpr()
    setlocal foldmethod=expr
    if !exists("b:undo_ftplugin")
        let b:undo_ftplugin = ""
    endif
    let b:undo_ftplugin .= "|setl foldexpr< foldmethod<"
endif

if g:typst_conceal
    setlocal conceallevel=2
endif

setlocal commentstring=//\ %s
setlocal comments=s1:/*,mb:*,ex:*/,://

setlocal formatoptions+=croqn
setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s*
setlocal formatlistpat+=\\\|^\\s*[-+\]\\s\\+

if has('win32')
    setlocal iskeyword=a-z,A-Z,48-57,_,-,128-167,224-235
else
    setlocal iskeyword=a-z,A-Z,48-57,_,-,192-255
endif

setlocal suffixesadd=.typ

command! -nargs=* -buffer TypstWatch call typst#TypstWatch(<f-args>)

command! -buffer Toc call typst#Toc('vertical')
command! -buffer Toch call typst#Toc('horizontal')
command! -buffer Tocv call typst#Toc('vertical')
command! -buffer Toct call typst#Toc('tab')

let &cpo = s:cpo_orig
unlet s:cpo_orig

" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab


================================================
FILE: indent/typst.vim
================================================
if exists('b:did_indent')
  finish
endif

let b:did_indent = 1

let s:cpo_save = &cpoptions
set cpoptions&vim

setlocal autoindent
setlocal indentexpr=TypstIndentExpr()
" setlocal indentkeys=... " We use the default

" This wrapper function is used to enhance performance.
function! TypstIndentExpr() abort
    return TypstIndent(v:lnum)
endfunction

function! TypstIndent(lnum) abort " {{{1
    let s:sw = shiftwidth()

    let [l:plnum, l:pline] = s:get_prev_nonblank(a:lnum - 1)
    if l:plnum == 0 | return 0 | endif

    let l:line = getline(a:lnum)
    let l:ind = indent(l:plnum)

    let l:synname = synIDattr(synID(a:lnum, 1, 1), "name")

    " Use last indent for block comments
    if l:synname == 'typstCommentBlock'
        return l:ind
    " do not change the indents of bullet lists
    elseif l:synname == 'typstMarkupBulletList'
        return indent(a:lnum)
    endif

    if l:pline =~ '\v[{[(]\s*$'
        let l:ind += s:sw
    endif

    if l:line =~ '\v^\s*[}\])]'
        let l:ind -= s:sw
    endif

    return l:ind
endfunction
" }}}1

" Gets the previous non-blank line that is not a comment.
function! s:get_prev_nonblank(lnum) abort " {{{1
    let l:lnum = prevnonblank(a:lnum)
    let l:line = getline(l:lnum)

    while l:lnum > 0 && l:line =~ '^\s*//'
        let l:lnum = prevnonblank(l:lnum - 1)
        let l:line = getline(l:lnum)
    endwhile

    return [l:lnum, s:remove_comments(l:line)]
endfunction
" }}}1

" Removes comments from the given line.
function! s:remove_comments(line) abort " {{{1
    return substitute(a:line, '\s*//.*', '', '')
endfunction
" }}}1

let &cpoptions = s:cpo_save
unlet s:cpo_save

" vim: et sts=2 sw=2 ft=vim


================================================
FILE: syntax/typst-embedded.vim
================================================
" Vim syntax file
" Language: Typst
" Maintainer: Kaj Munhoz Arfvidsson
" Upstream: https://github.com/kaarmu/typst.vim

for s:name in g:typst_embedded_languages
    let s:langname = substitute(s:name, '  *-> .*$', '', '')
    let s:langfile = substitute(s:name, '^.* ->  *', '', '')
    let s:include = ['syntax include'
                \   ,'@typstEmbedded_'..s:langname
                \   ,'syntax/'..s:langfile..'.vim']
    let s:rule = ['syn region'
                \,s:langname
                \,'matchgroup=Macro'
                \,'start=/```'..s:langname..'\>/ end=/```/'
                \,'contains=@typstEmbedded_'..s:langname
                \,'keepend']
    if g:typst_conceal
        let s:rule += ['concealends']
    endif
    execute 'silent! ' .. join(s:include, ' ')
    unlet! b:current_syntax
    execute join(s:rule, ' ')
endfor

" vim: sw=4 sts=4 et fdm=marker fdl=0


================================================
FILE: syntax/typst-emoji.vim
================================================
" Vim syntax file
" Language: Typst
" Maintainer: Kaj Munhoz Arfvidsson
" Upstream: https://github.com/kaarmu/typst.vim

let s:typstEmojiList = [
    \ ['abacus', '🧮'],
    \ ['abc', '🔤'],
    \ ['abcd', '🔡'],
    \ ['ABCD', '🔠'],
    \ ['accordion', '🪗'],
    \ ['aesculapius', '⚕'],
    \ ['airplane', '✈'],
    \ ['airplane\.landing', '🛬'],
    \ ['airplane\.small', '🛩'],
    \ ['airplane\.takeoff', '🛫'],
    \ ['alembic', '⚗'],
    \ ['alien', '👽'],
    \ ['alien\.monster', '👾'],
    \ ['ambulance', '🚑'],
    \ ['amphora', '🏺'],
    \ ['anchor', '⚓'],
    \ ['anger', '💢'],
    \ ['ant', '🐜'],
    \ ['apple\.green', '🍏'],
    \ ['apple\.red', '🍎'],
    \ ['arm\.mech', '🦾'],
    \ ['arm\.muscle', '💪'],
    \ ['arm\.selfie', '🤳'],
    \ ['arrow\.r\.filled', '➡'],
    \ ['arrow\.r\.hook', '↪'],
    \ ['arrow\.r\.soon', '🔜'],
    \ ['arrow\.l\.filled', '⬅'],
    \ ['arrow\.l\.hook', '↩'],
    \ ['arrow\.l\.back', '🔙'],
    \ ['arrow\.l\.end', '🔚'],
    \ ['arrow\.t\.filled', '⬆'],
    \ ['arrow\.t\.curve', '⤴'],
    \ ['arrow\.t\.top', '🔝'],
    \ ['arrow\.b\.filled', '⬇'],
    \ ['arrow\.b\.curve', '⤵'],
    \ ['arrow\.l\.r', '↔'],
    \ ['arrow\.l\.r\.on', '🔛'],
    \ ['arrow\.t\.b', '↕'],
    \ ['arrow\.bl', '↙'],
    \ ['arrow\.br', '↘'],
    \ ['arrow\.tl', '↖'],
    \ ['arrow\.tr', '↗'],
    \ ['arrows\.cycle', '🔄'],
    \ ['ast', '*'],
    \ ['ast\.box', '✳'],
    \ ['atm', '🏧'],
    \ ['atom', '⚛'],
    \ ['aubergine', '🍆'],
    \ ['avocado', '🥑'],
    \ ['axe', '🪓'],
    \ ['baby', '👶'],
    \ ['baby\.angel', '👼'],
    \ ['baby\.box', '🚼'],
    \ ['babybottle', '🍼'],
    \ ['backpack', '🎒'],
    \ ['bacon', '🥓'],
    \ ['badger', '🦡'],
    \ ['badminton', '🏸'],
    \ ['bagel', '🥯'],
    \ ['baggageclaim', '🛄'],
    \ ['baguette', '🥖'],
    \ ['balloon', '🎈'],
    \ ['ballot\.check', '☑'],
    \ ['ballotbox', '🗳'],
    \ ['banana', '🍌'],
    \ ['banjo', '🪕'],
    \ ['bank', '🏦'],
    \ ['barberpole', '💈'],
    \ ['baseball', '⚾'],
    \ ['basecap', '🧢'],
    \ ['basket', '🧺'],
    \ ['basketball', '⛹'],
    \ ['basketball\.ball', '🏀'],
    \ ['bat', '🦇'],
    \ ['bathtub', '🛀'],
    \ ['bathtub\.foam', '🛁'],
    \ ['battery', '🔋'],
    \ ['battery\.low', '🪫'],
    \ ['beach\.palm', '🏝'],
    \ ['beach\.umbrella', '🏖'],
    \ ['beads', '📿'],
    \ ['beans', '🫘'],
    \ ['bear', '🐻'],
    \ ['beaver', '🦫'],
    \ ['bed', '🛏'],
    \ ['bed\.person', '🛌'],
    \ ['bee', '🐝'],
    \ ['beer', '🍺'],
    \ ['beer\.clink', '🍻'],
    \ ['beetle', '🪲'],
    \ ['beetle\.lady', '🐞'],
    \ ['bell', '🔔'],
    \ ['bell\.ding', '🛎'],
    \ ['bell\.not', '🔕'],
    \ ['bento', '🍱'],
    \ ['bicyclist', '🚴'],
    \ ['bicyclist\.mountain', '🚵'],
    \ ['bike', '🚲'],
    \ ['bike\.not', '🚳'],
    \ ['bikini', '👙'],
    \ ['billiards', '🎱'],
    \ ['bin', '🗑'],
    \ ['biohazard', '☣'],
    \ ['bird', '🐦'],
    \ ['bison', '🦬'],
    \ ['blood', '🩸'],
    \ ['blouse', '👚'],
    \ ['blowfish', '🐡'],
    \ ['blueberries', '🫐'],
    \ ['boar', '🐗'],
    \ ['boat\.sail', '⛵'],
    \ ['boat\.row', '🚣'],
    \ ['boat\.motor', '🛥'],
    \ ['boat\.speed', '🚤'],
    \ ['boat\.canoe', '🛶'],
    \ ['bolt', '🔩'],
    \ ['bomb', '💣'],
    \ ['bone', '🦴'],
    \ ['book\.red', '📕'],
    \ ['book\.blue', '📘'],
    \ ['book\.green', '📗'],
    \ ['book\.orange', '📙'],
    \ ['book\.spiral', '📒'],
    \ ['book\.open', '📖'],
    \ ['bookmark', '🔖'],
    \ ['books', '📚'],
    \ ['boomerang', '🪃'],
    \ ['bordercontrol', '🛂'],
    \ ['bouquet', '💐'],
    \ ['bow', '🏹'],
    \ ['bowl\.spoon', '🥣'],
    \ ['bowl\.steam', '🍜'],
    \ ['bowling', '🎳'],
    \ ['boxing', '🥊'],
    \ ['boy', '👦'],
    \ ['brain', '🧠'],
    \ ['bread', '🍞'],
    \ ['brick', '🧱'],
    \ ['bride', '👰'],
    \ ['bridge\.fog', '🌁'],
    \ ['bridge\.night', '🌉'],
    \ ['briefcase', '💼'],
    \ ['briefs', '🩲'],
    \ ['brightness\.high', '🔆'],
    \ ['brightness\.low', '🔅'],
    \ ['broccoli', '🥦'],
    \ ['broom', '🧹'],
    \ ['brush', '🖌'],
    \ ['bubble\.speech\.r', '💬'],
    \ ['bubble\.speech\.l', '🗨'],
    \ ['bubble\.thought', '💭'],
    \ ['bubble\.anger\.r', '🗯'],
    \ ['bubbles', '🫧'],
    \ ['bubbletea', '🧋'],
    \ ['bucket', '🪣'],
    \ ['buffalo\.water', '🐃'],
    \ ['bug', '🐛'],
    \ ['builder', '👷'],
    \ ['burger', '🍔'],
    \ ['burrito', '🌯'],
    \ ['bus', '🚌'],
    \ ['bus\.front', '🚍'],
    \ ['bus\.small', '🚐'],
    \ ['bus\.stop', '🚏'],
    \ ['bus\.trolley', '🚎'],
    \ ['butter', '🧈'],
    \ ['butterfly', '🦋'],
    \ ['button', '🔲'],
    \ ['button\.alt', '🔳'],
    \ ['button\.radio', '🔘'],
    \ ['cabinet\.file', '🗄'],
    \ ['cablecar', '🚠'],
    \ ['cablecar\.small', '🚡'],
    \ ['cactus', '🌵'],
    \ ['cake', '🎂'],
    \ ['cake\.fish', '🍥'],
    \ ['cake\.moon', '🥮'],
    \ ['cake\.slice', '🍰'],
    \ ['calendar', '📅'],
    \ ['calendar\.spiral', '🗓'],
    \ ['calendar\.tearoff', '📆'],
    \ ['camel', '🐫'],
    \ ['camel\.dromedar', '🐪'],
    \ ['camera', '📷'],
    \ ['camera\.flash', '📸'],
    \ ['camera\.movie', '🎥'],
    \ ['camera\.movie\.box', '🎦'],
    \ ['camera\.video', '📹'],
    \ ['camping', '🏕'],
    \ ['can', '🥫'],
    \ ['candle', '🕯'],
    \ ['candy', '🍬'],
    \ ['cane', '🦯'],
    \ ['car', '🚗'],
    \ ['car\.front', '🚘'],
    \ ['car\.pickup', '🛻'],
    \ ['car\.police', '🚓'],
    \ ['car\.police\.front', '🚔'],
    \ ['car\.racing', '🏎'],
    \ ['car\.rickshaw', '🛺'],
    \ ['car\.suv', '🚙'],
    \ ['card\.credit', '💳'],
    \ ['card\.id', '🪪'],
    \ ['cardindex', '📇'],
    \ ['carrot', '🥕'],
    \ ['cart', '🛒'],
    \ ['cassette', '📼'],
    \ ['castle\.eu', '🏰'],
    \ ['castle\.jp', '🏯'],
    \ ['cat', '🐈'],
    \ ['cat\.face', '🐱'],
    \ ['cat\.face\.angry', '😾'],
    \ ['cat\.face\.cry', '😿'],
    \ ['cat\.face\.heart', '😻'],
    \ ['cat\.face\.joy', '😹'],
    \ ['cat\.face\.kiss', '😽'],
    \ ['cat\.face\.laugh', '😸'],
    \ ['cat\.face\.shock', '🙀'],
    \ ['cat\.face\.smile', '😺'],
    \ ['cat\.face\.smirk', '😼'],
    \ ['chain', '🔗'],
    \ ['chains', '⛓'],
    \ ['chair', '🪑'],
    \ ['champagne', '🍾'],
    \ ['chart\.bar', '📊'],
    \ ['chart\.up', '📈'],
    \ ['chart\.down', '📉'],
    \ ['chart\.yen\.up', '💹'],
    \ ['checkmark\.heavy', '✔'],
    \ ['checkmark\.box', '✅'],
    \ ['cheese', '🧀'],
    \ ['cherries', '🍒'],
    \ ['chess', '♟'],
    \ ['chestnut', '🌰'],
    \ ['chicken', '🐔'],
    \ ['chicken\.baby', '🐥'],
    \ ['chicken\.baby\.egg', '🐣'],
    \ ['chicken\.baby\.head', '🐤'],
    \ ['chicken\.leg', '🍗'],
    \ ['chicken\.male', '🐓'],
    \ ['child', '🧒'],
    \ ['chipmunk', '🐿'],
    \ ['chocolate', '🍫'],
    \ ['chopsticks', '🥢'],
    \ ['church', '⛪'],
    \ ['church\.love', '💒'],
    \ ['cigarette', '🚬'],
    \ ['cigarette\.not', '🚭'],
    \ ['circle\.black', '⚫'],
    \ ['circle\.blue', '🔵'],
    \ ['circle\.brown', '🟤'],
    \ ['circle\.green', '🟢'],
    \ ['circle\.orange', '🟠'],
    \ ['circle\.purple', '🟣'],
    \ ['circle\.white', '⚪'],
    \ ['circle\.red', '🔴'],
    \ ['circle\.yellow', '🟡'],
    \ ['circle\.stroked', '⭕'],
    \ ['circus', '🎪'],
    \ ['city', '🏙'],
    \ ['city\.dusk', '🌆'],
    \ ['city\.night', '🌃'],
    \ ['city\.sunset', '🌇'],
    \ ['clamp', '🗜'],
    \ ['clapperboard', '🎬'],
    \ ['climbing', '🧗'],
    \ ['clip', '📎'],
    \ ['clipboard', '📋'],
    \ ['clips', '🖇'],
    \ ['clock\.one', '🕐'],
    \ ['clock\.one\.thirty', '🕜'],
    \ ['clock\.two', '🕑'],
    \ ['clock\.two\.thirty', '🕝'],
    \ ['clock\.three', '🕒'],
    \ ['clock\.three\.thirty', '🕞'],
    \ ['clock\.four', '🕓'],
    \ ['clock\.four\.thirty', '🕟'],
    \ ['clock\.five', '🕔'],
    \ ['clock\.five\.thirty', '🕠'],
    \ ['clock\.six', '🕕'],
    \ ['clock\.six\.thirty', '🕡'],
    \ ['clock\.seven', '🕖'],
    \ ['clock\.seven\.thirty', '🕢'],
    \ ['clock\.eight', '🕗'],
    \ ['clock\.eight\.thirty', '🕣'],
    \ ['clock\.nine', '🕘'],
    \ ['clock\.nine\.thirty', '🕤'],
    \ ['clock\.ten', '🕙'],
    \ ['clock\.ten\.thirty', '🕥'],
    \ ['clock\.eleven', '🕚'],
    \ ['clock\.eleven\.thirty', '🕦'],
    \ ['clock\.twelve', '🕛'],
    \ ['clock\.twelve\.thirty', '🕧'],
    \ ['clock\.alarm', '⏰'],
    \ ['clock\.old', '🕰'],
    \ ['clock\.timer', '⏲'],
    \ ['cloud', '☁'],
    \ ['cloud\.dust', '💨'],
    \ ['cloud\.rain', '🌧'],
    \ ['cloud\.snow', '🌨'],
    \ ['cloud\.storm', '⛈'],
    \ ['cloud\.sun', '⛅'],
    \ ['cloud\.sun\.hidden', '🌥'],
    \ ['cloud\.sun\.rain', '🌦'],
    \ ['cloud\.thunder', '🌩'],
    \ ['coat', '🧥'],
    \ ['coat\.lab', '🥼'],
    \ ['cockroach', '🪳'],
    \ ['cocktail\.martini', '🍸'],
    \ ['cocktail\.tropical', '🍹'],
    \ ['coconut', '🥥'],
    \ ['coffee', '☕'],
    \ ['coffin', '⚰'],
    \ ['coin', '🪙'],
    \ ['comet', '☄'],
    \ ['compass', '🧭'],
    \ ['computer', '🖥'],
    \ ['computermouse', '🖱'],
    \ ['confetti', '🎊'],
    \ ['construction', '🚧'],
    \ ['controller', '🎮'],
    \ ['cookie', '🍪'],
    \ ['cookie\.fortune', '🥠'],
    \ ['cooking', '🍳'],
    \ ['cool', '🆒'],
    \ ['copyright', '©'],
    \ ['coral', '🪸'],
    \ ['corn', '🌽'],
    \ ['couch', '🛋'],
    \ ['couple', '💑'],
    \ ['cow', '🐄'],
    \ ['cow\.face', '🐮'],
    \ ['crab', '🦀'],
    \ ['crane', '🏗'],
    \ ['crayon', '🖍'],
    \ ['cricket', '🦗'],
    \ ['cricketbat', '🏏'],
    \ ['crocodile', '🐊'],
    \ ['croissant', '🥐'],
    \ ['crossmark', '❌'],
    \ ['crossmark\.box', '❎'],
    \ ['crown', '👑'],
    \ ['crutch', '🩼'],
    \ ['crystal', '🔮'],
    \ ['cucumber', '🥒'],
    \ ['cup\.straw', '🥤'],
    \ ['cupcake', '🧁'],
    \ ['curling', '🥌'],
    \ ['curry', '🍛'],
    \ ['custard', '🍮'],
    \ ['customs', '🛃'],
    \ ['cutlery', '🍴'],
    \ ['cyclone', '🌀'],
    \ ['dancing\.man', '🕺'],
    \ ['dancing\.woman', '💃'],
    \ ['dancing\.women\.bunny', '👯'],
    \ ['darts', '🎯'],
    \ ['dash\.wave\.double', '〰'],
    \ ['deer', '🦌'],
    \ ['desert', '🏜'],
    \ ['detective', '🕵'],
    \ ['diamond\.blue', '🔷'],
    \ ['diamond\.blue\.small', '🔹'],
    \ ['diamond\.orange', '🔶'],
    \ ['diamond\.orange\.small', '🔸'],
    \ ['diamond\.dot', '💠'],
    \ ['die', '🎲'],
    \ ['dino\.pod', '🦕'],
    \ ['dino\.rex', '🦖'],
    \ ['disc\.cd', '💿'],
    \ ['disc\.dvd', '📀'],
    \ ['disc\.mini', '💽'],
    \ ['discoball', '🪩'],
    \ ['diving', '🤿'],
    \ ['dodo', '🦤'],
    \ ['dog', '🐕'],
    \ ['dog\.face', '🐶'],
    \ ['dog\.guide', '🦮'],
    \ ['dog\.poodle', '🐩'],
    \ ['dollar', '💲'],
    \ ['dolphin', '🐬'],
    \ ['donut', '🍩'],
    \ ['door', '🚪'],
    \ ['dove\.peace', '🕊'],
    \ ['dragon', '🐉'],
    \ ['dragon\.face', '🐲'],
    \ ['dress', '👗'],
    \ ['dress\.kimono', '👘'],
    \ ['dress\.sari', '🥻'],
    \ ['drop', '💧'],
    \ ['drops', '💦'],
    \ ['drum', '🥁'],
    \ ['drum\.big', '🪘'],
    \ ['duck', '🦆'],
    \ ['dumpling', '🥟'],
    \ ['eagle', '🦅'],
    \ ['ear', '👂'],
    \ ['ear\.aid', '🦻'],
    \ ['egg', '🥚'],
    \ ['eighteen\.not', '🔞'],
    \ ['elephant', '🐘'],
    \ ['elevator', '🛗'],
    \ ['elf', '🧝'],
    \ ['email', '📧'],
    \ ['excl', '❗'],
    \ ['excl\.white', '❕'],
    \ ['excl\.double', '‼'],
    \ ['excl\.quest', '⁉'],
    \ ['explosion', '💥'],
    \ ['extinguisher', '🧯'],
    \ ['eye', '👁'],
    \ ['eyes', '👀'],
    \ ['face\.grin', '😀'],
    \ ['face\.angry', '😠'],
    \ ['face\.angry\.red', '😡'],
    \ ['face\.anguish', '😧'],
    \ ['face\.astonish', '😲'],
    \ ['face\.bandage', '🤕'],
    \ ['face\.beam', '😁'],
    \ ['face\.blank', '😶'],
    \ ['face\.clown', '🤡'],
    \ ['face\.cold', '🥶'],
    \ ['face\.concern', '😦'],
    \ ['face\.cool', '😎'],
    \ ['face\.cover', '🤭'],
    \ ['face\.cowboy', '🤠'],
    \ ['face\.cry', '😭'],
    \ ['face\.devil\.smile', '😈'],
    \ ['face\.devil\.frown', '👿'],
    \ ['face\.diagonal', '🫤'],
    \ ['face\.disguise', '🥸'],
    \ ['face\.dizzy', '😵'],
    \ ['face\.dotted', '🫥'],
    \ ['face\.down', '😞'],
    \ ['face\.down\.sweat', '😓'],
    \ ['face\.drool', '🤤'],
    \ ['face\.explode', '🤯'],
    \ ['face\.eyeroll', '🙄'],
    \ ['face\.friendly', '☺'],
    \ ['face\.fear', '😨'],
    \ ['face\.fear\.sweat', '😰'],
    \ ['face\.fever', '🤒'],
    \ ['face\.flush', '😳'],
    \ ['face\.frown', '☹'],
    \ ['face\.frown\.slight', '🙁'],
    \ ['face\.frust', '😣'],
    \ ['face\.goofy', '🤪'],
    \ ['face\.halo', '😇'],
    \ ['face\.happy', '😊'],
    \ ['face\.heart', '😍'],
    \ ['face\.hearts', '🥰'],
    \ ['face\.heat', '🥵'],
    \ ['face\.hug', '🤗'],
    \ ['face\.inv', '🙃'],
    \ ['face\.joy', '😂'],
    \ ['face\.kiss', '😗'],
    \ ['face\.kiss\.smile', '😙'],
    \ ['face\.kiss\.heart', '😘'],
    \ ['face\.kiss\.blush', '😚'],
    \ ['face\.lick', '😋'],
    \ ['face\.lie', '🤥'],
    \ ['face\.mask', '😷'],
    \ ['face\.meh', '😒'],
    \ ['face\.melt', '🫠'],
    \ ['face\.money', '🤑'],
    \ ['face\.monocle', '🧐'],
    \ ['face\.nausea', '🤢'],
    \ ['face\.nerd', '🤓'],
    \ ['face\.neutral', '😐'],
    \ ['face\.open', '😃'],
    \ ['face\.party', '🥳'],
    \ ['face\.peek', '🫣'],
    \ ['face\.plead', '🥺'],
    \ ['face\.relief', '😌'],
    \ ['face\.rofl', '🤣'],
    \ ['face\.sad', '😔'],
    \ ['face\.salute', '🫡'],
    \ ['face\.shock', '😱'],
    \ ['face\.shush', '🤫'],
    \ ['face\.skeptic', '🤨'],
    \ ['face\.sleep', '😴'],
    \ ['face\.sleepy', '😪'],
    \ ['face\.smile', '😄'],
    \ ['face\.smile\.slight', '🙂'],
    \ ['face\.smile\.sweat', '😅'],
    \ ['face\.smile\.tear', '🥲'],
    \ ['face\.smirk', '😏'],
    \ ['face\.sneeze', '🤧'],
    \ ['face\.speak\.not', '🫢'],
    \ ['face\.squint', '😆'],
    \ ['face\.stars', '🤩'],
    \ ['face\.straight', '😑'],
    \ ['face\.suffer', '😖'],
    \ ['face\.surprise', '😯'],
    \ ['face\.symbols', '🤬'],
    \ ['face\.tear', '😢'],
    \ ['face\.tear\.relief', '😥'],
    \ ['face\.tear\.withheld', '🥹'],
    \ ['face\.teeth', '😬'],
    \ ['face\.think', '🤔'],
    \ ['face\.tired', '😫'],
    \ ['face\.tongue', '😛'],
    \ ['face\.tongue\.squint', '😝'],
    \ ['face\.tongue\.wink', '😜'],
    \ ['face\.triumph', '😤'],
    \ ['face\.unhappy', '😕'],
    \ ['face\.vomit', '🤮'],
    \ ['face\.weary', '😩'],
    \ ['face\.wink', '😉'],
    \ ['face\.woozy', '🥴'],
    \ ['face\.worry', '😟'],
    \ ['face\.wow', '😮'],
    \ ['face\.yawn', '🥱'],
    \ ['face\.zip', '🤐'],
    \ ['factory', '🏭'],
    \ ['fairy', '🧚'],
    \ ['faith\.christ', '✝'],
    \ ['faith\.dharma', '☸'],
    \ ['faith\.islam', '☪'],
    \ ['faith\.judaism', '✡'],
    \ ['faith\.menorah', '🕎'],
    \ ['faith\.om', '🕉'],
    \ ['faith\.orthodox', '☦'],
    \ ['faith\.peace', '☮'],
    \ ['faith\.star\.dot', '🔯'],
    \ ['faith\.worship', '🛐'],
    \ ['faith\.yinyang', '☯'],
    \ ['falafel', '🧆'],
    \ ['family', '👪'],
    \ ['fax', '📠'],
    \ ['feather', '🪶'],
    \ ['feeding\.breast', '🤱'],
    \ ['fencing', '🤺'],
    \ ['ferriswheel', '🎡'],
    \ ['filebox', '🗃'],
    \ ['filedividers', '🗂'],
    \ ['film', '🎞'],
    \ ['finger\.r', '👉'],
    \ ['finger\.l', '👈'],
    \ ['finger\.t', '👆'],
    \ ['finger\.t\.alt', '☝'],
    \ ['finger\.b', '👇'],
    \ ['finger\.front', '🫵'],
    \ ['finger\.m', '🖕'],
    \ ['fingers\.cross', '🤞'],
    \ ['fingers\.pinch', '🤌'],
    \ ['fingers\.snap', '🫰'],
    \ ['fire', '🔥'],
    \ ['firecracker', '🧨'],
    \ ['fireengine', '🚒'],
    \ ['fireworks', '🎆'],
    \ ['fish', '🐟'],
    \ ['fish\.tropical', '🐠'],
    \ ['fishing', '🎣'],
    \ ['fist\.front', '👊'],
    \ ['fist\.r', '🤜'],
    \ ['fist\.l', '🤛'],
    \ ['fist\.raised', '✊'],
    \ ['flag\.black', '🏴'],
    \ ['flag\.white', '🏳'],
    \ ['flag\.goal', '🏁'],
    \ ['flag\.golf', '⛳'],
    \ ['flag\.red', '🚩'],
    \ ['flags\.jp\.crossed', '🎌'],
    \ ['flamingo', '🦩'],
    \ ['flashlight', '🔦'],
    \ ['flatbread', '🫓'],
    \ ['fleur', '⚜'],
    \ ['floppy', '💾'],
    \ ['flower\.hibiscus', '🌺'],
    \ ['flower\.lotus', '🪷'],
    \ ['flower\.pink', '🌸'],
    \ ['flower\.rose', '🌹'],
    \ ['flower\.sun', '🌻'],
    \ ['flower\.tulip', '🌷'],
    \ ['flower\.white', '💮'],
    \ ['flower\.wilted', '🥀'],
    \ ['flower\.yellow', '🌼'],
    \ ['fly', '🪰'],
    \ ['fog', '🌫'],
    \ ['folder', '📁'],
    \ ['folder\.open', '📂'],
    \ ['fondue', '🫕'],
    \ ['foot', '🦶'],
    \ ['football', '⚽'],
    \ ['football\.am', '🏈'],
    \ ['forex', '💱'],
    \ ['fountain', '⛲'],
    \ ['fox', '🦊'],
    \ ['free', '🆓'],
    \ ['fries', '🍟'],
    \ ['frisbee', '🥏'],
    \ ['frog\.face', '🐸'],
    \ ['fuelpump', '⛽'],
    \ ['garlic', '🧄'],
    \ ['gear', '⚙'],
    \ ['gem', '💎'],
    \ ['genie', '🧞'],
    \ ['ghost', '👻'],
    \ ['giraffe', '🦒'],
    \ ['girl', '👧'],
    \ ['glass\.clink', '🥂'],
    \ ['glass\.milk', '🥛'],
    \ ['glass\.pour', '🫗'],
    \ ['glass\.tumbler', '🥃'],
    \ ['glasses', '👓'],
    \ ['glasses\.sun', '🕶'],
    \ ['globe\.am', '🌎'],
    \ ['globe\.as\.au', '🌏'],
    \ ['globe\.eu\.af', '🌍'],
    \ ['globe\.meridian', '🌐'],
    \ ['gloves', '🧤'],
    \ ['goal', '🥅'],
    \ ['goat', '🐐'],
    \ ['goggles', '🥽'],
    \ ['golfing', '🏌'],
    \ ['gorilla', '🦍'],
    \ ['grapes', '🍇'],
    \ ['guard\.man', '💂'],
    \ ['guitar', '🎸'],
    \ ['gymnastics', '🤸'],
    \ ['haircut', '💇'],
    \ ['hammer', '🔨'],
    \ ['hammer\.pick', '⚒'],
    \ ['hammer\.wrench', '🛠'],
    \ ['hamsa', '🪬'],
    \ ['hamster\.face', '🐹'],
    \ ['hand\.raised', '✋'],
    \ ['hand\.raised\.alt', '🤚'],
    \ ['hand\.r', '🫱'],
    \ ['hand\.l', '🫲'],
    \ ['hand\.t', '🫴'],
    \ ['hand\.b', '🫳'],
    \ ['hand\.ok', '👌'],
    \ ['hand\.call', '🤙'],
    \ ['hand\.love', '🤟'],
    \ ['hand\.part', '🖖'],
    \ ['hand\.peace', '✌'],
    \ ['hand\.pinch', '🤏'],
    \ ['hand\.rock', '🤘'],
    \ ['hand\.splay', '🖐'],
    \ ['hand\.wave', '👋'],
    \ ['hand\.write', '✍'],
    \ ['handbag', '👜'],
    \ ['handball', '🤾'],
    \ ['handholding\.man\.man', '👬'],
    \ ['handholding\.woman\.man', '👫'],
    \ ['handholding\.woman\.woman', '👭'],
    \ ['hands\.folded', '🙏'],
    \ ['hands\.palms', '🤲'],
    \ ['hands\.clap', '👏'],
    \ ['hands\.heart', '🫶'],
    \ ['hands\.open', '👐'],
    \ ['hands\.raised', '🙌'],
    \ ['hands\.shake', '🤝'],
    \ ['hash', '#'],
    \ ['hat\.ribbon', '👒'],
    \ ['hat\.top', '🎩'],
    \ ['headphone', '🎧'],
    \ ['heart', '❤'],
    \ ['heart\.arrow', '💘'],
    \ ['heart\.beat', '💓'],
    \ ['heart\.black', '🖤'],
    \ ['heart\.blue', '💙'],
    \ ['heart\.box', '💟'],
    \ ['heart\.broken', '💔'],
    \ ['heart\.brown', '🤎'],
    \ ['heart\.double', '💕'],
    \ ['heart\.excl', '❣'],
    \ ['heart\.green', '💚'],
    \ ['heart\.grow', '💗'],
    \ ['heart\.orange', '🧡'],
    \ ['heart\.purple', '💜'],
    \ ['heart\.real', '🫀'],
    \ ['heart\.revolve', '💞'],
    \ ['heart\.ribbon', '💝'],
    \ ['heart\.spark', '💖'],
    \ ['heart\.white', '🤍'],
    \ ['heart\.yellow', '💛'],
    \ ['hedgehog', '🦔'],
    \ ['helicopter', '🚁'],
    \ ['helix', '🧬'],
    \ ['helmet\.cross', '⛑'],
    \ ['helmet\.military', '🪖'],
    \ ['hippo', '🦛'],
    \ ['hockey', '🏑'],
    \ ['hole', '🕳'],
    \ ['honey', '🍯'],
    \ ['hongbao', '🧧'],
    \ ['hook', '🪝'],
    \ ['horn\.postal', '📯'],
    \ ['horse', '🐎'],
    \ ['horse\.carousel', '🎠'],
    \ ['horse\.face', '🐴'],
    \ ['horse\.race', '🏇'],
    \ ['hospital', '🏥'],
    \ ['hotdog', '🌭'],
    \ ['hotel', '🏨'],
    \ ['hotel\.love', '🏩'],
    \ ['hotspring', '♨'],
    \ ['hourglass', '⌛'],
    \ ['hourglass\.flow', '⏳'],
    \ ['house', '🏠'],
    \ ['house\.derelict', '🏚'],
    \ ['house\.garden', '🏡'],
    \ ['house\.multiple', '🏘'],
    \ ['hundred', '💯'],
    \ ['hut', '🛖'],
    \ ['ice', '🧊'],
    \ ['icecream', '🍨'],
    \ ['icecream\.shaved', '🍧'],
    \ ['icecream\.soft', '🍦'],
    \ ['icehockey', '🏒'],
    \ ['id', '🆔'],
    \ ['info', 'ℹ'],
    \ ['izakaya', '🏮'],
    \ ['jar', '🫙'],
    \ ['jeans', '👖'],
    \ ['jigsaw', '🧩'],
    \ ['joystick', '🕹'],
    \ ['juggling', '🤹'],
    \ ['juice', '🧃'],
    \ ['kaaba', '🕋'],
    \ ['kadomatsu', '🎍'],
    \ ['kangaroo', '🦘'],
    \ ['gachi', '🈷'],
    \ ['go', '🈴'],
    \ ['hi', '㊙'],
    \ ['ka', '🉑'],
    \ ['kachi', '🈹'],
    \ ['kara', '🈳'],
    \ ['kon', '🈲'],
    \ ['man', '👨'],
    \ ['man\.box', '🚹'],
    \ ['man\.crown', '🤴'],
    \ ['man\.guapimao', '👲'],
    \ ['man\.levitate', '🕴'],
    \ ['man\.old', '👴'],
    \ ['man\.pregnant', '🫃'],
    \ ['man\.turban', '👳'],
    \ ['man\.tuxedo', '🤵'],
    \ ['muryo', '🈚'],
    \ ['shin', '🈸'],
    \ ['shuku', '㊗'],
    \ ['toku', '🉐'],
    \ ['yo', '🈺'],
    \ ['yubi', '🈯'],
    \ ['yuryo', '🈶'],
    \ ['koko', '🈁'],
    \ ['sa', '🈂'],
    \ ['kebab', '🥙'],
    \ ['key', '🔑'],
    \ ['key\.old', '🗝'],
    \ ['keyboard', '⌨'],
    \ ['kiss', '💏'],
    \ ['kissmark', '💋'],
    \ ['kite', '🪁'],
    \ ['kiwi', '🥝'],
    \ ['knife', '🔪'],
    \ ['knife\.dagger', '🗡'],
    \ ['knot', '🪢'],
    \ ['koala', '🐨'],
    \ ['koinobori', '🎏'],
    \ ['label', '🏷'],
    \ ['lacrosse', '🥍'],
    \ ['ladder', '🪜'],
    \ ['lamp\.diya', '🪔'],
    \ ['laptop', '💻'],
    \ ['a', '🅰'],
    \ ['ab', '🆎'],
    \ ['b', '🅱'],
    \ ['cl', '🆑'],
    \ ['o', '🅾'],
    \ ['leaf\.clover\.three', '☘'],
    \ ['leaf\.clover\.four', '🍀'],
    \ ['leaf\.fall', '🍂'],
    \ ['leaf\.herb', '🌿'],
    \ ['leaf\.maple', '🍁'],
    \ ['leaf\.wind', '🍃'],
    \ ['leftluggage', '🛅'],
    \ ['leg', '🦵'],
    \ ['leg\.mech', '🦿'],
    \ ['lemon', '🍋'],
    \ ['leopard', '🐆'],
    \ ['letter\.love', '💌'],
    \ ['liberty', '🗽'],
    \ ['lightbulb', '💡'],
    \ ['lightning', '⚡'],
    \ ['lion', '🦁'],
    \ ['lipstick', '💄'],
    \ ['litter', '🚮'],
    \ ['litter\.not', '🚯'],
    \ ['lizard', '🦎'],
    \ ['llama', '🦙'],
    \ ['lobster', '🦞'],
    \ ['lock', '🔒'],
    \ ['lock\.key', '🔐'],
    \ ['lock\.open', '🔓'],
    \ ['lock\.pen', '🔏'],
    \ ['lollipop', '🍭'],
    \ ['lotion', '🧴'],
    \ ['luggage', '🧳'],
    \ ['lungs', '🫁'],
    \ ['mage', '🧙'],
    \ ['magnet', '🧲'],
    \ ['magnify\.r', '🔎'],
    \ ['magnify\.l', '🔍'],
    \ ['mahjong\.dragon\.red', '🀄'],
    \ ['mail', '✉'],
    \ ['mail\.arrow', '📩'],
    \ ['mailbox\.closed\.empty', '📪'],
    \ ['mailbox\.closed\.full', '📫'],
    \ ['mailbox\.open\.empty', '📭'],
    \ ['mailbox\.open\.full', '📬'],
    \ ['mammoth', '🦣'],
    \ ['mango', '🥭'],
    \ ['map\.world', '🗺'],
    \ ['map\.jp', '🗾'],
    \ ['martialarts', '🥋'],
    \ ['masks', '🎭'],
    \ ['mate', '🧉'],
    \ ['matryoshka', '🪆'],
    \ ['meat', '🥩'],
    \ ['meat\.bone', '🍖'],
    \ ['medal\.first', '🥇'],
    \ ['medal\.second', '🥈'],
    \ ['medal\.third', '🥉'],
    \ ['medal\.sports', '🏅'],
    \ ['medal\.military', '🎖'],
    \ ['megaphone', '📢'],
    \ ['megaphone\.simple', '📣'],
    \ ['melon', '🍈'],
    \ ['merperson', '🧜'],
    \ ['metro', 'Ⓜ'],
    \ ['microbe', '🦠'],
    \ ['microphone', '🎤'],
    \ ['microphone\.studio', '🎙'],
    \ ['microscope', '🔬'],
    \ ['milkyway', '🌌'],
    \ ['mirror', '🪞'],
    \ ['mixer', '🎛'],
    \ ['money\.bag', '💰'],
    \ ['money\.dollar', '💵'],
    \ ['money\.euro', '💶'],
    \ ['money\.pound', '💷'],
    \ ['money\.yen', '💴'],
    \ ['money\.wings', '💸'],
    \ ['monkey', '🐒'],
    \ ['monkey\.face', '🐵'],
    \ ['monkey\.hear\.not', '🙉'],
    \ ['monkey\.see\.not', '🙈'],
    \ ['monkey\.speak\.not', '🙊'],
    \ ['moon\.crescent', '🌙'],
    \ ['moon\.full', '🌕'],
    \ ['moon\.full\.face', '🌝'],
    \ ['moon\.new', '🌑'],
    \ ['moon\.new\.face', '🌚'],
    \ ['moon\.wane\.one', '🌖'],
    \ ['moon\.wane\.two', '🌗'],
    \ ['moon\.wane\.three\.face', '🌜'],
    \ ['moon\.wane\.three', '🌘'],
    \ ['moon\.wax\.one', '🌒'],
    \ ['moon\.wax\.two', '🌓'],
    \ ['moon\.wax\.two\.face', '🌛'],
    \ ['moon\.wax\.three', '🌔'],
    \ ['mortarboard', '🎓'],
    \ ['mosque', '🕌'],
    \ ['mosquito', '🦟'],
    \ ['motorcycle', '🏍'],
    \ ['motorway', '🛣'],
    \ ['mountain', '⛰'],
    \ ['mountain\.fuji', '🗻'],
    \ ['mountain\.snow', '🏔'],
    \ ['mountain\.sunrise', '🌄'],
    \ ['mouse', '🐁'],
    \ ['mouse\.face', '🐭'],
    \ ['mousetrap', '🪤'],
    \ ['mouth', '👄'],
    \ ['mouth\.bite', '🫦'],
    \ ['moyai', '🗿'],
    \ ['museum', '🏛'],
    \ ['mushroom', '🍄'],
    \ ['musicalscore', '🎼'],
    \ ['nails\.polish', '💅'],
    \ ['namebadge', '📛'],
    \ ['nazar', '🧿'],
    \ ['necktie', '👔'],
    \ ['needle', '🪡'],
    \ ['nest\.empty', '🪹'],
    \ ['nest\.eggs', '🪺'],
    \ ['new', '🆕'],
    \ ['newspaper', '📰'],
    \ ['newspaper\.rolled', '🗞'],
    \ ['ng', '🆖'],
    \ ['ningyo', '🎎'],
    \ ['ninja', '🥷'],
    \ ['noentry', '⛔'],
    \ ['nose', '👃'],
    \ ['notebook', '📓'],
    \ ['notebook\.deco', '📔'],
    \ ['notepad', '🗒'],
    \ ['notes', '🎵'],
    \ ['notes\.triple', '🎶'],
    \ ['numbers', '🔢'],
    \ ['octopus', '🐙'],
    \ ['office', '🏢'],
    \ ['oil', '🛢'],
    \ ['ok', '🆗'],
    \ ['olive', '🫒'],
    \ ['oni', '👹'],
    \ ['onion', '🧅'],
    \ ['orangutan', '🦧'],
    \ ['otter', '🦦'],
    \ ['owl', '🦉'],
    \ ['ox', '🐂'],
    \ ['oyster', '🦪'],
    \ ['package', '📦'],
    \ ['paella', '🥘'],
    \ ['page', '📄'],
    \ ['page\.curl', '📃'],
    \ ['page\.pencil', '📝'],
    \ ['pager', '📟'],
    \ ['pages\.tabs', '📑'],
    \ ['painting', '🖼'],
    \ ['palette', '🎨'],
    \ ['pancakes', '🥞'],
    \ ['panda', '🐼'],
    \ ['parachute', '🪂'],
    \ ['park', '🏞'],
    \ ['parking', '🅿'],
    \ ['parrot', '🦜'],
    \ ['partalteration', '〽'],
    \ ['party', '🎉'],
    \ ['peach', '🍑'],
    \ ['peacock', '🦚'],
    \ ['peanuts', '🥜'],
    \ ['pear', '🍐'],
    \ ['pedestrian', '🚶'],
    \ ['pedestrian\.not', '🚷'],
    \ ['pen\.ball', '🖊'],
    \ ['pen\.fountain', '🖋'],
    \ ['pencil', '✏'],
    \ ['penguin', '🐧'],
    \ ['pepper', '🫑'],
    \ ['pepper\.hot', '🌶'],
    \ ['person', '🧑'],
    \ ['person\.angry', '🙎'],
    \ ['person\.beard', '🧔'],
    \ ['person\.blonde', '👱'],
    \ ['person\.bow', '🙇'],
    \ ['person\.crown', '🫅'],
    \ ['person\.deaf', '🧏'],
    \ ['person\.facepalm', '🤦'],
    \ ['person\.frown', '🙍'],
    \ ['person\.hijab', '🧕'],
    \ ['person\.kneel', '🧎'],
    \ ['person\.lotus', '🧘'],
    \ ['person\.massage', '💆'],
    \ ['person\.no', '🙅'],
    \ ['person\.ok', '🙆'],
    \ ['person\.old', '🧓'],
    \ ['person\.pregnant', '🫄'],
    \ ['person\.raise', '🙋'],
    \ ['person\.sassy', '💁'],
    \ ['person\.shrug', '🤷'],
    \ ['person\.stand', '🧍'],
    \ ['person\.steam', '🧖'],
    \ ['petri', '🧫'],
    \ ['phone', '📱'],
    \ ['phone\.arrow', '📲'],
    \ ['phone\.classic', '☎'],
    \ ['phone\.not', '📵'],
    \ ['phone\.off', '📴'],
    \ ['phone\.receiver', '📞'],
    \ ['phone\.signal', '📶'],
    \ ['phone\.vibrate', '📳'],
    \ ['piano', '🎹'],
    \ ['pick', '⛏'],
    \ ['pie', '🥧'],
    \ ['pig', '🐖'],
    \ ['pig\.face', '🐷'],
    \ ['pig\.nose', '🐽'],
    \ ['pill', '💊'],
    \ ['pin', '📌'],
    \ ['pin\.round', '📍'],
    \ ['pinata', '🪅'],
    \ ['pineapple', '🍍'],
    \ ['pingpong', '🏓'],
    \ ['pistol', '🔫'],
    \ ['pizza', '🍕'],
    \ ['placard', '🪧'],
    \ ['planet', '🪐'],
    \ ['plant', '🪴'],
    \ ['plaster', '🩹'],
    \ ['plate\.cutlery', '🍽'],
    \ ['playback\.down', '⏬'],
    \ ['playback\.eject', '⏏'],
    \ ['playback\.forward', '⏩'],
    \ ['playback\.pause', '⏸'],
    \ ['playback\.record', '⏺'],
    \ ['playback\.repeat', '🔁'],
    \ ['playback\.repeat\.once', '🔂'],
    \ ['playback\.repeat\.v', '🔃'],
    \ ['playback\.restart', '⏮'],
    \ ['playback\.rewind', '⏪'],
    \ ['playback\.shuffle', '🔀'],
    \ ['playback\.skip', '⏭'],
    \ ['playback\.stop', '⏹'],
    \ ['playback\.toggle', '⏯'],
    \ ['playback\.up', '⏫'],
    \ ['playingcard\.flower', '🎴'],
    \ ['playingcard\.joker', '🃏'],
    \ ['plunger', '🪠'],
    \ ['policeofficer', '👮'],
    \ ['poo', '💩'],
    \ ['popcorn', '🍿'],
    \ ['post\.eu', '🏤'],
    \ ['post\.jp', '🏣'],
    \ ['postbox', '📮'],
    \ ['potato', '🥔'],
    \ ['potato\.sweet', '🍠'],
    \ ['pouch', '👝'],
    \ ['powerplug', '🔌'],
    \ ['present', '🎁'],
    \ ['pretzel', '🥨'],
    \ ['printer', '🖨'],
    \ ['prints\.foot', '👣'],
    \ ['prints\.paw', '🐾'],
    \ ['prohibited', '🚫'],
    \ ['projector', '📽'],
    \ ['pumpkin\.lantern', '🎃'],
    \ ['purse', '👛'],
    \ ['quest', '❓'],
    \ ['quest\.white', '❔'],
    \ ['rabbit', '🐇'],
    \ ['rabbit\.face', '🐰'],
    \ ['raccoon', '🦝'],
    \ ['radio', '📻'],
    \ ['radioactive', '☢'],
    \ ['railway', '🛤'],
    \ ['rainbow', '🌈'],
    \ ['ram', '🐏'],
    \ ['rat', '🐀'],
    \ ['razor', '🪒'],
    \ ['receipt', '🧾'],
    \ ['recycling', '♻'],
    \ ['reg', '®'],
    \ ['restroom', '🚻'],
    \ ['rhino', '🦏'],
    \ ['ribbon', '🎀'],
    \ ['ribbon\.remind', '🎗'],
    \ ['rice', '🍚'],
    \ ['rice\.cracker', '🍘'],
    \ ['rice\.ear', '🌾'],
    \ ['rice\.onigiri', '🍙'],
    \ ['ring', '💍'],
    \ ['ringbuoy', '🛟'],
    \ ['robot', '🤖'],
    \ ['rock', '🪨'],
    \ ['rocket', '🚀'],
    \ ['rollercoaster', '🎢'],
    \ ['rosette', '🏵'],
    \ ['rugby', '🏉'],
    \ ['ruler', '📏'],
    \ ['ruler\.triangle', '📐'],
    \ ['running', '🏃'],
    \ ['safetypin', '🧷'],
    \ ['safetyvest', '🦺'],
    \ ['sake', '🍶'],
    \ ['salad', '🥗'],
    \ ['salt', '🧂'],
    \ ['sandwich', '🥪'],
    \ ['santa\.man', '🎅'],
    \ ['santa\.woman', '🤶'],
    \ ['satdish', '📡'],
    \ ['satellite', '🛰'],
    \ ['saw', '🪚'],
    \ ['saxophone', '🎷'],
    \ ['scales', '⚖'],
    \ ['scarf', '🧣'],
    \ ['school', '🏫'],
    \ ['scissors', '✂'],
    \ ['scooter', '🛴'],
    \ ['scooter\.motor', '🛵'],
    \ ['scorpion', '🦂'],
    \ ['screwdriver', '🪛'],
    \ ['scroll', '📜'],
    \ ['seal', '🦭'],
    \ ['seat', '💺'],
    \ ['seedling', '🌱'],
    \ ['shark', '🦈'],
    \ ['sheep', '🐑'],
    \ ['shell\.spiral', '🐚'],
    \ ['shield', '🛡'],
    \ ['ship', '🚢'],
    \ ['ship\.cruise', '🛳'],
    \ ['ship\.ferry', '⛴'],
    \ ['shirt\.sports', '🎽'],
    \ ['shirt\.t', '👕'],
    \ ['shoe', '👞'],
    \ ['shoe\.ballet', '🩰'],
    \ ['shoe\.flat', '🥿'],
    \ ['shoe\.heel', '👠'],
    \ ['shoe\.hike', '🥾'],
    \ ['shoe\.ice', '⛸'],
    \ ['shoe\.roller', '🛼'],
    \ ['shoe\.sandal\.heel', '👡'],
    \ ['shoe\.ski', '🎿'],
    \ ['shoe\.sneaker', '👟'],
    \ ['shoe\.tall', '👢'],
    \ ['shoe\.thong', '🩴'],
    \ ['shopping', '🛍'],
    \ ['shorts', '🩳'],
    \ ['shoshinsha', '🔰'],
    \ ['shower', '🚿'],
    \ ['shrimp', '🦐'],
    \ ['shrimp\.fried', '🍤'],
    \ ['shrine', '⛩'],
    \ ['sign\.crossing', '🚸'],
    \ ['sign\.stop', '🛑'],
    \ ['silhouette', '👤'],
    \ ['silhouette\.double', '👥'],
    \ ['silhouette\.hug', '🫂'],
    \ ['silhouette\.speak', '🗣'],
    \ ['siren', '🚨'],
    \ ['skateboard', '🛹'],
    \ ['skewer\.dango', '🍡'],
    \ ['skewer\.oden', '🍢'],
    \ ['skiing', '⛷'],
    \ ['skull', '💀'],
    \ ['skull\.bones', '☠'],
    \ ['skunk', '🦨'],
    \ ['sled', '🛷'],
    \ ['slide', '🛝'],
    \ ['slider', '🎚'],
    \ ['sloth', '🦥'],
    \ ['slots', '🎰'],
    \ ['snail', '🐌'],
    \ ['snake', '🐍'],
    \ ['snowboarding', '🏂'],
    \ ['snowflake', '❄'],
    \ ['snowman', '⛄'],
    \ ['snowman\.snow', '☃'],
    \ ['soap', '🧼'],
    \ ['socks', '🧦'],
    \ ['softball', '🥎'],
    \ ['sos', '🆘'],
    \ ['soup', '🍲'],
    \ ['spaghetti', '🍝'],
    \ ['sparkle\.box', '❇'],
    \ ['sparkler', '🎇'],
    \ ['sparkles', '✨'],
    \ ['speaker', '🔈'],
    \ ['speaker\.not', '🔇'],
    \ ['speaker\.wave', '🔉'],
    \ ['speaker\.waves', '🔊'],
    \ ['spider', '🕷'],
    \ ['spiderweb', '🕸'],
    \ ['spinach', '🥬'],
    \ ['sponge', '🧽'],
    \ ['spoon', '🥄'],
    \ ['square\.black', '⬛'],
    \ ['square\.black\.tiny', '▪'],
    \ ['square\.black\.small', '◾'],
    \ ['square\.black\.medium', '◼'],
    \ ['square\.white', '⬜'],
    \ ['square\.white\.tiny', '▫'],
    \ ['square\.white\.small', '◽'],
    \ ['square\.white\.medium', '◻'],
    \ ['square\.blue', '🟦'],
    \ ['square\.brown', '🟫'],
    \ ['square\.green', '🟩'],
    \ ['square\.orange', '🟧'],
    \ ['square\.purple', '🟪'],
    \ ['square\.red', '🟥'],
    \ ['square\.yellow', '🟨'],
    \ ['squid', '🦑'],
    \ ['stadium', '🏟'],
    \ ['star', '⭐'],
    \ ['star\.arc', '💫'],
    \ ['star\.box', '✴'],
    \ ['star\.glow', '🌟'],
    \ ['star\.shoot', '🌠'],
    \ ['stethoscope', '🩺'],
    \ ['store\.big', '🏬'],
    \ ['store\.small', '🏪'],
    \ ['strawberry', '🍓'],
    \ ['suit\.club', '♣'],
    \ ['suit\.diamond', '♦'],
    \ ['suit\.heart', '♥'],
    \ ['suit\.spade', '♠'],
    \ ['sun', '☀'],
    \ ['sun\.cloud', '🌤'],
    \ ['sun\.face', '🌞'],
    \ ['sunrise', '🌅'],
    \ ['superhero', '🦸'],
    \ ['supervillain', '🦹'],
    \ ['surfing', '🏄'],
    \ ['sushi', '🍣'],
    \ ['swan', '🦢'],
    \ ['swimming', '🏊'],
    \ ['swimsuit', '🩱'],
    \ ['swords', '⚔'],
    \ ['symbols', '🔣'],
    \ ['synagogue', '🕍'],
    \ ['syringe', '💉'],
    \ ['taco', '🌮'],
    \ ['takeout', '🥡'],
    \ ['tamale', '🫔'],
    \ ['tanabata', '🎋'],
    \ ['tangerine', '🍊'],
    \ ['tap', '🚰'],
    \ ['tap\.not', '🚱'],
    \ ['taxi', '🚕'],
    \ ['taxi\.front', '🚖'],
    \ ['teacup', '🍵'],
    \ ['teapot', '🫖'],
    \ ['teddy', '🧸'],
    \ ['telescope', '🔭'],
    \ ['temple', '🛕'],
    \ ['ten', '🔟'],
    \ ['tengu', '👺'],
    \ ['tennis', '🎾'],
    \ ['tent', '⛺'],
    \ ['testtube', '🧪'],
    \ ['thermometer', '🌡'],
    \ ['thread', '🧵'],
    \ ['thumb\.up', '👍'],
    \ ['thumb\.down', '👎'],
    \ ['ticket\.event', '🎟'],
    \ ['ticket\.travel', '🎫'],
    \ ['tiger', '🐅'],
    \ ['tiger\.face', '🐯'],
    \ ['tm', '™'],
    \ ['toilet', '🚽'],
    \ ['toiletpaper', '🧻'],
    \ ['tomato', '🍅'],
    \ ['tombstone', '🪦'],
    \ ['tongue', '👅'],
    \ ['toolbox', '🧰'],
    \ ['tooth', '🦷'],
    \ ['toothbrush', '🪥'],
    \ ['tornado', '🌪'],
    \ ['tower\.tokyo', '🗼'],
    \ ['trackball', '🖲'],
    \ ['tractor', '🚜'],
    \ ['trafficlight\.v', '🚦'],
    \ ['trafficlight\.h', '🚥'],
    \ ['train', '🚆'],
    \ ['train\.car', '🚃'],
    \ ['train\.light', '🚈'],
    \ ['train\.metro', '🚇'],
    \ ['train\.mono', '🚝'],
    \ ['train\.mountain', '🚞'],
    \ ['train\.speed', '🚄'],
    \ ['train\.speed\.bullet', '🚅'],
    \ ['train\.steam', '🚂'],
    \ ['train\.stop', '🚉'],
    \ ['train\.suspend', '🚟'],
    \ ['train\.tram', '🚊'],
    \ ['train\.tram\.car', '🚋'],
    \ ['transgender', '⚧'],
    \ ['tray\.inbox', '📥'],
    \ ['tray\.mail', '📨'],
    \ ['tray\.outbox', '📤'],
    \ ['tree\.deciduous', '🌳'],
    \ ['tree\.evergreen', '🌲'],
    \ ['tree\.palm', '🌴'],
    \ ['tree\.xmas', '🎄'],
    \ ['triangle\.r', '▶'],
    \ ['triangle\.l', '◀'],
    \ ['triangle\.t', '🔼'],
    \ ['triangle\.b', '🔽'],
    \ ['triangle\.t\.red', '🔺'],
    \ ['triangle\.b\.red', '🔻'],
    \ ['trident', '🔱'],
    \ ['troll', '🧌'],
    \ ['trophy', '🏆'],
    \ ['truck', '🚚'],
    \ ['truck\.trailer', '🚛'],
    \ ['trumpet', '🎺'],
    \ ['tsukimi', '🎑'],
    \ ['turkey', '🦃'],
    \ ['turtle', '🐢'],
    \ ['tv', '📺'],
    \ ['ufo', '🛸'],
    \ ['umbrella\.open', '☂'],
    \ ['umbrella\.closed', '🌂'],
    \ ['umbrella\.rain', '☔'],
    \ ['umbrella\.sun', '⛱'],
    \ ['unicorn', '🦄'],
    \ ['unknown', '🦳'],
    \ ['up', '🆙'],
    \ ['urn', '⚱'],
    \ ['vampire', '🧛'],
    \ ['violin', '🎻'],
    \ ['volcano', '🌋'],
    \ ['volleyball', '🏐'],
    \ ['vs', '🆚'],
    \ ['waffle', '🧇'],
    \ ['wand', '🪄'],
    \ ['warning', '⚠'],
    \ ['watch', '⌚'],
    \ ['watch\.stop', '⏱'],
    \ ['watermelon', '🍉'],
    \ ['waterpolo', '🤽'],
    \ ['wave', '🌊'],
    \ ['wc', '🚾'],
    \ ['weightlifting', '🏋'],
    \ ['whale', '🐋'],
    \ ['whale\.spout', '🐳'],
    \ ['wheel', '🛞'],
    \ ['wheelchair', '🦽'],
    \ ['wheelchair\.box', '♿'],
    \ ['wheelchair\.motor', '🦼'],
    \ ['wind', '🌬'],
    \ ['windchime', '🎐'],
    \ ['window', '🪟'],
    \ ['wine', '🍷'],
    \ ['wolf', '🐺'],
    \ ['woman', '👩'],
    \ ['woman\.box', '🚺'],
    \ ['woman\.crown', '👸'],
    \ ['woman\.old', '👵'],
    \ ['woman\.pregnant', '🤰'],
    \ ['wood', '🪵'],
    \ ['worm', '🪱'],
    \ ['wrench', '🔧'],
    \ ['wrestling', '🤼'],
    \ ['xray', '🩻'],
    \ ['yarn', '🧶'],
    \ ['yoyo', '🪀'],
    \ ['zebra', '🦓'],
    \ ['zodiac\.aquarius', '♒'],
    \ ['zodiac\.aries', '♈'],
    \ ['zodiac\.cancer', '♋'],
    \ ['zodiac\.capri', '♑'],
    \ ['zodiac\.gemini', '♊'],
    \ ['zodiac\.leo', '♌'],
    \ ['zodiac\.libra', '♎'],
    \ ['zodiac\.ophi', '⛎'],
    \ ['zodiac\.pisces', '♓'],
    \ ['zodiac\.sagit', '♐'],
    \ ['zodiac\.scorpio', '♏'],
    \ ['zodiac\.taurus', '♉'],
    \ ['zodiac\.virgo', '♍'],
    \ ['zombie', '🧟'],
    \ ['zzz', '💤'],
\ ]

for typmath in s:typstEmojiList
    exe "syn match typstMarkupEmoji '#emoji\.".typmath[0]."\\>' conceal cchar=".typmath[1]
endfor

" vim: sw=4 sts=4 et fdm=marker fdl=0 


================================================
FILE: syntax/typst-symbols.vim
================================================
" Vim syntax file
" Language: Typst
" Maintainer: Kaj Munhoz Arfvidsson
" Upstream: https://github.com/kaarmu/typst.vim

let s:typstMathList=[
    \ ["quote\.single", "'"],
    \ ['AA', '𝔸'],
    \ ['Alpha', 'Α'],
    \ ['BB', '𝔹'],
    \ ['Beta', 'Β'],
    \ ['CC', 'ℂ'],
    \ ['Chi', 'Χ'],
    \ ['DD', '𝔻'],
    \ ['Delta', 'Δ'],
    \ ['EE', '𝔼'],
    \ ['Epsilon', 'Ε'],
    \ ['Eta', 'Η'],
    \ ['FF', '𝔽'],
    \ ['GG', '𝔾'],
    \ ['Gamma', 'Γ'],
    \ ['HH', 'ℍ'],
    \ ['II', '𝕀'],
    \ ['Im', 'ℑ'],
    \ ['Iota', 'Ι'],
    \ ['JJ', '𝕁'],
    \ ['KK', '𝕂'],
    \ ['Kai', 'Ϗ'],
    \ ['Kappa', 'Κ'],
    \ ['LL', '𝕃'],
    \ ['Lambda', 'Λ'],
    \ ['MM', '𝕄'],
    \ ['Mu', 'Μ'],
    \ ['NN', 'ℕ'],
    \ ['Nu', 'Ν'],
    \ ['OO', '𝕆'],
    \ ['Omega', 'Ω'],
    \ ['Omicron', 'Ο'],
    \ ['PP', 'ℙ'],
    \ ['Phi', 'Φ'],
    \ ['Pi', 'Π'],
    \ ['Psi', 'Ψ'],
    \ ['QQ', 'ℚ'],
    \ ['RR', 'ℝ'],
    \ ['Re', 'ℜ'],
    \ ['Rho', 'Ρ'],
    \ ['SS', '𝕊'],
    \ ['Sigma', 'Σ'],
    \ ['TT', '𝕋'],
    \ ['Tau', 'Τ'],
    \ ['Theta', 'Θ'],
    \ ['UU', '𝕌'],
    \ ['Upsilon', 'Υ'],
    \ ['VV', '𝕍'],
    \ ['WW', '𝕎'],
    \ ['XX', '𝕏'],
    \ ['Xi', 'Ξ'],
    \ ['YY', '𝕐'],
    \ ['ZZ', 'ℤ'],
    \ ['Zeta', 'Ζ'],
    \ ['acute', '´'],
    \ ['acute\.double', '˝'],
    \ ['alef', 'א'],
    \ ['aleph', 'א'],
    \ ['alpha', 'α'],
    \ ['amp', '&'],
    \ ['amp\.inv', '⅋'],
    \ ['and', '∧'],
    \ ['and\.big', '⋀'],
    \ ['and\.curly', '⋏'],
    \ ['and\.dot', '⟑'],
    \ ['and\.double', '⩓'],
    \ ['angle', '∠'],
    \ ['angle\.acute', '⦟'],
    \ ['angle\.arc', '∡'],
    \ ['angle\.arc\.rev', '⦛'],
    \ ['angle\.l', '⟨'],
    \ ['angle\.l\.double', '《'],
    \ ['angle\.r', '⟩'],
    \ ['angle\.r\.double', '》'],
    \ ['angle\.rev', '⦣'],
    \ ['angle\.right', '∟'],
    \ ['angle\.right\.arc', '⊾'],
    \ ['angle\.right\.dot', '⦝'],
    \ ['angle\.right\.rev', '⯾'],
    \ ['angle\.right\.sq', '⦜'],
    \ ['angle\.spatial', '⟀'],
    \ ['angle\.spheric', '∢'],
    \ ['angle\.spheric\.rev', '⦠'],
    \ ['angle\.spheric\.top', '⦡'],
    \ ['angstrom', 'Å'],
    \ ['approx', '≈'],
    \ ['approx\.eq', '≊'],
    \ ['approx\.not', '≉'],
    \ ['arrow\.b', '↓'],
    \ ['arrow\.b\.bar', '↧'],
    \ ['arrow\.b\.curve', '⤵'],
    \ ['arrow\.b\.dashed', '⇣'],
    \ ['arrow\.b\.double', '⇓'],
    \ ['arrow\.b\.filled', '⬇'],
    \ ['arrow\.b\.quad', '⟱'],
    \ ['arrow\.b\.stop', '⤓'],
    \ ['arrow\.b\.stroked', '⇩'],
    \ ['arrow\.b\.triple', '⤋'],
    \ ['arrow\.b\.twohead', '↡'],
    \ ['arrow\.bl', '↙'],
    \ ['arrow\.bl\.double', '⇙'],
    \ ['arrow\.bl\.filled', '⬋'],
    \ ['arrow\.bl\.hook', '⤦'],
    \ ['arrow\.bl\.stroked', '⬃'],
    \ ['arrow\.br', '↘'],
    \ ['arrow\.br\.double', '⇘'],
    \ ['arrow\.br\.filled', '⬊'],
    \ ['arrow\.br\.hook', '⤥'],
    \ ['arrow\.br\.stroked', '⬂'],
    \ ['arrow\.ccw', '↺'],
    \ ['arrow\.ccw\.half', '↶'],
    \ ['arrow\.cw', '↻'],
    \ ['arrow\.cw\.half', '↷'],
    \ ['arrow\.l', '←'],
    \ ['arrow\.l\.bar', '↤'],
    \ ['arrow\.l\.curve', '⤶'],
    \ ['arrow\.l\.dashed', '⇠'],
    \ ['arrow\.l\.dotted', '⬸'],
    \ ['arrow\.l\.double', '⇐'],
    \ ['arrow\.l\.double\.bar', '⤆'],
    \ ['arrow\.l\.double\.long', '⟸'],
    \ ['arrow\.l\.double\.long\.bar', '⟽'],
    \ ['arrow\.l\.double\.not', '⇍'],
    \ ['arrow\.l\.filled', '⬅'],
    \ ['arrow\.l\.hook', '↩'],
    \ ['arrow\.l\.long', '⟵'],
    \ ['arrow\.l\.long\.bar', '⟻'],
    \ ['arrow\.l\.long\.squiggly', '⬳'],
    \ ['arrow\.l\.loop', '↫'],
    \ ['arrow\.l\.not', '↚'],
    \ ['arrow\.l\.quad', '⭅'],
    \ ['arrow\.l\.r', '↔'],
    \ ['arrow\.l\.r\.double', '⇔'],
    \ ['arrow\.l\.r\.double\.long', '⟺'],
    \ ['arrow\.l\.r\.double\.not', '⇎'],
    \ ['arrow\.l\.r\.filled', '⬌'],
    \ ['arrow\.l\.r\.long', '⟷'],
    \ ['arrow\.l\.r\.not', '↮'],
    \ ['arrow\.l\.r\.stroked', '⬄'],
    \ ['arrow\.l\.r\.wave', '↭'],
    \ ['arrow\.l\.squiggly', '⇜'],
    \ ['arrow\.l\.stop', '⇤'],
    \ ['arrow\.l\.stroked', '⇦'],
    \ ['arrow\.l\.tail', '↢'],
    \ ['arrow\.l\.triple', '⇚'],
    \ ['arrow\.l\.twohead', '↞'],
    \ ['arrow\.l\.twohead\.bar', '⬶'],
    \ ['arrow\.l\.wave', '↜'],
    \ ['arrow\.r', '→'],
    \ ['arrow\.r\.bar', '↦'],
    \ ['arrow\.r\.curve', '⤷'],
    \ ['arrow\.r\.dashed', '⇢'],
    \ ['arrow\.r\.dotted', '⤑'],
    \ ['arrow\.r\.double', '⇒'],
    \ ['arrow\.r\.double\.bar', '⤇'],
    \ ['arrow\.r\.double\.long', '⟹'],
    \ ['arrow\.r\.double\.long\.bar', '⟾'],
    \ ['arrow\.r\.double\.not', '⇏'],
    \ ['arrow\.r\.filled', '➡'],
    \ ['arrow\.r\.hook', '↪'],
    \ ['arrow\.r\.long', '⟶'],
    \ ['arrow\.r\.long\.bar', '⟼'],
    \ ['arrow\.r\.long\.squiggly', '⟿'],
    \ ['arrow\.r\.loop', '↬'],
    \ ['arrow\.r\.not', '↛'],
    \ ['arrow\.r\.quad', '⭆'],
    \ ['arrow\.r\.squiggly', '⇝'],
    \ ['arrow\.r\.stop', '⇥'],
    \ ['arrow\.r\.stroked', '⇨'],
    \ ['arrow\.r\.tail', '↣'],
    \ ['arrow\.r\.triple', '⇛'],
    \ ['arrow\.r\.twohead', '↠'],
    \ ['arrow\.r\.twohead\.bar', '⤅'],
    \ ['arrow\.r\.wave', '↝'],
    \ ['arrow\.t', '↑'],
    \ ['arrow\.t\.b', '↕'],
    \ ['arrow\.t\.b\.double', '⇕'],
    \ ['arrow\.t\.b\.filled', '⬍'],
    \ ['arrow\.t\.b\.stroked', '⇳'],
    \ ['arrow\.t\.bar', '↥'],
    \ ['arrow\.t\.curve', '⤴'],
    \ ['arrow\.t\.dashed', '⇡'],
    \ ['arrow\.t\.double', '⇑'],
    \ ['arrow\.t\.filled', '⬆'],
    \ ['arrow\.t\.quad', '⟰'],
    \ ['arrow\.t\.stop', '⤒'],
    \ ['arrow\.t\.stroked', '⇧'],
    \ ['arrow\.t\.triple', '⤊'],
    \ ['arrow\.t\.twohead', '↟'],
    \ ['arrow\.tl', '↖'],
    \ ['arrow\.tl\.br', '⤡'],
    \ ['arrow\.tl\.double', '⇖'],
    \ ['arrow\.tl\.filled', '⬉'],
    \ ['arrow\.tl\.hook', '⤣'],
    \ ['arrow\.tl\.stroked', '⬁'],
    \ ['arrow\.tr', '↗'],
    \ ['arrow\.tr\.bl', '⤢'],
    \ ['arrow\.tr\.double', '⇗'],
    \ ['arrow\.tr\.filled', '⬈'],
    \ ['arrow\.tr\.hook', '⤤'],
    \ ['arrow\.tr\.stroked', '⬀'],
    \ ['arrow\.zigzag', '↯'],
    \ ['arrowhead\.b', '⌄'],
    \ ['arrowhead\.t', '⌃'],
    \ ['arrows\.bb', '⇊'],
    \ ['arrows\.bt', '⇵'],
    \ ['arrows\.ll', '⇇'],
    \ ['arrows\.lll', '⬱'],
    \ ['arrows\.lr', '⇆'],
    \ ['arrows\.lr\.stop', '↹'],
    \ ['arrows\.rl', '⇄'],
    \ ['arrows\.rr', '⇉'],
    \ ['arrows\.rrr', '⇶'],
    \ ['arrows\.tb', '⇅'],
    \ ['arrows\.tt', '⇈'],
    \ ['ast\.basic', '*'],
    \ ['ast\.circle', '⊛'],
    \ ['ast\.double', '⁑'],
    \ ['ast\.low', '⁎'],
    \ ['ast\.op', '∗'],
    \ ['ast\.small', '﹡'],
    \ ['ast\.square', '⧆'],
    \ ['ast\.triple', '⁂'],
    \ ['at', '@'],
    \ ['backslash', '\'],
    \ ['backslash\.circle', '⦸'],
    \ ['backslash\.not', '⧷'],
    \ ['ballot', '☐'],
    \ ['ballot\.x', '☒'],
    \ ['bar\.h', '―'],
    \ ['bar\.v', '|'],
    \ ['bar\.v\.broken', '¦'],
    \ ['bar\.v\.circle', '⦶'],
    \ ['bar\.v\.double', '‖'],
    \ ['bar\.v\.triple', '⦀'],
    \ ['because', '∵'],
    \ ['bet', 'ב'],
    \ ['beta', 'β'],
    \ ['beta\.alt', 'ϐ'],
    \ ['beth', 'ב'],
    \ ['bitcoin', '₿'],
    \ ['bot', '⊥'],
    \ ['brace\.b', '⏟'],
    \ ['brace\.l', '{'],
    \ ['brace\.r', '}'],
    \ ['brace\.t', '⏞'],
    \ ['bracket\.b', '⎵'],
    \ ['bracket\.l', '['],
    \ ['bracket\.l\.double', '⟦'],
    \ ['bracket\.r', ']'],
    \ ['bracket\.r\.double', '⟧'],
    \ ['bracket\.t', '⎴'],
    \ ['breve', '˘'],
    \ ['bullet', '•'],
    \ ['caret', '‸'],
    \ ['caron', 'ˇ'],
    \ ['checkmark', '✓'],
    \ ['checkmark\.light', '🗸'],
    \ ['chi', 'χ'],
    \ ['circle\.dotted', '◌'],
    \ ['circle\.filled', '●'],
    \ ['circle\.filled\.big', '⬤'],
    \ ['circle\.filled\.small', '∙'],
    \ ['circle\.filled\.tiny', '⦁'],
    \ ['circle\.nested', '⊚'],
    \ ['circle\.stroked', '○'],
    \ ['circle\.stroked\.big', '◯'],
    \ ['circle\.stroked\.small', '⚬'],
    \ ['circle\.stroked\.tiny', '∘'],
    \ ['co', '℅'],
    \ ['colon', ':'],
    \ ['colon\.double\.eq', '⩴'],
    \ ['colon\.eq', '≔'],
    \ ['comma', ','],
    \ ['complement', '∁'],
    \ ['compose', '∘'],
    \ ['convolve', '∗'],
    \ ['copyright', '©'],
    \ ['copyright\.sound', '℗'],
    \ ['dagger', '†'],
    \ ['dagger\.double', '‡'],
    \ ['dash\.circle', '⊝'],
    \ ['dash\.colon', '∹'],
    \ ['dash\.em', '—'],
    \ ['dash\.en', '–'],
    \ ['dash\.fig', '‒'],
    \ ['dash\.wave', '〜'],
    \ ['dash\.wave\.double', '〰'],
    \ ['degree', '°'],
    \ ['degree\.c', '℃'],
    \ ['degree\.f', '℉'],
    \ ['delta', 'δ'],
    \ ['diaer', '¨'],
    \ ['diameter', '⌀'],
    \ ['diamond\.filled', '◆'],
    \ ['diamond\.filled\.medium', '⬥'],
    \ ['diamond\.filled\.small', '⬩'],
    \ ['diamond\.stroked', '◇'],
    \ ['diamond\.stroked\.dot', '⟐'],
    \ ['diamond\.stroked\.medium', '⬦'],
    \ ['diamond\.stroked\.small', '⋄'],
    \ ['diff', '∂'],
    \ ['div', '÷'],
    \ ['div\.circle', '⨸'],
    \ ['divides', '∣'],
    \ ['divides\.not', '∤'],
    \ ['dollar', '$'],
    \ ['dot\.basic', '.'],
    \ ['dot\.c', '·'],
    \ ['dot\.circle', '⊙'],
    \ ['dot\.circle\.big', '⨀'],
    \ ['dot\.double', '¨'],
    \ ['dot\.op', '⋅'],
    \ ['dot\.quad', '⃜'],
    \ ['dot\.square', '⊡'],
    \ ['dot\.triple', '⃛'],
    \ ['dotless\.i', '𝚤'],
    \ ['dotless\.j', '𝚥'],
    \ ['dots\.down', '⋱'],
    \ ['dots\.h', '…'],
    \ ['dots\.h\.c', '⋯'],
    \ ['dots\.up', '⋰'],
    \ ['dots\.v', '⋮'],
    \ ['ell', 'ℓ'],
    \ ['ellipse\.filled\.h', '⬬'],
    \ ['ellipse\.filled\.v', '⬮'],
    \ ['ellipse\.stroked\.h', '⬭'],
    \ ['ellipse\.stroked\.v', '⬯'],
    \ ['emptyset', '∅'],
    \ ['emptyset\.rev', '⦰'],
    \ ['epsilon', 'ε'],
    \ ['epsilon\.alt', 'ϵ'],
    \ ['eq', '='],
    \ ['eq\.circle', '⊜'],
    \ ['eq\.colon', '≕'],
    \ ['eq\.def', '≝'],
    \ ['eq\.delta', '≜'],
    \ ['eq\.equi', '≚'],
    \ ['eq\.est', '≙'],
    \ ['eq\.gt', '⋝'],
    \ ['eq\.lt', '⋜'],
    \ ['eq\.m', '≞'],
    \ ['eq\.not', '≠'],
    \ ['eq\.prec', '⋞'],
    \ ['eq\.quad', '≣'],
    \ ['eq\.quest', '≟'],
    \ ['eq\.small', '﹦'],
    \ ['eq\.star', '≛'],
    \ ['eq\.succ', '⋟'],
    \ ['eq\.triple', '≡'],
    \ ['equiv', '≡'],
    \ ['equiv\.not', '≢'],
    \ ['eta', 'η'],
    \ ['euro', '€'],
    \ ['excl', '!'],
    \ ['excl\.double', '‼'],
    \ ['excl\.inv', '¡'],
    \ ['excl\.quest', '⁉'],
    \ ['exists', '∃'],
    \ ['exists\.not', '∄'],
    \ ['fence\.dotted', '⦙'],
    \ ['fence\.l', '⧘'],
    \ ['fence\.l\.double', '⧚'],
    \ ['fence\.r', '⧙'],
    \ ['fence\.r\.double', '⧛'],
    \ ['floral', '❦'],
    \ ['floral\.l', '☙'],
    \ ['floral\.r', '❧'],
    \ ['forall', '∀'],
    \ ['franc', '₣'],
    \ ['gamma', 'γ'],
    \ ['gimel', 'ג'],
    \ ['gimmel', 'ג'],
    \ ['grave', '`'],
    \ ['gt', '>'],
    \ ['gt\.circle', '⧁'],
    \ ['gt\.curly', '≻'],
    \ ['gt\.curly\.approx', '⪸'],
    \ ['gt\.curly\.double', '⪼'],
    \ ['gt\.curly\.eq', '≽'],
    \ ['gt\.curly\.eq\.not', '⋡'],
    \ ['gt\.curly\.equiv', '⪴'],
    \ ['gt\.curly\.napprox', '⪺'],
    \ ['gt\.curly\.nequiv', '⪶'],
    \ ['gt\.curly\.not', '⊁'],
    \ ['gt\.curly\.ntilde', '⋩'],
    \ ['gt\.curly\.tilde', '≿'],
    \ ['gt\.dot', '⋗'],
    \ ['gt\.double', '≫'],
    \ ['gt\.eq', '≥'],
    \ ['gt\.eq\.lt', '⋛'],
    \ ['gt\.eq\.not', '≱'],
    \ ['gt\.eq\.slant', '⩾'],
    \ ['gt\.equiv', '≧'],
    \ ['gt\.lt', '≷'],
    \ ['gt\.lt\.not', '≹'],
    \ ['gt\.nequiv', '≩'],
    \ ['gt\.not', '≯'],
    \ ['gt\.ntilde', '⋧'],
    \ ['gt\.small', '﹥'],
    \ ['gt\.tilde', '≳'],
    \ ['gt\.tilde\.not', '≵'],
    \ ['gt\.tri', '⊳'],
    \ ['gt\.tri\.eq', '⊵'],
    \ ['gt\.tri\.eq\.not', '⋭'],
    \ ['gt\.tri\.not', '⋫'],
    \ ['gt\.triple', '⋙'],
    \ ['gt\.triple\.nested', '⫸'],
    \ ['harpoon\.bl', '⇃'],
    \ ['harpoon\.bl\.bar', '⥡'],
    \ ['harpoon\.bl\.stop', '⥙'],
    \ ['harpoon\.br', '⇂'],
    \ ['harpoon\.br\.bar', '⥝'],
    \ ['harpoon\.br\.stop', '⥕'],
    \ ['harpoon\.lb', '↽'],
    \ ['harpoon\.lb\.bar', '⥞'],
    \ ['harpoon\.lb\.rb', '⥐'],
    \ ['harpoon\.lb\.rt', '⥋'],
    \ ['harpoon\.lb\.stop', '⥖'],
    \ ['harpoon\.lt', '↼'],
    \ ['harpoon\.lt\.bar', '⥚'],
    \ ['harpoon\.lt\.rb', '⥊'],
    \ ['harpoon\.lt\.rt', '⥎'],
    \ ['harpoon\.lt\.stop', '⥒'],
    \ ['harpoon\.rb', '⇁'],
    \ ['harpoon\.rb\.bar', '⥟'],
    \ ['harpoon\.rb\.stop', '⥗'],
    \ ['harpoon\.rt', '⇀'],
    \ ['harpoon\.rt\.bar', '⥛'],
    \ ['harpoon\.rt\.stop', '⥓'],
    \ ['harpoon\.tl', '↿'],
    \ ['harpoon\.tl\.bar', '⥠'],
    \ ['harpoon\.tl\.bl', '⥑'],
    \ ['harpoon\.tl\.br', '⥍'],
    \ ['harpoon\.tl\.stop', '⥘'],
    \ ['harpoon\.tr', '↾'],
    \ ['harpoon\.tr\.bar', '⥜'],
    \ ['harpoon\.tr\.bl', '⥌'],
    \ ['harpoon\.tr\.br', '⥏'],
    \ ['harpoon\.tr\.stop', '⥔'],
    \ ['harpoons\.blbr', '⥥'],
    \ ['harpoons\.bltr', '⥯'],
    \ ['harpoons\.lbrb', '⥧'],
    \ ['harpoons\.ltlb', '⥢'],
    \ ['harpoons\.ltrb', '⇋'],
    \ ['harpoons\.ltrt', '⥦'],
    \ ['harpoons\.rblb', '⥩'],
    \ ['harpoons\.rtlb', '⇌'],
    \ ['harpoons\.rtlt', '⥨'],
    \ ['harpoons\.rtrb', '⥤'],
    \ ['harpoons\.tlbr', '⥮'],
    \ ['harpoons\.tltr', '⥣'],
    \ ['hash', '#'],
    \ ['hat', '^'],
    \ ['hexa\.filled', '⬢'],
    \ ['hexa\.stroked', '⬡'],
    \ ['hyph', '‐'],
    \ ['hyph\.minus', '-'],
    \ ['hyph\.nobreak', '‑'],
    \ ['hyph\.point', '‧'],
    \ ['in', '∈'],
    \ ['in\.not', '∉'],
    \ ['in\.rev', '∋'],
    \ ['in\.rev\.not', '∌'],
    \ ['in\.rev\.small', '∍'],
    \ ['in\.small', '∊'],
    \ ['infinity', '∞'],
    \ ['integral', '∫'],
    \ ['integral\.arrow\.hook', '⨗'],
    \ ['integral\.ccw', '⨑'],
    \ ['integral\.cont', '∮'],
    \ ['integral\.cont\.ccw', '∳'],
    \ ['integral\.cont\.cw', '∲'],
    \ ['integral\.cw', '∱'],
    \ ['integral\.double', '∬'],
    \ ['integral\.quad', '⨌'],
    \ ['integral\.sect', '⨙'],
    \ ['integral\.square', '⨖'],
    \ ['integral\.surf', '∯'],
    \ ['integral\.times', '⨘'],
    \ ['integral\.triple', '∭'],
    \ ['integral\.union', '⨚'],
    \ ['integral\.vol', '∰'],
    \ ['interrobang', '‽'],
    \ ['iota', 'ι'],
    \ ['join', '⨝'],
    \ ['join\.l', '⟕'],
    \ ['join\.l\.r', '⟗'],
    \ ['join\.r', '⟖'],
    \ ['kai', 'ϗ'],
    \ ['kappa', 'κ'],
    \ ['kappa\.alt', 'ϰ'],
    \ ['kelvin', 'K'],
    \ ['lambda', 'λ'],
    \ ['laplace', '∆'],
    \ ['lira', '₺'],
    \ ['lozenge\.filled', '⧫'],
    \ ['lozenge\.filled\.medium', '⬧'],
    \ ['lozenge\.filled\.small', '⬪'],
    \ ['lozenge\.stroked', '◊'],
    \ ['lozenge\.stroked\.medium', '⬨'],
    \ ['lozenge\.stroked\.small', '⬫'],
    \ ['lt', '<'],
    \ ['lt\.circle', '⧀'],
    \ ['lt\.curly', '≺'],
    \ ['lt\.curly\.approx', '⪷'],
    \ ['lt\.curly\.double', '⪻'],
    \ ['lt\.curly\.eq', '≼'],
    \ ['lt\.curly\.eq\.not', '⋠'],
    \ ['lt\.curly\.equiv', '⪳'],
    \ ['lt\.curly\.napprox', '⪹'],
    \ ['lt\.curly\.nequiv', '⪵'],
    \ ['lt\.curly\.not', '⊀'],
    \ ['lt\.curly\.ntilde', '⋨'],
    \ ['lt\.curly\.tilde', '≾'],
    \ ['lt\.dot', '⋖'],
    \ ['lt\.double', '≪'],
    \ ['lt\.eq', '≤'],
    \ ['lt\.eq\.gt', '⋚'],
    \ ['lt\.eq\.not', '≰'],
    \ ['lt\.eq\.slant', '⩽'],
    \ ['lt\.equiv', '≦'],
    \ ['lt\.gt', '≶'],
    \ ['lt\.gt\.not', '≸'],
    \ ['lt\.nequiv', '≨'],
    \ ['lt\.not', '≮'],
    \ ['lt\.ntilde', '⋦'],
    \ ['lt\.small', '﹤'],
    \ ['lt\.tilde', '≲'],
    \ ['lt\.tilde\.not', '≴'],
    \ ['lt\.tri', '⊲'],
    \ ['lt\.tri\.eq', '⊴'],
    \ ['lt\.tri\.eq\.not', '⋬'],
    \ ['lt\.tri\.not', '⋪'],
    \ ['lt\.triple', '⋘'],
    \ ['lt\.triple\.nested', '⫷'],
    \ ['macron', '¯'],
    \ ['maltese', '✠'],
    \ ['minus', '−'],
    \ ['minus\.circle', '⊖'],
    \ ['minus\.dot', '∸'],
    \ ['minus\.plus', '∓'],
    \ ['minus\.square', '⊟'],
    \ ['minus\.tilde', '≂'],
    \ ['minus\.triangle', '⨺'],
    \ ['models', '⊧'],
    \ ['mu', 'μ'],
    \ ['multimap', '⊸'],
    \ ['nabla', '∇'],
    \ ['not', '¬'],
    \ ['notes\.down', '🎝'],
    \ ['notes\.up', '🎜'],
    \ ['nothing', '∅'],
    \ ['nothing\.rev', '⦰'],
    \ ['nu', 'ν'],
    \ ['ohm', 'Ω'],
    \ ['ohm\.inv', '℧'],
    \ ['omega', 'ω'],
    \ ['omicron', 'ο'],
    \ ['oo', '∞'],
    \ ['or', '∨'],
    \ ['or\.big', '⋁'],
    \ ['or\.curly', '⋎'],
    \ ['or\.dot', '⟇'],
    \ ['or\.double', '⩔'],
    \ ['parallel', '∥'],
    \ ['parallel\.circle', '⦷'],
    \ ['parallel\.not', '∦'],
    \ ['paren\.b', '⏝'],
    \ ['paren\.l', '('],
    \ ['paren\.r', ')'],
    \ ['paren\.t', '⏜'],
    \ ['partial', '∂'],
    \ ['penta\.filled', '⬟'],
    \ ['penta\.stroked', '⬠'],
    \ ['percent', '%'],
    \ ['permille', '‰'],
    \ ['perp', '⟂'],
    \ ['perp\.circle', '⦹'],
    \ ['peso', '₱'],
    \ ['phi', 'φ'],
    \ ['phi\.alt', 'ϕ'],
    \ ['pi', 'π'],
    \ ['pi\.alt', 'ϖ'],
    \ ['pilcrow', '¶'],
    \ ['pilcrow\.rev', '⁋'],
    \ ['planck', 'ℎ'],
    \ ['planck\.reduce', 'ℏ'],
    \ ['plus', '+'],
    \ ['plus\.circle', '⊕'],
    \ ['plus\.circle\.arrow', '⟴'],
    \ ['plus\.circle\.big', '⨁'],
    \ ['plus\.dot', '∔'],
    \ ['plus\.minus', '±'],
    \ ['plus\.small', '﹢'],
    \ ['plus\.square', '⊞'],
    \ ['plus\.triangle', '⨹'],
    \ ['pound', '£'],
    \ ['prec', '≺'],
    \ ['prec\.approx', '⪷'],
    \ ['prec\.double', '⪻'],
    \ ['prec\.eq', '≼'],
    \ ['prec\.eq\.not', '⋠'],
    \ ['prec\.equiv', '⪳'],
    \ ['prec\.napprox', '⪹'],
    \ ['prec\.nequiv', '⪵'],
    \ ['prec\.not', '⊀'],
    \ ['prec\.ntilde', '⋨'],
    \ ['prec\.tilde', '≾'],
    \ ['prime', '′'],
    \ ['prime\.double', '″'],
    \ ['prime\.double\.rev', '‶'],
    \ ['prime\.quad', '⁗'],
    \ ['prime\.rev', '‵'],
    \ ['prime\.triple', '‴'],
    \ ['prime\.triple\.rev', '‷'],
    \ ['product', '∏'],
    \ ['product\.co', '∐'],
    \ ['prop', '∝'],
    \ ['psi', 'ψ'],
    \ ['qed', '∎'],
    \ ['quest', '?'],
    \ ['quest\.double', '⁇'],
    \ ['quest\.excl', '⁈'],
    \ ['quest\.inv', '¿'],
    \ ['quote\.angle\.l\.double', '«'],
    \ ['quote\.angle\.l\.single', '‹'],
    \ ['quote\.angle\.r\.double', '»'],
    \ ['quote\.angle\.r\.single', '›'],
    \ ['quote\.double', '"'],
    \ ['quote\.high\.double', '‟'],
    \ ['quote\.high\.single', '‛'],
    \ ['quote\.l\.double', '“'],
    \ ['quote\.l\.single', '‘'],
    \ ['quote\.low\.double', '„'],
    \ ['quote\.low\.single', '‚'],
    \ ['quote\.r\.double', '”'],
    \ ['quote\.r\.single', '’'],
    \ ['ratio', '∶'],
    \ ['rect\.filled\.h', '▬'],
    \ ['rect\.filled\.v', '▮'],
    \ ['rect\.stroked\.h', '▭'],
    \ ['rect\.stroked\.v', '▯'],
    \ ['refmark', '※'],
    \ ['rho', 'ρ'],
    \ ['rho\.alt', 'ϱ'],
    \ ['ruble', '₽'],
    \ ['rupee', '₹'],
    \ ['sect', '∩'],
    \ ['sect\.and', '⩄'],
    \ ['sect\.big', '⋂'],
    \ ['sect\.dot', '⩀'],
    \ ['sect\.double', '⋒'],
    \ ['sect\.sq', '⊓'],
    \ ['sect\.sq\.big', '⨅'],
    \ ['sect\.sq\.double', '⩎'],
    \ ['section', '§'],
    \ ['semi', ';'],
    \ ['semi\.rev', '⁏'],
    \ ['servicemark', '℠'],
    \ ['shin', 'ש'],
    \ ['sigma', 'σ'],
    \ ['sigma\.alt', 'ς'],
    \ ['slash', '/'],
    \ ['slash\.big', '⧸'],
    \ ['slash\.double', '⫽'],
    \ ['slash\.triple', '⫻'],
    \ ['smash', '⨳'],
    \ ['space', '␣'],
    \ ['square\.filled', '■'],
    \ ['square\.filled\.big', '⬛'],
    \ ['square\.filled\.medium', '◼'],
    \ ['square\.filled\.small', '◾'],
    \ ['square\.filled\.tiny', '▪'],
    \ ['square\.stroked', '□'],
    \ ['square\.stroked\.big', '⬜'],
    \ ['square\.stroked\.dotted', '⬚'],
    \ ['square\.stroked\.medium', '◻'],
    \ ['square\.stroked\.rounded', '▢'],
    \ ['square\.stroked\.small', '◽'],
    \ ['square\.stroked\.tiny', '▫'],
    \ ['star\.filled', '★'],
    \ ['star\.op', '⋆'],
    \ ['star\.stroked', '★'],
    \ ['subset', '⊂'],
    \ ['subset\.dot', '⪽'],
    \ ['subset\.double', '⋐'],
    \ ['subset\.eq', '⊆'],
    \ ['subset\.eq\.not', '⊈'],
    \ ['subset\.eq\.sq', '⊑'],
    \ ['subset\.eq\.sq\.not', '⋢'],
    \ ['subset\.neq', '⊊'],
    \ ['subset\.not', '⊄'],
    \ ['subset\.sq', '⊏'],
    \ ['subset\.sq\.neq', '⋤'],
    \ ['succ', '≻'],
    \ ['succ\.approx', '⪸'],
    \ ['succ\.double', '⪼'],
    \ ['succ\.eq', '≽'],
    \ ['succ\.eq\.not', '⋡'],
    \ ['succ\.equiv', '⪴'],
    \ ['succ\.napprox', '⪺'],
    \ ['succ\.nequiv', '⪶'],
    \ ['succ\.not', '⊁'],
    \ ['succ\.ntilde', '⋩'],
    \ ['succ\.tilde', '≿'],
    \ ['suit\.club', '♣'],
    \ ['suit\.diamond', '♦'],
    \ ['suit\.heart', '♥'],
    \ ['suit\.spade', '♠'],
    \ ['sum', '∑'],
    \ ['sum\.integral', '⨋'],
    \ ['supset', '⊃'],
    \ ['supset\.dot', '⪾'],
    \ ['supset\.double', '⋑'],
    \ ['supset\.eq', '⊇'],
    \ ['supset\.eq\.not', '⊉'],
    \ ['supset\.eq\.sq', '⊒'],
    \ ['supset\.eq\.sq\.not', '⋣'],
    \ ['supset\.neq', '⊋'],
    \ ['supset\.not', '⊅'],
    \ ['supset\.sq', '⊐'],
    \ ['supset\.sq\.neq', '⋥'],
    \ ['tack\.b', '⊤'],
    \ ['tack\.b\.big', '⟙'],
    \ ['tack\.b\.double', '⫪'],
    \ ['tack\.b\.short', '⫟'],
    \ ['tack\.l', '⊣'],
    \ ['tack\.l\.double', '⫤'],
    \ ['tack\.l\.long', '⟞'],
    \ ['tack\.l\.r', '⟛'],
    \ ['tack\.l\.short', '⫞'],
    \ ['tack\.r', '⊢'],
    \ ['tack\.r\.double', '⊨'],
    \ ['tack\.r\.double\.not', '⊭'],
    \ ['tack\.r\.long', '⟝'],
    \ ['tack\.r\.not', '⊬'],
    \ ['tack\.r\.short', '⊦'],
    \ ['tack\.t', '⊥'],
    \ ['tack\.t\.big', '⟘'],
    \ ['tack\.t\.double', '⫫'],
    \ ['tack\.t\.short', '⫠'],
    \ ['tau', 'τ'],
    \ ['therefore', '∴'],
    \ ['theta', 'θ'],
    \ ['theta\.alt', 'ϑ'],
    \ ['tilde\.basic', '~'],
    \ ['tilde\.eq', '≃'],
    \ ['tilde\.eq\.not', '≄'],
    \ ['tilde\.eq\.rev', '⋍'],
    \ ['tilde\.equiv', '≅'],
    \ ['tilde\.equiv\.not', '≇'],
    \ ['tilde\.nequiv', '≆'],
    \ ['tilde\.not', '≁'],
    \ ['tilde\.op', '∼'],
    \ ['tilde\.rev', '∽'],
    \ ['tilde\.rev\.equiv', '≌'],
    \ ['tilde\.triple', '≋'],
    \ ['times', '×'],
    \ ['times\.big', '⨉'],
    \ ['times\.circle', '⊗'],
    \ ['times\.circle\.big', '⨂'],
    \ ['times\.div', '⋇'],
    \ ['times\.l', '⋉'],
    \ ['times\.r', '⋊'],
    \ ['times\.square', '⊠'],
    \ ['times\.three\.l', '⋋'],
    \ ['times\.three\.r', '⋌'],
    \ ['times\.triangle', '⨻'],
    \ ['top', '⊤'],
    \ ['triangle\.filled\.b', '▼'],
    \ ['triangle\.filled\.bl', '◣'],
    \ ['triangle\.filled\.br', '◢'],
    \ ['triangle\.filled\.l', '◀'],
    \ ['triangle\.filled\.r', '▶'],
    \ ['triangle\.filled\.small\.b', '▾'],
    \ ['triangle\.filled\.small\.l', '◂'],
    \ ['triangle\.filled\.small\.r', '▸'],
    \ ['triangle\.filled\.small\.t', '▴'],
    \ ['triangle\.filled\.t', '▲'],
    \ ['triangle\.filled\.tl', '◤'],
    \ ['triangle\.filled\.tr', '◥'],
    \ ['triangle\.stroked\.b', '▽'],
    \ ['triangle\.stroked\.bl', '◺'],
    \ ['triangle\.stroked\.br', '◿'],
    \ ['triangle\.stroked\.dot', '◬'],
    \ ['triangle\.stroked\.l', '◁'],
    \ ['triangle\.stroked\.nested', '⟁'],
    \ ['triangle\.stroked\.r', '▷'],
    \ ['triangle\.stroked\.rounded', '🛆'],
    \ ['triangle\.stroked\.small\.b', '▿'],
    \ ['triangle\.stroked\.small\.l', '◃'],
    \ ['triangle\.stroked\.small\.r', '▹'],
    \ ['triangle\.stroked\.small\.t', '▵'],
    \ ['triangle\.stroked\.t', '△'],
    \ ['triangle\.stroked\.tl', '◸'],
    \ ['triangle\.stroked\.tr', '◹'],
    \ ['turtle\.b', '⏡'],
    \ ['turtle\.l', '〔'],
    \ ['turtle\.r', '〕'],
    \ ['turtle\.t', '⏠'],
    \ ['union', '∪'],
    \ ['union\.arrow', '⊌'],
    \ ['union\.big', '⋃'],
    \ ['union\.dot', '⊍'],
    \ ['union\.dot\.big', '⨃'],
    \ ['union\.double', '⋓'],
    \ ['union\.minus', '⩁'],
    \ ['union\.or', '⩅'],
    \ ['union\.plus', '⊎'],
    \ ['union\.plus\.big', '⨄'],
    \ ['union\.sq', '⊔'],
    \ ['union\.sq\.big', '⨆'],
    \ ['union\.sq\.double', '⩏'],
    \ ['upsilon', 'υ'],
    \ ['without', '∖'],
    \ ['won', '₩'],
    \ ['wreath', '≀'],
    \ ['xi', 'ξ'],
    \ ['xor', '⊕'],
    \ ['xor\.big', '⨁'],
    \ ['yen', '¥'],
    \ ['zeta', 'ζ'],
\ ]

for typmath in s:typstMathList
    "exe "syn match typstMathSymbol '\\(\\<\\|_\\)\\zs".typmath[0]."\\ze\\(\\>[^.]\\|_\\|$\\)' contained conceal cchar=".typmath[1]
    " exe "syn match typstMathSymbol '\\a\\@<!".typmath[0]."\\a\\@!' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol '".typmath[0]."' contained conceal cchar=".typmath[1]
endfor

let s:typstMathList2=[
    \ ['\[|', '⟦'],
    \ ['|\]', '⟧'],
    \ ['||', '‖'],
    \ ['\*', '∗'],
    \ [':=', '≔'],
    \ ['::=', '⩴'],
    \ ['\.\.\.', '…'],
    \ ["\\'", "′"],
    \ ['=:', '≕'],
    \ ['!=', '≠'],
    \ ['>>', '≫'],
    \ ['>=', '≥'],
    \ ['>>>', '⋙'],
    \ ['<<', '≪'],
    \ ['<=', '≤'],
    \ ['<<<', '⋘'],
    \ ['->', '→'],
    \ ['|->', '↦'],
    \ ['=>', '⇒'],
    \ ['|=>', '⤇'],
    \ ['==>', '⟹'],
    \ ['-->', '⟶'],
    \ ['\~\~>', '⟿'],
    \ ['\~>', '⇝'],
    \ ['>->', '↣'],
    \ ['->>', '↠'],
    \ ['<-', '←'],
    \ ['<==', '⟸'],
    \ ['<--', '⟵'],
    \ ['<\~\~', '⬳'],
    \ ['<\~', '⇜'],
    \ ['<-<', '↢'],
    \ ['<<-', '↞'],
    \ ['<->', '↔'],
    \ ['<=>', '⇔'],
    \ ['<==>', '⟺'],
    \ ['<-->', '⟷'],
\ ]

for typmath in s:typstMathList2
    "exe "syn match typstMathSymbol '\\(\\<\\|^\\|\\w\\|\\s\\|\\$\\)\\zs".typmath[0]."\\ze\\(\\w\\|\\s\\|$\\|\\$\\)' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol '".typmath[0]."' contained conceal cchar=".typmath[1]
endfor

let s:typstCalList=[
    \ ['A', '𝓐'],
    \ ['B', '𝓑'],
    \ ['C', '𝓒'],
    \ ['D', '𝓓'],
    \ ['E', '𝓔'],
    \ ['F', '𝓕'],
    \ ['G', '𝓖'],
    \ ['H', '𝓗'],
    \ ['I', '𝓘'],
    \ ['J', '𝓙'],
    \ ['K', '𝓚'],
    \ ['L', '𝓛'],
    \ ['M', '𝓜'],
    \ ['N', '𝓝'],
    \ ['O', '𝓞'],
    \ ['P', '𝓟'],
    \ ['Q', '𝓠'],
    \ ['R', '𝓡'],
    \ ['S', '𝓢'],
    \ ['T', '𝓣'],
    \ ['U', '𝓤'],
    \ ['V', '𝓥'],
    \ ['W', '𝓦'],
    \ ['X', '𝓧'],
    \ ['Y', '𝓨'],
    \ ['Z', '𝓩'],
    \ ['a', '𝓪'],
    \ ['b', '𝓫'],
    \ ['c', '𝓬'],
    \ ['d', '𝓭'],
    \ ['e', '𝓮'],
    \ ['f', '𝓯'],
    \ ['g', '𝓰'],
    \ ['h', '𝓱'],
    \ ['i', '𝓲'],
    \ ['j', '𝓳'],
    \ ['k', '𝓴'],
    \ ['l', '𝓵'],
    \ ['m', '𝓶'],
    \ ['n', '𝓷'],
    \ ['o', '𝓸'],
    \ ['p', '𝓹'],
    \ ['q', '𝓺'],
    \ ['r', '𝓻'],
    \ ['s', '𝓼'],
    \ ['t', '𝓽'],
    \ ['u', '𝓾'],
    \ ['v', '𝓿'],
    \ ['w', '𝔀'],
    \ ['x', '𝔁'],
    \ ['y', '𝔂'],
    \ ['z', '𝔃'],
\ ]

for typmath in s:typstCalList
    "exe "syn match typstMathSymbol '\\%(\\<\\|_\\)\\zscal(".typmath[0].")' contained conceal cchar=".typmath[1]
    "exe "syn match typstMathSymbol '\\%(\\<\\|_\\)\\zsfca(".typmath[0].")' contained conceal cchar=".typmath[1]
    " exe "syn match typstMathSymbol '\\a\\@<!cal(".typmath[0].")' contained conceal cchar=".typmath[1]
    " exe "syn match typstMathSymbol '\\a\\@<!fca(".typmath[0].")' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol 'cal(".typmath[0].")' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol 'fca(".typmath[0].")' contained conceal cchar=".typmath[1]
endfor

let s:typstBBList=[
    \ ['A', '𝔸'],
    \ ['B', '𝔹'],
    \ ['C', 'ℂ'],
    \ ['D', '𝔻'],
    \ ['E', '𝔼'],
    \ ['F', '𝔽'],
    \ ['G', '𝔾'],
    \ ['H', 'ℍ'],
    \ ['I', '𝕀'],
    \ ['J', '𝕁'],
    \ ['K', '𝕂'],
    \ ['L', '𝕃'],
    \ ['M', '𝕄'],
    \ ['N', 'ℕ'],
    \ ['O', '𝕆'],
    \ ['P', 'ℙ'],
    \ ['Q', 'ℚ'],
    \ ['R', 'ℝ'],
    \ ['S', '𝕊'],
    \ ['T', '𝕋'],
    \ ['U', '𝕌'],
    \ ['V', '𝕍'],
    \ ['W', '𝕎'],
    \ ['X', '𝕏'],
    \ ['Y', '𝕐'],
    \ ['Z', 'ℤ'],
    \ ['a', '𝕒'],
    \ ['b', '𝕓'],
    \ ['c', '𝕔'],
    \ ['d', '𝕕'],
    \ ['e', '𝕖'],
    \ ['f', '𝕗'],
    \ ['g', '𝕘'],
    \ ['h', '𝕙'],
    \ ['i', '𝕚'],
    \ ['j', '𝕛'],
    \ ['k', '𝕜'],
    \ ['l', '𝕝'],
    \ ['m', '𝕞'],
    \ ['n', '𝕟'],
    \ ['o', '𝕠'],
    \ ['p', '𝕡'],
    \ ['q', '𝕢'],
    \ ['r', '𝕣'],
    \ ['s', '𝕤'],
    \ ['t', '𝕥'],
    \ ['u', '𝕦'],
    \ ['v', '𝕧'],
    \ ['w', '𝕨'],
    \ ['x', '𝕩'],
    \ ['y', '𝕪'],
    \ ['z', '𝕫'],
    \ ['0', '𝟘'],
    \ ['1', '𝟙'],
    \ ['2', '𝟚'],
    \ ['3', '𝟛'],
    \ ['4', '𝟜'],
    \ ['5', '𝟝'],
    \ ['6', '𝟞'],
    \ ['7', '𝟟'],
    \ ['8', '𝟠'],
    \ ['9', '𝟡'],
\ ]

for typmath in s:typstBBList
    "exe "syn match typstMathSymbol '\\(\\<\\|_\\)\\zsbb(".typmath[0].")' contained conceal cchar=".typmath[1]
    "exe "syn match typstMathSymbol '\\(\\<\\|_\\)\\zsfbb(".typmath[0].")' contained conceal cchar=".typmath[1]
    " exe "syn match typstMathSymbol '\\a\\@<!bb(".typmath[0].")' contained conceal cchar=".typmath[1]
    " exe "syn match typstMathSymbol '\\a\\@<!fbb(".typmath[0].")' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol 'bb(".typmath[0].")' contained conceal cchar=".typmath[1]
    exe "syn match typstMathSymbol 'fbb(".typmath[0].")' contained conceal cchar=".typmath[1]
endfor


syntax region typstMathBold
    \ matchgroup=typstMathFunction start=/fb(/ end=/)/
    \ contains=@typstMath
    \ contained concealends

syntax region typstMathBold
    \ matchgroup=typstMathFunction start=/bold(/ end=/)/
    \ contains=@typstMath
    \ contained concealends

highlight default link typstMathBold         typstMarkupBold

let s:typstSubList=[
    \ ['0', '₀'],
    \ ['1', '₁'],
    \ ['2', '₂'],
    \ ['3', '₃'],
    \ ['4', '₄'],
    \ ['5', '₅'],
    \ ['6', '₆'],
    \ ['7', '₇'],
    \ ['8', '₈'],
    \ ['9', '₉'],
    \ ['+', '₊'],
    \ ['-', '₋'],
    \ ['=', '₌'],
    \ ['a', 'ₐ'],
    \ ['e', 'ₑ'],
    \ ['o', 'ₒ'],
    \ ['x', 'ₓ'],
    \ ['h', 'ₕ'],
    \ ['k', 'ₖ'],
    \ ['l', 'ₗ'],
    \ ['m', 'ₘ'],
    \ ['n', 'ₙ'],
    \ ['p', 'ₚ'],
    \ ['s', 'ₛ'],
    \ ['t', 'ₜ'],
\ ]

for typmath in s:typstSubList
    exe "syn match typstMathScripts '_".typmath[0]."' contained conceal cchar=".typmath[1]
endfor

let s:typstSupList=[
    \ ['0', '⁰'],
    \ ['1', '¹'],
    \ ['2', '²'],
    \ ['3', '³'],
    \ ['4', '⁴'],
    \ ['5', '⁵'],
    \ ['6', '⁶'],
    \ ['7', '⁷'],
    \ ['8', '⁸'],
    \ ['9', '⁹'],
    \ ['+', '⁺'],
    \ ['-', '⁻'],
    \ ['=', '⁼'],
    \ ['n', 'ⁿ'],
    \ ['i', 'ⁱ'],
\ ]

for typmath in s:typstSupList
    exe "syn match typstMathScripts '\\^".typmath[0]."' contained conceal cchar=".typmath[1]
endfor

" vim: sw=4 sts=4 et fdm=marker fdl=0 


================================================
FILE: syntax/typst.vim
================================================
" Vim syntax file
" Language: Typst
" Maintainer: Kaj Munhoz Arfvidsson
" Upstream: https://github.com/kaarmu/typst.vim

if exists("b:current_syntax") | finish | endif

call typst#options#init()
if !g:typst_syntax_highlight | finish | endif

syntax sync fromstart
syntax spell toplevel

" Common {{{1
syntax cluster typstCommon
    \ contains=@typstComment

" Common > Comment {{{2
syntax cluster typstComment
    \ contains=typstCommentBlock,typstCommentLine
syntax region typstCommentBlock
    \ start="/\*" end="\*/" keepend
    \ contains=typstCommentTodo,@Spell
syntax match typstCommentLine
    \ #//.*#
    \ contains=typstCommentTodo,@Spell
syntax keyword typstCommentTodo
    \ contained
    \ TODO FIXME XXX TBD


" Code {{{1
syntax cluster typstCode
    \ contains=@typstCommon
            \ ,@typstCodeKeywords
            \ ,@typstCodeConstants
            \ ,@typstCodeIdentifiers
            \ ,@typstCodeFunctions
            \ ,@typstCodeParens

" Code > Keywords {{{2
syntax cluster typstCodeKeywords
    \ contains=typstCodeConditional
            \ ,typstCodeRepeat
            \ ,typstCodeKeyword
            \ ,typstCodeStatement
syntax keyword typstCodeConditional
    \ contained
    \ if else
syntax keyword typstCodeRepeat
    \ contained
    \ while for
syntax keyword typstCodeKeyword
    \ contained
    \ not in and or return
syntax region typstCodeStatement
    \ contained
    \ matchgroup=typstCodeStatementWord start=/\v(let|set|import|include|context)>/
    \ matchgroup=Noise end=/\v%(;|$)/
    \ contains=@typstCode
syntax region typstCodeStatement
    \ contained
    \ matchgroup=typstCodeStatementWord start=/show/
    \ matchgroup=Noise end=/\v%(:|$)/ keepend
    \ contains=@typstCode
    \ skipwhite nextgroup=@typstCode,typstCodeShowRocket
syntax match typstCodeShowRocket
    \ contained
    \ /.*=>/
    \ contains=@typstCode
    \ skipwhite nextgroup=@typstCode

" Code > Identifiers {{{2
syntax cluster typstCodeIdentifiers
    \ contains=typstCodeIdentifier
            \ ,typstCodeFieldAccess
syntax match typstCodeIdentifier
    \ contained
    \ /\v<\K%(\k|-)*>(<%(let|set|show|import|include|context))@<![\.\[\(]@!/
syntax match typstCodeFieldAccess
    \ contained
    \ /\v<\K%(\k|-)*>(<%(let|set|show|import|include|context))@<!\.[\[\(]@!/
    \ nextgroup=typstCodeFieldAccess,typstCodeFunction

" Code > Functions {{{2
syntax cluster typstCodeFunctions
    \ contains=typstCodeFunction
syntax match typstCodeFunction
    \ contained
    \ /\v<\K%(\k|-)*>(<%(let|set|show|import|include|context))@<![\(\[]@=/
    \ nextgroup=typstCodeFunctionArgument
syntax match typstCodeFunctionArgument
    \ contained
    \ /\v%(%(\(.{-}\)|\[.{-}\]|\{.{-}\}))*/ transparent
    \ contains=@typstCode

" Code > Constants {{{2
syntax cluster typstCodeConstants
    \ contains=typstCodeConstant
            \ ,typstCodeFloat
            \ ,typstCodeInteger
            \ ,typstCodeString
            \ ,typstCodeLabel
syntax match typstCodeConstant
    \ contained
    \ /\v<%(none|auto|true|false)-@!>/
syntax match typstCodeInteger
    \ contained
    \ /\v<%(\d+|0b[01]+|0o[0-7]+|0x\x+)>/

" 1.0, 1., .0, 1.e6, 1.e-6, 1.e+6, 1e6
syntax match typstCodeFloat
    \ contained
    \ /\v<%(%(\d+\.\d*|\.\d+)%([eE][+-]?\d+)?|\d+[eE][+-]?\d+)/
    \ nextgroup=typstCodeFloatRatio ,typstCodeFloatLength ,typstCodeFloatAngle ,typstCodeFloatFraction
syntax match typstCodeFloatRatio contained /%/
syntax match typstCodeFloatLength contained /\v(pt|mm|cm|in|em)>/
syntax match typstCodeFloatAngle contained /\v(deg|rad)>/
syntax match typstCodeFloatFraction contained /fr\>/

syntax region typstCodeString
    \ contained
    \ start=/"/ skip=/\v\\\\|\\"/ end=/"/
    \ contains=@Spell
syntax match typstCodeLabel
    \ contained
    \ /\v\<%(\k|:|\.|-)*\>/

" Code > Parens {{{2
syntax cluster typstCodeParens
    \ contains=typstCodeParen
            \ ,typstCodeBrace
            \ ,typstCodeBracket
            \ ,typstCodeDollar
            \ ,typstMarkupRawInline
            \ ,typstMarkupRawBlock
syntax region typstCodeParen
    \ contained
    \ matchgroup=Noise start=/(/ end=/)/
    \ contains=@typstCode
syntax region typstCodeBrace
    \ contained
    \ matchgroup=Noise start=/{/ end=/}/
    \ contains=@typstCode
syntax region typstCodeBracket
    \ contained
    \ matchgroup=Noise start=/\[/ end=/\]/
    \ contains=@typstMarkup
syntax region typstCodeDollar
    \ contained
    \ matchgroup=Number start=/\\\@<!\$/ end=/\\\@<!\$/
    \ contains=@typstMath


" Hashtag {{{1
syntax cluster typstHashtag
    \ contains=@typstHashtagKeywords
            \ ,@typstHashtagConstants
            \ ,@typstHashtagIdentifiers
            \ ,@typstHashtagFunctions
            \ ,@typstHashtagParens

" Hashtag > Keywords {{{2
syntax cluster typstHashtagKeywords
    \ contains=typstHashtagConditional
            \ ,typstHashtagRepeat
            \ ,typstHashtagKeywords
            \ ,typstHashtagStatement

" syntax match typstHashtagControlFlowError
"     \ /\v#%(if|while|for)>-@!.{-}$\_.{-}%(\{|\[|\()/
syntax match typstHashtagControlFlow
    \ /\v#%(if|while|for)>.{-}\ze%(\{|\[|\()/
    \ contains=typstHashtagConditional,typstHashtagRepeat
    \ nextgroup=@typstCode
syntax region typstHashtagConditional
    \ contained
    \ start=/\v#if>/ end=/\v\ze(\{|\[)/
    \ contains=@typstCode
syntax region typstHashtagRepeat
    \ contained
    \ start=/\v#(while|for)>/ end=/\v\ze(\{|\[)/
    \ contains=@typstCode
syntax match typstHashtagKeyword
    \ /\v#(return)>/
    \ skipwhite nextgroup=@typstCode
syntax region typstHashtagStatement
    \ matchgroup=typstHashtagStatementWord start=/\v#(let|set|import|include|context)>/
    \ matchgroup=Noise end=/\v%(;|$)/
    \ contains=@typstCode
syntax region typstHashtagStatement
    \ matchgroup=typstHashtagStatementWord start=/#show/
    \ matchgroup=Noise end=/\v%(:|$)/ keepend
    \ contains=@typstCode
    \ skipwhite nextgroup=@typstCode,typstCodeShowRocket

" Hashtag > Constants {{{2
syntax cluster typstHashtagConstants
    \ contains=typstHashtagConstant
syntax match typstHashtagConstant
    \ /\v#(none|auto|true|false)>/

" Hashtag > Identifiers {{{2
syntax cluster typstHashtagIdentifiers
    \ contains=typstHashtagIdentifier
            \ ,typstHashtagFieldAccess
syntax match typstHashtagIdentifier
    \ /\v#\K%(\k|-)*>(<%(let|set|show|import|include|context))@<![\.\[\(]@!/
syntax match typstHashtagFieldAccess
    \ /\v#\K%(\k|-)*>(<%(let|set|show|import|include|context))@<!\.[\[\(]@!/
    \ nextgroup=typstCodeFieldAccess,typstCodeFunction

if g:typst_conceal_emoji
    runtime! syntax/typst-emoji.vim
endif


" Hashtag > Functions {{{2
syntax cluster typstHashtagFunctions
    \ contains=typstHashtagFunction
syntax match typstHashtagFunction
    \ /\v#\K%(\k|-)*>(<%(let|set|show|import|include|context))@<![\(\[]@=/
    \ nextgroup=typstCodeFunctionArgument

" Hashtag > Parens {{{2
syntax cluster typstHashtagParens
    \ contains=typstHashtagParen
            \ ,typstHashtagBrace
            \ ,typstHashtagBracket
            \ ,typstHashtagDollar
syntax region typstHashtagParen
    \ matchgroup=Noise start=/#(/ end=/)/
    \ contains=@typstCode
syntax region typstHashtagBrace
    \ matchgroup=Noise start=/#{/ end=/}/
    \ contains=@typstCode
syntax region typstHashtagBracket
    \ matchgroup=Noise start=/#\[/ end=/\]/
    \ contains=@typstMarkup
syntax region typstHashtagDollar
    \ matchgroup=Noise start=/#\$/ end=/\\\@<!\$/
    \ contains=@typstMath


" Markup {{{1
syntax cluster typstMarkup
    \ contains=@typstCommon
            \ ,@Spell
            \ ,@typstHashtag
            \ ,@typstMarkupText
            \ ,@typstMarkupParens

" Markup > Text {{{2
syntax cluster typstMarkupText
    \ contains=typstMarkupRawInline
            \ ,typstMarkupRawBlock
            \ ,typstMarkupLabel
            \ ,typstMarkupRefMarker
            \ ,typstMarkupUrl
            \ ,typstMarkupHeading
            \ ,typstMarkupBulletList
            \ ,typstMarkupEnumList
            \ ,typstMarkupTermMarker
            \ ,typstMarkupBold
            \ ,typstMarkupItalic
            \ ,typstMarkupLinebreak
            \ ,typstMarkupNonbreakingSpace
            \ ,typstMarkupSoftHyphen
            \ ,typstMarkupDash
            \ ,typstMarkupEllipsis

" Raw Text
syntax match typstMarkupRawInline
    \ /`.\{-}`/
syntax region typstMarkupRawBlock
    \ matchgroup=Macro start=/```\w*/
    \ matchgroup=Macro end=/```/ keepend
if g:typst_conceal
    syntax region typstMarkupCodeBlockTypst
        \ matchgroup=Macro start=/```typst/
        \ matchgroup=Macro end=/```/ contains=@typstCode keepend
        \ concealends
else
    syntax region typstMarkupCodeBlockTypst
        \ matchgroup=Macro start=/```typst/
        \ matchgroup=Macro end=/```/ contains=@typstCode keepend
endif
runtime! syntax/typst-embedded.vim

" Label & Reference
syntax match typstMarkupLabel
    \ /\v\<%(\k|:|\.|-)*\>/
" Ref markers can't end in ':' or '.', but labels can
syntax match typstMarkupRefMarker
    \ /\v\@%(\k|:|\.|-)*%(\k|-)/

" URL
syntax match typstMarkupUrl
    \ #\v\w+://\S*#

" Heading
syntax match typstMarkupHeading
    \ /^\s*\zs=\{1,6}\s.*$/
    \ contains=typstMarkupLabel,@Spell

" Lists
syntax match typstMarkupBulletList
    \ /\v^\s*-\s+/
syntax match typstMarkupEnumList
    \ /\v^\s*(\+|\d+\.)\s+/
syntax region typstMarkupTermMarker
    \ oneline start=/\v^\s*\/\s/ end=/:/
    \ contains=@typstMarkup

" Bold & Italic
syntax match typstMarkupBold
    \ /\v(\w|\\)@1<!\*\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!\*/
    \ contains=typstMarkupBoldRegion
syntax match typstMarkupItalic
    \ /\v(\w|\\)@1<!_\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!_/
    \ contains=typstMarkupItalicRegion
syntax match typstMarkupBoldItalic
    \ contained
    \ /\v(\w|\\)@1<![_\*]\S@=.{-}(\n.{-1,})*\S@1<=\\@1<!\2/
    \ contains=typstMarkupBoldRegion,typstMarkupItalicRegion
if g:typst_conceal
    syntax region typstMarkupBoldRegion
        \ contained
        \ transparent matchgroup=typstMarkupBold
        \ start=/\(^\|[^0-9a-zA-Z]\)\@<=\*/ end=/\*\($\|[^0-9a-zA-Z]\)\@=/
        \ concealends contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell
    syntax region typstMarkupItalicRegion
        \ contained
        \ transparent matchgroup=typstMarkupItalic
        \ start=/\(^\|[^0-9a-zA-Z]\)\@<=_/ end=/_\($\|[^0-9a-zA-Z]\)\@=/
        \ concealends contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell
else
    syntax region typstMarkupBoldRegion
        \ contained
        \ transparent matchgroup=typstMarkupBold
        \ start=/\(^\|[^0-9a-zA-Z]\)\@<=\*/ end=/\*\($\|[^0-9a-zA-Z]\)\@=/
        \ contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell
    syntax region typstMarkupItalicRegion
        \ contained
        \ transparent matchgroup=typstMarkupItalic
        \ start=/\(^\|[^0-9a-zA-Z]\)\@<=_/ end=/_\($\|[^0-9a-zA-Z]\)\@=/
        \ contains=typstMarkupBoldItalic,typstMarkupLabel,@Spell
endif

" Linebreak & Special Whitespace
syntax match typstMarkupLinebreak
    \ /\\\\/
syntax match typstMarkupNonbreakingSpace
    \ /\~/

" Special Symbols
syntax match typstMarkupSoftHyphen
    \ /-?/
syntax match typstMarkupDash
    \ /-\{2,3}/
syntax match typstMarkupEllipsis
    \ /\.\.\./

" Markup > Parens {{{2
syntax cluster typstMarkupParens
    \ contains=typstMarkupBracket
            \ ,typstMarkupDollar
syntax region typstMarkupBracket
    \ matchgroup=Noise start=/\[/ end=/\]/
    \ contains=@typstMarkup
syntax region typstMarkupDollar
    \ matchgroup=Special start=/\\\@<!\$/ end=/\\\@<!\$/
    \ contains=@typstMath


" Math {{{1
syntax cluster typstMath
    \ contains=@typstCommon
            \ ,@typstHashtag
            \ ,typstMathIdentifier
            \ ,typstMathFunction
            \ ,typstMathNumber
            \ ,typstMathSymbol
            \ ,typstMathBold
            \ ,typstMathScripts
            \ ,typstMathQuote

" a math identifier should be like \k without '_'
syntax match typstMathIdentifier
    \ /\v<\a%(\a|\d)+>/
    \ contained
syntax match typstMathFunction
    \ /\v<\a%(\a|\d)+\ze\(/
    \ contained
syntax match typstMathNumber
    \ /\v<\d+>/
    \ contained
syntax region typstMathQuote
    \ matchgroup=String start=/"/ skip=/\\"/ end=/"/
    \ contained

if g:typst_conceal_math
    runtime! syntax/typst-symbols.vim
endif


" Math > Linked groups {{{2
highlight default link typstMathIdentifier          Identifier
highlight default link typstMathFunction            Statement
highlight default link typstMathNumber              Number
highlight default link typstMathSymbol              Statement

" Highlighting {{{1

" Highlighting > Linked groups {{{2
highlight default link typstCommentBlock            Comment
highlight default link typstCommentLine             Comment
highlight default link typstCommentTodo             Todo
highlight default link typstCodeConditional         Conditional
highlight default link typstCodeRepeat              Repeat
highlight default link typstCodeKeyword             Keyword
highlight default link typstCodeConstant            Constant
highlight default link typstCodeInteger             Number
highlight default link typstCodeFloat               Number
highlight default link typstCodeFloatLength         Number
highlight default link typstCodeFloatAngle          Number
highlight default link typstCodeFloatRatio          Number
highlight default link typstCodeFloatFraction       Number
highlight default link typstCodeString              String
highlight default link typstCodeLabel               Structure
highlight default link typstCodeStatementWord       Statement
highlight default link typstCodeIdentifier          Identifier
highlight default link typstCodeFieldAccess         Identifier
highlight default link typstCodeFunction            Function
highlight default link typstCodeParen               Noise
highlight default link typstCodeBrace               Noise
highlight default link typstCodeBracket             Noise
highlight default link typstCodeDollar              Noise
" highlight default link typstHashtagControlFlowError Error
highlight default link typstHashtagConditional      Conditional
highlight default link typstHashtagRepeat           Repeat
highlight default link typstHashtagKeyword          Keyword
highlight default link typstHashtagConstant         Constant
highlight default link typstHashtagStatementWord    Statement
highlight default link typstHashtagIdentifier       Identifier
highlight default link typstHashtagFieldAccess      Identifier
highlight default link typstHashtagFunction         Function
highlight default link typstHashtagParen            Noise
highlight default link typstHashtagBrace            Noise
highlight default link typstHashtagBracket          Noise
highlight default link typstHashtagDollar           Noise
highlight default link typstMarkupRawInline         Macro
highlight default link typstMarkupRawBlock          Macro
highlight default link typstMarkupLabel             Structure
highlight default link typstMarkupRefMarker         Structure
highlight default link typstMarkupBulletList        Structure
highlight default link typstMarkupHeading           Title
" highlight default link typstMarkupItalicError       Error
" highlight default link typstMarkupBoldError         Error
highlight default link typstMarkupEnumList          Structure
highlight default link typstMarkupLinebreak         Structure
highlight default link typstMarkupNonbreakingSpace  Structure
highlight default link typstMarkupSoftHyphen        Structure
highlight default link typstMarkupDash              Structure
highlight default link typstMarkupEllipsis          Structure
highlight default link typstMarkupTermMarker        Structure
highlight default link typstMarkupDollar            Noise

" Highlighting > Custom Styling {{{2
highlight! Conceal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE

highlight default typstMarkupUrl                        term=underline          cterm=underline         gui=underline
highlight default typstMarkupBold                       term=bold               cterm=bold              gui=bold
highlight default typstMarkupItalic                     term=italic             cterm=italic            gui=italic
highlight default typstMarkupBoldItalic                 term=bold,italic        cterm=bold,italic       gui=bold,italic

" }}}1

let b:current_syntax = "typst"

" vim: sw=4 sts=4 et fdm=marker fdl=0 


================================================
FILE: tests/italic-bold.typ
================================================
= Italic

// Italic
_Lorem ipsum_

// Not italic
Lorem\_ipsum

// Italic
_Lorem\_ipsum_

// Error
_Lorem ipsum\_

// Ialic
_Lorem
ipsum_

// Error
_Lorem

ipsum_

// Citations

_Lorem ipsum_ @dolor_sit

_Lorem ipsum_ #cite("dolor_sit")


= Bold

// Bold
*Lorem ipsum*

// Not bold
Lorem\*ipsum

// Bold
*Lorem\*ipsum*

// Error
*Lorem ipsum\*

// Bold
*Lorem
ipsum*

// Error
*Lorem

ipsum*

// Citations

*Lorem ipsum* @dolor_sit

*Lorem ipsum* #cite("dolor_sit")



================================================
FILE: tests/leaky-modes.typ
================================================
= Leaky Bodies

== Issue #69

// Broken

#show link: underline
#show link: set text(navy)
#show par: set block(spacing: 1.75em)

// Not Broken

#show link: underline
#show link: set text(navy);;
#show par: set block(spacing: 1.75em)

== Issue #46 (solved)

// Not Broken 

#{ // Function body
  [ // Content block
  + text
  + text
  + #box()[text another text]
  + text
  + text
  ]
}

// Broken

#{ // Function body
  [ // Content block
  + text
  + text
  + #box()[text
    another text]
  + text
  + text
  ]
}

== Issue #43 (solved)

#while index < 3 {
    let x = "abc"  // Wrong highlighting
}

#{
    while index < 3 {
        let x = "abc"  // Correct highlighting
    }
}
Download .txt
gitextract_o5i93ar6/

├── .gitignore
├── LICENSE
├── README.md
├── autoload/
│   ├── typst/
│   │   └── options.vim
│   └── typst.vim
├── compiler/
│   └── typst.vim
├── ftdetect/
│   └── typst.vim
├── ftplugin/
│   └── typst.vim
├── indent/
│   └── typst.vim
├── syntax/
│   ├── typst-embedded.vim
│   ├── typst-emoji.vim
│   ├── typst-symbols.vim
│   └── typst.vim
└── tests/
    ├── italic-bold.typ
    └── leaky-modes.typ
Condensed preview — 15 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (121K chars).
[
  {
    "path": ".gitignore",
    "chars": 7,
    "preview": "*.swp\n\n"
  },
  {
    "path": "LICENSE",
    "chars": 1078,
    "preview": "MIT License\n\nCopyright (c) 2023 Kaj Munhoz Arfvidsson\n\nPermission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "README.md",
    "chars": 4778,
    "preview": "# typst.vim\n\n*OBS: Work In Progress*\n\n(Neo)vim plugin for [Typst](https://typst.app).\n\nI am applying the 80/20 rule in t"
  },
  {
    "path": "autoload/typst/options.vim",
    "chars": 1040,
    "preview": "\nlet s:initialized = v:false\n\nfunction! typst#options#init() abort \" {{{1\n    if s:initialized | return | endif\n\n    cal"
  },
  {
    "path": "autoload/typst.vim",
    "chars": 10448,
    "preview": "function! typst#TypstWatch(...)\n    \" Prepare command\n    \" NOTE: added arguments #23 but they will always be like\n    \""
  },
  {
    "path": "compiler/typst.vim",
    "chars": 890,
    "preview": "\" Vim compiler file\n\" Compiler: typst\n\nif exists(\"current_compiler\")\n    finish\nendif\nlet current_compiler = g:typst_cmd"
  },
  {
    "path": "ftdetect/typst.vim",
    "chars": 53,
    "preview": "autocmd! BufRead,BufNewFile *.typ set filetype=typst\n"
  },
  {
    "path": "ftplugin/typst.vim",
    "chars": 1497,
    "preview": "\" Only do this when not done yet for this buffer\nif exists(\"b:did_ftplugin\") | finish | endif\nlet b:did_ftplugin = 1\n\nle"
  },
  {
    "path": "indent/typst.vim",
    "chars": 1678,
    "preview": "if exists('b:did_indent')\n  finish\nendif\n\nlet b:did_indent = 1\n\nlet s:cpo_save = &cpoptions\nset cpoptions&vim\n\nsetlocal "
  },
  {
    "path": "syntax/typst-embedded.vim",
    "chars": 890,
    "preview": "\" Vim syntax file\n\" Language: Typst\n\" Maintainer: Kaj Munhoz Arfvidsson\n\" Upstream: https://github.com/kaarmu/typst.vim\n"
  },
  {
    "path": "syntax/typst-emoji.vim",
    "chars": 36061,
    "preview": "\" Vim syntax file\n\" Language: Typst\n\" Maintainer: Kaj Munhoz Arfvidsson\n\" Upstream: https://github.com/kaarmu/typst.vim\n"
  },
  {
    "path": "syntax/typst-symbols.vim",
    "chars": 29917,
    "preview": "\" Vim syntax file\n\" Language: Typst\n\" Maintainer: Kaj Munhoz Arfvidsson\n\" Upstream: https://github.com/kaarmu/typst.vim\n"
  },
  {
    "path": "syntax/typst.vim",
    "chars": 16441,
    "preview": "\" Vim syntax file\n\" Language: Typst\n\" Maintainer: Kaj Munhoz Arfvidsson\n\" Upstream: https://github.com/kaarmu/typst.vim\n"
  },
  {
    "path": "tests/italic-bold.typ",
    "chars": 466,
    "preview": "= Italic\n\n// Italic\n_Lorem ipsum_\n\n// Not italic\nLorem\\_ipsum\n\n// Italic\n_Lorem\\_ipsum_\n\n// Error\n_Lorem ipsum\\_\n\n// Ial"
  },
  {
    "path": "tests/leaky-modes.typ",
    "chars": 682,
    "preview": "= Leaky Bodies\n\n== Issue #69\n\n// Broken\n\n#show link: underline\n#show link: set text(navy)\n#show par: set block(spacing: "
  }
]

About this extraction

This page contains the full source code of the kaarmu/typst.vim GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 15 files (103.4 KB), approximately 40.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!