diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2017-12-06 13:05:56 +0100 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-12-06 13:05:56 +0100 |
commit | 9fe009095afdb86f6f771109ac454ccfc5340f31 (patch) | |
tree | 1bb6b2fd7e2ff2b94bd3dd8ce6fdb735e873237b /autoload | |
parent | dce9e8dec5ef51730291c7bbff3e3997433eabbd (diff) | |
download | vim-polyglot-9fe009095afdb86f6f771109ac454ccfc5340f31.tar.gz vim-polyglot-9fe009095afdb86f6f771109ac454ccfc5340f31.zip |
Change julia provider to JuliaEditorSupport/julia-vim, closes #253
Diffstat (limited to 'autoload')
-rw-r--r-- | autoload/LaTeXtoUnicode.vim | 625 | ||||
-rw-r--r-- | autoload/fish.vim | 71 | ||||
-rw-r--r-- | autoload/julia.vim | 188 | ||||
-rw-r--r-- | autoload/julia_blocks.vim | 798 | ||||
-rw-r--r-- | autoload/julia_latex_symbols.vim | 3316 |
5 files changed, 4927 insertions, 71 deletions
diff --git a/autoload/LaTeXtoUnicode.vim b/autoload/LaTeXtoUnicode.vim new file mode 100644 index 00000000..581dec1e --- /dev/null +++ b/autoload/LaTeXtoUnicode.vim @@ -0,0 +1,625 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1 + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Support for LaTex-to-Unicode conversion as in the Julia REPL " +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +function! s:L2U_Setup() + + call s:L2U_SetupGlobal() + + " Keep track of whether LaTeX-to-Unicode is activated + " (used when filetype changes) + if !has_key(b:, "l2u_enabled") + let b:l2u_enabled = 0 + endif + + " Did we install the L2U tab mappings? + if !has_key(b:, "l2u_tab_set") + let b:l2u_tab_set = 0 + endif + if !has_key(b:, "l2u_cmdtab_set") + let b:l2u_cmdtab_set = 0 + endif + + " Did we activate the L2U as-you-type substitutions? + if !has_key(b:, "l2u_autosub_set") + let b:l2u_autosub_set = 0 + endif + + " Following are some flags used to pass information between the function which + " attempts the LaTeX-to-Unicode completion and the fallback function + + " Was a (possibly partial) completion found? + let b:l2u_found_completion = 0 + " Is the cursor just after a single backslash + let b:l2u_singlebslash = 0 + " Backup value of the completeopt settings + " (since we temporarily add the 'longest' setting while + " attempting LaTeX-to-Unicode) + let b:l2u_backup_commpleteopt = &completeopt + " Are we in the middle of a L2U tab completion? + let b:l2u_tab_completing = 0 + " Are we calling the tab fallback? + let b:l2u_in_fallback = 0 + +endfunction + +function! s:L2U_SetupGlobal() + + " Initialization of global and script-local variables + " is only performed once + if get(g:, "l2u_did_global_setup", 0) + return + endif + + let g:l2u_did_global_setup = 1 + + let g:l2u_symbols_dict = julia_latex_symbols#get_dict() + + call s:L2U_deprecated_options() + + if v:version < 704 + let g:latex_to_unicode_tab = 0 + let g:latex_to_unicode_auto = 0 + endif + + " YouCompleteMe and neocomplcache/neocomplete/deoplete plug-ins do not work well + " with LaTeX symbols suggestions + if exists("g:loaded_youcompleteme") || + \ exists("g:loaded_neocomplcache") || + \ exists("g:loaded_neocomplete") || + \ exists("g:loaded_deoplete") + let g:latex_to_unicode_suggestions = 0 + endif + + " A hack to forcibly get out of completion mode: feed + " this string with feedkeys() + if has("win32") || has("win64") + if has("gui_running") + let s:l2u_esc_sequence = "\u0006" + else + let s:l2u_esc_sequence = "\u0006\b" + endif + else + let s:l2u_esc_sequence = "\u0091\b" + end + + " Trigger for the previous mapping of <Tab> + let s:l2u_fallback_trigger = "\u0091L2UFallbackTab" + +endfunction + +" Each time the filetype changes, we may need to enable or +" disable the LaTeX-to-Unicode functionality +function! LaTeXtoUnicode#Refresh() + + call s:L2U_Setup() + + " by default, LaTeX-to-Unicode is only active on julia files + let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia")) + let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^")) + + if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0 + if b:l2u_enabled + call LaTeXtoUnicode#Disable() + else + return + endif + elseif !b:l2u_enabled + call LaTeXtoUnicode#Enable() + endif + +endfunction + +function! LaTeXtoUnicode#Enable() + + if b:l2u_enabled + return + end + + call s:L2U_ResetLastCompletionInfo() + + let b:l2u_enabled = 1 + + " If we're editing the first file upon opening vim, this will only init the + " command line mode mapping, and the full initialization will be performed by + " the autocmd triggered by InsertEnter, defined in /ftdetect.vim. + " Otherwise, if we're opening a file from within a running vim session, this + " will actually initialize all the LaTeX-to-Unicode substitutions. + call LaTeXtoUnicode#Init() + + return + +endfunction + +function! LaTeXtoUnicode#Disable() + if !b:l2u_enabled + return + endif + let b:l2u_enabled = 0 + call LaTeXtoUnicode#Init() + return +endfunction + +" Translate old options to their new equivalents +function! s:L2U_deprecated_options() + for [new, old] in [["latex_to_unicode_tab", "julia_latex_to_unicode"], + \ ["latex_to_unicode_auto", "julia_auto_latex_to_unicode"], + \ ["latex_to_unicode_suggestions", "julia_latex_suggestions_enabled"], + \ ["latex_to_unicode_eager", "julia_latex_to_unicode_eager"]] + if !has_key(g:, new) && has_key(g:, old) + exec "let g:" . new . " = g:" . old + endif + endfor +endfunction + +function! s:L2U_file_type_regex(ft) + if type(a:ft) == 3 + let file_types = "\\%(" . join(a:ft, "\\|") . "\\)" + elseif type(a:ft) == 1 + let file_types = a:ft + else + echoerr "invalid file_type specification" + endif + return "^" . file_types . "$" +endfunction + +" Some data used to keep track of the previous completion attempt. +" Used to detect +" 1) if we just attempted the same completion, or +" 2) if backspace was just pressed while completing +" This function initializes and resets the required info + +function! s:L2U_ResetLastCompletionInfo() + let b:l2u_completed_once = 0 + let b:l2u_bs_while_completing = 0 + let b:l2u_last_compl = { + \ 'line': '', + \ 'col0': -1, + \ 'col1': -1, + \ } +endfunction + +" This function only detects whether an exact match is found for a LaTeX +" symbol in front of the cursor +function! s:L2U_ismatch() + let col1 = col('.') + let l = getline('.') + let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$') + if col0 == -1 + return 0 + endif + let base = l[col0 : col1-1] + return has_key(g:l2u_symbols_dict, base) +endfunction + +" Helper function to sort suggestion entries +function! s:L2U_partmatches_sort(p1, p2) + return a:p1.word > a:p2.word ? 1 : a:p1.word < a:p2.word ? -1 : 0 +endfunction + +" Helper function to fix display of Unicode compose characters +" in the suggestions menu (they are displayed on top of '◌') +function! s:L2U_fix_compose_chars(uni) + let u = matchstr(a:uni, '^.') + let isc = ("\u0300" <= u && u <= "\u036F") || + \ ("\u1DC0" <= u && u <= "\u1DFF") || + \ ("\u20D0" <= u && u <= "\u20FF") || + \ ("\uFE20" <= u && u <= "\uFE2F") + return isc ? "\u25CC" . a:uni : a:uni +endfunction + +" Helper function to find the longest common prefix among +" partial completion matches (used when suggestions are disabled +" and in command line mode) +function! s:L2U_longest_common_prefix(partmatches) + let common = a:partmatches[0] + for i in range(1, len(a:partmatches)-1) + let p = a:partmatches[i] + if len(p) < len(common) + let common = common[0 : len(p)-1] + endif + for j in range(1, len(common)-1) + if p[j] != common[j] + let common = common[0 : j-1] + break + endif + endfor + endfor + return common +endfunction + +" Omnicompletion function. Besides the usual two-stage omnifunc behaviour, +" it has the following peculiar features: +" *) keeps track of the previous completion attempt +" *) sets some info to be used by the fallback function +" *) either returns a list of completions if a partial match is found, or a +" Unicode char if an exact match is found +" *) forces its way out of completion mode through a hack in some cases +function! LaTeXtoUnicode#omnifunc(findstart, base) + if a:findstart + " first stage + " avoid infinite loop if the fallback happens to call omnicompletion + if b:l2u_in_fallback + let b:l2u_in_fallback = 0 + return -3 + endif + let b:l2u_in_fallback = 0 + " set info for the callback + let b:l2u_tab_completing = 1 + let b:l2u_found_completion = 1 + " analyse current line + let col1 = col('.') + let l = getline('.') + let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$') + " compare with previous completion attempt + let b:l2u_bs_while_completing = 0 + let b:l2u_completed_once = 0 + if col0 == b:l2u_last_compl['col0'] + let prevl = b:l2u_last_compl['line'] + if col1 == b:l2u_last_compl['col1'] && l ==# prevl + let b:l2u_completed_once = 1 + elseif col1 == b:l2u_last_compl['col1'] - 1 && l ==# prevl[0 : col1-2] . prevl[col1 : -1] + let b:l2u_bs_while_completing = 1 + endif + endif + " store completion info for next attempt + let b:l2u_last_compl['col0'] = col0 + let b:l2u_last_compl['col1'] = col1 + let b:l2u_last_compl['line'] = l + " is the cursor right after a backslash? + let b:l2u_singlebslash = (match(l[0:col1-2], '\\$') >= 0) + " completion not found + if col0 == -1 + let b:l2u_found_completion = 0 + call feedkeys(s:l2u_esc_sequence, 'n') + let col0 = -2 + endif + return col0 + else + " read settings (eager mode is implicit when suggestions are disabled) + let suggestions = get(g:, "latex_to_unicode_suggestions", 1) + let eager = get(g:, "latex_to_unicode_eager", 1) || !suggestions + " search for matches + let partmatches = [] + let exact_match = 0 + for k in keys(g:l2u_symbols_dict) + if k ==# a:base + let exact_match = 1 + endif + if len(k) >= len(a:base) && k[0 : len(a:base)-1] ==# a:base + let menu = s:L2U_fix_compose_chars(g:l2u_symbols_dict[k]) + if suggestions + call add(partmatches, {'word': k, 'menu': menu}) + else + call add(partmatches, k) + endif + endif + endfor + " exact matches are replaced with Unicode + " exceptions: + " *) we reached an exact match by pressing backspace while completing + " *) the exact match is one among many, and the eager setting is + " disabled, and it's the first time this completion is attempted + if exact_match && !b:l2u_bs_while_completing && (len(partmatches) == 1 || eager || b:l2u_completed_once) + " the completion is successful: reset the last completion info... + call s:L2U_ResetLastCompletionInfo() + " ...force our way out of completion mode... + call feedkeys(s:l2u_esc_sequence, 'n') + " ...return the Unicode symbol + return [g:l2u_symbols_dict[a:base]] + endif + if !empty(partmatches) + " here, only partial matches were found; either keep just the longest + " common prefix, or pass them on + if !suggestions + let partmatches = [s:L2U_longest_common_prefix(partmatches)] + else + call sort(partmatches, "s:L2U_partmatches_sort") + endif + endif + if empty(partmatches) + call feedkeys(s:l2u_esc_sequence, 'n') + let b:l2u_found_completion = 0 + endif + return partmatches + endif +endfunction + +function! LaTeXtoUnicode#PutLiteral(k) + call feedkeys(a:k, 'ni') + return '' +endfunction + +" Function which saves the current insert-mode mapping of a key sequence `s` +" and associates it with another key sequence `k` (e.g. stores the current +" <Tab> mapping into the Fallback trigger) +function! s:L2U_SetFallbackMapping(s, k) + let mmdict = maparg(a:s, 'i', 0, 1) + if empty(mmdict) + exe 'inoremap <buffer> ' . a:k . ' ' . a:s + return + endif + let rhs = mmdict["rhs"] + if rhs =~# '^<Plug>L2U' + return + endif + let pre = '<buffer>' + if mmdict["silent"] + let pre = pre . '<silent>' + endif + if mmdict["expr"] + let pre = pre . '<expr>' + endif + if mmdict["noremap"] + let cmd = 'inoremap ' + else + let cmd = 'imap ' + " This is a nasty hack used to prevent infinite recursion. It's not a + " general solution. + if mmdict["expr"] + let rhs = substitute(rhs, '\c' . a:s, "\<C-R>=LaTeXtoUnicode#PutLiteral('" . a:s . "')\<CR>", 'g') + endif + endif + exe cmd . pre . ' ' . a:k . ' ' . rhs +endfunction + +" This is the function which is mapped to <Tab> +function! LaTeXtoUnicode#Tab() + " the <Tab> is passed through to the fallback mapping if the completion + " menu is present, and it hasn't been raised by the L2U tab, and there + " isn't an exact match before the cursor when suggestions are disabled + if pumvisible() && !b:l2u_tab_completing && (get(g:, "latex_to_unicode_suggestions", 1) || !s:L2U_ismatch()) + call feedkeys(s:l2u_fallback_trigger) + return '' + endif + " reset the in_fallback info + let b:l2u_in_fallback = 0 + " temporary change to completeopt to use the `longest` setting, which is + " probably the only one which makes sense given that the goal of the + " completion is to substitute the final string + let b:l2u_backup_commpleteopt = &completeopt + set completeopt+=longest + set completeopt-=noinsert + " invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is + " handled by the CompleteDone autocommand. + return "\<C-X>\<C-O>" +endfunction + +" This function is called at every CompleteDone event, and is meant to handle +" the failures of LaTeX-to-Unicode completion by calling a fallback +function! LaTeXtoUnicode#FallbackCallback() + if !b:l2u_tab_completing + " completion was not initiated by L2U, nothing to do + return + else + " completion was initiated by L2U, restore completeopt + let &completeopt = b:l2u_backup_commpleteopt + endif + " at this point L2U tab completion is over + let b:l2u_tab_completing = 0 + " if the completion was successful do nothing + if b:l2u_found_completion == 1 || b:l2u_singlebslash == 1 + return + endif + " fallback + let b:l2u_in_fallback = 1 + call feedkeys(s:l2u_fallback_trigger) + return +endfunction + +" This is the function which is mapped to <S-Tab> in command-line mode +function! LaTeXtoUnicode#CmdTab() + " first stage + " analyse command line + let col1 = getcmdpos() - 1 + let l = getcmdline() + let col0 = match(l[0:col1-1], '\\[^[:space:]\\]\+$') + let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0) + " completion not found + if col0 == -1 + return l + endif + let base = l[col0 : col1-1] + " search for matches + let partmatches = [] + let exact_match = 0 + for k in keys(g:l2u_symbols_dict) + if k ==# base + let exact_match = 1 + endif + if len(k) >= len(base) && k[0 : len(base)-1] ==# base + call add(partmatches, k) + endif + endfor + if len(partmatches) == 0 + return l + endif + " exact matches are replaced with Unicode + if exact_match + let unicode = g:l2u_symbols_dict[base] + if col0 > 0 + let pre = l[0 : col0 - 1] + else + let pre = '' + endif + let posdiff = col1-col0 - len(unicode) + call setcmdpos(col1 - posdiff + 1) + return pre . unicode . l[col1 : -1] + endif + " no exact match: complete with the longest common prefix + let common = s:L2U_longest_common_prefix(partmatches) + if col0 > 0 + let pre = l[0 : col0 - 1] + else + let pre = '' + endif + let posdiff = col1-col0 - len(common) + call setcmdpos(col1 - posdiff + 1) + return pre . common . l[col1 : -1] +endfunction + +" Setup the L2U tab mapping +function! s:L2U_SetTab(wait_insert_enter) + if !b:l2u_cmdtab_set && get(g:, "latex_to_unicode_tab", 1) && b:l2u_enabled + cmap <buffer> <S-Tab> <Plug>L2UCmdTab + cnoremap <buffer> <Plug>L2UCmdTab <C-\>eLaTeXtoUnicode#CmdTab()<CR> + let b:l2u_cmdtab_set = 1 + endif + if b:l2u_tab_set + return + endif + " g:did_insert_enter is set from an autocommand in ftdetect + if a:wait_insert_enter && !get(g:, "did_insert_enter", 0) + return + endif + if !get(g:, "latex_to_unicode_tab", 1) || !b:l2u_enabled + return + endif + + " Backup the previous omnifunc (the check is probably not really needed) + if get(b:, "prev_omnifunc", "") != "LaTeXtoUnicode#omnifunc" + let b:prev_omnifunc = &omnifunc + endif + setlocal omnifunc=LaTeXtoUnicode#omnifunc + + call s:L2U_SetFallbackMapping('<Tab>', s:l2u_fallback_trigger) + imap <buffer> <Tab> <Plug>L2UTab + inoremap <buffer><expr> <Plug>L2UTab LaTeXtoUnicode#Tab() + + augroup L2UTab + autocmd! * <buffer> + " Every time a completion finishes, the fallback may be invoked + autocmd CompleteDone <buffer> call LaTeXtoUnicode#FallbackCallback() + augroup END + + let b:l2u_tab_set = 1 +endfunction + +" Revert the LaTeX-to-Unicode tab mapping settings +function! s:L2U_UnsetTab() + if b:l2u_cmdtab_set + cunmap <buffer> <S-Tab> + let b:l2u_cmdtab_set = 0 + endif + if !b:l2u_tab_set + return + endif + exec "setlocal omnifunc=" . get(b:, "prev_omnifunc", "") + iunmap <buffer> <Tab> + if empty(maparg("<Tab>", "i")) + call s:L2U_SetFallbackMapping(s:l2u_fallback_trigger, '<Tab>') + endif + iunmap <buffer> <Plug>L2UTab + exe 'iunmap <buffer> ' . s:l2u_fallback_trigger + augroup L2UTab + autocmd! * <buffer> + augroup END + let b:l2u_tab_set = 0 +endfunction + +" Function which looks for viable LaTeX-to-Unicode supstitutions as you type +function! LaTeXtoUnicode#AutoSub(...) + let vc = a:0 == 0 ? v:char : a:1 + let col1 = col('.') + let lnum = line('.') + if col1 == 1 + if a:0 > 1 + call feedkeys(a:2, 'n') + endif + return '' + endif + let bs = (vc != "\n") + let l = getline(lnum)[0 : col1-1-bs] . v:char + let col0 = match(l, '\\\%([_^]\?[A-Za-z]\+\%' . col1 . 'c\%([^A-Za-z]\|$\)\|[_^]\%([0-9()=+-]\)\%' . col1 .'c\%(.\|$\)\)') + if col0 == -1 + if a:0 > 1 + call feedkeys(a:2, 'n') + endif + return '' + endif + let base = l[col0 : -1-bs] + let unicode = get(g:l2u_symbols_dict, base, '') + if empty(unicode) + if a:0 > 1 + call feedkeys(a:2, 'n') + endif + return '' + endif + call feedkeys("\<C-G>u", 'n') + call feedkeys(repeat("\b", len(base) + bs) . unicode . vc . s:l2u_esc_sequence, 'nt') + call feedkeys("\<C-G>u", 'n') + return '' +endfunction + +" Setup the auto as-you-type LaTeX-to-Unicode substitution +function! s:L2U_SetAutoSub(wait_insert_enter) + if b:l2u_autosub_set + return + endif + " g:did_insert_enter is set from an autocommand in ftdetect + if a:wait_insert_enter && !get(g:, "did_insert_enter", 0) + return + endif + if !get(g:, "latex_to_unicode_auto", 0) || !b:l2u_enabled + return + endif + " Viable substitutions are searched at every character insertion via the + " autocmd InsertCharPre. The <Enter> key does not seem to be catched in + " this way though, so we use a mapping for that case. + imap <buffer> <CR> <Plug>L2UAutoSub + inoremap <buffer><expr> <Plug>L2UAutoSub LaTeXtoUnicode#AutoSub("\n", "\<CR>") + + augroup L2UAutoSub + autocmd! * <buffer> + autocmd InsertCharPre <buffer> call LaTeXtoUnicode#AutoSub() + augroup END + + let b:l2u_autosub_set = 1 +endfunction + +" Revert the auto LaTeX-to-Unicode settings +function! s:L2U_UnsetAutoSub() + if !b:l2u_autosub_set + return + endif + + iunmap <buffer> <CR> + iunmap <buffer> <Plug>L2UAutoSub + augroup L2UAutoSub + autocmd! * <buffer> + augroup END + let b:l2u_autosub_set = 0 +endfunction + +" Initialization. Can be used to re-init when global settings have changed. +function! LaTeXtoUnicode#Init(...) + let wait_insert_enter = a:0 > 0 ? a:1 : 1 + + if !wait_insert_enter + augroup L2UInit + autocmd! + augroup END + endif + + call s:L2U_UnsetTab() + call s:L2U_UnsetAutoSub() + + call s:L2U_SetTab(wait_insert_enter) + call s:L2U_SetAutoSub(wait_insert_enter) +endfunction + +function! LaTeXtoUnicode#Toggle() + call s:L2U_Setup() + if b:l2u_enabled + call LaTeXtoUnicode#Disable() + echo "LaTeX-to-Unicode disabled" + else + call LaTeXtoUnicode#Enable() + echo "LaTeX-to-Unicode enabled" + endif + return +endfunction + +endif diff --git a/autoload/fish.vim b/autoload/fish.vim deleted file mode 100644 index d4e63cdc..00000000 --- a/autoload/fish.vim +++ /dev/null @@ -1,71 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1 - -function! fish#Indent() - let l:shiftwidth = shiftwidth() - let l:prevlnum = prevnonblank(v:lnum - 1) - if l:prevlnum ==# 0 - return 0 - endif - let l:indent = 0 - let l:prevline = getline(l:prevlnum) - if l:prevline =~# '\v^\s*switch>' - let l:indent = l:shiftwidth * 2 - elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>' - let l:indent = l:shiftwidth - endif - let l:line = getline(v:lnum) - if l:line =~# '\v^\s*end>' - return indent(v:lnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent) - elseif l:line =~# '\v^\s*%(case|else)>' - return indent(v:lnum) - l:shiftwidth - endif - return indent(l:prevlnum) + l:indent -endfunction - -function! fish#Format() - if mode() =~# '\v^%(i|R)$' - return 1 - else - let l:command = v:lnum.','.(v:lnum+v:count-1).'!fish_indent' - echo l:command - execute l:command - endif -endfunction - -function! fish#Fold() - let l:line = getline(v:lnum) - if l:line =~# '\v^\s*%(begin|if|while|for|function|switch)>' - return 'a1' - elseif l:line =~# '\v^\s*end>' - return 's1' - else - return '=' - end -endfunction - -function! fish#Complete(findstart, base) - if a:findstart - return getline('.') =~# '\v^\s*$' ? -1 : 0 - else - if empty(a:base) - return [] - endif - let l:results = [] - let l:completions = - \ system('fish -c "complete -C'.shellescape(a:base).'"') - let l:cmd = substitute(a:base, '\v\S+$', '', '') - for l:line in split(l:completions, '\n') - let l:tokens = split(l:line, '\t') - call add(l:results, {'word': l:cmd.l:tokens[0], - \'abbr': l:tokens[0], - \'menu': get(l:tokens, 1, '')}) - endfor - return l:results - endif -endfunction - -function! fish#errorformat() - return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s' -endfunction - -endif diff --git a/autoload/julia.vim b/autoload/julia.vim new file mode 100644 index 00000000..695a6b78 --- /dev/null +++ b/autoload/julia.vim @@ -0,0 +1,188 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1 + +function! julia#set_syntax_version(jvers) + if &filetype != "julia" + echo "Not a Julia file" + return + endif + syntax clear + let b:julia_syntax_version = a:jvers + set filetype=julia +endfunction + +function! julia#toggle_deprecated_syntax() + if &filetype != "julia" + echo "Not a Julia file" + return + endif + syntax clear + let hd = get(b:, "julia_syntax_highlight_deprecated", + \ get(g:, "julia_syntax_highlight_deprecated", 0)) + let b:julia_syntax_highlight_deprecated = hd ? 0 : 1 + set filetype=julia + if b:julia_syntax_highlight_deprecated + echo "Highlighting of deprecated syntax enabled" + else + echo "Highlighting of deprecated syntax disabled" + endif +endfunction + +if exists("loaded_matchit") + +function! julia#toggle_function_blockassign() + let sav_pos = getcurpos() + let l = getline('.') + let c = match(l, '\C\m\<function\s\+.\+(') + if c != -1 + return julia#function_block2assign() + endif + let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*') + if c == -1 + echohl WarningMsg | echo "Not on a function definition or assignment line" | echohl None + return + endif + return julia#function_assign2block() +endfunction + +function! julia#function_block2assign() + let sav_pos = getcurpos() + let l = getline('.') + let c = match(l, '\C\m\<function\s\+.\+(') + if c == -1 + echohl WarningMsg | echo "Not on a function definition line" | echohl None + return + endif + let fpos = copy(sav_pos) + let fpos[2] = c+1 + call setpos('.', fpos) + normal % + if line('.') != fpos[1]+2 || match(getline('.'), '\C\m^\s*end\s*$') == -1 + echohl WarningMsg | echo "Only works with 3-lines functions" | echohl None + call setpos('.', sav_pos) + return + endif + call setpos('.', fpos) + normal! f( + normal % + while line('.') == fpos[1] && match(l[col('.')-1:], '\C\m)(') == 0 + normal! l + normal % + endwhile + if line('.') != fpos[1] || match(l[(col('.')-1):], '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*$') != 0 + echohl WarningMsg | echo "Unrecognized function definition format" | echohl None + call setpos('.', sav_pos) + return + endif + + call setpos('.', fpos) + normal! dwA = J + if match(getline('.')[(col('.')-1):], '\C\mreturn\>') == 0 + normal! dw + endif + if match(getline('.')[(col('.')-1):], '\C\m\s*$') == 0 + normal! F=C= nothing + endif + normal! jddk^ + return +endfunction + +function! julia#function_assign2block() + let sav_pos = getcurpos() + let l = getline('.') + let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*') + if c == -1 + echohl WarningMsg | echo "Not on a function assignment-definition line" | echohl None + return + endif + normal ^ + while match(l[(col('.')-1):], '\%(\S\+\.\)*@') == 0 + normal! W + endwhile + normal! ifunction + let l = getline('.') + let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*\zs=\s*') + let eqpos = copy(sav_pos) + let eqpos[2] = c+1 + call setpos('.', eqpos) + normal! cw
oend + normal % + s/\s*$// | noh + return +endfunction + + +let s:nonid_chars = "\U01-\U07" . "\U0E-\U1F" . + \ "\"#$'(,.:;=?@`\\U5B{" . + \ "\U80-\UA1" . "\UA7\UA8\UAB\UAD\UAF\UB4" . "\UB6-\UB8" . "\UBB\UBF" + +let s:nonidS_chars = "[:space:])\\U5D}" . s:nonid_chars + +" the following excludes '!' since it can be used as an identifier, +" and '$' since it can be used in interpolations +" note that \U2D is '-' +let s:uniop_chars = "+\\U2D~¬√∛∜" + +let s:binop_chars = "=+\\U2D*/\\%÷^&|⊻<>≤≥≡≠≢∈∉⋅×∪∩⊆⊈⊂⊄⊊←→∋∌⊕⊖⊞⊟∘∧⊗⊘↑↓∨⊠±" + +" the following is a list of all remainig valid operator chars, +" but it's more efficient when expressed with ranges (see below) +" let s:binop_chars_extra = "↔↚↛↠↣↦↮⇎⇏⇒⇔⇴⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿⟵⟶⟷⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤌⤍⤎⤏⤐⤑⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥊⥋⥎⥐⥒⥓⥖⥗⥚⥛⥞⥟⥢⥤⥦⥧⥨⥩⥪⥫⥬⥭⥰⧴⬱⬰⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←→" . +" \ "∝∊∍∥∦∷∺∻∽∾≁≃≄≅≆≇≈≉≊≋≌≍≎≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≣≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊃⊅⊇⊉⊋⊏⊐⊑⊒⊜⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⋍⋐⋑⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⟈⟉⟒⦷⧀⧁⧡⧣⧤⧥⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫷⫸⫹⫺⊢⊣" . +" \ "⊔∓∔∸≂≏⊎⊽⋎⋓⧺⧻⨈⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨹⨺⩁⩂⩅⩊⩌⩏⩐⩒⩔⩖⩗⩛⩝⩡⩢⩣" . +" \ "⊙⊚⊛⊡⊓∗∙∤⅋≀⊼⋄⋆⋇⋉⋊⋋⋌⋏⋒⟑⦸⦼⦾⦿⧶⧷⨇⨰⨱⨲⨳⨴⨵⨶⨷⨸⨻⨼⨽⩀⩃⩄⩋⩍⩎⩑⩓⩕⩘⩚⩜⩞⩟⩠⫛⊍▷⨝⟕⟖⟗" . +" \ "⇵⟰⟱⤈⤉⤊⤋⤒⤓⥉⥌⥍⥏⥑⥔⥕⥘⥙⥜⥝⥠⥡⥣⥥⥮⥯↑↓" + +" same as above, but with character ranges, for performance +let s:binop_chars_extra = "\\U214B\\U2190-\\U2194\\U219A\\U219B\\U21A0\\U21A3\\U21A6\\U21AE\\U21CE\\U21CF\\U21D2\\U21D4\\U21F4-\\U21FF\\U2208-\\U220D\\U2213\\U2214\\U2217-\\U2219\\U221D\\U2224-\\U222A\\U2237\\U2238\\U223A\\U223B\\U223D\\U223E\\U2240-\\U228B\\U228D-\\U229C\\U229E-\\U22A3\\U22A9\\U22AC\\U22AE\\U22B0-\\U22B7\\U22BB-\\U22BD\\U22C4-\\U22C7\\U22C9-\\U22D3\\U22D5-\\U22ED\\U22F2-\\U22FF\\U25B7\\U27C8\\U27C9\\U27D1\\U27D2\\U27D5-\\U27D7\\U27F0\\U27F1\\U27F5-\\U27F7\\U27F7\\U27F9-\\U27FF\\U2900-\\U2918\\U291D-\\U2920\\U2944-\\U2970\\U29B7\\U29B8\\U29BC\\U29BE-\\U29C1\\U29E1\\U29E3-\\U29E5\\U29F4\\U29F6\\U29F7\\U29FA\\U29FB\\U2A07\\U2A08\\U2A1D\\U2A22-\\U2A2E\\U2A30-\\U2A3D\\U2A40-\\U2A45\\U2A4A-\\U2A58\\U2A5A-\\U2A63\\U2A66\\U2A67\\U2A6A-\\U2AD9\\U2ADB\\U2AF7-\\U2AFA\\U2B30-\\U2B44\\U2B47-\\U2B4C\\UFFE9-\\UFFEC" + +" a Julia identifier, sort of +let s:idregex = '[^' . s:nonidS_chars . '0-9!' . s:uniop_chars . s:binop_chars . '][^' . s:nonidS_chars . s:uniop_chars . s:binop_chars . s:binop_chars_extra . ']*' + +let s:operators = '\%(' . '\.\%([-+*/^÷%|&!]\|//\|\\\|<<\|>>>\?\)\?=' . + \ '\|' . '[:$<>]=\|||\|&&\||>\|<|\|<:\|:>\|::\|<<\|>>>\?\|//\|[-=]>\|\.\{3\}' . + \ '\|' . '[' . s:uniop_chars . '!$]' . + \ '\|' . '\.\?[' . s:binop_chars . s:binop_chars_extra . ']' . + \ '\)' + +function! julia#idundercursor() + " TODO... + let w = expand('<cword>') + " let [l,c] = [line('.'),col('.')] + " let ll = getline(l) + return w +endfunction + +function! julia#gotodefinition() + let w = julia#idundercursor() + if empty(w) + return '' + endif + let [l,c] = [line('.'),col('.')] + let st = map(synstack(l,c), 'synIDattr(v:val, "name")') + let n = len(st) + if n > 0 && st[-1] =~# '^julia\%(\%(Range\|Ternary\|CTrans\)\?Operator\|\%(Possible\)\?SymbolS\?\|\%(Bl\|Rep\)\?Keyword\|Conditional\|ParDelim\|Char\|Colon\|Typedef\|Number\|Float\|Const\%(Generic\|Bool\)\|ComplexUnit\|\%(Special\|\%(Octal\|Hex\)Escape\)Char\|UniChar\%(Small\|Large\)\|Comment[LM]\|Todo\|Semicolon\)$' + return '' + endif + + let comprehension = 0 + let indollar = 0 + for i in range(n-1, 0, -1) + if st[i] =~# '^juliaDollar\%(Var\|Par\|SqBra\)$' + let indollar = 1 + endif + if !indollar && st[i] =~# '^julia\%(\a*String\|QuotedParBlockS\?\)$' + return '' + endif + if st[i] =~# '^julia\%(ParBlock\%(InRange\)\?\|SqBraBlock\|\%(Dollar\|StringVars\)\%(Par\|SqBra\)\)$' + let comprehension = 1 + endif + endfor + + let s1 = search('\C\<' . w . '\s*=[^=]', 'bcWzs') + + return +endfunction + +endif + +endif diff --git a/autoload/julia_blocks.vim b/autoload/julia_blocks.vim new file mode 100644 index 00000000..ef7cf016 --- /dev/null +++ b/autoload/julia_blocks.vim @@ -0,0 +1,798 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1 + +" Facilities for moving around Julia blocks (e.g. if/end, function/end etc.) +" (AKA a collection of horrible hacks) + +let s:default_mappings = { + \ "moveblock_n" : "]]", + \ "moveblock_N" : "][", + \ "moveblock_p" : "[[", + \ "moveblock_P" : "[]", + \ + \ "move_n" : "]j", + \ "move_N" : "]J", + \ "move_p" : "[j", + \ "move_P" : "[J", + \ + \ "select_a" : "aj", + \ "select_i" : "ij", + \ + \ "whereami" : "", + \ } + +function! s:getmapchars(function) + if exists("g:julia_blocks_mappings") && has_key(g:julia_blocks_mappings, a:function) + return s:escape(g:julia_blocks_mappings[a:function]) + else + return s:escape(s:default_mappings[a:function]) + endif +endfunction + +function! s:map_move(function, toend, backwards) + let chars = s:getmapchars(a:function) + if empty(chars) + return + endif + let fn = "julia_blocks#" . a:function + let lhs = "<buffer> <nowait> <silent> " . chars . " " + let cnt = ":<C-U>let b:jlblk_count=v:count1" + exe "nnoremap " . lhs . cnt + \ . " <Bar> call " . fn . "()<CR>" + exe "onoremap " . lhs . cnt + \ . "<CR><Esc>:call julia_blocks#owrapper_move(v:operator, \"" . fn . "\", " . a:toend . ", " . a:backwards . ")<CR>" + exe "xnoremap " . lhs . cnt + \ . "<CR>gv<Esc>:call julia_blocks#vwrapper_move(\"" . fn . "\")<CR>" + let b:jlblk_mapped[a:function] = 1 +endfunction + +function! julia_blocks#owrapper_move(oper, function, toend, backwards) + let F = function(a:function) + + let save_redraw = &lazyredraw + let save_select = &selection + + let restore_cmds = "\<Esc>" + \ . ":let &l:selection = \"" . save_select . "\"\<CR>" + \ . ":let &l:lazyredraw = " . save_redraw . "\<CR>" + \ . ":\<BS>" + + setlocal lazyredraw + + let start_pos = getpos('.') + let b:jlblk_abort_calls_esc = 0 + call F() + let b:jlblk_abort_calls_esc = 1 + let end_pos = getpos('.') + if start_pos == end_pos + call feedkeys(restore_cmds, 'n') + endif + + let &l:selection = "inclusive" + if a:backwards || !a:toend + let &l:selection = "exclusive" + endif + if a:toend && a:backwards + let end_pos[2] += 1 + endif + + if s:compare_pos(start_pos, end_pos) > 0 + let [start_pos, end_pos] = [end_pos, start_pos] + endif + + call setpos("'<", start_pos) + call setpos("'>", end_pos) + + " NOTE: the 'c' operator behaves differently, for mysterious reasons. We + " simulate it with 'd' followed by 'i' instead + call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n') +endfunction + +function! julia_blocks#vwrapper_move(function) + let F = function(a:function) + + let s = getpos('.') + let b1 = getpos("'<") + let b2 = getpos("'>") + + let b = b1 == s ? b2 : b1 + call setpos('.', s) + let b:jlblk_abort_calls_esc = 0 + call F() + let b:jlblk_abort_calls_esc = 1 + let e = getpos('.') + call setpos('.', b) + exe "normal " . visualmode() + call setpos('.', e) +endfunction + +function! s:unmap(function) + if !get(b:jlblk_mapped, a:function, 0) + return + endif + let chars = s:getmapchars(a:function) + if empty(chars) + " shouldn't happen + return + endif + let mapids = a:function =~# "^move" ? ["n", "x", "o"] : + \ a:function =~# "^select" ? ["x", "o"] : + \ ["n"] + let fn = "julia_blocks#" . a:function + let cmd = "<buffer> " . chars + for m in mapids + exe m . "unmap " . cmd + endfor + let b:jlblk_mapped[a:function] = 0 +endfunction + +function! s:escape(chars) + let c = a:chars + let c = substitute(c, '|', '<Bar>', 'g') + return c +endfunction + +function! s:map_select(function) + let chars = s:getmapchars(a:function) + if empty(chars) + return + endif + let fn = "julia_blocks#" . a:function + let lhs = "<buffer> <nowait> <silent> " . chars . " " + let cnt = ":<C-U>let b:jlblk_inwrapper=1<CR>:let b:jlblk_count=max([v:prevcount,1])<CR>" + exe "onoremap " . lhs . "<Esc>" . cnt + \ . ":call julia_blocks#owrapper_select(v:operator, \"" . fn . "\")<CR>" + exe "xnoremap " . lhs . cnt + \ . ":call julia_blocks#vwrapper_select(\"" . fn . "\")<CR>" + let b:jlblk_mapped[a:function] = 1 +endfunction + +function! julia_blocks#owrapper_select(oper, function) ", toend, backwards) + let F = function(a:function) + + let save_redraw = &lazyredraw + let save_select = &selection + + let restore_cmds = "\<Esc>" + \ . ":let &l:selection = \"" . save_select . "\"\<CR>" + \ . ":let &l:lazyredraw = " . save_redraw . "\<CR>" + \ . ":\<BS>" + + setlocal lazyredraw + + let b:jlblk_abort_calls_esc = 0 + let retF = F() + let b:jlblk_abort_calls_esc = 1 + if empty(retF) + let b:jlblk_inwrapper = 0 + call feedkeys(restore_cmds, 'n') + return + end + let [start_pos, end_pos] = retF + + if start_pos == end_pos + call feedkeys(restore_cmds, 'n') + endif + + let &l:selection = "inclusive" + + call setpos("'<", start_pos) + call setpos("'>", end_pos) + + let b:jlblk_inwrapper = 0 + " NOTE: the 'c' operator behaves differently, for mysterious reasons. We + " simulate it with 'd' followed by 'i' instead + call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n') +endfunction + +function! julia_blocks#vwrapper_select(function) + let F = function(a:function) + + let b:jlblk_abort_calls_esc = 0 + let retF = F() + let b:jlblk_abort_calls_esc = 1 + if empty(retF) + let b:jlblk_inwrapper = 0 + return + end + let [start_pos, end_pos] = retF + call setpos("'<", start_pos) + call setpos("'>", end_pos) + normal! gv + let b:jlblk_inwrapper = 0 +endfunction + +function! s:map_aux(function) + let chars = s:getmapchars(a:function) + if empty(chars) + return + endif + let fn = "julia_blocks#" . a:function + let lhs = "<buffer> <nowait> <silent> " . chars . " " + exe "nnoremap " . lhs . ":<C-U>echo " . fn . "()<CR>" + let b:jlblk_mapped[a:function] = 1 +endfunction + +let s:julia_blocks_functions = { + \ "moveblock_N": [1, 0], + \ "moveblock_n": [0, 0], + \ "moveblock_p": [0, 1], + \ "moveblock_P": [1, 1], + \ + \ "move_N": [1, 0], + \ "move_n": [0, 0], + \ "move_p": [0, 1], + \ "move_P": [1, 1], + \ + \ "select_a": [], + \ "select_i": [], + \ + \ "whereami": [], + \ } + +function! julia_blocks#init_mappings() + let b:jlblk_mapped = {} + for f in keys(s:julia_blocks_functions) + if f =~# "^move" + let [te, bw] = s:julia_blocks_functions[f] + call s:map_move(f, te, bw) + elseif f =~# "^select" + call s:map_select(f) + else + call s:map_aux(f) + endif + endfor + call julia_blocks#select_reset() + augroup JuliaBlocks + au! + au InsertEnter *.jl call julia_blocks#select_reset() + au CursorMoved *.jl call s:cursor_moved() + augroup END + + " we would need some autocmd event associated with exiting from + " visual mode, but there isn't any, so we resort to this crude + " hack + " ACTUALLY this creates more problems than it solves, so the crude hack + " is just disabled + "vnoremap <buffer><silent><unique> <Esc> <Esc>:call julia_blocks#select_reset()<CR> +endfunction + +function! julia_blocks#remove_mappings() + if exists("b:jlblk_mapped") + for f in keys(s:julia_blocks_functions) + call s:unmap(f) + endfor + endif + unlet! b:jlblk_save_pos b:jlblk_view b:jlblk_count b:jlblk_abort_calls_esc + unlet! b:jlblk_inwrapper b:jlblk_did_select b:jlblk_doing_select + unlet! b:jlblk_last_start_pos b:jlblk_last_end_pos b:jlblk_last_mode + augroup JuliaBlocks + au! + augroup END + augroup! JuliaBlocks + let md = maparg("<Esc>", "x", 0, 1) + if !empty(md) && md["buffer"] + vunmap <buffer> <Esc> + endif +endfunction + +function! s:restore_view() + "redraw! " would ensure correct behaviour, but is annoying + let pos = getpos('.') + if pos == b:jlblk_save_pos + call winrestview(b:jlblk_view) + return + endif + let oldtopline = b:jlblk_view["topline"] + let newtopline = winsaveview()["topline"] + let l = pos[1] + if l >= oldtopline + &l:scrolloff && l <= oldtopline + winheight(0) - 1 - &l:scrolloff + if newtopline > oldtopline + exe ":normal! " . (newtopline - oldtopline) . "\<C-Y>" + elseif newtopline < oldtopline + exe ":normal! " . (oldtopline - newtopline) . "\<C-E>" + endif + " these reduce the scrolling to the minimum (which is maybe not + " standard ViM behaviour?) + elseif newtopline < oldtopline && (l - newtopline - &l:scrolloff) > 0 + exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>" + elseif newtopline > oldtopline && (newtopline + &l:scrolloff - l) > 0 + exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>" + endif + call setpos('.', pos) " make sure we didn't screw up + " (since winsaveview may not be up to date) +endfunction + +function! s:abort() + call setpos('.', b:jlblk_save_pos) + call s:restore_view() + if get(b:, "jlblk_abort_calls_esc", 1) + call feedkeys("\<Esc>", 'n') + endif + return 0 +endfunction + +function! s:set_mark_tick(...) + " This could be a one-liner: + " call setpos("''", b:jlblk_save_pos) + " but we want to append to the jumplist, + " which setpos doesn't do + let p = getpos('.') + call setpos('.', b:jlblk_save_pos) + normal! m' + call setpos('.', p) +endfunction + +function! s:get_save_pos(...) + if !exists("b:jlblk_save_pos") || (a:0 == 0) || (a:0 > 0 && a:1) + let b:jlblk_save_pos = getpos('.') + endif + let b:jlblk_view = winsaveview() +endfunction + +function! s:on_end() + return getline('.')[col('.')-1] =~# '\k' && expand("<cword>") =~# b:julia_end_keywords +endfunction + +function! s:on_begin() + let [l,c] = [line('.'), col('.')] + normal! ^ + let patt = '\%<'.(c+1).'c\(' . b:julia_begin_keywordsm . '\)\%>'.(c-1).'c' + let n = search(patt, 'Wnc', l) + call cursor(l, c) + return n > 0 +endfunction + +function! s:matchit() + let lkj = exists(":lockjumps") == 2 ? "lockjumps " : "" + exe lkj . "normal %" +endfunction + +function! s:move_before_begin() + call search(b:julia_begin_keywordsm, 'Wbc') + normal! h +endfunction + +function! s:cycle_until_end() + let pos = getpos('.') + while !s:on_end() + call s:matchit() + let c = 0 + if getpos('.') == pos || c > 1000 + " shouldn't happen, but let's avoid infinite loops anyway + return 0 + endif + let c += 1 + endwhile + return 1 +endfunction + +function! s:moveto_block_delim(toend, backwards, ...) + let pattern = a:toend ? b:julia_end_keywords : b:julia_begin_keywordsm + let flags = a:backwards ? 'Wb' : 'W' + let cnt = a:0 > 0 ? a:1 : b:jlblk_count + if !a:toend && a:backwards && s:on_begin() + call s:move_before_begin() + endif + let ret = 0 + for c in range(cnt) + if a:toend && a:backwards && s:on_end() + normal! l + normal! bh + endif + while 1 + let searchret = search(pattern, flags) + if !searchret + return ret + endif + exe "let skip = " . b:match_skip + if !skip + let ret = 1 + break + endif + endwhile + endfor + return ret +endfunction + +function! s:compare_pos(pos1, pos2) + if a:pos1[1] < a:pos2[1] + return -1 + elseif a:pos1[1] > a:pos2[1] + return 1 + elseif a:pos1[2] < a:pos2[2] + return -1 + elseif a:pos1[2] > a:pos2[2] + return 1 + else + return 0 + endif +endfunction + +function! julia_blocks#move_N() + call s:get_save_pos() + + let ret = s:moveto_block_delim(1, 0) + if !ret + return s:abort() + endif + + normal! e + call s:set_mark_tick() + + return 1 +endfunction + +function! julia_blocks#move_n() + call s:get_save_pos() + + let ret = s:moveto_block_delim(0, 0) + if !ret + return s:abort() + endif + + call s:set_mark_tick() + + return 1 +endfunction + +function! julia_blocks#move_p() + call s:get_save_pos() + + let ret = s:moveto_block_delim(0, 1) + if !ret + return s:abort() + endif + + call s:set_mark_tick() + + return 1 +endfunction + +function! julia_blocks#move_P() + call s:get_save_pos() + + let ret = s:moveto_block_delim(1, 1) + if !ret + return s:abort() + endif + + normal! e + call s:set_mark_tick() + + return 1 +endfunction + +function! s:moveto_currentblock_end() + let flags = 'W' + if s:on_end() + let flags .= 'c' + " NOTE: using "normal! lb" fails at the end of the file (?!) + normal! l + normal! b + endif + + let ret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip) + if ret <= 0 + return s:abort() + endif + + normal! e + return 1 +endfunction + +function! julia_blocks#moveblock_N() + call s:get_save_pos() + + let ret = 0 + for c in range(b:jlblk_count) + let last_seen_pos = getpos('.') + if s:on_end() + normal! hel + let save_pos = getpos('.') + let ret_start = s:moveto_block_delim(0, 0, 1) + let start1_pos = ret_start ? getpos('.') : [0,0,0,0] + call setpos('.', save_pos) + if s:on_end() + normal! h + endif + let ret_end = s:moveto_block_delim(1, 0, 1) + let end1_pos = ret_end ? getpos('.') : [0,0,0,0] + + if ret_start && (!ret_end || s:compare_pos(start1_pos, end1_pos) < 0) + call setpos('.', start1_pos) + else + call setpos('.', save_pos) + endif + endif + + let moveret = s:moveto_currentblock_end() + if !moveret && c == 0 + let moveret = s:moveto_block_delim(0, 0, 1) && s:cycle_until_end() + if moveret + normal! e + endif + endif + if !moveret + call setpos('.', last_seen_pos) + break + endif + + let ret = 1 + endfor + if !ret + return s:abort() + endif + + call s:set_mark_tick() + + return 1 +endfunction + +function! julia_blocks#moveblock_n() + call s:get_save_pos() + + let ret = 0 + for c in range(b:jlblk_count) + let last_seen_pos = getpos('.') + + call s:moveto_currentblock_end() + if s:moveto_block_delim(0, 0, 1) + let ret = 1 + else + call setpos('.', last_seen_pos) + break + endif + endfor + + if !ret + return s:abort() + endif + + call s:set_mark_tick() + + return 1 +endfunction + +function! julia_blocks#moveblock_p() + call s:get_save_pos() + + let ret = 0 + for c in range(b:jlblk_count) + let last_seen_pos = getpos('.') + if s:on_begin() + call s:move_before_begin() + if s:on_end() + normal! l + endif + let save_pos = getpos('.') + let ret_start = s:moveto_block_delim(0, 1, 1) + let start1_pos = ret_start ? getpos('.') : [0,0,0,0] + call setpos('.', save_pos) + let ret_end = s:moveto_block_delim(1, 1, 1) + let end1_pos = ret_end ? getpos('.') : [0,0,0,0] + + if ret_end && (!ret_start || s:compare_pos(start1_pos, end1_pos) < 0) + call setpos('.', end1_pos) + else + call setpos('.', save_pos) + endif + endif + + let moveret = s:moveto_currentblock_end() + if !moveret && c == 0 + let moveret = s:moveto_block_delim(1, 1, 1) + endif + if !moveret + call setpos('.', last_seen_pos) + break + endif + + call s:matchit() + let ret = 1 + endfor + if !ret + return s:abort() + endif + + call s:set_mark_tick() + call s:restore_view() + + return 1 +endfunction + +function! julia_blocks#moveblock_P() + call s:get_save_pos() + + let ret = 0 + for c in range(b:jlblk_count) + let last_seen_pos = getpos('.') + + call s:moveto_currentblock_end() + if s:on_end() + call s:matchit() + endif + + if s:moveto_block_delim(1, 1, 1) + " NOTE: normal! he does not work unless &whichwrap inlcudes h + normal! h + normal! e + let ret = 1 + else + call setpos('.', last_seen_pos) + endif + endfor + + if !ret + return s:abort() + endif + + call s:set_mark_tick() + call s:restore_view() + + return 1 +endfunction + +function! julia_blocks#whereami() + let b:jlblk_count = v:count1 + let save_redraw = &lazyredraw + setlocal lazyredraw + let pos = getpos('.') + let ret = julia_blocks#select_a('w') + if empty(ret) + call setpos('.', pos) + let &l:lazyredraw = save_redraw + return "" + end + let [start_pos, end_pos] = ret + let m = getline(start_pos[1])[start_pos[2]-1:] + + " If cursor_moved was not forced from select_a, we force it now + " (TODO: this is *really* ugly) + if end_pos != pos + call s:cursor_moved(1) + endif + call setpos('.', pos) + call s:restore_view() + let &l:lazyredraw = save_redraw + return m +endfunction + +" Block text objects + +function! s:find_block(current_mode) + + let flags = 'W' + + if b:jlblk_did_select + call setpos('.', b:jlblk_last_start_pos) + if !s:cycle_until_end() + return s:abort() + endif + if !(a:current_mode[0] == 'a' && a:current_mode == b:jlblk_last_mode) + let flags .= 'c' + endif + elseif s:on_end() + let flags .= 'c' + " NOTE: using "normal! lb" fails at the end of the file (?!) + normal! l + normal! b + endif + let searchret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip) + if searchret <= 0 + if !b:jlblk_did_select + return s:abort() + else + call setpos('.', b:jlblk_last_end_pos) + endif + endif + + let end_pos = getpos('.') + " Jump to match + call s:matchit() + let start_pos = getpos('.') + + let b:jlblk_last_start_pos = copy(start_pos) + let b:jlblk_last_end_pos = copy(end_pos) + + return [start_pos, end_pos] +endfunction + +function! s:repeated_find(ai_mode) + let repeat = b:jlblk_count + (a:ai_mode == 'i' && v:count1 > 1 ? 1 : 0) + for c in range(repeat) + let current_mode = (c < repeat - 1 ? 'a' : a:ai_mode) + let ret_find_block = s:find_block(current_mode) + if empty(ret_find_block) + return 0 + endif + let [start_pos, end_pos] = ret_find_block + call setpos('.', end_pos) + let b:jlblk_last_mode = current_mode + if c < repeat - 1 + let b:jlblk_doing_select = 0 + let b:jlblk_did_select = 1 + endif + endfor + return [start_pos, end_pos] +endfunction + +function! julia_blocks#select_a(...) + let mode_flag = a:0 > 0 ? a:1 : '' + call s:get_save_pos(!b:jlblk_did_select) + let current_pos = getpos('.') + let ret_find_block = s:repeated_find('a' . mode_flag) + if empty(ret_find_block) + return 0 + endif + let [start_pos, end_pos] = ret_find_block + + call setpos('.', end_pos) + normal! e + let end_pos = getpos('.') + + let b:jlblk_doing_select = 1 + + " CursorMove is only triggered if end_pos + " end_pos is different than the staring position; + " so when starting from the 'd' in 'end' we need to + " force it + if current_pos == end_pos + call s:cursor_moved(1) + endif + + call s:set_mark_tick() + return [start_pos, end_pos] +endfunction + +function! julia_blocks#select_i() + call s:get_save_pos(!b:jlblk_did_select) + let current_pos = getpos('.') + let ret_find_block = s:repeated_find('i') + if empty(ret_find_block) + return 0 + endif + let [start_pos, end_pos] = ret_find_block + + if end_pos[1] <= start_pos[1]+1 + return s:abort() + endif + + call setpos('.', end_pos) + + let b:jlblk_doing_select = 1 + + let start_pos[1] += 1 + call setpos('.', start_pos) + normal! ^ + let start_pos = getpos('.') + let end_pos[1] -= 1 + let end_pos[2] = len(getline(end_pos[1])) + + " CursorMove is only triggered if end_pos + " end_pos is different than the staring position; + " so when starting from the 'd' in 'end' we need to + " force it + if current_pos == end_pos + call s:cursor_moved(1) + endif + + call s:set_mark_tick() + return [start_pos, end_pos] +endfunction + +function julia_blocks#select_reset() + let b:jlblk_did_select = 0 + let b:jlblk_doing_select = 0 + let b:jlblk_inwrapper = 0 + let b:jlblk_last_mode = "" +endfunction + +function! s:cursor_moved(...) + if b:jlblk_inwrapper && !(a:0 > 0 && a:1) + return + endif + let b:jlblk_did_select = b:jlblk_doing_select + let b:jlblk_doing_select = 0 +endfunction + +endif diff --git a/autoload/julia_latex_symbols.vim b/autoload/julia_latex_symbols.vim new file mode 100644 index 00000000..8fdb856a --- /dev/null +++ b/autoload/julia_latex_symbols.vim @@ -0,0 +1,3316 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1 + +" This file is autogenerated from the script 'generate_latex_symbols_table.jl' +" The symbols are based on Julia version 0.7.0-DEV.2011 + +scriptencoding utf-8 + +function! julia_latex_symbols#get_dict() + return { + \ '\textexclamdown': '¡', + \ '\sterling': '£', + \ '\yen': '¥', + \ '\textbrokenbar': '¦', + \ '\S': '§', + \ '\textasciidieresis': '¨', + \ '\copyright': '©', + \ '\:copyright:': '©', + \ '\textordfeminine': 'ª', + \ '\neg': '¬', + \ '\circledR': '®', + \ '\:registered:': '®', + \ '\textasciimacron': '¯', + \ '\degree': '°', + \ '\pm': '±', + \ '\^2': '²', + \ '\^3': '³', + \ '\textasciiacute': '´', + \ '\P': '¶', + \ '\cdotp': '·', + \ '\^1': '¹', + \ '\textordmasculine': 'º', + \ '\textonequarter': '¼', + \ '\textonehalf': '½', + \ '\textthreequarters': '¾', + \ '\textquestiondown': '¿', + \ '\AA': 'Å', + \ '\AE': 'Æ', + \ '\DH': 'Ð', + \ '\times': '×', + \ '\O': 'Ø', + \ '\TH': 'Þ', + \ '\ss': 'ß', + \ '\aa': 'å', + \ '\ae': 'æ', + \ '\eth': 'ð', + \ '\div': '÷', + \ '\o': 'ø', + \ '\th': 'þ', + \ '\DJ': 'Đ', + \ '\dj': 'đ', + \ '\Elzxh': 'ħ', + \ '\hbar': 'ħ', + \ '\L': 'Ł', + \ '\l': 'ł', + \ '\NG': 'Ŋ', + \ '\ng': 'ŋ', + \ '\OE': 'Œ', + \ '\oe': 'œ', + \ '\texthvlig': 'ƕ', + \ '\textnrleg': 'ƞ', + \ '\Zbar': 'Ƶ', + \ '\textdoublepipe': 'ǂ', + \ '\Elztrna': 'ɐ', + \ '\Elztrnsa': 'ɒ', + \ '\Elzopeno': 'ɔ', + \ '\Elzrtld': 'ɖ', + \ '\Elzschwa': 'ə', + \ '\Elzpgamma': 'ɣ', + \ '\Elzpbgam': 'ɤ', + \ '\Elztrnh': 'ɥ', + \ '\Elzbtdl': 'ɬ', + \ '\Elzrtll': 'ɭ', + \ '\Elztrnm': 'ɯ', + \ '\Elztrnmlr': 'ɰ', + \ '\Elzltlmr': 'ɱ', + \ '\Elzltln': 'ɲ', + \ '\Elzrtln': 'ɳ', + \ '\Elzclomeg': 'ɷ', + \ '\textphi': 'ɸ', + \ '\Elztrnr': 'ɹ', + \ '\Elztrnrl': 'ɺ', + \ '\Elzrttrnr': 'ɻ', + \ '\Elzrl': 'ɼ', + \ '\Elzrtlr': 'ɽ', + \ '\Elzfhr': 'ɾ', + \ '\Elzrtls': 'ʂ', + \ '\Elzesh': 'ʃ', + \ '\Elztrnt': 'ʇ', + \ '\Elzrtlt': 'ʈ', + \ '\Elzpupsil': 'ʊ', + \ '\Elzpscrv': 'ʋ', + \ '\Elzinvv': 'ʌ', + \ '\Elzinvw': 'ʍ', + \ '\Elztrny': 'ʎ', + \ '\Elzrtlz': 'ʐ', + \ '\Elzyogh': 'ʒ', + \ '\Elzglst': 'ʔ', + \ '\Elzreglst': 'ʕ', + \ '\Elzinglst': 'ʖ', + \ '\textturnk': 'ʞ', + \ '\Elzdyogh': 'ʤ', + \ '\Elztesh': 'ʧ', + \ '\^h': 'ʰ', + \ '\^j': 'ʲ', + \ '\^r': 'ʳ', + \ '\^w': 'ʷ', + \ '\^y': 'ʸ', + \ '\rasp': 'ʼ', + \ '\textasciicaron': 'ˇ', + \ '\Elzverts': 'ˈ', + \ '\Elzverti': 'ˌ', + \ '\Elzlmrk': 'ː', + \ '\Elzhlmrk': 'ˑ', + \ '\Elzsbrhr': '˒', + \ '\Elzsblhr': '˓', + \ '\Elzrais': '˔', + \ '\Elzlow': '˕', + \ '\u': '˘', + \ '\texttildelow': '˜', + \ '\^l': 'ˡ', + \ '\^s': 'ˢ', + \ '\^x': 'ˣ', + \ '\grave': '̀', + \ '\acute': '́', + \ '\hat': '̂', + \ '\tilde': '̃', + \ '\bar': '̄', + \ '\overbar': '̅', + \ '\breve': '̆', + \ '\dot': '̇', + \ '\ddot': '̈', + \ '\ovhook': '̉', + \ '\ocirc': '̊', + \ '\H': '̋', + \ '\check': '̌', + \ '\candra': '̐', + \ '\oturnedcomma': '̒', + \ '\ocommatopright': '̕', + \ '\droang': '̚', + \ '\Elzpalh': '̡', + \ '\Elzrh': '̢', + \ '\c': '̧', + \ '\k': '̨', + \ '\Elzsbbrg': '̪', + \ '\wideutilde': '̰', + \ '\underbar': '̲', + \ '\Elzxl': '̵', + \ '\Elzbar': '̶', + \ '\sout': '̶', + \ '\not': '̸', + \ '\underleftrightarrow': '͍', + \ '\Alpha': 'Α', + \ '\Beta': 'Β', + \ '\Gamma': 'Γ', + \ '\Delta': 'Δ', + \ '\Epsilon': 'Ε', + \ '\Zeta': 'Ζ', + \ '\Eta': 'Η', + \ '\Theta': 'Θ', + \ '\Iota': 'Ι', + \ '\Kappa': 'Κ', + \ '\Lambda': 'Λ', + \ '\upMu': 'Μ', + \ '\upNu': 'Ν', + \ '\Xi': 'Ξ', + \ '\upOmicron': 'Ο', + \ '\Pi': 'Π', + \ '\Rho': 'Ρ', + \ '\Sigma': 'Σ', + \ '\Tau': 'Τ', + \ '\Upsilon': 'Υ', + \ '\Phi': 'Φ', + \ '\Chi': 'Χ', + \ '\Psi': 'Ψ', + \ '\Omega': 'Ω', + \ '\alpha': 'α', + \ '\beta': 'β', + \ '\gamma': 'γ', + \ '\delta': 'δ', + \ '\upepsilon': 'ε', + \ '\varepsilon': 'ε', + \ '\zeta': 'ζ', + \ '\eta': 'η', + \ '\theta': 'θ', + \ '\iota': 'ι', + \ '\kappa': 'κ', + \ '\lambda': 'λ', + \ '\mu': 'μ', + \ '\nu': 'ν', + \ '\xi': 'ξ', + \ '\upomicron': 'ο', + \ '\pi': 'π', + \ '\rho': 'ρ', + \ '\varsigma': 'ς', + \ '\sigma': 'σ', + \ '\tau': 'τ', + \ '\upsilon': 'υ', + \ '\varphi': 'φ', + \ '\chi': 'χ', + \ '\psi': 'ψ', + \ '\omega': 'ω', + \ '\upvarbeta': 'ϐ', + \ '\vartheta': 'ϑ', + \ '\phi': 'ϕ', + \ '\varpi': 'ϖ', + \ '\upoldKoppa': 'Ϙ', + \ '\upoldkoppa': 'ϙ', + \ '\Stigma': 'Ϛ', + \ '\upstigma': 'ϛ', + \ '\Digamma': 'Ϝ', + \ '\digamma': 'ϝ', + \ '\Koppa': 'Ϟ', + \ '\upkoppa': 'ϟ', + \ '\Sampi': 'Ϡ', + \ '\upsampi': 'ϡ', + \ '\varkappa': 'ϰ', + \ '\varrho': 'ϱ', + \ '\textTheta': 'ϴ', + \ '\epsilon': 'ϵ', + \ '\backepsilon': '϶', + \ '\^A': 'ᴬ', + \ '\^B': 'ᴮ', + \ '\^D': 'ᴰ', + \ '\^E': 'ᴱ', + \ '\^G': 'ᴳ', + \ '\^H': 'ᴴ', + \ '\^I': 'ᴵ', + \ '\^J': 'ᴶ', + \ '\^K': 'ᴷ', + \ '\^L': 'ᴸ', + \ '\^M': 'ᴹ', + \ '\^N': 'ᴺ', + \ '\^O': 'ᴼ', + \ '\^P': 'ᴾ', + \ '\^R': 'ᴿ', + \ '\^T': 'ᵀ', + \ '\^U': 'ᵁ', + \ '\^W': 'ᵂ', + \ '\^a': 'ᵃ', + \ '\^alpha': 'ᵅ', + \ '\^b': 'ᵇ', + \ '\^d': 'ᵈ', + \ '\^e': 'ᵉ', + \ '\^epsilon': 'ᵋ', + \ '\^g': 'ᵍ', + \ '\^k': 'ᵏ', + \ '\^m': 'ᵐ', + \ '\^o': 'ᵒ', + \ '\^p': 'ᵖ', + \ '\^t': 'ᵗ', + \ '\^u': 'ᵘ', + \ '\^v': 'ᵛ', + \ '\^beta': 'ᵝ', + \ '\^gamma': 'ᵞ', + \ '\^delta': 'ᵟ', + \ '\^phi': 'ᵠ', + \ '\^chi': 'ᵡ', + \ '\_i': 'ᵢ', + \ '\_r': 'ᵣ', + \ '\_u': 'ᵤ', + \ '\_v': 'ᵥ', + \ '\_beta': 'ᵦ', + \ '\_gamma': 'ᵧ', + \ '\_rho': 'ᵨ', + \ '\_phi': 'ᵩ', + \ '\_chi': 'ᵪ', + \ '\^c': 'ᶜ', + \ '\^f': 'ᶠ', + \ '\^iota': 'ᶥ', + \ '\^Phi': 'ᶲ', + \ '\^z': 'ᶻ', + \ '\^theta': 'ᶿ', + \ '\enspace': ' ', + \ '\quad': ' ', + \ '\thickspace': ' ', + \ '\thinspace': ' ', + \ '\hspace': ' ', + \ '\endash': '–', + \ '\emdash': '—', + \ '\Vert': '‖', + \ '\lq': '‘', + \ '\rq': '’', + \ '\Elzreapos': '‛', + \ '\textquotedblleft': '“', + \ '\textquotedblright': '”', + \ '\dagger': '†', + \ '\ddagger': '‡', + \ '\bullet': '•', + \ '\dots': '…', + \ '\ldots': '…', + \ '\textperthousand': '‰', + \ '\textpertenthousand': '‱', + \ '\prime': '′', + \ '\pprime': '″', + \ '\ppprime': '‴', + \ '\backprime': '‵', + \ '\backpprime': '‶', + \ '\backppprime': '‷', + \ '\guilsinglleft': '‹', + \ '\guilsinglright': '›', + \ '\:bangbang:': '‼', + \ '\tieconcat': '⁀', + \ '\:interrobang:': '⁉', + \ '\pppprime': '⁗', + \ '\nolinebreak': '', + \ '\^0': '⁰', + \ '\^i': 'ⁱ', + \ '\^4': '⁴', + \ '\^5': '⁵', + \ '\^6': '⁶', + \ '\^7': '⁷', + \ '\^8': '⁸', + \ '\^9': '⁹', + \ '\^+': '⁺', + \ '\^-': '⁻', + \ '\^=': '⁼', + \ '\^(': '⁽', + \ '\^)': '⁾', + \ '\^n': 'ⁿ', + \ '\_0': '₀', + \ '\_1': '₁', + \ '\_2': '₂', + \ '\_3': '₃', + \ '\_4': '₄', + \ '\_5': '₅', + \ '\_6': '₆', + \ '\_7': '₇', + \ '\_8': '₈', + \ '\_9': '₉', + \ '\_+': '₊', + \ '\_-': '₋', + \ '\_=': '₌', + \ '\_(': '₍', + \ '\_)': '₎', + \ '\_a': 'ₐ', + \ '\_e': 'ₑ', + \ '\_o': 'ₒ', + \ '\_x': 'ₓ', + \ '\_schwa': 'ₔ', + \ '\_h': 'ₕ', + \ '\_k': 'ₖ', + \ '\_l': 'ₗ', + \ '\_m': 'ₘ', + \ '\_n': 'ₙ', + \ '\_p': 'ₚ', + \ '\_s': 'ₛ', + \ '\_t': 'ₜ', + \ '\Elzpes': '₧', + \ '\euro': '€', + \ '\leftharpoonaccent': '⃐', + \ '\rightharpoonaccent': '⃑', + \ '\vertoverlay': '⃒', + \ '\overleftarrow': '⃖', + \ '\vec': '⃗', + \ '\dddot': '⃛', + \ '\ddddot': '⃜', + \ '\enclosecircle': '⃝', + \ '\enclosesquare': '⃞', + \ '\enclosediamond': '⃟', + \ '\overleftrightarrow': '⃡', + \ '\enclosetriangle': '⃤', + \ '\annuity': '⃧', + \ '\threeunderdot': '⃨', + \ '\widebridgeabove': '⃩', + \ '\underrightharpoondown': '⃬', + \ '\underleftharpoondown': '⃭', + \ '\underleftarrow': '⃮', + \ '\underrightarrow': '⃯', + \ '\asteraccent': '⃰', + \ '\BbbC': 'ℂ', + \ '\Eulerconst': 'ℇ', + \ '\mscrg': 'ℊ', + \ '\mscrH': 'ℋ', + \ '\mfrakH': 'ℌ', + \ '\BbbH': 'ℍ', + \ '\Planckconst': 'ℎ', + \ '\hslash': 'ℏ', + \ '\mscrI': 'ℐ', + \ '\Im': 'ℑ', + \ '\mscrL': 'ℒ', + \ '\ell': 'ℓ', + \ '\BbbN': 'ℕ', + \ '\textnumero': '№', + \ '\wp': '℘', + \ '\BbbP': 'ℙ', + \ '\BbbQ': 'ℚ', + \ '\mscrR': 'ℛ', + \ '\Re': 'ℜ', + \ '\BbbR': 'ℝ', + \ '\Elzxrat': '℞', + \ '\texttrademark': '™', + \ '\:tm:': '™', + \ '\BbbZ': 'ℤ', + \ '\mho': '℧', + \ '\mfrakZ': 'ℨ', + \ '\turnediota': '℩', + \ '\Angstrom': 'Å', + \ '\mscrB': 'ℬ', + \ '\mfrakC': 'ℭ', + \ '\mscre': 'ℯ', + \ '\euler': 'ℯ', + \ '\mscrE': 'ℰ', + \ '\mscrF': 'ℱ', + \ '\Finv': 'Ⅎ', + \ '\mscrM': 'ℳ', + \ '\mscro': 'ℴ', + \ '\aleph': 'ℵ', + \ '\beth': 'ℶ', + \ '\gimel': 'ℷ', + \ '\daleth': 'ℸ', + \ '\:information_source:': 'ℹ', + \ '\Bbbpi': 'ℼ', + \ '\Bbbgamma': 'ℽ', + \ '\BbbGamma': 'ℾ', + \ '\BbbPi': 'ℿ', + \ '\bbsum': '⅀', + \ '\Game': '⅁', + \ '\sansLturned': '⅂', + \ '\sansLmirrored': '⅃', + \ '\Yup': '⅄', + \ '\mitBbbD': 'ⅅ', + \ '\mitBbbd': 'ⅆ', + \ '\mitBbbe': 'ⅇ', + \ '\mitBbbi': 'ⅈ', + \ '\mitBbbj': 'ⅉ', + \ '\PropertyLine': '⅊', + \ '\upand': '⅋', + \ '\leftarrow': '←', + \ '\uparrow': '↑', + \ '\to': '→', + \ '\rightarrow': '→', + \ '\downarrow': '↓', + \ '\leftrightarrow': '↔', + \ '\:left_right_arrow:': '↔', + \ '\updownarrow': '↕', + \ '\:arrow_up_down:': '↕', + \ '\nwarrow': '↖', + \ '\:arrow_upper_left:': '↖', + \ '\nearrow': '↗', + \ '\:arrow_upper_right:': '↗', + \ '\searrow': '↘', + \ '\:arrow_lower_right:': '↘', + \ '\swarrow': '↙', + \ '\:arrow_lower_left:': '↙', + \ '\nleftarrow': '↚', + \ '\nrightarrow': '↛', + \ '\leftwavearrow': '↜', + \ '\rightwavearrow': '↝', + \ '\twoheadleftarrow': '↞', + \ '\twoheaduparrow': '↟', + \ '\twoheadrightarrow': '↠', + \ '\twoheaddownarrow': '↡', + \ '\leftarrowtail': '↢', + \ '\rightarrowtail': '↣', + \ '\mapsfrom': '↤', + \ '\mapsup': '↥', + \ '\mapsto': '↦', + \ '\mapsdown': '↧', + \ '\updownarrowbar': '↨', + \ '\hookleftarrow': '↩', + \ '\:leftwards_arrow_with_hook:': '↩', + \ '\hookrightarrow': '↪', + \ '\:arrow_right_hook:': '↪', + \ '\looparrowleft': '↫', + \ '\looparrowright': '↬', + \ '\leftrightsquigarrow': '↭', + \ '\nleftrightarrow': '↮', + \ '\downzigzagarrow': '↯', + \ '\Lsh': '↰', + \ '\Rsh': '↱', + \ '\Ldsh': '↲', + \ '\Rdsh': '↳', + \ '\linefeed': '↴', + \ '\carriagereturn': '↵', + \ '\curvearrowleft': '↶', + \ '\curvearrowright': '↷', + \ '\barovernorthwestarrow': '↸', + \ '\barleftarrowrightarrowbar': '↹', + \ '\circlearrowleft': '↺', + \ '\circlearrowright': '↻', + \ '\leftharpoonup': '↼', + \ '\leftharpoondown': '↽', + \ '\upharpoonleft': '↾', + \ '\upharpoonright': '↿', + \ '\rightharpoonup': '⇀', + \ '\rightharpoondown': '⇁', + \ '\downharpoonright': '⇂', + \ '\downharpoonleft': '⇃', + \ '\rightleftarrows': '⇄', + \ '\dblarrowupdown': '⇅', + \ '\leftrightarrows': '⇆', + \ '\leftleftarrows': '⇇', + \ '\upuparrows': '⇈', + \ '\rightrightarrows': '⇉', + \ '\downdownarrows': '⇊', + \ '\leftrightharpoons': '⇋', + \ '\rightleftharpoons': '⇌', + \ '\nLeftarrow': '⇍', + \ '\nLeftrightarrow': '⇎', + \ '\nRightarrow': '⇏', + \ '\Leftarrow': '⇐', + \ '\Uparrow': '⇑', + \ '\Rightarrow': '⇒', + \ '\Downarrow': '⇓', + \ '\Leftrightarrow': '⇔', + \ '\Updownarrow': '⇕', + \ '\Nwarrow': '⇖', + \ '\Nearrow': '⇗', + \ '\Searrow': '⇘', + \ '\Swarrow': '⇙', + \ '\Lleftarrow': '⇚', + \ '\Rrightarrow': '⇛', + \ '\leftsquigarrow': '⇜', + \ '\rightsquigarrow': '⇝', + \ '\nHuparrow': '⇞', + \ '\nHdownarrow': '⇟', + \ '\leftdasharrow': '⇠', + \ '\updasharrow': '⇡', + \ '\rightdasharrow': '⇢', + \ '\downdasharrow': '⇣', + \ '\barleftarrow': '⇤', + \ '\rightarrowbar': '⇥', + \ '\leftwhitearrow': '⇦', + \ '\upwhitearrow': '⇧', + \ '\rightwhitearrow': '⇨', + \ '\downwhitearrow': '⇩', + \ '\whitearrowupfrombar': '⇪', + \ '\circleonrightarrow': '⇴', + \ '\DownArrowUpArrow': '⇵', + \ '\rightthreearrows': '⇶', + \ '\nvleftarrow': '⇷', + \ '\nvrightarrow': '⇸', + \ '\nvleftrightarrow': '⇹', + \ '\nVleftarrow': '⇺', + \ '\nVrightarrow': '⇻', + \ '\nVleftrightarrow': '⇼', + \ '\leftarrowtriangle': '⇽', + \ '\rightarrowtriangle': '⇾', + \ '\leftrightarrowtriangle': '⇿', + \ '\forall': '∀', + \ '\complement': '∁', + \ '\partial': '∂', + \ '\exists': '∃', + \ '\nexists': '∄', + \ '\varnothing': '∅', + \ '\emptyset': '∅', + \ '\increment': '∆', + \ '\del': '∇', + \ '\nabla': '∇', + \ '\in': '∈', + \ '\notin': '∉', + \ '\smallin': '∊', + \ '\ni': '∋', + \ '\nni': '∌', + \ '\smallni': '∍', + \ '\QED': '∎', + \ '\prod': '∏', + \ '\coprod': '∐', + \ '\sum': '∑', + \ '\minus': '−', + \ '\mp': '∓', + \ '\dotplus': '∔', + \ '\setminus': '∖', + \ '\ast': '∗', + \ '\circ': '∘', + \ '\vysmblkcircle': '∙', + \ '\surd': '√', + \ '\sqrt': '√', + \ '\cbrt': '∛', + \ '\fourthroot': '∜', + \ '\propto': '∝', + \ '\infty': '∞', + \ '\rightangle': '∟', + \ '\angle': '∠', + \ '\measuredangle': '∡', + \ '\sphericalangle': '∢', + \ '\mid': '∣', + \ '\nmid': '∤', + \ '\parallel': '∥', + \ '\nparallel': '∦', + \ '\wedge': '∧', + \ '\vee': '∨', + \ '\cap': '∩', + \ '\cup': '∪', + \ '\int': '∫', + \ '\iint': '∬', + \ '\iiint': '∭', + \ '\oint': '∮', + \ '\oiint': '∯', + \ '\oiiint': '∰', + \ '\clwintegral': '∱', + \ '\varointclockwise': '∲', + \ '\ointctrclockwise': '∳', + \ '\therefore': '∴', + \ '\because': '∵', + \ '\Colon': '∷', + \ '\dotminus': '∸', + \ '\dotsminusdots': '∺', + \ '\kernelcontraction': '∻', + \ '\sim': '∼', + \ '\backsim': '∽', + \ '\lazysinv': '∾', + \ '\sinewave': '∿', + \ '\wr': '≀', + \ '\nsim': '≁', + \ '\eqsim': '≂', + \ '\neqsim': '≂̸', + \ '\simeq': '≃', + \ '\nsime': '≄', + \ '\cong': '≅', + \ '\approxnotequal': '≆', + \ '\ncong': '≇', + \ '\approx': '≈', + \ '\napprox': '≉', + \ '\approxeq': '≊', + \ '\tildetrpl': '≋', + \ '\allequal': '≌', + \ '\asymp': '≍', + \ '\Bumpeq': '≎', + \ '\nBumpeq': '≎̸', + \ '\bumpeq': '≏', + \ '\nbumpeq': '≏̸', + \ '\doteq': '≐', + \ '\Doteq': '≑', + \ '\fallingdotseq': '≒', + \ '\risingdotseq': '≓', + \ '\coloneq': '≔', + \ '\eqcolon': '≕', + \ '\eqcirc': '≖', + \ '\circeq': '≗', + \ '\arceq': '≘', + \ '\wedgeq': '≙', + \ '\veeeq': '≚', + \ '\starequal': '≛', + \ '\triangleq': '≜', + \ '\eqdef': '≝', + \ '\measeq': '≞', + \ '\questeq': '≟', + \ '\ne': '≠', + \ '\equiv': '≡', + \ '\nequiv': '≢', + \ '\Equiv': '≣', + \ '\le': '≤', + \ '\ge': '≥', + \ '\leqq': '≦', + \ '\geqq': '≧', + \ '\lneqq': '≨', + \ '\lvertneqq': '≨︀', + \ '\gneqq': '≩', + \ '\gvertneqq': '≩︀', + \ '\ll': '≪', + \ '\NotLessLess': '≪̸', + \ '\gg': '≫', + \ '\NotGreaterGreater': '≫̸', + \ '\between': '≬', + \ '\nasymp': '≭', + \ '\nless': '≮', + \ '\ngtr': '≯', + \ '\nleq': '≰', + \ '\ngeq': '≱', + \ '\lesssim': '≲', + \ '\gtrsim': '≳', + \ '\nlesssim': '≴', + \ '\ngtrsim': '≵', + \ '\lessgtr': '≶', + \ '\gtrless': '≷', + \ '\notlessgreater': '≸', + \ '\notgreaterless': '≹', + \ '\prec': '≺', + \ '\succ': '≻', + \ '\preccurlyeq': '≼', + \ '\succcurlyeq': '≽', + \ '\precsim': '≾', + \ '\nprecsim': '≾̸', + \ '\succsim': '≿', + \ '\nsuccsim': '≿̸', + \ '\nprec': '⊀', + \ '\nsucc': '⊁', + \ '\subset': '⊂', + \ '\supset': '⊃', + \ '\nsubset': '⊄', + \ '\nsupset': '⊅', + \ '\subseteq': '⊆', + \ '\supseteq': '⊇', + \ '\nsubseteq': '⊈', + \ '\nsupseteq': '⊉', + \ '\subsetneq': '⊊', + \ '\varsubsetneqq': '⊊︀', + \ '\supsetneq': '⊋', + \ '\varsupsetneq': '⊋︀', + \ '\cupdot': '⊍', + \ '\uplus': '⊎', + \ '\sqsubset': '⊏', + \ '\NotSquareSubset': '⊏̸', + \ '\sqsupset': '⊐', + \ '\NotSquareSuperset': '⊐̸', + \ '\sqsubseteq': '⊑', + \ '\sqsupseteq': '⊒', + \ '\sqcap': '⊓', + \ '\sqcup': '⊔', + \ '\oplus': '⊕', + \ '\ominus': '⊖', + \ '\otimes': '⊗', + \ '\oslash': '⊘', + \ '\odot': '⊙', + \ '\circledcirc': '⊚', + \ '\circledast': '⊛', + \ '\circledequal': '⊜', + \ '\circleddash': '⊝', + \ '\boxplus': '⊞', + \ '\boxminus': '⊟', + \ '\boxtimes': '⊠', + \ '\boxdot': '⊡', + \ '\vdash': '⊢', + \ '\dashv': '⊣', + \ '\top': '⊤', + \ '\bot': '⊥', + \ '\models': '⊧', + \ '\vDash': '⊨', + \ '\Vdash': '⊩', + \ '\Vvdash': '⊪', + \ '\VDash': '⊫', + \ '\nvdash': '⊬', + \ '\nvDash': '⊭', + \ '\nVdash': '⊮', + \ '\nVDash': '⊯', + \ '\prurel': '⊰', + \ '\scurel': '⊱', + \ '\vartriangleleft': '⊲', + \ '\vartriangleright': '⊳', + \ '\trianglelefteq': '⊴', + \ '\trianglerighteq': '⊵', + \ '\original': '⊶', + \ '\image': '⊷', + \ '\multimap': '⊸', + \ '\hermitconjmatrix': '⊹', + \ '\intercal': '⊺', + \ '\veebar': '⊻', + \ '\xor': '⊻', + \ '\barwedge': '⊼', + \ '\barvee': '⊽', + \ '\rightanglearc': '⊾', + \ '\varlrtriangle': '⊿', + \ '\bigwedge': '⋀', + \ '\bigvee': '⋁', + \ '\bigcap': '⋂', + \ '\bigcup': '⋃', + \ '\diamond': '⋄', + \ '\cdot': '⋅', + \ '\star': '⋆', + \ '\divideontimes': '⋇', + \ '\bowtie': '⋈', + \ '\ltimes': '⋉', + \ '\rtimes': '⋊', + \ '\leftthreetimes': '⋋', + \ '\rightthreetimes': '⋌', + \ '\backsimeq': '⋍', + \ '\curlyvee': '⋎', + \ '\curlywedge': '⋏', + \ '\Subset': '⋐', + \ '\Supset': '⋑', + \ '\Cap': '⋒', + \ '\Cup': '⋓', + \ '\pitchfork': '⋔', + \ '\equalparallel': '⋕', + \ '\lessdot': '⋖', + \ '\gtrdot': '⋗', + \ '\verymuchless': '⋘', + \ '\ggg': '⋙', + \ '\lesseqgtr': '⋚', + \ '\gtreqless': '⋛', + \ '\eqless': '⋜', + \ '\eqgtr': '⋝', + \ '\curlyeqprec': '⋞', + \ '\curlyeqsucc': '⋟', + \ '\npreccurlyeq': '⋠', + \ '\nsucccurlyeq': '⋡', + \ '\nsqsubseteq': '⋢', + \ '\nsqsupseteq': '⋣', + \ '\sqsubsetneq': '⋤', + \ '\Elzsqspne': '⋥', + \ '\lnsim': '⋦', + \ '\gnsim': '⋧', + \ '\precnsim': '⋨', + \ '\succnsim': '⋩', + \ '\ntriangleleft': '⋪', + \ '\ntriangleright': '⋫', + \ '\ntrianglelefteq': '⋬', + \ '\ntrianglerighteq': '⋭', + \ '\vdots': '⋮', + \ '\cdots': '⋯', + \ '\adots': '⋰', + \ '\ddots': '⋱', + \ '\disin': '⋲', + \ '\varisins': '⋳', + \ '\isins': '⋴', + \ '\isindot': '⋵', + \ '\varisinobar': '⋶', + \ '\isinobar': '⋷', + \ '\isinvb': '⋸', + \ '\isinE': '⋹', + \ '\nisd': '⋺', + \ '\varnis': '⋻', + \ '\nis': '⋼', + \ '\varniobar': '⋽', + \ '\niobar': '⋾', + \ '\bagmember': '⋿', + \ '\diameter': '⌀', + \ '\house': '⌂', + \ '\varbarwedge': '⌅', + \ '\vardoublebarwedge': '⌆', + \ '\lceil': '⌈', + \ '\rceil': '⌉', + \ '\lfloor': '⌊', + \ '\rfloor': '⌋', + \ '\invnot': '⌐', + \ '\sqlozenge': '⌑', + \ '\profline': '⌒', + \ '\profsurf': '⌓', + \ '\recorder': '⌕', + \ '\viewdata': '⌗', + \ '\turnednot': '⌙', + \ '\:watch:': '⌚', + \ '\:hourglass:': '⌛', + \ '\ulcorner': '⌜', + \ '\urcorner': '⌝', + \ '\llcorner': '⌞', + \ '\lrcorner': '⌟', + \ '\frown': '⌢', + \ '\smile': '⌣', + \ '\varhexagonlrbonds': '⌬', + \ '\conictaper': '⌲', + \ '\topbot': '⌶', + \ '\obar': '⌽', + \ '\APLnotslash': '⌿', + \ '\APLnotbackslash': '⍀', + \ '\APLboxupcaret': '⍓', + \ '\APLboxquestion': '⍰', + \ '\hexagon': '⎔', + \ '\Elzdlcorn': '⎣', + \ '\lmoustache': '⎰', + \ '\rmoustache': '⎱', + \ '\overbracket': '⎴', + \ '\underbracket': '⎵', + \ '\bbrktbrk': '⎶', + \ '\sqrtbottom': '⎷', + \ '\lvboxline': '⎸', + \ '\rvboxline': '⎹', + \ '\varcarriagereturn': '⏎', + \ '\overbrace': '⏞', + \ '\underbrace': '⏟', + \ '\trapezium': '⏢', + \ '\benzenr': '⏣', + \ '\strns': '⏤', + \ '\fltns': '⏥', + \ '\accurrent': '⏦', + \ '\elinters': '⏧', + \ '\:fast_forward:': '⏩', + \ '\:rewind:': '⏪', + \ '\:arrow_double_up:': '⏫', + \ '\:arrow_double_down:': '⏬', + \ '\:alarm_clock:': '⏰', + \ '\:hourglass_flowing_sand:': '⏳', + \ '\blanksymbol': '␢', + \ '\textvisiblespace': '␣', + \ '\:m:': 'Ⓜ', + \ '\circledS': 'Ⓢ', + \ '\Elzdshfnc': '┆', + \ '\Elzsqfnw': '┙', + \ '\diagup': '╱', + \ '\diagdown': '╲', + \ '\blockuphalf': '▀', + \ '\blocklowhalf': '▄', + \ '\blockfull': '█', + \ '\blocklefthalf': '▌', + \ '\blockrighthalf': '▐', + \ '\blockqtrshaded': '░', + \ '\blockhalfshaded': '▒', + \ '\blockthreeqtrshaded': '▓', + \ '\blacksquare': '■', + \ '\square': '□', + \ '\squoval': '▢', + \ '\blackinwhitesquare': '▣', + \ '\squarehfill': '▤', + \ '\squarevfill': '▥', + \ '\squarehvfill': '▦', + \ '\squarenwsefill': '▧', + \ '\squareneswfill': '▨', + \ '\squarecrossfill': '▩', + \ '\smblksquare': '▪', + \ '\:black_small_square:': '▪', + \ '\smwhtsquare': '▫', + \ '\:white_small_square:': '▫', + \ '\hrectangleblack': '▬', + \ '\hrectangle': '▭', + \ '\vrectangleblack': '▮', + \ '\Elzvrecto': '▯', + \ '\parallelogramblack': '▰', + \ '\parallelogram': '▱', + \ '\bigblacktriangleup': '▲', + \ '\bigtriangleup': '△', + \ '\blacktriangle': '▴', + \ '\vartriangle': '▵', + \ '\blacktriangleright': '▶', + \ '\:arrow_forward:': '▶', + \ '\triangleright': '▷', + \ '\smallblacktriangleright': '▸', + \ '\smalltriangleright': '▹', + \ '\blackpointerright': '►', + \ '\whitepointerright': '▻', + \ '\bigblacktriangledown': '▼', + \ '\bigtriangledown': '▽', + \ '\blacktriangledown': '▾', + \ '\triangledown': '▿', + \ '\blacktriangleleft': '◀', + \ '\:arrow_backward:': '◀', + \ '\triangleleft': '◁', + \ '\smallblacktriangleleft': '◂', + \ '\smalltriangleleft': '◃', + \ '\blackpointerleft': '◄', + \ '\whitepointerleft': '◅', + \ '\mdlgblkdiamond': '◆', + \ '\mdlgwhtdiamond': '◇', + \ '\blackinwhitediamond': '◈', + \ '\fisheye': '◉', + \ '\lozenge': '◊', + \ '\bigcirc': '○', + \ '\dottedcircle': '◌', + \ '\circlevertfill': '◍', + \ '\bullseye': '◎', + \ '\mdlgblkcircle': '●', + \ '\Elzcirfl': '◐', + \ '\Elzcirfr': '◑', + \ '\Elzcirfb': '◒', + \ '\circletophalfblack': '◓', + \ '\circleurquadblack': '◔', + \ '\blackcircleulquadwhite': '◕', + \ '\blacklefthalfcircle': '◖', + \ '\blackrighthalfcircle': '◗', + \ '\Elzrvbull': '◘', + \ '\inversewhitecircle': '◙', + \ '\invwhiteupperhalfcircle': '◚', + \ '\invwhitelowerhalfcircle': '◛', + \ '\ularc': '◜', + \ '\urarc': '◝', + \ '\lrarc': '◞', + \ '\llarc': '◟', + \ '\topsemicircle': '◠', + \ '\botsemicircle': '◡', + \ '\lrblacktriangle': '◢', + \ '\llblacktriangle': '◣', + \ '\ulblacktriangle': '◤', + \ '\urblacktriangle': '◥', + \ '\smwhtcircle': '◦', + \ '\Elzsqfl': '◧', + \ '\Elzsqfr': '◨', + \ '\squareulblack': '◩', + \ '\Elzsqfse': '◪', + \ '\boxbar': '◫', + \ '\trianglecdot': '◬', + \ '\triangleleftblack': '◭', + \ '\trianglerightblack': '◮', + \ '\lgwhtcircle': '◯', + \ '\squareulquad': '◰', + \ '\squarellquad': '◱', + \ '\squarelrquad': '◲', + \ '\squareurquad': '◳', + \ '\circleulquad': '◴', + \ '\circlellquad': '◵', + \ '\circlelrquad': '◶', + \ '\circleurquad': '◷', + \ '\ultriangle': '◸', + \ '\urtriangle': '◹', + \ '\lltriangle': '◺', + \ '\mdwhtsquare': '◻', + \ '\:white_medium_square:': '◻', + \ '\mdblksquare': '◼', + \ '\:black_medium_square:': '◼', + \ '\mdsmwhtsquare': '◽', + \ '\:white_medium_small_square:': '◽', + \ '\mdsmblksquare': '◾', + \ '\:black_medium_small_square:': '◾', + \ '\lrtriangle': '◿', + \ '\:sunny:': '☀', + \ '\:cloud:': '☁', + \ '\bigstar': '★', + \ '\bigwhitestar': '☆', + \ '\astrosun': '☉', + \ '\:phone:': '☎', + \ '\:ballot_box_with_check:': '☑', + \ '\:umbrella:': '☔', + \ '\:coffee:': '☕', + \ '\:point_up:': '☝', + \ '\danger': '☡', + \ '\:relaxed:': '☺', + \ '\blacksmiley': '☻', + \ '\sun': '☼', + \ '\rightmoon': '☽', + \ '\leftmoon': '☾', + \ '\mercury': '☿', + \ '\venus': '♀', + \ '\female': '♀', + \ '\male': '♂', + \ '\mars': '♂', + \ '\jupiter': '♃', + \ '\saturn': '♄', + \ '\uranus': '♅', + \ '\neptune': '♆', + \ '\pluto': '♇', + \ '\aries': '♈', + \ '\:aries:': '♈', + \ '\taurus': '♉', + \ '\:taurus:': '♉', + \ '\gemini': '♊', + \ '\:gemini:': '♊', + \ '\cancer': '♋', + \ '\:cancer:': '♋', + \ '\leo': '♌', + \ '\:leo:': '♌', + \ '\virgo': '♍', + \ '\:virgo:': '♍', + \ '\libra': '♎', + \ '\:libra:': '♎', + \ '\scorpio': '♏', + \ '\:scorpius:': '♏', + \ '\sagittarius': '♐', + \ '\:sagittarius:': '♐', + \ '\capricornus': '♑', + \ '\:capricorn:': '♑', + \ '\aquarius': '♒', + \ '\:aquarius:': '♒', + \ '\pisces': '♓', + \ '\:pisces:': '♓', + \ '\spadesuit': '♠', + \ '\:spades:': '♠', + \ '\heartsuit': '♡', + \ '\diamondsuit': '♢', + \ '\clubsuit': '♣', + \ '\:clubs:': '♣', + \ '\varspadesuit': '♤', + \ '\varheartsuit': '♥', + \ '\:hearts:': '♥', + \ '\vardiamondsuit': '♦', + \ '\:diamonds:': '♦', + \ '\varclubsuit': '♧', + \ '\:hotsprings:': '♨', + \ '\quarternote': '♩', + \ '\eighthnote': '♪', + \ '\twonotes': '♫', + \ '\flat': '♭', + \ '\natural': '♮', + \ '\sharp': '♯', + \ '\:recycle:': '♻', + \ '\acidfree': '♾', + \ '\:wheelchair:': '♿', + \ '\dicei': '⚀', + \ '\diceii': '⚁', + \ '\diceiii': '⚂', + \ '\diceiv': '⚃', + \ '\dicev': '⚄', + \ '\dicevi': '⚅', + \ '\circledrightdot': '⚆', + \ '\circledtwodots': '⚇', + \ '\blackcircledrightdot': '⚈', + \ '\blackcircledtwodots': '⚉', + \ '\:anchor:': '⚓', + \ '\:warning:': '⚠', + \ '\:zap:': '⚡', + \ '\Hermaphrodite': '⚥', + \ '\mdwhtcircle': '⚪', + \ '\:white_circle:': '⚪', + \ '\mdblkcircle': '⚫', + \ '\:black_circle:': '⚫', + \ '\mdsmwhtcircle': '⚬', + \ '\neuter': '⚲', + \ '\:soccer:': '⚽', + \ '\:baseball:': '⚾', + \ '\:snowman:': '⛄', + \ '\:partly_sunny:': '⛅', + \ '\:ophiuchus:': '⛎', + \ '\:no_entry:': '⛔', + \ '\:church:': '⛪', + \ '\:fountain:': '⛲', + \ '\:golf:': '⛳', + \ '\:boat:': '⛵', + \ '\:tent:': '⛺', + \ '\:fuelpump:': '⛽', + \ '\:scissors:': '✂', + \ '\:white_check_mark:': '✅', + \ '\:airplane:': '✈', + \ '\:email:': '✉', + \ '\:fist:': '✊', + \ '\:hand:': '✋', + \ '\:v:': '✌', + \ '\:pencil2:': '✏', + \ '\:black_nib:': '✒', + \ '\checkmark': '✓', + \ '\:heavy_check_mark:': '✔', + \ '\:heavy_multiplication_x:': '✖', + \ '\maltese': '✠', + \ '\:sparkles:': '✨', + \ '\circledstar': '✪', + \ '\:eight_spoked_asterisk:': '✳', + \ '\:eight_pointed_black_star:': '✴', + \ '\varstar': '✶', + \ '\dingasterisk': '✽', + \ '\:snowflake:': '❄', + \ '\:sparkle:': '❇', + \ '\:x:': '❌', + \ '\:negative_squared_cross_mark:': '❎', + \ '\:question:': '❓', + \ '\:grey_question:': '❔', + \ '\:grey_exclamation:': '❕', + \ '\:exclamation:': '❗', + \ '\:heart:': '❤', + \ '\:heavy_plus_sign:': '➕', + \ '\:heavy_minus_sign:': '➖', + \ '\:heavy_division_sign:': '➗', + \ '\draftingarrow': '➛', + \ '\:arrow_right:': '➡', + \ '\:curly_loop:': '➰', + \ '\:loop:': '➿', + \ '\threedangle': '⟀', + \ '\whiteinwhitetriangle': '⟁', + \ '\perp': '⟂', + \ '\bsolhsub': '⟈', + \ '\suphsol': '⟉', + \ '\wedgedot': '⟑', + \ '\upin': '⟒', + \ '\leftouterjoin': '⟕', + \ '\rightouterjoin': '⟖', + \ '\fullouterjoin': '⟗', + \ '\bigbot': '⟘', + \ '\bigtop': '⟙', + \ '\llbracket': '⟦', + \ '\openbracketleft': '⟦', + \ '\openbracketright': '⟧', + \ '\rrbracket': '⟧', + \ '\langle': '⟨', + \ '\rangle': '⟩', + \ '\UUparrow': '⟰', + \ '\DDownarrow': '⟱', + \ '\longleftarrow': '⟵', + \ '\longrightarrow': '⟶', + \ '\longleftrightarrow': '⟷', + \ '\impliedby': '⟸', + \ '\Longleftarrow': '⟸', + \ '\implies': '⟹', + \ '\Longrightarrow': '⟹', + \ '\Longleftrightarrow': '⟺', + \ '\iff': '⟺', + \ '\longmapsfrom': '⟻', + \ '\longmapsto': '⟼', + \ '\Longmapsfrom': '⟽', + \ '\Longmapsto': '⟾', + \ '\longrightsquigarrow': '⟿', + \ '\nvtwoheadrightarrow': '⤀', + \ '\nVtwoheadrightarrow': '⤁', + \ '\nvLeftarrow': '⤂', + \ '\nvRightarrow': '⤃', + \ '\nvLeftrightarrow': '⤄', + \ '\twoheadmapsto': '⤅', + \ '\Mapsfrom': '⤆', + \ '\Mapsto': '⤇', + \ '\downarrowbarred': '⤈', + \ '\uparrowbarred': '⤉', + \ '\Uuparrow': '⤊', + \ '\Ddownarrow': '⤋', + \ '\leftbkarrow': '⤌', + \ '\bkarow': '⤍', + \ '\leftdbkarrow': '⤎', + \ '\dbkarow': '⤏', + \ '\drbkarrow': '⤐', + \ '\rightdotarrow': '⤑', + \ '\UpArrowBar': '⤒', + \ '\DownArrowBar': '⤓', + \ '\nvrightarrowtail': '⤔', + \ '\nVrightarrowtail': '⤕', + \ '\twoheadrightarrowtail': '⤖', + \ '\nvtwoheadrightarrowtail': '⤗', + \ '\nVtwoheadrightarrowtail': '⤘', + \ '\diamondleftarrow': '⤝', + \ '\rightarrowdiamond': '⤞', + \ '\diamondleftarrowbar': '⤟', + \ '\barrightarrowdiamond': '⤠', + \ '\hksearow': '⤥', + \ '\hkswarow': '⤦', + \ '\tona': '⤧', + \ '\toea': '⤨', + \ '\tosa': '⤩', + \ '\towa': '⤪', + \ '\rdiagovfdiag': '⤫', + \ '\fdiagovrdiag': '⤬', + \ '\seovnearrow': '⤭', + \ '\neovsearrow': '⤮', + \ '\fdiagovnearrow': '⤯', + \ '\rdiagovsearrow': '⤰', + \ '\neovnwarrow': '⤱', + \ '\nwovnearrow': '⤲', + \ '\:arrow_heading_up:': '⤴', + \ '\:arrow_heading_down:': '⤵', + \ '\ElzRlarr': '⥂', + \ '\ElzrLarr': '⥄', + \ '\rightarrowplus': '⥅', + \ '\leftarrowplus': '⥆', + \ '\Elzrarrx': '⥇', + \ '\leftrightarrowcircle': '⥈', + \ '\twoheaduparrowcircle': '⥉', + \ '\leftrightharpoonupdown': '⥊', + \ '\leftrightharpoondownup': '⥋', + \ '\updownharpoonrightleft': '⥌', + \ '\updownharpoonleftright': '⥍', + \ '\LeftRightVector': '⥎', + \ '\RightUpDownVector': '⥏', + \ '\DownLeftRightVector': '⥐', + \ '\LeftUpDownVector': '⥑', + \ '\LeftVectorBar': '⥒', + \ '\RightVectorBar': '⥓', + \ '\RightUpVectorBar': '⥔', + \ '\RightDownVectorBar': '⥕', + \ '\DownLeftVectorBar': '⥖', + \ '\DownRightVectorBar': '⥗', + \ '\LeftUpVectorBar': '⥘', + \ '\LeftDownVectorBar': '⥙', + \ '\LeftTeeVector': '⥚', + \ '\RightTeeVector': '⥛', + \ '\RightUpTeeVector': '⥜', + \ '\RightDownTeeVector': '⥝', + \ '\DownLeftTeeVector': '⥞', + \ '\DownRightTeeVector': '⥟', + \ '\LeftUpTeeVector': '⥠', + \ '\LeftDownTeeVector': '⥡', + \ '\leftharpoonsupdown': '⥢', + \ '\upharpoonsleftright': '⥣', + \ '\rightharpoonsupdown': '⥤', + \ '\downharpoonsleftright': '⥥', + \ '\leftrightharpoonsup': '⥦', + \ '\leftrightharpoonsdown': '⥧', + \ '\rightleftharpoonsup': '⥨', + \ '\rightleftharpoonsdown': '⥩', + \ '\leftharpoonupdash': '⥪', + \ '\dashleftharpoondown': '⥫', + \ '\rightharpoonupdash': '⥬', + \ '\dashrightharpoondown': '⥭', + \ '\UpEquilibrium': '⥮', + \ '\ReverseUpEquilibrium': '⥯', + \ '\RoundImplies': '⥰', + \ '\Vvert': '⦀', + \ '\Elroang': '⦆', + \ '\Elzddfnc': '⦙', + \ '\measuredangleleft': '⦛', + \ '\Angle': '⦜', + \ '\rightanglemdot': '⦝', + \ '\angles': '⦞', + \ '\angdnr': '⦟', + \ '\Elzlpargt': '⦠', + \ '\sphericalangleup': '⦡', + \ '\turnangle': '⦢', + \ '\revangle': '⦣', + \ '\angleubar': '⦤', + \ '\revangleubar': '⦥', + \ '\wideangledown': '⦦', + \ '\wideangleup': '⦧', + \ '\measanglerutone': '⦨', + \ '\measanglelutonw': '⦩', + \ '\measanglerdtose': '⦪', + \ '\measangleldtosw': '⦫', + \ '\measangleurtone': '⦬', + \ '\measangleultonw': '⦭', + \ '\measangledrtose': '⦮', + \ '\measangledltosw': '⦯', + \ '\revemptyset': '⦰', + \ '\emptysetobar': '⦱', + \ '\emptysetocirc': '⦲', + \ '\emptysetoarr': '⦳', + \ '\emptysetoarrl': '⦴', + \ '\circledparallel': '⦷', + \ '\obslash': '⦸', + \ '\odotslashdot': '⦼', + \ '\circledwhitebullet': '⦾', + \ '\circledbullet': '⦿', + \ '\olessthan': '⧀', + \ '\ogreaterthan': '⧁', + \ '\boxdiag': '⧄', + \ '\boxbslash': '⧅', + \ '\boxast': '⧆', + \ '\boxcircle': '⧇', + \ '\ElzLap': '⧊', + \ '\Elzdefas': '⧋', + \ '\LeftTriangleBar': '⧏', + \ '\NotLeftTriangleBar': '⧏̸', + \ '\RightTriangleBar': '⧐', + \ '\NotRightTriangleBar': '⧐̸', + \ '\dualmap': '⧟', + \ '\lrtriangleeq': '⧡', + \ '\shuffle': '⧢', + \ '\eparsl': '⧣', + \ '\smeparsl': '⧤', + \ '\eqvparsl': '⧥', + \ '\blacklozenge': '⧫', + \ '\RuleDelayed': '⧴', + \ '\dsol': '⧶', + \ '\rsolbar': '⧷', + \ '\doubleplus': '⧺', + \ '\tripleplus': '⧻', + \ '\bigodot': '⨀', + \ '\bigoplus': '⨁', + \ '\bigotimes': '⨂', + \ '\bigcupdot': '⨃', + \ '\biguplus': '⨄', + \ '\bigsqcap': '⨅', + \ '\bigsqcup': '⨆', + \ '\conjquant': '⨇', + \ '\disjquant': '⨈', + \ '\bigtimes': '⨉', + \ '\modtwosum': '⨊', + \ '\sumint': '⨋', + \ '\iiiint': '⨌', + \ '\intbar': '⨍', + \ '\intBar': '⨎', + \ '\clockoint': '⨏', + \ '\cirfnint': '⨐', + \ '\awint': '⨑', + \ '\rppolint': '⨒', + \ '\scpolint': '⨓', + \ '\npolint': '⨔', + \ '\pointint': '⨕', + \ '\sqrint': '⨖', + \ '\intx': '⨘', + \ '\intcap': '⨙', + \ '\intcup': '⨚', + \ '\upint': '⨛', + \ '\lowint': '⨜', + \ '\Join': '⨝', + \ '\ringplus': '⨢', + \ '\plushat': '⨣', + \ '\simplus': '⨤', + \ '\plusdot': '⨥', + \ '\plussim': '⨦', + \ '\plussubtwo': '⨧', + \ '\plustrif': '⨨', + \ '\commaminus': '⨩', + \ '\minusdot': '⨪', + \ '\minusfdots': '⨫', + \ '\minusrdots': '⨬', + \ '\opluslhrim': '⨭', + \ '\oplusrhrim': '⨮', + \ '\ElzTimes': '⨯', + \ '\dottimes': '⨰', + \ '\timesbar': '⨱', + \ '\btimes': '⨲', + \ '\smashtimes': '⨳', + \ '\otimeslhrim': '⨴', + \ '\otimesrhrim': '⨵', + \ '\otimeshat': '⨶', + \ '\Otimes': '⨷', + \ '\odiv': '⨸', + \ '\triangleplus': '⨹', + \ '\triangleminus': '⨺', + \ '\triangletimes': '⨻', + \ '\intprod': '⨼', + \ '\intprodr': '⨽', + \ '\amalg': '⨿', + \ '\capdot': '⩀', + \ '\uminus': '⩁', + \ '\barcup': '⩂', + \ '\barcap': '⩃', + \ '\capwedge': '⩄', + \ '\cupvee': '⩅', + \ '\twocups': '⩊', + \ '\twocaps': '⩋', + \ '\closedvarcup': '⩌', + \ '\closedvarcap': '⩍', + \ '\Sqcap': '⩎', + \ '\Sqcup': '⩏', + \ '\closedvarcupsmashprod': '⩐', + \ '\wedgeodot': '⩑', + \ '\veeodot': '⩒', + \ '\ElzAnd': '⩓', + \ '\ElzOr': '⩔', + \ '\wedgeonwedge': '⩕', + \ '\ElOr': '⩖', + \ '\bigslopedvee': '⩗', + \ '\bigslopedwedge': '⩘', + \ '\wedgemidvert': '⩚', + \ '\veemidvert': '⩛', + \ '\midbarwedge': '⩜', + \ '\midbarvee': '⩝', + \ '\perspcorrespond': '⩞', + \ '\Elzminhat': '⩟', + \ '\wedgedoublebar': '⩠', + \ '\varveebar': '⩡', + \ '\doublebarvee': '⩢', + \ '\veedoublebar': '⩣', + \ '\eqdot': '⩦', + \ '\dotequiv': '⩧', + \ '\dotsim': '⩪', + \ '\simrdots': '⩫', + \ '\simminussim': '⩬', + \ '\congdot': '⩭', + \ '\asteq': '⩮', + \ '\hatapprox': '⩯', + \ '\approxeqq': '⩰', + \ '\eqqplus': '⩱', + \ '\pluseqq': '⩲', + \ '\eqqsim': '⩳', + \ '\Coloneq': '⩴', + \ '\Equal': '⩵', + \ '\eqeqeq': '⩶', + \ '\ddotseq': '⩷', + \ '\equivDD': '⩸', + \ '\ltcir': '⩹', + \ '\gtcir': '⩺', + \ '\ltquest': '⩻', + \ '\gtquest': '⩼', + \ '\leqslant': '⩽', + \ '\nleqslant': '⩽̸', + \ '\geqslant': '⩾', + \ '\ngeqslant': '⩾̸', + \ '\lesdot': '⩿', + \ '\gesdot': '⪀', + \ '\lesdoto': '⪁', + \ '\gesdoto': '⪂', + \ '\lesdotor': '⪃', + \ '\gesdotol': '⪄', + \ '\lessapprox': '⪅', + \ '\gtrapprox': '⪆', + \ '\lneq': '⪇', + \ '\gneq': '⪈', + \ '\lnapprox': '⪉', + \ '\gnapprox': '⪊', + \ '\lesseqqgtr': '⪋', + \ '\gtreqqless': '⪌', + \ '\lsime': '⪍', + \ '\gsime': '⪎', + \ '\lsimg': '⪏', + \ '\gsiml': '⪐', + \ '\lgE': '⪑', + \ '\glE': '⪒', + \ '\lesges': '⪓', + \ '\gesles': '⪔', + \ '\eqslantless': '⪕', + \ '\eqslantgtr': '⪖', + \ '\elsdot': '⪗', + \ '\egsdot': '⪘', + \ '\eqqless': '⪙', + \ '\eqqgtr': '⪚', + \ '\eqqslantless': '⪛', + \ '\eqqslantgtr': '⪜', + \ '\simless': '⪝', + \ '\simgtr': '⪞', + \ '\simlE': '⪟', + \ '\simgE': '⪠', + \ '\NestedLessLess': '⪡', + \ '\NotNestedLessLess': '⪡̸', + \ '\NestedGreaterGreater': '⪢', + \ '\NotNestedGreaterGreater': '⪢̸', + \ '\partialmeetcontraction': '⪣', + \ '\glj': '⪤', + \ '\gla': '⪥', + \ '\ltcc': '⪦', + \ '\gtcc': '⪧', + \ '\lescc': '⪨', + \ '\gescc': '⪩', + \ '\smt': '⪪', + \ '\lat': '⪫', + \ '\smte': '⪬', + \ '\late': '⪭', + \ '\bumpeqq': '⪮', + \ '\preceq': '⪯', + \ '\npreceq': '⪯̸', + \ '\succeq': '⪰', + \ '\nsucceq': '⪰̸', + \ '\precneq': '⪱', + \ '\succneq': '⪲', + \ '\preceqq': '⪳', + \ '\succeqq': '⪴', + \ '\precneqq': '⪵', + \ '\succneqq': '⪶', + \ '\precapprox': '⪷', + \ '\succapprox': '⪸', + \ '\precnapprox': '⪹', + \ '\succnapprox': '⪺', + \ '\Prec': '⪻', + \ '\Succ': '⪼', + \ '\subsetdot': '⪽', + \ '\supsetdot': '⪾', + \ '\subsetplus': '⪿', + \ '\supsetplus': '⫀', + \ '\submult': '⫁', + \ '\supmult': '⫂', + \ '\subedot': '⫃', + \ '\supedot': '⫄', + \ '\subseteqq': '⫅', + \ '\nsubseteqq': '⫅̸', + \ '\supseteqq': '⫆', + \ '\nsupseteqq': '⫆̸', + \ '\subsim': '⫇', + \ '\supsim': '⫈', + \ '\subsetapprox': '⫉', + \ '\supsetapprox': '⫊', + \ '\subsetneqq': '⫋', + \ '\supsetneqq': '⫌', + \ '\lsqhook': '⫍', + \ '\rsqhook': '⫎', + \ '\csub': '⫏', + \ '\csup': '⫐', + \ '\csube': '⫑', + \ '\csupe': '⫒', + \ '\subsup': '⫓', + \ '\supsub': '⫔', + \ '\subsub': '⫕', + \ '\supsup': '⫖', + \ '\suphsub': '⫗', + \ '\supdsub': '⫘', + \ '\forkv': '⫙', + \ '\mlcp': '⫛', + \ '\forks': '⫝̸', + \ '\forksnot': '⫝', + \ '\dashV': '⫣', + \ '\Dashv': '⫤', + \ '\interleave': '⫴', + \ '\Elztdcol': '⫶', + \ '\lllnest': '⫷', + \ '\gggnest': '⫸', + \ '\leqqslant': '⫹', + \ '\geqqslant': '⫺', + \ '\:arrow_left:': '⬅', + \ '\:arrow_up:': '⬆', + \ '\:arrow_down:': '⬇', + \ '\squaretopblack': '⬒', + \ '\squarebotblack': '⬓', + \ '\squareurblack': '⬔', + \ '\squarellblack': '⬕', + \ '\diamondleftblack': '⬖', + \ '\diamondrightblack': '⬗', + \ '\diamondtopblack': '⬘', + \ '\diamondbotblack': '⬙', + \ '\dottedsquare': '⬚', + \ '\lgblksquare': '⬛', + \ '\:black_large_square:': '⬛', + \ '\lgwhtsquare': '⬜', + \ '\:white_large_square:': '⬜', + \ '\vysmblksquare': '⬝', + \ '\vysmwhtsquare': '⬞', + \ '\pentagonblack': '⬟', + \ '\pentagon': '⬠', + \ '\varhexagon': '⬡', + \ '\varhexagonblack': '⬢', + \ '\hexagonblack': '⬣', + \ '\lgblkcircle': '⬤', + \ '\mdblkdiamond': '⬥', + \ '\mdwhtdiamond': '⬦', + \ '\mdblklozenge': '⬧', + \ '\mdwhtlozenge': '⬨', + \ '\smblkdiamond': '⬩', + \ '\smblklozenge': '⬪', + \ '\smwhtlozenge': '⬫', + \ '\blkhorzoval': '⬬', + \ '\whthorzoval': '⬭', + \ '\blkvertoval': '⬮', + \ '\whtvertoval': '⬯', + \ '\circleonleftarrow': '⬰', + \ '\leftthreearrows': '⬱', + \ '\leftarrowonoplus': '⬲', + \ '\longleftsquigarrow': '⬳', + \ '\nvtwoheadleftarrow': '⬴', + \ '\nVtwoheadleftarrow': '⬵', + \ '\twoheadmapsfrom': '⬶', + \ '\twoheadleftdbkarrow': '⬷', + \ '\leftdotarrow': '⬸', + \ '\nvleftarrowtail': '⬹', + \ '\nVleftarrowtail': '⬺', + \ '\twoheadleftarrowtail': '⬻', + \ '\nvtwoheadleftarrowtail': '⬼', + \ '\nVtwoheadleftarrowtail': '⬽', + \ '\leftarrowx': '⬾', + \ '\leftcurvedarrow': '⬿', + \ '\equalleftarrow': '⭀', + \ '\bsimilarleftarrow': '⭁', + \ '\leftarrowbackapprox': '⭂', + \ '\rightarrowgtr': '⭃', + \ '\rightarrowsupset': '⭄', + \ '\LLeftarrow': '⭅', + \ '\RRightarrow': '⭆', + \ '\bsimilarrightarrow': '⭇', + \ '\rightarrowbackapprox': '⭈', + \ '\similarleftarrow': '⭉', + \ '\leftarrowapprox': '⭊', + \ '\leftarrowbsimilar': '⭋', + \ '\rightarrowbsimilar': '⭌', + \ '\medwhitestar': '⭐', + \ '\:star:': '⭐', + \ '\medblackstar': '⭑', + \ '\smwhitestar': '⭒', + \ '\rightpentagonblack': '⭓', + \ '\rightpentagon': '⭔', + \ '\:o:': '⭕', + \ '\_j': 'ⱼ', + \ '\^V': 'ⱽ', + \ '\postalmark': '〒', + \ '\:wavy_dash:': '〰', + \ '\:part_alternation_mark:': '〽', + \ '\:congratulations:': '㊗', + \ '\:secret:': '㊙', + \ '\mbfA': '𝐀', + \ '\mbfB': '𝐁', + \ '\mbfC': '𝐂', + \ '\mbfD': '𝐃', + \ '\mbfE': '𝐄', + \ '\mbfF': '𝐅', + \ '\mbfG': '𝐆', + \ '\mbfH': '𝐇', + \ '\mbfI': '𝐈', + \ '\mbfJ': '𝐉', + \ '\mbfK': '𝐊', + \ '\mbfL': '𝐋', + \ '\mbfM': '𝐌', + \ '\mbfN': '𝐍', + \ '\mbfO': '𝐎', + \ '\mbfP': '𝐏', + \ '\mbfQ': '𝐐', + \ '\mbfR': '𝐑', + \ '\mbfS': '𝐒', + \ '\mbfT': '𝐓', + \ '\mbfU': '𝐔', + \ '\mbfV': '𝐕', + \ '\mbfW': '𝐖', + \ '\mbfX': '𝐗', + \ '\mbfY': '𝐘', + \ '\mbfZ': '𝐙', + \ '\mbfa': '𝐚', + \ '\mbfb': '𝐛', + \ '\mbfc': '𝐜', + \ '\mbfd': '𝐝', + \ '\mbfe': '𝐞', + \ '\mbff': '𝐟', + \ '\mbfg': '𝐠', + \ '\mbfh': '𝐡', + \ '\mbfi': '𝐢', + \ '\mbfj': '𝐣', + \ '\mbfk': '𝐤', + \ '\mbfl': '𝐥', + \ '\mbfm': '𝐦', + \ '\mbfn': '𝐧', + \ '\mbfo': '𝐨', + \ '\mbfp': '𝐩', + \ '\mbfq': '𝐪', + \ '\mbfr': '𝐫', + \ '\mbfs': '𝐬', + \ '\mbft': '𝐭', + \ '\mbfu': '𝐮', + \ '\mbfv': '𝐯', + \ '\mbfw': '𝐰', + \ '\mbfx': '𝐱', + \ '\mbfy': '𝐲', + \ '\mbfz': '𝐳', + \ '\mitA': '𝐴', + \ '\mitB': '𝐵', + \ '\mitC': '𝐶', + \ '\mitD': '𝐷', + \ '\mitE': '𝐸', + \ '\mitF': '𝐹', + \ '\mitG': '𝐺', + \ '\mitH': '𝐻', + \ '\mitI': '𝐼', + \ '\mitJ': '𝐽', + \ '\mitK': '𝐾', + \ '\mitL': '𝐿', + \ '\mitM': '𝑀', + \ '\mitN': '𝑁', + \ '\mitO': '𝑂', + \ '\mitP': '𝑃', + \ '\mitQ': '𝑄', + \ '\mitR': '𝑅', + \ '\mitS': '𝑆', + \ '\mitT': '𝑇', + \ '\mitU': '𝑈', + \ '\mitV': '𝑉', + \ '\mitW': '𝑊', + \ '\mitX': '𝑋', + \ '\mitY': '𝑌', + \ '\mitZ': '𝑍', + \ '\mita': '𝑎', + \ '\mitb': '𝑏', + \ '\mitc': '𝑐', + \ '\mitd': '𝑑', + \ '\mite': '𝑒', + \ '\mitf': '𝑓', + \ '\mitg': '𝑔', + \ '\miti': '𝑖', + \ '\mitj': '𝑗', + \ '\mitk': '𝑘', + \ '\mitl': '𝑙', + \ '\mitm': '𝑚', + \ '\mitn': '𝑛', + \ '\mito': '𝑜', + \ '\mitp': '𝑝', + \ '\mitq': '𝑞', + \ '\mitr': '𝑟', + \ '\mits': '𝑠', + \ '\mitt': '𝑡', + \ '\mitu': '𝑢', + \ '\mitv': '𝑣', + \ '\mitw': '𝑤', + \ '\mitx': '𝑥', + \ '\mity': '𝑦', + \ '\mitz': '𝑧', + \ '\mbfitA': '𝑨', + \ '\mbfitB': '𝑩', + \ '\mbfitC': '𝑪', + \ '\mbfitD': '𝑫', + \ '\mbfitE': '𝑬', + \ '\mbfitF': '𝑭', + \ '\mbfitG': '𝑮', + \ '\mbfitH': '𝑯', + \ '\mbfitI': '𝑰', + \ '\mbfitJ': '𝑱', + \ '\mbfitK': '𝑲', + \ '\mbfitL': '𝑳', + \ '\mbfitM': '𝑴', + \ '\mbfitN': '𝑵', + \ '\mbfitO': '𝑶', + \ '\mbfitP': '𝑷', + \ '\mbfitQ': '𝑸', + \ '\mbfitR': '𝑹', + \ '\mbfitS': '𝑺', + \ '\mbfitT': '𝑻', + \ '\mbfitU': '𝑼', + \ '\mbfitV': '𝑽', + \ '\mbfitW': '𝑾', + \ '\mbfitX': '𝑿', + \ '\mbfitY': '𝒀', + \ '\mbfitZ': '𝒁', + \ '\mbfita': '𝒂', + \ '\mbfitb': '𝒃', + \ '\mbfitc': '𝒄', + \ '\mbfitd': '𝒅', + \ '\mbfite': '𝒆', + \ '\mbfitf': '𝒇', + \ '\mbfitg': '𝒈', + \ '\mbfith': '𝒉', + \ '\mbfiti': '𝒊', + \ '\mbfitj': '𝒋', + \ '\mbfitk': '𝒌', + \ '\mbfitl': '𝒍', + \ '\mbfitm': '𝒎', + \ '\mbfitn': '𝒏', + \ '\mbfito': '𝒐', + \ '\mbfitp': '𝒑', + \ '\mbfitq': '𝒒', + \ '\mbfitr': '𝒓', + \ '\mbfits': '𝒔', + \ '\mbfitt': '𝒕', + \ '\mbfitu': '𝒖', + \ '\mbfitv': '𝒗', + \ '\mbfitw': '𝒘', + \ '\mbfitx': '𝒙', + \ '\mbfity': '𝒚', + \ '\mbfitz': '𝒛', + \ '\mscrA': '𝒜', + \ '\mscrC': '𝒞', + \ '\mscrD': '𝒟', + \ '\mscrG': '𝒢', + \ '\mscrJ': '𝒥', + \ '\mscrK': '𝒦', + \ '\mscrN': '𝒩', + \ '\mscrO': '𝒪', + \ '\mscrP': '𝒫', + \ '\mscrQ': '𝒬', + \ '\mscrS': '𝒮', + \ '\mscrT': '𝒯', + \ '\mscrU': '𝒰', + \ '\mscrV': '𝒱', + \ '\mscrW': '𝒲', + \ '\mscrX': '𝒳', + \ '\mscrY': '𝒴', + \ '\mscrZ': '𝒵', + \ '\mscra': '𝒶', + \ '\mscrb': '𝒷', + \ '\mscrc': '𝒸', + \ '\mscrd': '𝒹', + \ '\mscrf': '𝒻', + \ '\mscrh': '𝒽', + \ '\mscri': '𝒾', + \ '\mscrj': '𝒿', + \ '\mscrk': '𝓀', + \ '\mscrl': '𝓁', + \ '\mscrm': '𝓂', + \ '\mscrn': '𝓃', + \ '\mscrp': '𝓅', + \ '\mscrq': '𝓆', + \ '\mscrr': '𝓇', + \ '\mscrs': '𝓈', + \ '\mscrt': '𝓉', + \ '\mscru': '𝓊', + \ '\mscrv': '𝓋', + \ '\mscrw': '𝓌', + \ '\mscrx': '𝓍', + \ '\mscry': '𝓎', + \ '\mscrz': '𝓏', + \ '\mbfscrA': '𝓐', + \ '\mbfscrB': '𝓑', + \ '\mbfscrC': '𝓒', + \ '\mbfscrD': '𝓓', + \ '\mbfscrE': '𝓔', + \ '\mbfscrF': '𝓕', + \ '\mbfscrG': '𝓖', + \ '\mbfscrH': '𝓗', + \ '\mbfscrI': '𝓘', + \ '\mbfscrJ': '𝓙', + \ '\mbfscrK': '𝓚', + \ '\mbfscrL': '𝓛', + \ '\mbfscrM': '𝓜', + \ '\mbfscrN': '𝓝', + \ '\mbfscrO': '𝓞', + \ '\mbfscrP': '𝓟', + \ '\mbfscrQ': '𝓠', + \ '\mbfscrR': '𝓡', + \ '\mbfscrS': '𝓢', + \ '\mbfscrT': '𝓣', + \ '\mbfscrU': '𝓤', + \ '\mbfscrV': '𝓥', + \ '\mbfscrW': '𝓦', + \ '\mbfscrX': '𝓧', + \ '\mbfscrY': '𝓨', + \ '\mbfscrZ': '𝓩', + \ '\mbfscra': '𝓪', + \ '\mbfscrb': '𝓫', + \ '\mbfscrc': '𝓬', + \ '\mbfscrd': '𝓭', + \ '\mbfscre': '𝓮', + \ '\mbfscrf': '𝓯', + \ '\mbfscrg': '𝓰', + \ '\mbfscrh': '𝓱', + \ '\mbfscri': '𝓲', + \ '\mbfscrj': '𝓳', + \ '\mbfscrk': '𝓴', + \ '\mbfscrl': '𝓵', + \ '\mbfscrm': '𝓶', + \ '\mbfscrn': '𝓷', + \ '\mbfscro': '𝓸', + \ '\mbfscrp': '𝓹', + \ '\mbfscrq': '𝓺', + \ '\mbfscrr': '𝓻', + \ '\mbfscrs': '𝓼', + \ '\mbfscrt': '𝓽', + \ '\mbfscru': '𝓾', + \ '\mbfscrv': '𝓿', + \ '\mbfscrw': '𝔀', + \ '\mbfscrx': '𝔁', + \ '\mbfscry': '𝔂', + \ '\mbfscrz': '𝔃', + \ '\mfrakA': '𝔄', + \ '\mfrakB': '𝔅', + \ '\mfrakD': '𝔇', + \ '\mfrakE': '𝔈', + \ '\mfrakF': '𝔉', + \ '\mfrakG': '𝔊', + \ '\mfrakJ': '𝔍', + \ '\mfrakK': '𝔎', + \ '\mfrakL': '𝔏', + \ '\mfrakM': '𝔐', + \ '\mfrakN': '𝔑', + \ '\mfrakO': '𝔒', + \ '\mfrakP': '𝔓', + \ '\mfrakQ': '𝔔', + \ '\mfrakS': '𝔖', + \ '\mfrakT': '𝔗', + \ '\mfrakU': '𝔘', + \ '\mfrakV': '𝔙', + \ '\mfrakW': '𝔚', + \ '\mfrakX': '𝔛', + \ '\mfrakY': '𝔜', + \ '\mfraka': '𝔞', + \ '\mfrakb': '𝔟', + \ '\mfrakc': '𝔠', + \ '\mfrakd': '𝔡', + \ '\mfrake': '𝔢', + \ '\mfrakf': '𝔣', + \ '\mfrakg': '𝔤', + \ '\mfrakh': '𝔥', + \ '\mfraki': '𝔦', + \ '\mfrakj': '𝔧', + \ '\mfrakk': '𝔨', + \ '\mfrakl': '𝔩', + \ '\mfrakm': '𝔪', + \ '\mfrakn': '𝔫', + \ '\mfrako': '𝔬', + \ '\mfrakp': '𝔭', + \ '\mfrakq': '𝔮', + \ '\mfrakr': '𝔯', + \ '\mfraks': '𝔰', + \ '\mfrakt': '𝔱', + \ '\mfraku': '𝔲', + \ '\mfrakv': '𝔳', + \ '\mfrakw': '𝔴', + \ '\mfrakx': '𝔵', + \ '\mfraky': '𝔶', + \ '\mfrakz': '𝔷', + \ '\BbbA': '𝔸', + \ '\BbbB': '𝔹', + \ '\BbbD': '𝔻', + \ '\BbbE': '𝔼', + \ '\BbbF': '𝔽', + \ '\BbbG': '𝔾', + \ '\BbbI': '𝕀', + \ '\BbbJ': '𝕁', + \ '\BbbK': '𝕂', + \ '\BbbL': '𝕃', + \ '\BbbM': '𝕄', + \ '\BbbO': '𝕆', + \ '\BbbS': '𝕊', + \ '\BbbT': '𝕋', + \ '\BbbU': '𝕌', + \ '\BbbV': '𝕍', + \ '\BbbW': '𝕎', + \ '\BbbX': '𝕏', + \ '\BbbY': '𝕐', + \ '\Bbba': '𝕒', + \ '\Bbbb': '𝕓', + \ '\Bbbc': '𝕔', + \ '\Bbbd': '𝕕', + \ '\Bbbe': '𝕖', + \ '\Bbbf': '𝕗', + \ '\Bbbg': '𝕘', + \ '\Bbbh': '𝕙', + \ '\Bbbi': '𝕚', + \ '\Bbbj': '𝕛', + \ '\Bbbk': '𝕜', + \ '\Bbbl': '𝕝', + \ '\Bbbm': '𝕞', + \ '\Bbbn': '𝕟', + \ '\Bbbo': '𝕠', + \ '\Bbbp': '𝕡', + \ '\Bbbq': '𝕢', + \ '\Bbbr': '𝕣', + \ '\Bbbs': '𝕤', + \ '\Bbbt': '𝕥', + \ '\Bbbu': '𝕦', + \ '\Bbbv': '𝕧', + \ '\Bbbw': '𝕨', + \ '\Bbbx': '𝕩', + \ '\Bbby': '𝕪', + \ '\Bbbz': '𝕫', + \ '\mbffrakA': '𝕬', + \ '\mbffrakB': '𝕭', + \ '\mbffrakC': '𝕮', + \ '\mbffrakD': '𝕯', + \ '\mbffrakE': '𝕰', + \ '\mbffrakF': '𝕱', + \ '\mbffrakG': '𝕲', + \ '\mbffrakH': '𝕳', + \ '\mbffrakI': '𝕴', + \ '\mbffrakJ': '𝕵', + \ '\mbffrakK': '𝕶', + \ '\mbffrakL': '𝕷', + \ '\mbffrakM': '𝕸', + \ '\mbffrakN': '𝕹', + \ '\mbffrakO': '𝕺', + \ '\mbffrakP': '𝕻', + \ '\mbffrakQ': '𝕼', + \ '\mbffrakR': '𝕽', + \ '\mbffrakS': '𝕾', + \ '\mbffrakT': '𝕿', + \ '\mbffrakU': '𝖀', + \ '\mbffrakV': '𝖁', + \ '\mbffrakW': '𝖂', + \ '\mbffrakX': '𝖃', + \ '\mbffrakY': '𝖄', + \ '\mbffrakZ': '𝖅', + \ '\mbffraka': '𝖆', + \ '\mbffrakb': '𝖇', + \ '\mbffrakc': '𝖈', + \ '\mbffrakd': '𝖉', + \ '\mbffrake': '𝖊', + \ '\mbffrakf': '𝖋', + \ '\mbffrakg': '𝖌', + \ '\mbffrakh': '𝖍', + \ '\mbffraki': '𝖎', + \ '\mbffrakj': '𝖏', + \ '\mbffrakk': '𝖐', + \ '\mbffrakl': '𝖑', + \ '\mbffrakm': '𝖒', + \ '\mbffrakn': '𝖓', + \ '\mbffrako': '𝖔', + \ '\mbffrakp': '𝖕', + \ '\mbffrakq': '𝖖', + \ '\mbffrakr': '𝖗', + \ '\mbffraks': '𝖘', + \ '\mbffrakt': '𝖙', + \ '\mbffraku': '𝖚', + \ '\mbffrakv': '𝖛', + \ '\mbffrakw': '𝖜', + \ '\mbffrakx': '𝖝', + \ '\mbffraky': '𝖞', + \ '\mbffrakz': '𝖟', + \ '\msansA': '𝖠', + \ '\msansB': '𝖡', + \ '\msansC': '𝖢', + \ '\msansD': '𝖣', + \ '\msansE': '𝖤', + \ '\msansF': '𝖥', + \ '\msansG': '𝖦', + \ '\msansH': '𝖧', + \ '\msansI': '𝖨', + \ '\msansJ': '𝖩', + \ '\msansK': '𝖪', + \ '\msansL': '𝖫', + \ '\msansM': '𝖬', + \ '\msansN': '𝖭', + \ '\msansO': '𝖮', + \ '\msansP': '𝖯', + \ '\msansQ': '𝖰', + \ '\msansR': '𝖱', + \ '\msansS': '𝖲', + \ '\msansT': '𝖳', + \ '\msansU': '𝖴', + \ '\msansV': '𝖵', + \ '\msansW': '𝖶', + \ '\msansX': '𝖷', + \ '\msansY': '𝖸', + \ '\msansZ': '𝖹', + \ '\msansa': '𝖺', + \ '\msansb': '𝖻', + \ '\msansc': '𝖼', + \ '\msansd': '𝖽', + \ '\msanse': '𝖾', + \ '\msansf': '𝖿', + \ '\msansg': '𝗀', + \ '\msansh': '𝗁', + \ '\msansi': '𝗂', + \ '\msansj': '𝗃', + \ '\msansk': '𝗄', + \ '\msansl': '𝗅', + \ '\msansm': '𝗆', + \ '\msansn': '𝗇', + \ '\msanso': '𝗈', + \ '\msansp': '𝗉', + \ '\msansq': '𝗊', + \ '\msansr': '𝗋', + \ '\msanss': '𝗌', + \ '\msanst': '𝗍', + \ '\msansu': '𝗎', + \ '\msansv': '𝗏', + \ '\msansw': '𝗐', + \ '\msansx': '𝗑', + \ '\msansy': '𝗒', + \ '\msansz': '𝗓', + \ '\mbfsansA': '𝗔', + \ '\mbfsansB': '𝗕', + \ '\mbfsansC': '𝗖', + \ '\mbfsansD': '𝗗', + \ '\mbfsansE': '𝗘', + \ '\mbfsansF': '𝗙', + \ '\mbfsansG': '𝗚', + \ '\mbfsansH': '𝗛', + \ '\mbfsansI': '𝗜', + \ '\mbfsansJ': '𝗝', + \ '\mbfsansK': '𝗞', + \ '\mbfsansL': '𝗟', + \ '\mbfsansM': '𝗠', + \ '\mbfsansN': '𝗡', + \ '\mbfsansO': '𝗢', + \ '\mbfsansP': '𝗣', + \ '\mbfsansQ': '𝗤', + \ '\mbfsansR': '𝗥', + \ '\mbfsansS': '𝗦', + \ '\mbfsansT': '𝗧', + \ '\mbfsansU': '𝗨', + \ '\mbfsansV': '𝗩', + \ '\mbfsansW': '𝗪', + \ '\mbfsansX': '𝗫', + \ '\mbfsansY': '𝗬', + \ '\mbfsansZ': '𝗭', + \ '\mbfsansa': '𝗮', + \ '\mbfsansb': '𝗯', + \ '\mbfsansc': '𝗰', + \ '\mbfsansd': '𝗱', + \ '\mbfsanse': '𝗲', + \ '\mbfsansf': '𝗳', + \ '\mbfsansg': '𝗴', + \ '\mbfsansh': '𝗵', + \ '\mbfsansi': '𝗶', + \ '\mbfsansj': '𝗷', + \ '\mbfsansk': '𝗸', + \ '\mbfsansl': '𝗹', + \ '\mbfsansm': '𝗺', + \ '\mbfsansn': '𝗻', + \ '\mbfsanso': '𝗼', + \ '\mbfsansp': '𝗽', + \ '\mbfsansq': '𝗾', + \ '\mbfsansr': '𝗿', + \ '\mbfsanss': '𝘀', + \ '\mbfsanst': '𝘁', + \ '\mbfsansu': '𝘂', + \ '\mbfsansv': '𝘃', + \ '\mbfsansw': '𝘄', + \ '\mbfsansx': '𝘅', + \ '\mbfsansy': '𝘆', + \ '\mbfsansz': '𝘇', + \ '\mitsansA': '𝘈', + \ '\mitsansB': '𝘉', + \ '\mitsansC': '𝘊', + \ '\mitsansD': '𝘋', + \ '\mitsansE': '𝘌', + \ '\mitsansF': '𝘍', + \ '\mitsansG': '𝘎', + \ '\mitsansH': '𝘏', + \ '\mitsansI': '𝘐', + \ '\mitsansJ': '𝘑', + \ '\mitsansK': '𝘒', + \ '\mitsansL': '𝘓', + \ '\mitsansM': '𝘔', + \ '\mitsansN': '𝘕', + \ '\mitsansO': '𝘖', + \ '\mitsansP': '𝘗', + \ '\mitsansQ': '𝘘', + \ '\mitsansR': '𝘙', + \ '\mitsansS': '𝘚', + \ '\mitsansT': '𝘛', + \ '\mitsansU': '𝘜', + \ '\mitsansV': '𝘝', + \ '\mitsansW': '𝘞', + \ '\mitsansX': '𝘟', + \ '\mitsansY': '𝘠', + \ '\mitsansZ': '𝘡', + \ '\mitsansa': '𝘢', + \ '\mitsansb': '𝘣', + \ '\mitsansc': '𝘤', + \ '\mitsansd': '𝘥', + \ '\mitsanse': '𝘦', + \ '\mitsansf': '𝘧', + \ '\mitsansg': '𝘨', + \ '\mitsansh': '𝘩', + \ '\mitsansi': '𝘪', + \ '\mitsansj': '𝘫', + \ '\mitsansk': '𝘬', + \ '\mitsansl': '𝘭', + \ '\mitsansm': '𝘮', + \ '\mitsansn': '𝘯', + \ '\mitsanso': '𝘰', + \ '\mitsansp': '𝘱', + \ '\mitsansq': '𝘲', + \ '\mitsansr': '𝘳', + \ '\mitsanss': '𝘴', + \ '\mitsanst': '𝘵', + \ '\mitsansu': '𝘶', + \ '\mitsansv': '𝘷', + \ '\mitsansw': '𝘸', + \ '\mitsansx': '𝘹', + \ '\mitsansy': '𝘺', + \ '\mitsansz': '𝘻', + \ '\mbfitsansA': '𝘼', + \ '\mbfitsansB': '𝘽', + \ '\mbfitsansC': '𝘾', + \ '\mbfitsansD': '𝘿', + \ '\mbfitsansE': '𝙀', + \ '\mbfitsansF': '𝙁', + \ '\mbfitsansG': '𝙂', + \ '\mbfitsansH': '𝙃', + \ '\mbfitsansI': '𝙄', + \ '\mbfitsansJ': '𝙅', + \ '\mbfitsansK': '𝙆', + \ '\mbfitsansL': '𝙇', + \ '\mbfitsansM': '𝙈', + \ '\mbfitsansN': '𝙉', + \ '\mbfitsansO': '𝙊', + \ '\mbfitsansP': '𝙋', + \ '\mbfitsansQ': '𝙌', + \ '\mbfitsansR': '𝙍', + \ '\mbfitsansS': '𝙎', + \ '\mbfitsansT': '𝙏', + \ '\mbfitsansU': '𝙐', + \ '\mbfitsansV': '𝙑', + \ '\mbfitsansW': '𝙒', + \ '\mbfitsansX': '𝙓', + \ '\mbfitsansY': '𝙔', + \ '\mbfitsansZ': '𝙕', + \ '\mbfitsansa': '𝙖', + \ '\mbfitsansb': '𝙗', + \ '\mbfitsansc': '𝙘', + \ '\mbfitsansd': '𝙙', + \ '\mbfitsanse': '𝙚', + \ '\mbfitsansf': '𝙛', + \ '\mbfitsansg': '𝙜', + \ '\mbfitsansh': '𝙝', + \ '\mbfitsansi': '𝙞', + \ '\mbfitsansj': '𝙟', + \ '\mbfitsansk': '𝙠', + \ '\mbfitsansl': '𝙡', + \ '\mbfitsansm': '𝙢', + \ '\mbfitsansn': '𝙣', + \ '\mbfitsanso': '𝙤', + \ '\mbfitsansp': '𝙥', + \ '\mbfitsansq': '𝙦', + \ '\mbfitsansr': '𝙧', + \ '\mbfitsanss': '𝙨', + \ '\mbfitsanst': '𝙩', + \ '\mbfitsansu': '𝙪', + \ '\mbfitsansv': '𝙫', + \ '\mbfitsansw': '𝙬', + \ '\mbfitsansx': '𝙭', + \ '\mbfitsansy': '𝙮', + \ '\mbfitsansz': '𝙯', + \ '\mttA': '𝙰', + \ '\mttB': '𝙱', + \ '\mttC': '𝙲', + \ '\mttD': '𝙳', + \ '\mttE': '𝙴', + \ '\mttF': '𝙵', + \ '\mttG': '𝙶', + \ '\mttH': '𝙷', + \ '\mttI': '𝙸', + \ '\mttJ': '𝙹', + \ '\mttK': '𝙺', + \ '\mttL': '𝙻', + \ '\mttM': '𝙼', + \ '\mttN': '𝙽', + \ '\mttO': '𝙾', + \ '\mttP': '𝙿', + \ '\mttQ': '𝚀', + \ '\mttR': '𝚁', + \ '\mttS': '𝚂', + \ '\mttT': '𝚃', + \ '\mttU': '𝚄', + \ '\mttV': '𝚅', + \ '\mttW': '𝚆', + \ '\mttX': '𝚇', + \ '\mttY': '𝚈', + \ '\mttZ': '𝚉', + \ '\mtta': '𝚊', + \ '\mttb': '𝚋', + \ '\mttc': '𝚌', + \ '\mttd': '𝚍', + \ '\mtte': '𝚎', + \ '\mttf': '𝚏', + \ '\mttg': '𝚐', + \ '\mtth': '𝚑', + \ '\mtti': '𝚒', + \ '\mttj': '𝚓', + \ '\mttk': '𝚔', + \ '\mttl': '𝚕', + \ '\mttm': '𝚖', + \ '\mttn': '𝚗', + \ '\mtto': '𝚘', + \ '\mttp': '𝚙', + \ '\mttq': '𝚚', + \ '\mttr': '𝚛', + \ '\mtts': '𝚜', + \ '\mttt': '𝚝', + \ '\mttu': '𝚞', + \ '\mttv': '𝚟', + \ '\mttw': '𝚠', + \ '\mttx': '𝚡', + \ '\mtty': '𝚢', + \ '\mttz': '𝚣', + \ '\imath': '𝚤', + \ '\jmath': '𝚥', + \ '\mbfAlpha': '𝚨', + \ '\mbfBeta': '𝚩', + \ '\mbfGamma': '𝚪', + \ '\mbfDelta': '𝚫', + \ '\mbfEpsilon': '𝚬', + \ '\mbfZeta': '𝚭', + \ '\mbfEta': '𝚮', + \ '\mbfTheta': '𝚯', + \ '\mbfIota': '𝚰', + \ '\mbfKappa': '𝚱', + \ '\mbfLambda': '𝚲', + \ '\mbfMu': '𝚳', + \ '\mbfNu': '𝚴', + \ '\mbfXi': '𝚵', + \ '\mbfOmicron': '𝚶', + \ '\mbfPi': '𝚷', + \ '\mbfRho': '𝚸', + \ '\mbfvarTheta': '𝚹', + \ '\mbfSigma': '𝚺', + \ '\mbfTau': '𝚻', + \ '\mbfUpsilon': '𝚼', + \ '\mbfPhi': '𝚽', + \ '\mbfChi': '𝚾', + \ '\mbfPsi': '𝚿', + \ '\mbfOmega': '𝛀', + \ '\mbfnabla': '𝛁', + \ '\mbfalpha': '𝛂', + \ '\mbfbeta': '𝛃', + \ '\mbfgamma': '𝛄', + \ '\mbfdelta': '𝛅', + \ '\mbfepsilon': '𝛆', + \ '\mbfzeta': '𝛇', + \ '\mbfeta': '𝛈', + \ '\mbftheta': '𝛉', + \ '\mbfiota': '𝛊', + \ '\mbfkappa': '𝛋', + \ '\mbflambda': '𝛌', + \ '\mbfmu': '𝛍', + \ '\mbfnu': '𝛎', + \ '\mbfxi': '𝛏', + \ '\mbfomicron': '𝛐', + \ '\mbfpi': '𝛑', + \ '\mbfrho': '𝛒', + \ '\mbfvarsigma': '𝛓', + \ '\mbfsigma': '𝛔', + \ '\mbftau': '𝛕', + \ '\mbfupsilon': '𝛖', + \ '\mbfvarphi': '𝛗', + \ '\mbfchi': '𝛘', + \ '\mbfpsi': '𝛙', + \ '\mbfomega': '𝛚', + \ '\mbfpartial': '𝛛', + \ '\mbfvarepsilon': '𝛜', + \ '\mbfvartheta': '𝛝', + \ '\mbfvarkappa': '𝛞', + \ '\mbfphi': '𝛟', + \ '\mbfvarrho': '𝛠', + \ '\mbfvarpi': '𝛡', + \ '\mitAlpha': '𝛢', + \ '\mitBeta': '𝛣', + \ '\mitGamma': '𝛤', + \ '\mitDelta': '𝛥', + \ '\mitEpsilon': '𝛦', + \ '\mitZeta': '𝛧', + \ '\mitEta': '𝛨', + \ '\mitTheta': '𝛩', + \ '\mitIota': '𝛪', + \ '\mitKappa': '𝛫', + \ '\mitLambda': '𝛬', + \ '\mitMu': '𝛭', + \ '\mitNu': '𝛮', + \ '\mitXi': '𝛯', + \ '\mitOmicron': '𝛰', + \ '\mitPi': '𝛱', + \ '\mitRho': '𝛲', + \ '\mitvarTheta': '𝛳', + \ '\mitSigma': '𝛴', + \ '\mitTau': '𝛵', + \ '\mitUpsilon': '𝛶', + \ '\mitPhi': '𝛷', + \ '\mitChi': '𝛸', + \ '\mitPsi': '𝛹', + \ '\mitOmega': '𝛺', + \ '\mitnabla': '𝛻', + \ '\mitalpha': '𝛼', + \ '\mitbeta': '𝛽', + \ '\mitgamma': '𝛾', + \ '\mitdelta': '𝛿', + \ '\mitepsilon': '𝜀', + \ '\mitzeta': '𝜁', + \ '\miteta': '𝜂', + \ '\mittheta': '𝜃', + \ '\mitiota': '𝜄', + \ '\mitkappa': '𝜅', + \ '\mitlambda': '𝜆', + \ '\mitmu': '𝜇', + \ '\mitnu': '𝜈', + \ '\mitxi': '𝜉', + \ '\mitomicron': '𝜊', + \ '\mitpi': '𝜋', + \ '\mitrho': '𝜌', + \ '\mitvarsigma': '𝜍', + \ '\mitsigma': '𝜎', + \ '\mittau': '𝜏', + \ '\mitupsilon': '𝜐', + \ '\mitphi': '𝜑', + \ '\mitchi': '𝜒', + \ '\mitpsi': '𝜓', + \ '\mitomega': '𝜔', + \ '\mitpartial': '𝜕', + \ '\mitvarepsilon': '𝜖', + \ '\mitvartheta': '𝜗', + \ '\mitvarkappa': '𝜘', + \ '\mitvarphi': '𝜙', + \ '\mitvarrho': '𝜚', + \ '\mitvarpi': '𝜛', + \ '\mbfitAlpha': '𝜜', + \ '\mbfitBeta': '𝜝', + \ '\mbfitGamma': '𝜞', + \ '\mbfitDelta': '𝜟', + \ '\mbfitEpsilon': '𝜠', + \ '\mbfitZeta': '𝜡', + \ '\mbfitEta': '𝜢', + \ '\mbfitTheta': '𝜣', + \ '\mbfitIota': '𝜤', + \ '\mbfitKappa': '𝜥', + \ '\mbfitLambda': '𝜦', + \ '\mbfitMu': '𝜧', + \ '\mbfitNu': '𝜨', + \ '\mbfitXi': '𝜩', + \ '\mbfitOmicron': '𝜪', + \ '\mbfitPi': '𝜫', + \ '\mbfitRho': '𝜬', + \ '\mbfitvarTheta': '𝜭', + \ '\mbfitSigma': '𝜮', + \ '\mbfitTau': '𝜯', + \ '\mbfitUpsilon': '𝜰', + \ '\mbfitPhi': '𝜱', + \ '\mbfitChi': '𝜲', + \ '\mbfitPsi': '𝜳', + \ '\mbfitOmega': '𝜴', + \ '\mbfitnabla': '𝜵', + \ '\mbfitalpha': '𝜶', + \ '\mbfitbeta': '𝜷', + \ '\mbfitgamma': '𝜸', + \ '\mbfitdelta': '𝜹', + \ '\mbfitepsilon': '𝜺', + \ '\mbfitzeta': '𝜻', + \ '\mbfiteta': '𝜼', + \ '\mbfittheta': '𝜽', + \ '\mbfitiota': '𝜾', + \ '\mbfitkappa': '𝜿', + \ '\mbfitlambda': '𝝀', + \ '\mbfitmu': '𝝁', + \ '\mbfitnu': '𝝂', + \ '\mbfitxi': '𝝃', + \ '\mbfitomicron': '𝝄', + \ '\mbfitpi': '𝝅', + \ '\mbfitrho': '𝝆', + \ '\mbfitvarsigma': '𝝇', + \ '\mbfitsigma': '𝝈', + \ '\mbfittau': '𝝉', + \ '\mbfitupsilon': '𝝊', + \ '\mbfitphi': '𝝋', + \ '\mbfitchi': '𝝌', + \ '\mbfitpsi': '𝝍', + \ '\mbfitomega': '𝝎', + \ '\mbfitpartial': '𝝏', + \ '\mbfitvarepsilon': '𝝐', + \ '\mbfitvartheta': '𝝑', + \ '\mbfitvarkappa': '𝝒', + \ '\mbfitvarphi': '𝝓', + \ '\mbfitvarrho': '𝝔', + \ '\mbfitvarpi': '𝝕', + \ '\mbfsansAlpha': '𝝖', + \ '\mbfsansBeta': '𝝗', + \ '\mbfsansGamma': '𝝘', + \ '\mbfsansDelta': '𝝙', + \ '\mbfsansEpsilon': '𝝚', + \ '\mbfsansZeta': '𝝛', + \ '\mbfsansEta': '𝝜', + \ '\mbfsansTheta': '𝝝', + \ '\mbfsansIota': '𝝞', + \ '\mbfsansKappa': '𝝟', + \ '\mbfsansLambda': '𝝠', + \ '\mbfsansMu': '𝝡', + \ '\mbfsansNu': '𝝢', + \ '\mbfsansXi': '𝝣', + \ '\mbfsansOmicron': '𝝤', + \ '\mbfsansPi': '𝝥', + \ '\mbfsansRho': '𝝦', + \ '\mbfsansvarTheta': '𝝧', + \ '\mbfsansSigma': '𝝨', + \ '\mbfsansTau': '𝝩', + \ '\mbfsansUpsilon': '𝝪', + \ '\mbfsansPhi': '𝝫', + \ '\mbfsansChi': '𝝬', + \ '\mbfsansPsi': '𝝭', + \ '\mbfsansOmega': '𝝮', + \ '\mbfsansnabla': '𝝯', + \ '\mbfsansalpha': '𝝰', + \ '\mbfsansbeta': '𝝱', + \ '\mbfsansgamma': '𝝲', + \ '\mbfsansdelta': '𝝳', + \ '\mbfsansepsilon': '𝝴', + \ '\mbfsanszeta': '𝝵', + \ '\mbfsanseta': '𝝶', + \ '\mbfsanstheta': '𝝷', + \ '\mbfsansiota': '𝝸', + \ '\mbfsanskappa': '𝝹', + \ '\mbfsanslambda': '𝝺', + \ '\mbfsansmu': '𝝻', + \ '\mbfsansnu': '𝝼', + \ '\mbfsansxi': '𝝽', + \ '\mbfsansomicron': '𝝾', + \ '\mbfsanspi': '𝝿', + \ '\mbfsansrho': '𝞀', + \ '\mbfsansvarsigma': '𝞁', + \ '\mbfsanssigma': '𝞂', + \ '\mbfsanstau': '𝞃', + \ '\mbfsansupsilon': '𝞄', + \ '\mbfsansphi': '𝞅', + \ '\mbfsanschi': '𝞆', + \ '\mbfsanspsi': '𝞇', + \ '\mbfsansomega': '𝞈', + \ '\mbfsanspartial': '𝞉', + \ '\mbfsansvarepsilon': '𝞊', + \ '\mbfsansvartheta': '𝞋', + \ '\mbfsansvarkappa': '𝞌', + \ '\mbfsansvarphi': '𝞍', + \ '\mbfsansvarrho': '𝞎', + \ '\mbfsansvarpi': '𝞏', + \ '\mbfitsansAlpha': '𝞐', + \ '\mbfitsansBeta': '𝞑', + \ '\mbfitsansGamma': '𝞒', + \ '\mbfitsansDelta': '𝞓', + \ '\mbfitsansEpsilon': '𝞔', + \ '\mbfitsansZeta': '𝞕', + \ '\mbfitsansEta': '𝞖', + \ '\mbfitsansTheta': '𝞗', + \ '\mbfitsansIota': '𝞘', + \ '\mbfitsansKappa': '𝞙', + \ '\mbfitsansLambda': '𝞚', + \ '\mbfitsansMu': '𝞛', + \ '\mbfitsansNu': '𝞜', + \ '\mbfitsansXi': '𝞝', + \ '\mbfitsansOmicron': '𝞞', + \ '\mbfitsansPi': '𝞟', + \ '\mbfitsansRho': '𝞠', + \ '\mbfitsansvarTheta': '𝞡', + \ '\mbfitsansSigma': '𝞢', + \ '\mbfitsansTau': '𝞣', + \ '\mbfitsansUpsilon': '𝞤', + \ '\mbfitsansPhi': '𝞥', + \ '\mbfitsansChi': '𝞦', + \ '\mbfitsansPsi': '𝞧', + \ '\mbfitsansOmega': '𝞨', + \ '\mbfitsansnabla': '𝞩', + \ '\mbfitsansalpha': '𝞪', + \ '\mbfitsansbeta': '𝞫', + \ '\mbfitsansgamma': '𝞬', + \ '\mbfitsansdelta': '𝞭', + \ '\mbfitsansepsilon': '𝞮', + \ '\mbfitsanszeta': '𝞯', + \ '\mbfitsanseta': '𝞰', + \ '\mbfitsanstheta': '𝞱', + \ '\mbfitsansiota': '𝞲', + \ '\mbfitsanskappa': '𝞳', + \ '\mbfitsanslambda': '𝞴', + \ '\mbfitsansmu': '𝞵', + \ '\mbfitsansnu': '𝞶', + \ '\mbfitsansxi': '𝞷', + \ '\mbfitsansomicron': '𝞸', + \ '\mbfitsanspi': '𝞹', + \ '\mbfitsansrho': '𝞺', + \ '\mbfitsansvarsigma': '𝞻', + \ '\mbfitsanssigma': '𝞼', + \ '\mbfitsanstau': '𝞽', + \ '\mbfitsansupsilon': '𝞾', + \ '\mbfitsansphi': '𝞿', + \ '\mbfitsanschi': '𝟀', + \ '\mbfitsanspsi': '𝟁', + \ '\mbfitsansomega': '𝟂', + \ '\mbfitsanspartial': '𝟃', + \ '\mbfitsansvarepsilon': '𝟄', + \ '\mbfitsansvartheta': '𝟅', + \ '\mbfitsansvarkappa': '𝟆', + \ '\mbfitsansvarphi': '𝟇', + \ '\mbfitsansvarrho': '𝟈', + \ '\mbfitsansvarpi': '𝟉', + \ '\mbfDigamma': '𝟊', + \ '\mbfdigamma': '𝟋', + \ '\mbfzero': '𝟎', + \ '\mbfone': '𝟏', + \ '\mbftwo': '𝟐', + \ '\mbfthree': '𝟑', + \ '\mbffour': '𝟒', + \ '\mbffive': '𝟓', + \ '\mbfsix': '𝟔', + \ '\mbfseven': '𝟕', + \ '\mbfeight': '𝟖', + \ '\mbfnine': '𝟗', + \ '\Bbbzero': '𝟘', + \ '\Bbbone': '𝟙', + \ '\Bbbtwo': '𝟚', + \ '\Bbbthree': '𝟛', + \ '\Bbbfour': '𝟜', + \ '\Bbbfive': '𝟝', + \ '\Bbbsix': '𝟞', + \ '\Bbbseven': '𝟟', + \ '\Bbbeight': '𝟠', + \ '\Bbbnine': '𝟡', + \ '\msanszero': '𝟢', + \ '\msansone': '𝟣', + \ '\msanstwo': '𝟤', + \ '\msansthree': '𝟥', + \ '\msansfour': '𝟦', + \ '\msansfive': '𝟧', + \ '\msanssix': '𝟨', + \ '\msansseven': '𝟩', + \ '\msanseight': '𝟪', + \ '\msansnine': '𝟫', + \ '\mbfsanszero': '𝟬', + \ '\mbfsansone': '𝟭', + \ '\mbfsanstwo': '𝟮', + \ '\mbfsansthree': '𝟯', + \ '\mbfsansfour': '𝟰', + \ '\mbfsansfive': '𝟱', + \ '\mbfsanssix': '𝟲', + \ '\mbfsansseven': '𝟳', + \ '\mbfsanseight': '𝟴', + \ '\mbfsansnine': '𝟵', + \ '\mttzero': '𝟶', + \ '\mttone': '𝟷', + \ '\mtttwo': '𝟸', + \ '\mttthree': '𝟹', + \ '\mttfour': '𝟺', + \ '\mttfive': '𝟻', + \ '\mttsix': '𝟼', + \ '\mttseven': '𝟽', + \ '\mtteight': '𝟾', + \ '\mttnine': '𝟿', + \ '\:mahjong:': '🀄', + \ '\:black_joker:': '🃏', + \ '\:a:': '🅰', + \ '\:b:': '🅱', + \ '\:o2:': '🅾', + \ '\:parking:': '🅿', + \ '\:ab:': '🆎', + \ '\:cl:': '🆑', + \ '\:cool:': '🆒', + \ '\:free:': '🆓', + \ '\:id:': '🆔', + \ '\:new:': '🆕', + \ '\:ng:': '🆖', + \ '\:ok:': '🆗', + \ '\:sos:': '🆘', + \ '\:up:': '🆙', + \ '\:vs:': '🆚', + \ '\:koko:': '🈁', + \ '\:sa:': '🈂', + \ '\:u7121:': '🈚', + \ '\:u6307:': '🈯', + \ '\:u7981:': '🈲', + \ '\:u7a7a:': '🈳', + \ '\:u5408:': '🈴', + \ '\:u6e80:': '🈵', + \ '\:u6709:': '🈶', + \ '\:u6708:': '🈷', + \ '\:u7533:': '🈸', + \ '\:u5272:': '🈹', + \ '\:u55b6:': '🈺', + \ '\:ideograph_advantage:': '🉐', + \ '\:accept:': '🉑', + \ '\:cyclone:': '🌀', + \ '\:foggy:': '🌁', + \ '\:closed_umbrella:': '🌂', + \ '\:night_with_stars:': '🌃', + \ '\:sunrise_over_mountains:': '🌄', + \ '\:sunrise:': '🌅', + \ '\:city_sunset:': '🌆', + \ '\:city_sunrise:': '🌇', + \ '\:rainbow:': '🌈', + \ '\:bridge_at_night:': '🌉', + \ '\:ocean:': '🌊', + \ '\:volcano:': '🌋', + \ '\:milky_way:': '🌌', + \ '\:earth_africa:': '🌍', + \ '\:earth_americas:': '🌎', + \ '\:earth_asia:': '🌏', + \ '\:globe_with_meridians:': '🌐', + \ '\:new_moon:': '🌑', + \ '\:waxing_crescent_moon:': '🌒', + \ '\:first_quarter_moon:': '🌓', + \ '\:moon:': '🌔', + \ '\:full_moon:': '🌕', + \ '\:waning_gibbous_moon:': '🌖', + \ '\:last_quarter_moon:': '🌗', + \ '\:waning_crescent_moon:': '🌘', + \ '\:crescent_moon:': '🌙', + \ '\:new_moon_with_face:': '🌚', + \ '\:first_quarter_moon_with_face:': '🌛', + \ '\:last_quarter_moon_with_face:': '🌜', + \ '\:full_moon_with_face:': '🌝', + \ '\:sun_with_face:': '🌞', + \ '\:star2:': '🌟', + \ '\:stars:': '🌠', + \ '\:chestnut:': '🌰', + \ '\:seedling:': '🌱', + \ '\:evergreen_tree:': '🌲', + \ '\:deciduous_tree:': '🌳', + \ '\:palm_tree:': '🌴', + \ '\:cactus:': '🌵', + \ '\:tulip:': '🌷', + \ '\:cherry_blossom:': '🌸', + \ '\:rose:': '🌹', + \ '\:hibiscus:': '🌺', + \ '\:sunflower:': '🌻', + \ '\:blossom:': '🌼', + \ '\:corn:': '🌽', + \ '\:ear_of_rice:': '🌾', + \ '\:herb:': '🌿', + \ '\:four_leaf_clover:': '🍀', + \ '\:maple_leaf:': '🍁', + \ '\:fallen_leaf:': '🍂', + \ '\:leaves:': '🍃', + \ '\:mushroom:': '🍄', + \ '\:tomato:': '🍅', + \ '\:eggplant:': '🍆', + \ '\:grapes:': '🍇', + \ '\:melon:': '🍈', + \ '\:watermelon:': '🍉', + \ '\:tangerine:': '🍊', + \ '\:lemon:': '🍋', + \ '\:banana:': '🍌', + \ '\:pineapple:': '🍍', + \ '\:apple:': '🍎', + \ '\:green_apple:': '🍏', + \ '\:pear:': '🍐', + \ '\:peach:': '🍑', + \ '\:cherries:': '🍒', + \ '\:strawberry:': '🍓', + \ '\:hamburger:': '🍔', + \ '\:pizza:': '🍕', + \ '\:meat_on_bone:': '🍖', + \ '\:poultry_leg:': '🍗', + \ '\:rice_cracker:': '🍘', + \ '\:rice_ball:': '🍙', + \ '\:rice:': '🍚', + \ '\:curry:': '🍛', + \ '\:ramen:': '🍜', + \ '\:spaghetti:': '🍝', + \ '\:bread:': '🍞', + \ '\:fries:': '🍟', + \ '\:sweet_potato:': '🍠', + \ '\:dango:': '🍡', + \ '\:oden:': '🍢', + \ '\:sushi:': '🍣', + \ '\:fried_shrimp:': '🍤', + \ '\:fish_cake:': '🍥', + \ '\:icecream:': '🍦', + \ '\:shaved_ice:': '🍧', + \ '\:ice_cream:': '🍨', + \ '\:doughnut:': '🍩', + \ '\:cookie:': '🍪', + \ '\:chocolate_bar:': '🍫', + \ '\:candy:': '🍬', + \ '\:lollipop:': '🍭', + \ '\:custard:': '🍮', + \ '\:honey_pot:': '🍯', + \ '\:cake:': '🍰', + \ '\:bento:': '🍱', + \ '\:stew:': '🍲', + \ '\:egg:': '🍳', + \ '\:fork_and_knife:': '🍴', + \ '\:tea:': '🍵', + \ '\:sake:': '🍶', + \ '\:wine_glass:': '🍷', + \ '\:cocktail:': '🍸', + \ '\:tropical_drink:': '🍹', + \ '\:beer:': '🍺', + \ '\:beers:': '🍻', + \ '\:baby_bottle:': '🍼', + \ '\:ribbon:': '🎀', + \ '\:gift:': '🎁', + \ '\:birthday:': '🎂', + \ '\:jack_o_lantern:': '🎃', + \ '\:christmas_tree:': '🎄', + \ '\:santa:': '🎅', + \ '\:fireworks:': '🎆', + \ '\:sparkler:': '🎇', + \ '\:balloon:': '🎈', + \ '\:tada:': '🎉', + \ '\:confetti_ball:': '🎊', + \ '\:tanabata_tree:': '🎋', + \ '\:crossed_flags:': '🎌', + \ '\:bamboo:': '🎍', + \ '\:dolls:': '🎎', + \ '\:flags:': '🎏', + \ '\:wind_chime:': '🎐', + \ '\:rice_scene:': '🎑', + \ '\:school_satchel:': '🎒', + \ '\:mortar_board:': '🎓', + \ '\:carousel_horse:': '🎠', + \ '\:ferris_wheel:': '🎡', + \ '\:roller_coaster:': '🎢', + \ '\:fishing_pole_and_fish:': '🎣', + \ '\:microphone:': '🎤', + \ '\:movie_camera:': '🎥', + \ '\:cinema:': '🎦', + \ '\:headphones:': '🎧', + \ '\:art:': '🎨', + \ '\:tophat:': '🎩', + \ '\:circus_tent:': '🎪', + \ '\:ticket:': '🎫', + \ '\:clapper:': '🎬', + \ '\:performing_arts:': '🎭', + \ '\:video_game:': '🎮', + \ '\:dart:': '🎯', + \ '\:slot_machine:': '🎰', + \ '\:8ball:': '🎱', + \ '\:game_die:': '🎲', + \ '\:bowling:': '🎳', + \ '\:flower_playing_cards:': '🎴', + \ '\:musical_note:': '🎵', + \ '\:notes:': '🎶', + \ '\:saxophone:': '🎷', + \ '\:guitar:': '🎸', + \ '\:musical_keyboard:': '🎹', + \ '\:trumpet:': '🎺', + \ '\:violin:': '🎻', + \ '\:musical_score:': '🎼', + \ '\:running_shirt_with_sash:': '🎽', + \ '\:tennis:': '🎾', + \ '\:ski:': '🎿', + \ '\:basketball:': '🏀', + \ '\:checkered_flag:': '🏁', + \ '\:snowboarder:': '🏂', + \ '\:runner:': '🏃', + \ '\:surfer:': '🏄', + \ '\:trophy:': '🏆', + \ '\:horse_racing:': '🏇', + \ '\:football:': '🏈', + \ '\:rugby_football:': '🏉', + \ '\:swimmer:': '🏊', + \ '\:house:': '🏠', + \ '\:house_with_garden:': '🏡', + \ '\:office:': '🏢', + \ '\:post_office:': '🏣', + \ '\:european_post_office:': '🏤', + \ '\:hospital:': '🏥', + \ '\:bank:': '🏦', + \ '\:atm:': '🏧', + \ '\:hotel:': '🏨', + \ '\:love_hotel:': '🏩', + \ '\:convenience_store:': '🏪', + \ '\:school:': '🏫', + \ '\:department_store:': '🏬', + \ '\:factory:': '🏭', + \ '\:izakaya_lantern:': '🏮', + \ '\:japanese_castle:': '🏯', + \ '\:european_castle:': '🏰', + \ '\:skin-tone-2:': '🏻', + \ '\:skin-tone-3:': '🏼', + \ '\:skin-tone-4:': '🏽', + \ '\:skin-tone-5:': '🏾', + \ '\:skin-tone-6:': '🏿', + \ '\:rat:': '🐀', + \ '\:mouse2:': '🐁', + \ '\:ox:': '🐂', + \ '\:water_buffalo:': '🐃', + \ '\:cow2:': '🐄', + \ '\:tiger2:': '🐅', + \ '\:leopard:': '🐆', + \ '\:rabbit2:': '🐇', + \ '\:cat2:': '🐈', + \ '\:dragon:': '🐉', + \ '\:crocodile:': '🐊', + \ '\:whale2:': '🐋', + \ '\:snail:': '🐌', + \ '\:snake:': '🐍', + \ '\:racehorse:': '🐎', + \ '\:ram:': '🐏', + \ '\:goat:': '🐐', + \ '\:sheep:': '🐑', + \ '\:monkey:': '🐒', + \ '\:rooster:': '🐓', + \ '\:chicken:': '🐔', + \ '\:dog2:': '🐕', + \ '\:pig2:': '🐖', + \ '\:boar:': '🐗', + \ '\:elephant:': '🐘', + \ '\:octopus:': '🐙', + \ '\:shell:': '🐚', + \ '\:bug:': '🐛', + \ '\:ant:': '🐜', + \ '\:bee:': '🐝', + \ '\:beetle:': '🐞', + \ '\:fish:': '🐟', + \ '\:tropical_fish:': '🐠', + \ '\:blowfish:': '🐡', + \ '\:turtle:': '🐢', + \ '\:hatching_chick:': '🐣', + \ '\:baby_chick:': '🐤', + \ '\:hatched_chick:': '🐥', + \ '\:bird:': '🐦', + \ '\:penguin:': '🐧', + \ '\:koala:': '🐨', + \ '\:poodle:': '🐩', + \ '\:dromedary_camel:': '🐪', + \ '\:camel:': '🐫', + \ '\:dolphin:': '🐬', + \ '\:mouse:': '🐭', + \ '\:cow:': '🐮', + \ '\:tiger:': '🐯', + \ '\:rabbit:': '🐰', + \ '\:cat:': '🐱', + \ '\:dragon_face:': '🐲', + \ '\:whale:': '🐳', + \ '\:horse:': '🐴', + \ '\:monkey_face:': '🐵', + \ '\:dog:': '🐶', + \ '\:pig:': '🐷', + \ '\:frog:': '🐸', + \ '\:hamster:': '🐹', + \ '\:wolf:': '🐺', + \ '\:bear:': '🐻', + \ '\:panda_face:': '🐼', + \ '\:pig_nose:': '🐽', + \ '\:feet:': '🐾', + \ '\:eyes:': '👀', + \ '\:ear:': '👂', + \ '\:nose:': '👃', + \ '\:lips:': '👄', + \ '\:tongue:': '👅', + \ '\:point_up_2:': '👆', + \ '\:point_down:': '👇', + \ '\:point_left:': '👈', + \ '\:point_right:': '👉', + \ '\:facepunch:': '👊', + \ '\:wave:': '👋', + \ '\:ok_hand:': '👌', + \ '\:+1:': '👍', + \ '\:-1:': '👎', + \ '\:clap:': '👏', + \ '\:open_hands:': '👐', + \ '\:crown:': '👑', + \ '\:womans_hat:': '👒', + \ '\:eyeglasses:': '👓', + \ '\:necktie:': '👔', + \ '\:shirt:': '👕', + \ '\:jeans:': '👖', + \ '\:dress:': '👗', + \ '\:kimono:': '👘', + \ '\:bikini:': '👙', + \ '\:womans_clothes:': '👚', + \ '\:purse:': '👛', + \ '\:handbag:': '👜', + \ '\:pouch:': '👝', + \ '\:mans_shoe:': '👞', + \ '\:athletic_shoe:': '👟', + \ '\:high_heel:': '👠', + \ '\:sandal:': '👡', + \ '\:boot:': '👢', + \ '\:footprints:': '👣', + \ '\:bust_in_silhouette:': '👤', + \ '\:busts_in_silhouette:': '👥', + \ '\:boy:': '👦', + \ '\:girl:': '👧', + \ '\:man:': '👨', + \ '\:woman:': '👩', + \ '\:family:': '👪', + \ '\:couple:': '👫', + \ '\:two_men_holding_hands:': '👬', + \ '\:two_women_holding_hands:': '👭', + \ '\:cop:': '👮', + \ '\:dancers:': '👯', + \ '\:bride_with_veil:': '👰', + \ '\:person_with_blond_hair:': '👱', + \ '\:man_with_gua_pi_mao:': '👲', + \ '\:man_with_turban:': '👳', + \ '\:older_man:': '👴', + \ '\:older_woman:': '👵', + \ '\:baby:': '👶', + \ '\:construction_worker:': '👷', + \ '\:princess:': '👸', + \ '\:japanese_ogre:': '👹', + \ '\:japanese_goblin:': '👺', + \ '\:ghost:': '👻', + \ '\:angel:': '👼', + \ '\:alien:': '👽', + \ '\:space_invader:': '👾', + \ '\:imp:': '👿', + \ '\:skull:': '💀', + \ '\:information_desk_person:': '💁', + \ '\:guardsman:': '💂', + \ '\:dancer:': '💃', + \ '\:lipstick:': '💄', + \ '\:nail_care:': '💅', + \ '\:massage:': '💆', + \ '\:haircut:': '💇', + \ '\:barber:': '💈', + \ '\:syringe:': '💉', + \ '\:pill:': '💊', + \ '\:kiss:': '💋', + \ '\:love_letter:': '💌', + \ '\:ring:': '💍', + \ '\:gem:': '💎', + \ '\:couplekiss:': '💏', + \ '\:bouquet:': '💐', + \ '\:couple_with_heart:': '💑', + \ '\:wedding:': '💒', + \ '\:heartbeat:': '💓', + \ '\:broken_heart:': '💔', + \ '\:two_hearts:': '💕', + \ '\:sparkling_heart:': '💖', + \ '\:heartpulse:': '💗', + \ '\:cupid:': '💘', + \ '\:blue_heart:': '💙', + \ '\:green_heart:': '💚', + \ '\:yellow_heart:': '💛', + \ '\:purple_heart:': '💜', + \ '\:gift_heart:': '💝', + \ '\:revolving_hearts:': '💞', + \ '\:heart_decoration:': '💟', + \ '\:diamond_shape_with_a_dot_inside:': '💠', + \ '\:bulb:': '💡', + \ '\:anger:': '💢', + \ '\:bomb:': '💣', + \ '\:zzz:': '💤', + \ '\:boom:': '💥', + \ '\:sweat_drops:': '💦', + \ '\:droplet:': '💧', + \ '\:dash:': '💨', + \ '\:hankey:': '💩', + \ '\:muscle:': '💪', + \ '\:dizzy:': '💫', + \ '\:speech_balloon:': '💬', + \ '\:thought_balloon:': '💭', + \ '\:white_flower:': '💮', + \ '\:100:': '💯', + \ '\:moneybag:': '💰', + \ '\:currency_exchange:': '💱', + \ '\:heavy_dollar_sign:': '💲', + \ '\:credit_card:': '💳', + \ '\:yen:': '💴', + \ '\:dollar:': '💵', + \ '\:euro:': '💶', + \ '\:pound:': '💷', + \ '\:money_with_wings:': '💸', + \ '\:chart:': '💹', + \ '\:seat:': '💺', + \ '\:computer:': '💻', + \ '\:briefcase:': '💼', + \ '\:minidisc:': '💽', + \ '\:floppy_disk:': '💾', + \ '\:cd:': '💿', + \ '\:dvd:': '📀', + \ '\:file_folder:': '📁', + \ '\:open_file_folder:': '📂', + \ '\:page_with_curl:': '📃', + \ '\:page_facing_up:': '📄', + \ '\:date:': '📅', + \ '\:calendar:': '📆', + \ '\:card_index:': '📇', + \ '\:chart_with_upwards_trend:': '📈', + \ '\:chart_with_downwards_trend:': '📉', + \ '\:bar_chart:': '📊', + \ '\:clipboard:': '📋', + \ '\:pushpin:': '📌', + \ '\:round_pushpin:': '📍', + \ '\:paperclip:': '📎', + \ '\:straight_ruler:': '📏', + \ '\:triangular_ruler:': '📐', + \ '\:bookmark_tabs:': '📑', + \ '\:ledger:': '📒', + \ '\:notebook:': '📓', + \ '\:notebook_with_decorative_cover:': '📔', + \ '\:closed_book:': '📕', + \ '\:book:': '📖', + \ '\:green_book:': '📗', + \ '\:blue_book:': '📘', + \ '\:orange_book:': '📙', + \ '\:books:': '📚', + \ '\:name_badge:': '📛', + \ '\:scroll:': '📜', + \ '\:memo:': '📝', + \ '\:telephone_receiver:': '📞', + \ '\:pager:': '📟', + \ '\:fax:': '📠', + \ '\:satellite:': '📡', + \ '\:loudspeaker:': '📢', + \ '\:mega:': '📣', + \ '\:outbox_tray:': '📤', + \ '\:inbox_tray:': '📥', + \ '\:package:': '📦', + \ '\:e-mail:': '📧', + \ '\:incoming_envelope:': '📨', + \ '\:envelope_with_arrow:': '📩', + \ '\:mailbox_closed:': '📪', + \ '\:mailbox:': '📫', + \ '\:mailbox_with_mail:': '📬', + \ '\:mailbox_with_no_mail:': '📭', + \ '\:postbox:': '📮', + \ '\:postal_horn:': '📯', + \ '\:newspaper:': '📰', + \ '\:iphone:': '📱', + \ '\:calling:': '📲', + \ '\:vibration_mode:': '📳', + \ '\:mobile_phone_off:': '📴', + \ '\:no_mobile_phones:': '📵', + \ '\:signal_strength:': '📶', + \ '\:camera:': '📷', + \ '\:video_camera:': '📹', + \ '\:tv:': '📺', + \ '\:radio:': '📻', + \ '\:vhs:': '📼', + \ '\:twisted_rightwards_arrows:': '🔀', + \ '\:repeat:': '🔁', + \ '\:repeat_one:': '🔂', + \ '\:arrows_clockwise:': '🔃', + \ '\:arrows_counterclockwise:': '🔄', + \ '\:low_brightness:': '🔅', + \ '\:high_brightness:': '🔆', + \ '\:mute:': '🔇', + \ '\:speaker:': '🔈', + \ '\:sound:': '🔉', + \ '\:loud_sound:': '🔊', + \ '\:battery:': '🔋', + \ '\:electric_plug:': '🔌', + \ '\:mag:': '🔍', + \ '\:mag_right:': '🔎', + \ '\:lock_with_ink_pen:': '🔏', + \ '\:closed_lock_with_key:': '🔐', + \ '\:key:': '🔑', + \ '\:lock:': '🔒', + \ '\:unlock:': '🔓', + \ '\:bell:': '🔔', + \ '\:no_bell:': '🔕', + \ '\:bookmark:': '🔖', + \ '\:link:': '🔗', + \ '\:radio_button:': '🔘', + \ '\:back:': '🔙', + \ '\:end:': '🔚', + \ '\:on:': '🔛', + \ '\:soon:': '🔜', + \ '\:top:': '🔝', + \ '\:underage:': '🔞', + \ '\:keycap_ten:': '🔟', + \ '\:capital_abcd:': '🔠', + \ '\:abcd:': '🔡', + \ '\:1234:': '🔢', + \ '\:symbols:': '🔣', + \ '\:abc:': '🔤', + \ '\:fire:': '🔥', + \ '\:flashlight:': '🔦', + \ '\:wrench:': '🔧', + \ '\:hammer:': '🔨', + \ '\:nut_and_bolt:': '🔩', + \ '\:hocho:': '🔪', + \ '\:gun:': '🔫', + \ '\:microscope:': '🔬', + \ '\:telescope:': '🔭', + \ '\:crystal_ball:': '🔮', + \ '\:six_pointed_star:': '🔯', + \ '\:beginner:': '🔰', + \ '\:trident:': '🔱', + \ '\:black_square_button:': '🔲', + \ '\:white_square_button:': '🔳', + \ '\:red_circle:': '🔴', + \ '\:large_blue_circle:': '🔵', + \ '\:large_orange_diamond:': '🔶', + \ '\:large_blue_diamond:': '🔷', + \ '\:small_orange_diamond:': '🔸', + \ '\:small_blue_diamond:': '🔹', + \ '\:small_red_triangle:': '🔺', + \ '\:small_red_triangle_down:': '🔻', + \ '\:arrow_up_small:': '🔼', + \ '\:arrow_down_small:': '🔽', + \ '\:clock1:': '🕐', + \ '\:clock2:': '🕑', + \ '\:clock3:': '🕒', + \ '\:clock4:': '🕓', + \ '\:clock5:': '🕔', + \ '\:clock6:': '🕕', + \ '\:clock7:': '🕖', + \ '\:clock8:': '🕗', + \ '\:clock9:': '🕘', + \ '\:clock10:': '🕙', + \ '\:clock11:': '🕚', + \ '\:clock12:': '🕛', + \ '\:clock130:': '🕜', + \ '\:clock230:': '🕝', + \ '\:clock330:': '🕞', + \ '\:clock430:': '🕟', + \ '\:clock530:': '🕠', + \ '\:clock630:': '🕡', + \ '\:clock730:': '🕢', + \ '\:clock830:': '🕣', + \ '\:clock930:': '🕤', + \ '\:clock1030:': '🕥', + \ '\:clock1130:': '🕦', + \ '\:clock1230:': '🕧', + \ '\:mount_fuji:': '🗻', + \ '\:tokyo_tower:': '🗼', + \ '\:statue_of_liberty:': '🗽', + \ '\:japan:': '🗾', + \ '\:moyai:': '🗿', + \ '\:grinning:': '😀', + \ '\:grin:': '😁', + \ '\:joy:': '😂', + \ '\:smiley:': '😃', + \ '\:smile:': '😄', + \ '\:sweat_smile:': '😅', + \ '\:laughing:': '😆', + \ '\:innocent:': '😇', + \ '\:smiling_imp:': '😈', + \ '\:wink:': '😉', + \ '\:blush:': '😊', + \ '\:yum:': '😋', + \ '\:relieved:': '😌', + \ '\:heart_eyes:': '😍', + \ '\:sunglasses:': '😎', + \ '\:smirk:': '😏', + \ '\:neutral_face:': '😐', + \ '\:expressionless:': '😑', + \ '\:unamused:': '😒', + \ '\:sweat:': '😓', + \ '\:pensive:': '😔', + \ '\:confused:': '😕', + \ '\:confounded:': '😖', + \ '\:kissing:': '😗', + \ '\:kissing_heart:': '😘', + \ '\:kissing_smiling_eyes:': '😙', + \ '\:kissing_closed_eyes:': '😚', + \ '\:stuck_out_tongue:': '😛', + \ '\:stuck_out_tongue_winking_eye:': '😜', + \ '\:stuck_out_tongue_closed_eyes:': '😝', + \ '\:disappointed:': '😞', + \ '\:worried:': '😟', + \ '\:angry:': '😠', + \ '\:rage:': '😡', + \ '\:cry:': '😢', + \ '\:persevere:': '😣', + \ '\:triumph:': '😤', + \ '\:disappointed_relieved:': '😥', + \ '\:frowning:': '😦', + \ '\:anguished:': '😧', + \ '\:fearful:': '😨', + \ '\:weary:': '😩', + \ '\:sleepy:': '😪', + \ '\:tired_face:': '😫', + \ '\:grimacing:': '😬', + \ '\:sob:': '😭', + \ '\:open_mouth:': '😮', + \ '\:hushed:': '😯', + \ '\:cold_sweat:': '😰', + \ '\:scream:': '😱', + \ '\:astonished:': '😲', + \ '\:flushed:': '😳', + \ '\:sleeping:': '😴', + \ '\:dizzy_face:': '😵', + \ '\:no_mouth:': '😶', + \ '\:mask:': '😷', + \ '\:smile_cat:': '😸', + \ '\:joy_cat:': '😹', + \ '\:smiley_cat:': '😺', + \ '\:heart_eyes_cat:': '😻', + \ '\:smirk_cat:': '😼', + \ '\:kissing_cat:': '😽', + \ '\:pouting_cat:': '😾', + \ '\:crying_cat_face:': '😿', + \ '\:scream_cat:': '🙀', + \ '\:no_good:': '🙅', + \ '\:ok_woman:': '🙆', + \ '\:bow:': '🙇', + \ '\:see_no_evil:': '🙈', + \ '\:hear_no_evil:': '🙉', + \ '\:speak_no_evil:': '🙊', + \ '\:raising_hand:': '🙋', + \ '\:raised_hands:': '🙌', + \ '\:person_frowning:': '🙍', + \ '\:person_with_pouting_face:': '🙎', + \ '\:pray:': '🙏', + \ '\:rocket:': '🚀', + \ '\:helicopter:': '🚁', + \ '\:steam_locomotive:': '🚂', + \ '\:railway_car:': '🚃', + \ '\:bullettrain_side:': '🚄', + \ '\:bullettrain_front:': '🚅', + \ '\:train2:': '🚆', + \ '\:metro:': '🚇', + \ '\:light_rail:': '🚈', + \ '\:station:': '🚉', + \ '\:tram:': '🚊', + \ '\:train:': '🚋', + \ '\:bus:': '🚌', + \ '\:oncoming_bus:': '🚍', + \ '\:trolleybus:': '🚎', + \ '\:busstop:': '🚏', + \ '\:minibus:': '🚐', + \ '\:ambulance:': '🚑', + \ '\:fire_engine:': '🚒', + \ '\:police_car:': '🚓', + \ '\:oncoming_police_car:': '🚔', + \ '\:taxi:': '🚕', + \ '\:oncoming_taxi:': '🚖', + \ '\:car:': '🚗', + \ '\:oncoming_automobile:': '🚘', + \ '\:blue_car:': '🚙', + \ '\:truck:': '🚚', + \ '\:articulated_lorry:': '🚛', + \ '\:tractor:': '🚜', + \ '\:monorail:': '🚝', + \ '\:mountain_railway:': '🚞', + \ '\:suspension_railway:': '🚟', + \ '\:mountain_cableway:': '🚠', + \ '\:aerial_tramway:': '🚡', + \ '\:ship:': '🚢', + \ '\:rowboat:': '🚣', + \ '\:speedboat:': '🚤', + \ '\:traffic_light:': '🚥', + \ '\:vertical_traffic_light:': '🚦', + \ '\:construction:': '🚧', + \ '\:rotating_light:': '🚨', + \ '\:triangular_flag_on_post:': '🚩', + \ '\:door:': '🚪', + \ '\:no_entry_sign:': '🚫', + \ '\:smoking:': '🚬', + \ '\:no_smoking:': '🚭', + \ '\:put_litter_in_its_place:': '🚮', + \ '\:do_not_litter:': '🚯', + \ '\:potable_water:': '🚰', + \ '\:non-potable_water:': '🚱', + \ '\:bike:': '🚲', + \ '\:no_bicycles:': '🚳', + \ '\:bicyclist:': '🚴', + \ '\:mountain_bicyclist:': '🚵', + \ '\:walking:': '🚶', + \ '\:no_pedestrians:': '🚷', + \ '\:children_crossing:': '🚸', + \ '\:mens:': '🚹', + \ '\:womens:': '🚺', + \ '\:restroom:': '🚻', + \ '\:baby_symbol:': '🚼', + \ '\:toilet:': '🚽', + \ '\:wc:': '🚾', + \ '\:shower:': '🚿', + \ '\:bath:': '🛀', + \ '\:bathtub:': '🛁', + \ '\:passport_control:': '🛂', + \ '\:customs:': '🛃', + \ '\:baggage_claim:': '🛄', + \ '\:left_luggage:': '🛅'} +endfunction + +endif |