aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml3
-rw-r--r--config/CMakeLists.txt1
-rw-r--r--config/config.h.in1
-rw-r--r--runtime/autoload/provider/pythonx.vim4
-rw-r--r--runtime/autoload/spellfile.vim10
-rw-r--r--runtime/compiler/ts-node.vim29
-rw-r--r--runtime/compiler/tsc.vim26
-rw-r--r--runtime/doc/cmdline.txt4
-rw-r--r--runtime/doc/eval.txt14
-rw-r--r--runtime/doc/insert.txt4
-rw-r--r--runtime/doc/intro.txt2
-rw-r--r--runtime/doc/lsp.txt8
-rw-r--r--runtime/doc/lua.txt335
-rw-r--r--runtime/doc/options.txt33
-rw-r--r--runtime/doc/quickfix.txt39
-rw-r--r--runtime/doc/spell.txt14
-rw-r--r--runtime/doc/treesitter.txt295
-rw-r--r--runtime/doc/vim_diff.txt3
-rw-r--r--runtime/doc/visual.txt5
-rw-r--r--runtime/filetype.vim10
-rw-r--r--runtime/ftplugin/typescript.vim39
-rw-r--r--runtime/ftplugin/typescriptreact.vim33
-rw-r--r--runtime/indent/typescript.vim4
-rw-r--r--runtime/lua/vim/lsp/buf.lua46
-rw-r--r--runtime/lua/vim/lsp/callbacks.lua21
-rw-r--r--runtime/lua/vim/lsp/rpc.lua11
-rw-r--r--runtime/lua/vim/lsp/util.lua54
-rw-r--r--runtime/lua/vim/treesitter.lua22
-rw-r--r--runtime/lua/vim/treesitter/highlighter.lua84
-rw-r--r--runtime/lua/vim/treesitter/query.lua56
-rw-r--r--runtime/lua/vim/uri.lua20
-rw-r--r--runtime/pack/dist/opt/cfilter/plugin/cfilter.vim39
-rw-r--r--runtime/syntax/resolv.vim53
-rw-r--r--runtime/syntax/typescript.vim2052
-rw-r--r--runtime/syntax/typescriptcommon.vim2067
-rw-r--r--runtime/syntax/typescriptreact.vim160
-rwxr-xr-xscripts/download-unicode-files.sh2
-rwxr-xr-xscripts/gen_vimdoc.py3
-rw-r--r--src/nvim/api/buffer.c169
-rw-r--r--src/nvim/api/private/helpers.c51
-rw-r--r--src/nvim/api/vim.c150
-rw-r--r--src/nvim/buffer.c5
-rw-r--r--src/nvim/buffer_defs.h7
-rw-r--r--src/nvim/change.c16
-rw-r--r--src/nvim/cursor_shape.c41
-rw-r--r--src/nvim/edit.c8
-rw-r--r--src/nvim/eval.c83
-rw-r--r--src/nvim/eval/funcs.c11
-rw-r--r--src/nvim/eval/userfunc.c198
-rw-r--r--src/nvim/ex_cmds.c8
-rw-r--r--src/nvim/ex_cmds.lua12
-rw-r--r--src/nvim/ex_docmd.c63
-rw-r--r--src/nvim/ex_getln.c62
-rw-r--r--src/nvim/extmark.c34
-rw-r--r--src/nvim/extmark.h1
-rw-r--r--src/nvim/fileio.c37
-rw-r--r--src/nvim/fold.c195
-rw-r--r--src/nvim/fold.h1
-rw-r--r--src/nvim/getchar.c18
-rw-r--r--src/nvim/globals.h6
-rw-r--r--src/nvim/log.h15
-rw-r--r--src/nvim/lua/executor.c53
-rw-r--r--src/nvim/lua/treesitter.c48
-rw-r--r--src/nvim/macros.h6
-rw-r--r--src/nvim/main.c2
-rw-r--r--src/nvim/memline.c1
-rw-r--r--src/nvim/move.c5
-rw-r--r--src/nvim/normal.c90
-rw-r--r--src/nvim/ops.c40
-rw-r--r--src/nvim/option.c8
-rw-r--r--src/nvim/option_defs.h1
-rw-r--r--src/nvim/options.lua10
-rw-r--r--src/nvim/os/lang.c16
-rw-r--r--src/nvim/popupmnu.c1
-rw-r--r--src/nvim/quickfix.c31
-rw-r--r--src/nvim/regexp.c5
-rw-r--r--src/nvim/screen.c549
-rw-r--r--src/nvim/search.c103
-rw-r--r--src/nvim/spell.c24
-rw-r--r--src/nvim/syntax.c2
-rw-r--r--src/nvim/testdir/check.vim32
-rw-r--r--src/nvim/testdir/shared.vim21
-rw-r--r--src/nvim/testdir/test_autocmd.vim31
-rw-r--r--src/nvim/testdir/test_cmdline.vim24
-rw-r--r--src/nvim/testdir/test_display.vim37
-rw-r--r--src/nvim/testdir/test_edit.vim59
-rw-r--r--src/nvim/testdir/test_environ.vim25
-rw-r--r--src/nvim/testdir/test_filetype.vim5
-rw-r--r--src/nvim/testdir/test_functions.vim37
-rw-r--r--src/nvim/testdir/test_gf.vim27
-rw-r--r--src/nvim/testdir/test_highlight.vim14
-rw-r--r--src/nvim/testdir/test_ins_complete.vim26
-rw-r--r--src/nvim/testdir/test_lambda.vim2
-rw-r--r--src/nvim/testdir/test_listdict.vim8
-rw-r--r--src/nvim/testdir/test_mapping.vim36
-rw-r--r--src/nvim/testdir/test_matchadd_conceal.vim75
-rw-r--r--src/nvim/testdir/test_popup.vim47
-rw-r--r--src/nvim/testdir/test_quickfix.vim94
-rw-r--r--src/nvim/testdir/test_search.vim110
-rw-r--r--src/nvim/testdir/test_search_stat.vim128
-rw-r--r--src/nvim/testdir/test_spell.vim42
-rw-r--r--src/nvim/testdir/test_startup.vim26
-rw-r--r--src/nvim/testdir/test_statusline.vim19
-rw-r--r--src/nvim/testdir/test_syntax.vim4
-rw-r--r--src/nvim/testdir/test_tagjump.vim34
-rw-r--r--src/nvim/testdir/test_timers.vim42
-rw-r--r--src/nvim/testdir/test_undo.vim39
-rw-r--r--src/nvim/testdir/test_vimscript.vim11
-rw-r--r--src/nvim/tui/tui.c1
-rw-r--r--src/nvim/undo.c10
-rw-r--r--src/nvim/window.c14
-rw-r--r--test/functional/api/extmark_spec.lua9
-rw-r--r--test/functional/api/highlight_spec.lua12
-rw-r--r--test/functional/core/job_spec.lua1
-rw-r--r--test/functional/legacy/display_spec.lua31
-rw-r--r--test/functional/legacy/visual_mode_spec.lua42
-rw-r--r--test/functional/lua/buffer_updates_spec.lua202
-rw-r--r--test/functional/lua/treesitter_spec.lua38
-rw-r--r--test/functional/lua/vim_spec.lua70
-rw-r--r--test/functional/normal/meta_key_spec.lua22
-rw-r--r--test/functional/ui/cmdline_spec.lua32
-rw-r--r--test/functional/ui/cursor_spec.lua17
-rw-r--r--test/functional/ui/fold_spec.lua46
-rw-r--r--test/functional/ui/inccommand_spec.lua20
-rw-r--r--test/functional/ui/messages_spec.lua2
-rw-r--r--test/functional/visual/meta_key_spec.lua22
-rw-r--r--test/helpers.lua2
-rw-r--r--unicode/CaseFolding.txt7
-rw-r--r--unicode/EastAsianWidth.txt115
-rw-r--r--unicode/UnicodeData.txt962
-rw-r--r--unicode/emoji-data.txt1908
131 files changed, 8153 insertions, 4279 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 50ef4e6897..90ba2a6d7a 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +1,2 @@
-custom: https://salt.bountysource.com/teams/neovim
+github: neovim
+open_collective: neovim
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt
index 6c9e06d59d..8a70d864c4 100644
--- a/config/CMakeLists.txt
+++ b/config/CMakeLists.txt
@@ -32,6 +32,7 @@ endif()
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
check_include_files(termios.h HAVE_TERMIOS_H)
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
+check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
# Functions
check_function_exists(fseeko HAVE_FSEEKO)
diff --git a/config/config.h.in b/config/config.h.in
index 5e60e6279f..95e2c872a3 100644
--- a/config/config.h.in
+++ b/config/config.h.in
@@ -33,6 +33,7 @@
#cmakedefine HAVE_STRCASECMP
#cmakedefine HAVE_STRINGS_H
#cmakedefine HAVE_STRNCASECMP
+#cmakedefine HAVE_SYS_SDT_H
#cmakedefine HAVE_SYS_UTSNAME_H
#cmakedefine HAVE_SYS_WAIT_H
#cmakedefine HAVE_TERMIOS_H
diff --git a/runtime/autoload/provider/pythonx.vim b/runtime/autoload/provider/pythonx.vim
index e89d519790..550931d8aa 100644
--- a/runtime/autoload/provider/pythonx.vim
+++ b/runtime/autoload/provider/pythonx.vim
@@ -29,8 +29,8 @@ endfunction
function! s:get_python_candidates(major_version) abort
return {
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
- \ 3: ['python3', 'python3.9', 'python3.8', 'python3.7', 'python3.6', 'python3.5',
- \ 'python3.4', 'python3.3', 'python']
+ \ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7',
+ \ 'python3.6', 'python']
\ }[a:major_version]
endfunction
diff --git a/runtime/autoload/spellfile.vim b/runtime/autoload/spellfile.vim
index d098902305..e36e2f936b 100644
--- a/runtime/autoload/spellfile.vim
+++ b/runtime/autoload/spellfile.vim
@@ -1,13 +1,9 @@
" Vim script to download a missing spell file
if !exists('g:spellfile_URL')
- " Prefer using http:// when netrw should be able to use it, since
- " more firewalls let this through.
- if executable("curl") || executable("wget") || executable("fetch")
- let g:spellfile_URL = 'http://ftp.vim.org/pub/vim/runtime/spell'
- else
- let g:spellfile_URL = 'ftp://ftp.vim.org/pub/vim/runtime/spell'
- endif
+ " Always use https:// because it's secure. The certificate is for nluug.nl,
+ " thus we can't use the alias ftp.vim.org here.
+ let g:spellfile_URL = 'https://ftp.nluug.nl/pub/vim/runtime/spell'
endif
let s:spellfile_URL = '' " Start with nothing so that s:donedict is reset.
diff --git a/runtime/compiler/ts-node.vim b/runtime/compiler/ts-node.vim
new file mode 100644
index 0000000000..14f0ea790c
--- /dev/null
+++ b/runtime/compiler/ts-node.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: TypeScript Runner
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "node"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ ts-node
+
+CompilerSet makeprg=ts-node
+CompilerSet errorformat=%f\ %#(%l\\,%c):\ %trror\ TS%n:\ %m,
+ \%E%f:%l,
+ \%+Z%\\w%\\+Error:\ %.%#,
+ \%C%p^%\\+,
+ \%C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/tsc.vim b/runtime/compiler/tsc.vim
new file mode 100644
index 0000000000..a246fc7751
--- /dev/null
+++ b/runtime/compiler/tsc.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: TypeScript Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "tsc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ tsc
+
+CompilerSet makeprg=tsc
+CompilerSet errorformat=%f\ %#(%l\\,%c):\ %trror\ TS%n:\ %m,
+ \%trror\ TS%n:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index 163dc81804..f7a281cb88 100644
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -224,6 +224,10 @@ CTRL-[ *c_CTRL-[* *c_<Esc>* *c_Esc*
present in 'cpoptions', start entered command.
Note: If your <Esc> key is hard to hit on your keyboard, train
yourself to use CTRL-[.
+ *c_META* *c_ALT*
+ ALT (|META|) acts like <Esc> if the chord is not mapped.
+ For example <A-x> acts like <Esc>x if <A-x> does not have a
+ command-line mode mapping.
*c_CTRL-C*
CTRL-C quit command-line without executing
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 5127a9f390..0f848d0c27 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -38,7 +38,9 @@ List An ordered sequence of items |List|.
Dictionary An associative, unordered array: Each entry has a key and a
value. |Dictionary|
- Example: {'blue': "#0000ff", 'red': "#ff0000"}
+ Examples:
+ {'blue': "#0000ff", 'red': "#ff0000"}
+ #{blue: "#0000ff", red: "#ff0000"}
The Number and String types are converted automatically, depending on how they
are used.
@@ -436,8 +438,14 @@ only appear once. Examples: >
A key is always a String. You can use a Number, it will be converted to a
String automatically. Thus the String '4' and the number 4 will find the same
entry. Note that the String '04' and the Number 04 are different, since the
-Number will be converted to the String '4'. The empty string can be used as a
-key.
+Number will be converted to the String '4'. The empty string can also be used
+as a key.
+ *literal-Dict*
+To avoid having to put quotes around every key the #{} form can be used. This
+does require the key to consist only of ASCII letters, digits, '-' and '_'.
+Example: >
+ let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
+Note that 333 here is the string "333". Empty keys are not possible with #{}.
A value can be any expression. Using a Dictionary for a value creates a
nested Dictionary: >
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index e53af5074b..c4b93a2a27 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -42,9 +42,9 @@ char action ~
abbreviation.
Note: If your <Esc> key is hard to hit, try CTRL-[ instead.
*i_META* *i_ALT*
- ALT (|META|) acts like <Esc> if the chord is not mapped.
+ ALT (|META|) acts like <Esc> if the chord is not mapped.
For example <A-x> acts like <Esc>x if <A-x> does not have an
- insert-mode mapping.
+ insert-mode mapping.
*i_CTRL-C*
CTRL-C Quit insert mode, go back to Normal mode. Do not check for
abbreviations. Does not trigger the |InsertLeave| autocommand
diff --git a/runtime/doc/intro.txt b/runtime/doc/intro.txt
index 59b1f44e39..d858985e3f 100644
--- a/runtime/doc/intro.txt
+++ b/runtime/doc/intro.txt
@@ -382,6 +382,8 @@ Note:
<k1>, ..., <k9> and <kPoint> will not work.
- Nvim supports mapping multibyte chars with modifiers such as `<M-รค>`. Which
combinations actually work depends on the the UI or host terminal.
+- When a key is pressed using a meta or alt modifier and no mapping exists
+ for that keypress, Nvim behaves as though <Esc> was pressed before the key.
*<>*
Examples are often given in the <> notation. Sometimes this is just to make
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index b32775bc82..44b611c2cf 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -39,9 +39,10 @@ To check LSP clients attached to the current buffer: >
*lsp-config*
Inline diagnostics are enabled automatically, e.g. syntax errors will be
annotated in the buffer. But you probably want to use other features like
-go-to-definition, hover, etc. Example config: >
+go-to-definition, hover, etc. Full list of features in |vim.lsp.buf|.
+
+Example config: >
- nnoremap <silent> gd <cmd>lua vim.lsp.buf.declaration()<CR>
nnoremap <silent> <c-]> <cmd>lua vim.lsp.buf.definition()<CR>
nnoremap <silent> K <cmd>lua vim.lsp.buf.hover()<CR>
nnoremap <silent> gD <cmd>lua vim.lsp.buf.implementation()<CR>
@@ -50,6 +51,9 @@ go-to-definition, hover, etc. Example config: >
nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR>
nnoremap <silent> g0 <cmd>lua vim.lsp.buf.document_symbol()<CR>
nnoremap <silent> gW <cmd>lua vim.lsp.buf.workspace_symbol()<CR>
+ nnoremap <silent> gd <cmd>lua vim.lsp.buf.declaration()<CR>
+
+Note: Language servers may have limited support for these features.
Nvim provides the |vim.lsp.omnifunc| 'omnifunc' handler which allows
|i_CTRL-X_CTRL-O| to consume LSP completion. Example config (note the use of
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
index 509ed7bf2c..a53024d420 100644
--- a/runtime/doc/lua.txt
+++ b/runtime/doc/lua.txt
@@ -551,290 +551,6 @@ Example: TCP echo-server *tcp-server*
print('TCP echo-server listening on port: '..server:getsockname().port)
------------------------------------------------------------------------------
-VIM.TREESITTER *lua-treesitter*
-
-Nvim integrates the tree-sitter library for incremental parsing of buffers.
-
-Currently Nvim does not provide the tree-sitter parsers, instead these must
-be built separately, for instance using the tree-sitter utility. The only
-exception is a C parser being included in official builds for testing
-purposes. Parsers are searched for as `parser/{lang}.*` in any 'runtimepath'
-directory. A parser can also be loaded manually using a full path: >
-
- vim.treesitter.require_language("python", "/path/to/python.so")
-
-<Create a parser for a buffer and a given language (if another plugin uses the
-same buffer/language combination, it will be safely reused). Use >
-
- parser = vim.treesitter.get_parser(bufnr, lang)
-
-<`bufnr=0` can be used for current buffer. `lang` will default to 'filetype' (this
-doesn't work yet for some filetypes like "cpp") Currently, the parser will be
-retained for the lifetime of a buffer but this is subject to change. A plugin
-should keep a reference to the parser object as long as it wants incremental
-updates.
-
-Parser files *treesitter-parsers*
-
-Parsers are the heart of tree-sitter. They are libraries that tree-sitter will
-search for in the `parsers` runtime directory.
-
-For a parser to be available for a given language, there must be a file named
-`{lang}.so` within the parser directory.
-
-Parser methods *lua-treesitter-parser*
-
-tsparser:parse() *tsparser:parse()*
-Whenever you need to access the current syntax tree, parse the buffer: >
-
- tstree = parser:parse()
-
-<This will return an immutable tree that represents the current state of the
-buffer. When the plugin wants to access the state after a (possible) edit
-it should call `parse()` again. If the buffer wasn't edited, the same tree will
-be returned again without extra work. If the buffer was parsed before,
-incremental parsing will be done of the changed parts.
-
-NB: to use the parser directly inside a |nvim_buf_attach| Lua callback, you must
-call `get_parser()` before you register your callback. But preferably parsing
-shouldn't be done directly in the change callback anyway as they will be very
-frequent. Rather a plugin that does any kind of analysis on a tree should use
-a timer to throttle too frequent updates.
-
-tsparser:set_included_ranges({ranges}) *tsparser:set_included_ranges()*
- Changes the ranges the parser should consider. This is used for
- language injection. {ranges} should be of the form (all zero-based): >
- {
- {start_node, end_node},
- ...
- }
-<
- NOTE: `start_node` and `end_node` are both inclusive.
-
-Tree methods *lua-treesitter-tree*
-
-tstree:root() *tstree:root()*
- Return the root node of this tree.
-
-
-Node methods *lua-treesitter-node*
-
-tsnode:parent() *tsnode:parent()*
- Get the node's immediate parent.
-
-tsnode:iter_children() *tsnode:iter_children()*
- Iterates over all the direct children of {tsnode}, regardless of
- wether they are named or not.
- Returns the child node plus the eventual field name corresponding to
- this child node.
-
-tsnode:field({name}) *tsnode:field()*
- Returns a table of the nodes corresponding to the {name} field.
-
-tsnode:child_count() *tsnode:child_count()*
- Get the node's number of children.
-
-tsnode:child({index}) *tsnode:child()*
- Get the node's child at the given {index}, where zero represents the
- first child.
-
-tsnode:named_child_count() *tsnode:named_child_count()*
- Get the node's number of named children.
-
-tsnode:named_child({index}) *tsnode:named_child()*
- Get the node's named child at the given {index}, where zero represents
- the first named child.
-
-tsnode:start() *tsnode:start()*
- Get the node's start position. Return three values: the row, column
- and total byte count (all zero-based).
-
-tsnode:end_() *tsnode:end_()*
- Get the node's end position. Return three values: the row, column
- and total byte count (all zero-based).
-
-tsnode:range() *tsnode:range()*
- Get the range of the node. Return four values: the row, column
- of the start position, then the row, column of the end position.
-
-tsnode:type() *tsnode:type()*
- Get the node's type as a string.
-
-tsnode:symbol() *tsnode:symbol()*
- Get the node's type as a numerical id.
-
-tsnode:named() *tsnode:named()*
- Check if the node is named. Named nodes correspond to named rules in
- the grammar, whereas anonymous nodes correspond to string literals
- in the grammar.
-
-tsnode:missing() *tsnode:missing()*
- Check if the node is missing. Missing nodes are inserted by the
- parser in order to recover from certain kinds of syntax errors.
-
-tsnode:has_error() *tsnode:has_error()*
- Check if the node is a syntax error or contains any syntax errors.
-
-tsnode:sexpr() *tsnode:sexpr()*
- Get an S-expression representing the node as a string.
-
-tsnode:descendant_for_range({start_row}, {start_col}, {end_row}, {end_col})
- *tsnode:descendant_for_range()*
- Get the smallest node within this node that spans the given range of
- (row, column) positions
-
-tsnode:named_descendant_for_range({start_row}, {start_col}, {end_row}, {end_col})
- *tsnode:named_descendant_for_range()*
- Get the smallest named node within this node that spans the given
- range of (row, column) positions
-
-Query methods *lua-treesitter-query*
-
-Tree-sitter queries are supported, with some limitations. Currently, the only
-supported match predicate is `eq?` (both comparing a capture against a string
-and two captures against each other).
-
-vim.treesitter.parse_query({lang}, {query})
- *vim.treesitter.parse_query()*
- Parse {query} as a string. (If the query is in a file, the caller
- should read the contents into a string before calling).
-
-query:iter_captures({node}, {bufnr}, {start_row}, {end_row})
- *query:iter_captures()*
- Iterate over all captures from all matches inside {node}.
- {bufnr} is needed if the query contains predicates, then the caller
- must ensure to use a freshly parsed tree consistent with the current
- text of the buffer. {start_row} and {end_row} can be used to limit
- matches inside a row range (this is typically used with root node
- as the node, i e to get syntax highlight matches in the current
- viewport)
-
- The iterator returns two values, a numeric id identifying the capture
- and the captured node. The following example shows how to get captures
- by name:
->
- for id, node in query:iter_captures(tree:root(), bufnr, first, last) do
- local name = query.captures[id] -- name of the capture in the query
- -- typically useful info about the node:
- local type = node:type() -- type of the captured node
- local row1, col1, row2, col2 = node:range() -- range of the capture
- ... use the info here ...
- end
-<
-query:iter_matches({node}, {bufnr}, {start_row}, {end_row})
- *query:iter_matches()*
- Iterate over all matches within a node. The arguments are the same as
- for |query:iter_captures()| but the iterated values are different:
- an (1-based) index of the pattern in the query, and a table mapping
- capture indices to nodes. If the query has more than one pattern
- the capture table might be sparse, and e.g. `pairs` should be used and not
- `ipairs`. Here an example iterating over all captures in
- every match:
->
- for pattern, match in cquery:iter_matches(tree:root(), bufnr, first, last) do
- for id,node in pairs(match) do
- local name = query.captures[id]
- -- `node` was captured by the `name` capture in the match
- ... use the info here ...
- end
- end
-
-Treesitter Query Predicates *lua-treesitter-predicates*
-
-When writing queries for treesitter, one might use `predicates`, that is,
-special scheme nodes that are evaluted to verify things on a captured node for
-example, the |eq?| predicate : >
- ((identifier) @foo (#eq? @foo "foo"))
-
-This will only match identifier corresponding to the `"foo"` text.
-Here is a list of built-in predicates :
-
- `eq?` *ts-predicate-eq?*
- This predicate will check text correspondance between nodes or
- strings : >
- ((identifier) @foo (#eq? @foo "foo"))
- ((node1) @left (node2) @right (#eq? @left @right))
-<
- `match?` *ts-predicate-match?*
- `vim-match?` *ts-predicate-vim-match?*
- This will match if the provived vim regex matches the text
- corresponding to a node : >
- ((idenfitier) @constant (#match? @constant "^[A-Z_]+$"))
-< Note: the `^` and `$` anchors will respectively match the
- start and end of the node's text.
-
- `lua-match?` *ts-predicate-lua-match?*
- This will match the same way than |match?| but using lua
- regexes.
-
- `contains?` *ts-predicate-contains?*
- Will check if any of the following arguments appears in the
- text corresponding to the node : >
- ((identifier) @foo (#contains? @foo "foo"))
- ((identifier) @foo-bar (#contains @foo-bar "foo" "bar"))
-<
- *lua-treesitter-not-predicate*
-Each predicate has a `not-` prefixed predicate that is just the negation of
-the predicate.
-
- *vim.treesitter.query.add_predicate()*
-vim.treesitter.query.add_predicate({name}, {handler})
-
-This adds a predicate with the name {name} to be used in queries.
-{handler} should be a function whose signature will be : >
- handler(match, pattern, bufnr, predicate)
-<
- *vim.treesitter.query.list_predicates()*
-vim.treesitter.query.list_predicates()
-
-This lists the currently available predicates to use in queries.
-
-Treesitter syntax highlighting (WIP) *lua-treesitter-highlight*
-
-NOTE: This is a partially implemented feature, and not usable as a default
-solution yet. What is documented here is a temporary interface indented
-for those who want to experiment with this feature and contribute to
-its development.
-
-Highlights are defined in the same query format as in the tree-sitter highlight
-crate, which some limitations and additions. Set a highlight query for a
-buffer with this code: >
-
- local query = [[
- "for" @keyword
- "if" @keyword
- "return" @keyword
-
- (string_literal) @string
- (number_literal) @number
- (comment) @comment
-
- (preproc_function_def name: (identifier) @function)
-
- ; ... more definitions
- ]]
-
- highlighter = vim.treesitter.TSHighlighter.new(query, bufnr, lang)
- -- alternatively, to use the current buffer and its filetype:
- -- highlighter = vim.treesitter.TSHighlighter.new(query)
-
- -- Don't recreate the highlighter for the same buffer, instead
- -- modify the query like this:
- local query2 = [[ ... ]]
- highlighter:set_query(query2)
-
-As mentioned above the supported predicate is currently only `eq?`. `match?`
-predicates behave like matching always fails. As an addition a capture which
-begin with an upper-case letter like `@WarningMsg` will map directly to this
-highlight group, if defined. Also if the predicate begins with upper-case and
-contains a dot only the part before the first will be interpreted as the
-highlight group. As an example, this warns of a binary expression with two
-identical identifiers, highlighting both as |hl-WarningMsg|: >
-
- ((binary_expression left: (identifier) @WarningMsg.left right: (identifier) @WarningMsg.right)
- (eq? @WarningMsg.left @WarningMsg.right))
-
-------------------------------------------------------------------------------
VIM.HIGHLIGHT *lua-highlight*
Nvim includes a function for highlighting a selection on yank (see for example
@@ -1021,13 +737,20 @@ vim.defer_fn({fn}, {timeout}) *vim.defer_fn*
Returns: ~
|vim.loop|.new_timer() object
-vim.wait({time}, {callback} [, {interval}]) *vim.wait()*
+vim.wait({time} [, {callback}, {interval}, {fast_only}]) *vim.wait()*
Wait for {time} in milliseconds until {callback} returns `true`.
Executes {callback} immediately and at approximately {interval}
milliseconds (default 200). Nvim still processes other events during
this time.
+ Parameters: ~
+ {time} Number of milliseconds to wait
+ {callback} Optional callback. Waits until {callback} returns true
+ {interval} (Approximate) number of milliseconds to wait between polls
+ {fast_only} If true, only |api-fast| events will be processed.
+ If called from while in an |api-fast| event, will
+ automatically be set to `true`.
Returns: ~
If {callback} returns `true` during the {time}:
@@ -1567,4 +1290,46 @@ validate({opt}) *vim.validate()*
โ€ข msg: (optional) error string if validation
fails
+
+==============================================================================
+Lua module: uri *lua-uri*
+
+uri_from_bufnr({bufnr}) *vim.uri_from_bufnr()*
+ Get a URI from a bufnr
+
+ Parameters: ~
+ {bufnr} (number): Buffer number
+
+ Return: ~
+ URI
+
+uri_from_fname({path}) *vim.uri_from_fname()*
+ Get a URI from a file path.
+
+ Parameters: ~
+ {path} (string): Path to file
+
+ Return: ~
+ URI
+
+uri_to_bufnr({uri}) *vim.uri_to_bufnr()*
+ Return or create a buffer for a uri.
+
+ Parameters: ~
+ {uri} (string): The URI
+
+ Return: ~
+ bufnr.
+ Note:
+ Creates buffer but does not load it
+
+uri_to_fname({uri}) *vim.uri_to_fname()*
+ Get a filename from a URI
+
+ Parameters: ~
+ {uri} (string): The URI
+
+ Return: ~
+ Filename
+
vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 190d6f9229..beb5e9f4c2 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2738,21 +2738,26 @@ A jump table for the options with a short description can be found at |Q_op|.
hor{N} horizontal bar, {N} percent of the character height
ver{N} vertical bar, {N} percent of the character width
block block cursor, fills the whole character
- [only one of the above three should be present]
+ - Only one of the above three should be present.
+ - Default is "block" for each mode.
blinkwait{N} *cursor-blinking*
blinkon{N}
blinkoff{N}
blink times for cursor: blinkwait is the delay before
the cursor starts blinking, blinkon is the time that
the cursor is shown and blinkoff is the time that the
- cursor is not shown. The times are in msec. When one
- of the numbers is zero, there is no blinking. E.g.: >
+ cursor is not shown. Times are in msec. When one of
+ the numbers is zero, there is no blinking. E.g.: >
:set guicursor=n:blinkon0
-< {group-name}
- Highlight group name that sets the color and font for
- the cursor. |inverse|/reverse and no group-name are
- interpreted as "the host terminal default cursor
- colors" which usually invert bg and fg colors.
+< - Default is "blinkon0" for each mode.
+ {group-name}
+ Highlight group that decides the color and font of the
+ cursor.
+ In the |TUI|:
+ - |inverse|/reverse and no group-name are interpreted
+ as "host-terminal default cursor colors" which
+ typically means "inverted bg and fg colors".
+ - |ctermfg| and |guifg| are ignored.
{group-name}/{group-name}
Two highlight group names, the first is used when
no language mappings are used, the other when they
@@ -5667,6 +5672,14 @@ A jump table for the options with a short description can be found at |Q_op|.
up to the first character that is not an ASCII letter or number and
not a dash. Also see |set-spc-auto|.
+ *'spelloptions'* *'spo'*
+'spelloptions' 'spo' string (default "")
+ local to buffer
+ A comma separated list of options for spell checking:
+ camel When a word is CamelCased, assume "Cased" is a
+ separate word: every upper-case character in a word
+ that comes after a lower case character indicates the
+ start of a new word.
*'spellsuggest'* *'sps'*
'spellsuggest' 'sps' string (default "best")
@@ -6492,7 +6505,9 @@ A jump table for the options with a short description can be found at |Q_op|.
>= 12 Every executed function.
>= 13 When an exception is thrown, caught, finished, or discarded.
>= 14 Anything pending in a ":finally" clause.
- >= 15 Every executed Ex command (truncated at 200 characters).
+ >= 15 Every executed Ex command from a script (truncated at 200
+ characters).
+ >= 16 Every executed Ex command
This option can also be set with the "-V" argument. See |-V|.
This option is also set by the |:verbose| command.
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index 61e090cc78..188cfc91b6 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -501,6 +501,29 @@ EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
< Otherwise it works the same as `:ldo`.
{not in Vi}
+FILTERING A QUICKFIX OR LOCATION LIST:
+ *cfilter-plugin* *:Cfilter* *:Lfilter*
+If you have too many entries in a quickfix list, you can use the cfilter
+plugin to reduce the number of entries. Load the plugin with: >
+
+ packadd cfilter
+
+Then you can use the following commands to filter a quickfix/location list: >
+
+ :Cfilter[!] /{pat}/
+ :Lfilter[!] /{pat}/
+
+The |:Cfilter| command creates a new quickfix list from the entries matching
+{pat} in the current quickfix list. {pat} is a Vim |regular-expression|
+pattern. Both the file name and the text of the entries are matched against
+{pat}. If the optional ! is supplied, then the entries not matching {pat} are
+used. The pattern can be optionally enclosed using one of the following
+characters: ', ", /. If the pattern is empty, then the last used search
+pattern is used.
+
+The |:Lfilter| command does the same as |:Cfilter| but operates on the current
+location list.
+
=============================================================================
2. The error window *quickfix-window*
@@ -1563,22 +1586,6 @@ The backslashes before the pipe character are required to avoid it to be
recognized as a command separator. The backslash before each space is
required for the set command.
- *cfilter-plugin* *:Cfilter* *:Lfilter*
-If you have too many matching messages, you can use the cfilter plugin to
-reduce the number of entries. Load the plugin with: >
- packadd cfilter
-
-Then you can use these command: >
- :Cfilter[!] /{pat}/
- :Lfilter[!] /{pat}/
-
-:Cfilter creates a new quickfix list from entries matching {pat} in the
-current quickfix list. Both the file name and the text of the entries are
-matched against {pat}. If ! is supplied, then entries not matching {pat} are
-used.
-
-:Lfilter does the same as :Cfilter but operates on the current location list.
-
=============================================================================
8. The directory stack *quickfix-directory-stack*
diff --git a/runtime/doc/spell.txt b/runtime/doc/spell.txt
index b88e26cdff..0eef976819 100644
--- a/runtime/doc/spell.txt
+++ b/runtime/doc/spell.txt
@@ -187,6 +187,9 @@ When there is a line break right after a sentence the highlighting of the next
line may be postponed. Use |CTRL-L| when needed. Also see |set-spc-auto| for
how it can be set automatically when 'spelllang' is set.
+The 'spelloptions' option has a few more flags that influence the way spell
+checking works.
+
Vim counts the number of times a good word is encountered. This is used to
sort the suggestions: words that have been seen before get a small bonus,
words that have been seen often get a bigger bonus. The COMMON item in the
@@ -617,11 +620,12 @@ ask you where to write the file (there must be a writable directory in
'runtimepath' for this).
The plugin has a default place where to look for spell files, on the Vim ftp
-server. If you want to use another location or another protocol, set the
-g:spellfile_URL variable to the directory that holds the spell files. The
-|netrw| plugin is used for getting the file, look there for the specific
-syntax of the URL. Example: >
- let g:spellfile_URL = 'http://ftp.vim.org/vim/runtime/spell'
+server. The protocol used is SSL (https://) for security. If you want to use
+another location or another protocol, set the g:spellfile_URL variable to the
+directory that holds the spell files. You can use http:// or ftp://, but you
+are taking a security risk then. The |netrw| plugin is used for getting the
+file, look there for the specific syntax of the URL. Example: >
+ let g:spellfile_URL = 'https://ftp.nluug.nl/vim/runtime/spell'
You may need to escape special characters.
The plugin will only ask about downloading a language once. If you want to
diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt
new file mode 100644
index 0000000000..7f644486f7
--- /dev/null
+++ b/runtime/doc/treesitter.txt
@@ -0,0 +1,295 @@
+*treesitter.txt* Nvim
+
+
+ NVIM REFERENCE MANUAL
+
+
+Tree-sitter integration *treesitter*
+
+ Type |gO| to see the table of contents.
+
+------------------------------------------------------------------------------
+VIM.TREESITTER *lua-treesitter*
+
+Nvim integrates the tree-sitter library for incremental parsing of buffers.
+
+Currently Nvim does not provide the tree-sitter parsers, instead these must
+be built separately, for instance using the tree-sitter utility. The only
+exception is a C parser being included in official builds for testing
+purposes. Parsers are searched for as `parser/{lang}.*` in any 'runtimepath'
+directory. A parser can also be loaded manually using a full path: >
+
+ vim.treesitter.require_language("python", "/path/to/python.so")
+
+<Create a parser for a buffer and a given language (if another plugin uses the
+same buffer/language combination, it will be safely reused). Use >
+
+ parser = vim.treesitter.get_parser(bufnr, lang)
+
+<`bufnr=0` can be used for current buffer. `lang` will default to 'filetype' (this
+doesn't work yet for some filetypes like "cpp") Currently, the parser will be
+retained for the lifetime of a buffer but this is subject to change. A plugin
+should keep a reference to the parser object as long as it wants incremental
+updates.
+
+Parser files *treesitter-parsers*
+
+Parsers are the heart of tree-sitter. They are libraries that tree-sitter will
+search for in the `parser` runtime directory.
+
+For a parser to be available for a given language, there must be a file named
+`{lang}.so` within the parser directory.
+
+Parser methods *lua-treesitter-parser*
+
+tsparser:parse() *tsparser:parse()*
+Whenever you need to access the current syntax tree, parse the buffer: >
+
+ tstree = parser:parse()
+
+<This will return an immutable tree that represents the current state of the
+buffer. When the plugin wants to access the state after a (possible) edit
+it should call `parse()` again. If the buffer wasn't edited, the same tree will
+be returned again without extra work. If the buffer was parsed before,
+incremental parsing will be done of the changed parts.
+
+NB: to use the parser directly inside a |nvim_buf_attach| Lua callback, you must
+call `get_parser()` before you register your callback. But preferably parsing
+shouldn't be done directly in the change callback anyway as they will be very
+frequent. Rather a plugin that does any kind of analysis on a tree should use
+a timer to throttle too frequent updates.
+
+tsparser:set_included_ranges({ranges}) *tsparser:set_included_ranges()*
+ Changes the ranges the parser should consider. This is used for
+ language injection. {ranges} should be of the form (all zero-based): >
+ {
+ {start_node, end_node},
+ ...
+ }
+<
+ NOTE: `start_node` and `end_node` are both inclusive.
+
+Tree methods *lua-treesitter-tree*
+
+tstree:root() *tstree:root()*
+ Return the root node of this tree.
+
+
+Node methods *lua-treesitter-node*
+
+tsnode:parent() *tsnode:parent()*
+ Get the node's immediate parent.
+
+tsnode:iter_children() *tsnode:iter_children()*
+ Iterates over all the direct children of {tsnode}, regardless of
+ wether they are named or not.
+ Returns the child node plus the eventual field name corresponding to
+ this child node.
+
+tsnode:field({name}) *tsnode:field()*
+ Returns a table of the nodes corresponding to the {name} field.
+
+tsnode:child_count() *tsnode:child_count()*
+ Get the node's number of children.
+
+tsnode:child({index}) *tsnode:child()*
+ Get the node's child at the given {index}, where zero represents the
+ first child.
+
+tsnode:named_child_count() *tsnode:named_child_count()*
+ Get the node's number of named children.
+
+tsnode:named_child({index}) *tsnode:named_child()*
+ Get the node's named child at the given {index}, where zero represents
+ the first named child.
+
+tsnode:start() *tsnode:start()*
+ Get the node's start position. Return three values: the row, column
+ and total byte count (all zero-based).
+
+tsnode:end_() *tsnode:end_()*
+ Get the node's end position. Return three values: the row, column
+ and total byte count (all zero-based).
+
+tsnode:range() *tsnode:range()*
+ Get the range of the node. Return four values: the row, column
+ of the start position, then the row, column of the end position.
+
+tsnode:type() *tsnode:type()*
+ Get the node's type as a string.
+
+tsnode:symbol() *tsnode:symbol()*
+ Get the node's type as a numerical id.
+
+tsnode:named() *tsnode:named()*
+ Check if the node is named. Named nodes correspond to named rules in
+ the grammar, whereas anonymous nodes correspond to string literals
+ in the grammar.
+
+tsnode:missing() *tsnode:missing()*
+ Check if the node is missing. Missing nodes are inserted by the
+ parser in order to recover from certain kinds of syntax errors.
+
+tsnode:has_error() *tsnode:has_error()*
+ Check if the node is a syntax error or contains any syntax errors.
+
+tsnode:sexpr() *tsnode:sexpr()*
+ Get an S-expression representing the node as a string.
+
+tsnode:descendant_for_range({start_row}, {start_col}, {end_row}, {end_col})
+ *tsnode:descendant_for_range()*
+ Get the smallest node within this node that spans the given range of
+ (row, column) positions
+
+tsnode:named_descendant_for_range({start_row}, {start_col}, {end_row}, {end_col})
+ *tsnode:named_descendant_for_range()*
+ Get the smallest named node within this node that spans the given
+ range of (row, column) positions
+
+Query methods *lua-treesitter-query*
+
+Tree-sitter queries are supported, with some limitations. Currently, the only
+supported match predicate is `eq?` (both comparing a capture against a string
+and two captures against each other).
+
+vim.treesitter.parse_query({lang}, {query})
+ *vim.treesitter.parse_query()*
+ Parse {query} as a string. (If the query is in a file, the caller
+ should read the contents into a string before calling).
+
+query:iter_captures({node}, {bufnr}, {start_row}, {end_row})
+ *query:iter_captures()*
+ Iterate over all captures from all matches inside {node}.
+ {bufnr} is needed if the query contains predicates, then the caller
+ must ensure to use a freshly parsed tree consistent with the current
+ text of the buffer. {start_row} and {end_row} can be used to limit
+ matches inside a row range (this is typically used with root node
+ as the node, i e to get syntax highlight matches in the current
+ viewport)
+
+ The iterator returns two values, a numeric id identifying the capture
+ and the captured node. The following example shows how to get captures
+ by name:
+>
+ for id, node in query:iter_captures(tree:root(), bufnr, first, last) do
+ local name = query.captures[id] -- name of the capture in the query
+ -- typically useful info about the node:
+ local type = node:type() -- type of the captured node
+ local row1, col1, row2, col2 = node:range() -- range of the capture
+ ... use the info here ...
+ end
+<
+query:iter_matches({node}, {bufnr}, {start_row}, {end_row})
+ *query:iter_matches()*
+ Iterate over all matches within a node. The arguments are the same as
+ for |query:iter_captures()| but the iterated values are different:
+ an (1-based) index of the pattern in the query, and a table mapping
+ capture indices to nodes. If the query has more than one pattern
+ the capture table might be sparse, and e.g. `pairs` should be used and not
+ `ipairs`. Here an example iterating over all captures in
+ every match:
+>
+ for pattern, match in cquery:iter_matches(tree:root(), bufnr, first, last) do
+ for id,node in pairs(match) do
+ local name = query.captures[id]
+ -- `node` was captured by the `name` capture in the match
+ ... use the info here ...
+ end
+ end
+
+Treesitter Query Predicates *lua-treesitter-predicates*
+
+When writing queries for treesitter, one might use `predicates`, that is,
+special scheme nodes that are evaluted to verify things on a captured node for
+example, the |eq?| predicate : >
+ ((identifier) @foo (#eq? @foo "foo"))
+
+This will only match identifier corresponding to the `"foo"` text.
+Here is a list of built-in predicates :
+
+ `eq?` *ts-predicate-eq?*
+ This predicate will check text correspondance between nodes or
+ strings : >
+ ((identifier) @foo (#eq? @foo "foo"))
+ ((node1) @left (node2) @right (#eq? @left @right))
+<
+ `match?` *ts-predicate-match?*
+ `vim-match?` *ts-predicate-vim-match?*
+ This will match if the provived vim regex matches the text
+ corresponding to a node : >
+ ((idenfitier) @constant (#match? @constant "^[A-Z_]+$"))
+< Note: the `^` and `$` anchors will respectively match the
+ start and end of the node's text.
+
+ `lua-match?` *ts-predicate-lua-match?*
+ This will match the same way than |match?| but using lua
+ regexes.
+
+ `contains?` *ts-predicate-contains?*
+ Will check if any of the following arguments appears in the
+ text corresponding to the node : >
+ ((identifier) @foo (#contains? @foo "foo"))
+ ((identifier) @foo-bar (#contains @foo-bar "foo" "bar"))
+<
+ *lua-treesitter-not-predicate*
+Each predicate has a `not-` prefixed predicate that is just the negation of
+the predicate.
+
+ *vim.treesitter.query.add_predicate()*
+vim.treesitter.query.add_predicate({name}, {handler})
+
+This adds a predicate with the name {name} to be used in queries.
+{handler} should be a function whose signature will be : >
+ handler(match, pattern, bufnr, predicate)
+<
+ *vim.treesitter.query.list_predicates()*
+vim.treesitter.query.list_predicates()
+
+This lists the currently available predicates to use in queries.
+
+Treesitter syntax highlighting (WIP) *lua-treesitter-highlight*
+
+NOTE: This is a partially implemented feature, and not usable as a default
+solution yet. What is documented here is a temporary interface indented
+for those who want to experiment with this feature and contribute to
+its development.
+
+Highlights are defined in the same query format as in the tree-sitter highlight
+crate, which some limitations and additions. Set a highlight query for a
+buffer with this code: >
+
+ local query = [[
+ "for" @keyword
+ "if" @keyword
+ "return" @keyword
+
+ (string_literal) @string
+ (number_literal) @number
+ (comment) @comment
+
+ (preproc_function_def name: (identifier) @function)
+
+ ; ... more definitions
+ ]]
+
+ highlighter = vim.treesitter.TSHighlighter.new(query, bufnr, lang)
+ -- alternatively, to use the current buffer and its filetype:
+ -- highlighter = vim.treesitter.TSHighlighter.new(query)
+
+ -- Don't recreate the highlighter for the same buffer, instead
+ -- modify the query like this:
+ local query2 = [[ ... ]]
+ highlighter:set_query(query2)
+
+As mentioned above the supported predicate is currently only `eq?`. `match?`
+predicates behave like matching always fails. As an addition a capture which
+begin with an upper-case letter like `@WarningMsg` will map directly to this
+highlight group, if defined. Also if the predicate begins with upper-case and
+contains a dot only the part before the first will be interpreted as the
+highlight group. As an example, this warns of a binary expression with two
+identical identifiers, highlighting both as |hl-WarningMsg|: >
+
+ ((binary_expression left: (identifier) @WarningMsg.left right: (identifier) @WarningMsg.right)
+ (eq? @WarningMsg.left @WarningMsg.right))
+
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 4bcea3e3fe..ae60c1c5e8 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -195,7 +195,7 @@ Input/Mappings:
<M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc.
Case-sensitive: <M-a> and <M-A> are two different keycodes.
- ALT in insert-mode behaves like <Esc> if not mapped. |i_ALT|
+ ALT behaves like <Esc> if not mapped. |i_ALT| |v_ALT| |c_ALT|
Normal commands:
|g<Tab>| goes to the last-accessed tabpage.
@@ -508,7 +508,6 @@ Test functions:
test_alloc_fail()
test_autochdir()
test_disable_char_avail()
- test_garbagecollect_now()
test_null_channel()
test_null_dict()
test_null_job()
diff --git a/runtime/doc/visual.txt b/runtime/doc/visual.txt
index 0052382044..fd3d93ed98 100644
--- a/runtime/doc/visual.txt
+++ b/runtime/doc/visual.txt
@@ -159,7 +159,10 @@ If you want to highlight exactly the same area as the last time, you can use
*v_<Esc>*
<Esc> In Visual mode: Stop Visual mode.
-
+ *v_META* *v_ALT*
+ ALT (|META|) acts like <Esc> if the chord is not mapped.
+ For example <A-x> acts like <Esc>x if <A-x> does not have a
+ visual-mode mapping.
*v_CTRL-C*
CTRL-C In Visual mode: Stop Visual mode. When insert mode is
pending (the mode message shows
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 32bd6daba0..7accc22b3d 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -313,7 +313,7 @@ au BufNewFile,BufRead *.css setf css
au BufNewFile,BufRead *.con setf cterm
" Changelog
-au BufNewFile,BufRead changelog.Debian,changelog.dch,NEWS.Debian,NEWS.dch
+au BufNewFile,BufRead changelog.Debian,changelog.dch,NEWS.Debian,NEWS.dch,*/debian/changelog
\ setf debchangelog
au BufNewFile,BufRead [cC]hange[lL]og
@@ -1158,10 +1158,10 @@ au BufNewFile,BufRead *.papp,*.pxml,*.pxsl setf papp
au BufNewFile,BufRead */etc/passwd,*/etc/passwd-,*/etc/passwd.edit,*/etc/shadow,*/etc/shadow-,*/etc/shadow.edit,*/var/backups/passwd.bak,*/var/backups/shadow.bak setf passwd
" Pascal (also *.p)
-au BufNewFile,BufRead *.pas setf pascal
+au BufNewFile,BufRead *.pas,*.pp setf pascal
-" Delphi project file
-au BufNewFile,BufRead *.dpr setf pascal
+" Delphi or Lazarus program file
+au BufNewFile,BufRead *.dpr,*.lpr setf pascal
" PDF
au BufNewFile,BufRead *.pdf setf pdf
@@ -1732,7 +1732,7 @@ au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo
au BufNewFile,BufRead texmf.cnf setf texmf
" Tidy config
-au BufNewFile,BufRead .tidyrc,tidyrc setf tidy
+au BufNewFile,BufRead .tidyrc,tidyrc,tidy.conf setf tidy
" TF mud client
au BufNewFile,BufRead *.tf,.tfrc,tfrc setf tf
diff --git a/runtime/ftplugin/typescript.vim b/runtime/ftplugin/typescript.vim
new file mode 100644
index 0000000000..f701ae96cd
--- /dev/null
+++ b/runtime/ftplugin/typescript.vim
@@ -0,0 +1,39 @@
+" Vim filetype plugin file
+" Language: TypeScript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Aug 30
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//%s
+
+setlocal suffixesadd+=.ts,.d.ts,.tsx,.js,.jsx,.cjs,.mjs
+
+" Change the :browse e filter to primarily show TypeScript-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="TypeScript Files (*.ts)\t*.ts\n" .
+ \ "TypeScript Declaration Files (*.d.ts)\t*.d.ts\n" .
+ \ "TSX Files (*.tsx)\t*.tsx\n" .
+ \ "JavaScript Files (*.js)\t*.js\n" .
+ \ "JavaScript Modules (*.es, *.cjs, *.mjs)\t*.es;*.cjs;*.mjs\n" .
+ \ "JSON Files (*.json)\t*.json\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms< sua< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/typescriptreact.vim b/runtime/ftplugin/typescriptreact.vim
new file mode 100644
index 0000000000..3bd6001a18
--- /dev/null
+++ b/runtime/ftplugin/typescriptreact.vim
@@ -0,0 +1,33 @@
+" Vim filetype plugin file
+" Language: TypeScript React
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 09
+
+let s:match_words = ""
+let s:undo_ftplugin = ""
+
+runtime! ftplugin/typescript.vim
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if exists("b:match_words")
+ let s:match_words = b:match_words
+endif
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words = s:match_words .
+ \ '<:>,' .
+ \ '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,' .
+ \ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+let b:undo_ftplugin = "unlet! b:match_words b:match_ignorecase | " . s:undo_ftplugin
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/typescript.vim b/runtime/indent/typescript.vim
index 69accaa054..b6b2cb5acf 100644
--- a/runtime/indent/typescript.vim
+++ b/runtime/indent/typescript.vim
@@ -1,7 +1,7 @@
" Vim indent file
" Language: TypeScript
" Maintainer: See https://github.com/HerringtonDarkholme/yats.vim
-" Last Change: 2019 Jun 06
+" Last Change: 2019 Oct 18
" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org
" 0. Initialization {{{1
@@ -442,7 +442,7 @@ let &cpo = s:cpo_save
unlet s:cpo_save
function! Fixedgq(lnum, count)
- let l:tw = &tw ? &tw : 80;
+ let l:tw = &tw ? &tw : 80
let l:count = a:count
let l:first_char = indent(a:lnum) + 1
diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua
index 208082f241..c015884f5b 100644
--- a/runtime/lua/vim/lsp/buf.lua
+++ b/runtime/lua/vim/lsp/buf.lua
@@ -1,9 +1,7 @@
local vim = vim
local validate = vim.validate
-local api = vim.api
local vfn = vim.fn
local util = require 'vim.lsp.util'
-local list_extend = vim.list_extend
local M = {}
@@ -142,6 +140,7 @@ function M.formatting_sync(options, timeout_ms)
local result = vim.lsp.buf_request_sync(0, "textDocument/formatting", params, timeout_ms)
if not result then return end
result = result[1].result
+ if not result then return end
vim.lsp.util.apply_text_edits(result)
end
@@ -153,36 +152,14 @@ end
--@param start_pos ({number, number}, optional) mark-indexed position.
---Defaults to the end of the last visual selection.
function M.range_formatting(options, start_pos, end_pos)
- validate {
- options = {options, 't', true};
- start_pos = {start_pos, 't', true};
- end_pos = {end_pos, 't', true};
- }
+ validate { options = {options, 't', true} }
local sts = vim.bo.softtabstop;
options = vim.tbl_extend('keep', options or {}, {
tabSize = (sts > 0 and sts) or (sts < 0 and vim.bo.shiftwidth) or vim.bo.tabstop;
insertSpaces = vim.bo.expandtab;
})
- local A = list_extend({}, start_pos or api.nvim_buf_get_mark(0, '<'))
- local B = list_extend({}, end_pos or api.nvim_buf_get_mark(0, '>'))
- -- convert to 0-index
- A[1] = A[1] - 1
- B[1] = B[1] - 1
- -- account for encoding.
- if A[2] > 0 then
- A = {A[1], util.character_offset(0, A[1], A[2])}
- end
- if B[2] > 0 then
- B = {B[1], util.character_offset(0, B[1], B[2])}
- end
- local params = {
- textDocument = { uri = vim.uri_from_bufnr(0) };
- range = {
- start = { line = A[1]; character = A[2]; };
- ["end"] = { line = B[1]; character = B[2]; };
- };
- options = options;
- }
+ local params = util.make_given_range_params(start_pos, end_pos)
+ params.options = options
return request('textDocument/rangeFormatting', params)
end
@@ -307,6 +284,21 @@ function M.code_action(context)
request('textDocument/codeAction', params)
end
+--- Performs |vim.lsp.buf.code_action()| for a given range.
+---
+--@param context: (table, optional) Valid `CodeActionContext` object
+--@param start_pos ({number, number}, optional) mark-indexed position.
+---Defaults to the start of the last visual selection.
+--@param end_pos ({number, number}, optional) mark-indexed position.
+---Defaults to the end of the last visual selection.
+function M.range_code_action(context, start_pos, end_pos)
+ validate { context = { context, 't', true } }
+ context = context or { diagnostics = util.get_line_diagnostics() }
+ local params = util.make_given_range_params(start_pos, end_pos)
+ params.context = context
+ request('textDocument/codeAction', params)
+end
+
--- Executes an LSP server command.
---
--@param command A valid `ExecuteCommandParams` object
diff --git a/runtime/lua/vim/lsp/callbacks.lua b/runtime/lua/vim/lsp/callbacks.lua
index 0ee03e6a2f..4e7a8333a0 100644
--- a/runtime/lua/vim/lsp/callbacks.lua
+++ b/runtime/lua/vim/lsp/callbacks.lua
@@ -229,16 +229,19 @@ M['textDocument/implementation'] = location_callback
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_signatureHelp
M['textDocument/signatureHelp'] = function(_, method, result)
+ -- When use `autocmd CompleteDone <silent><buffer> lua vim.lsp.buf.signature_help()` to call signatureHelp callback
+ -- If the completion item doesn't have signatures It will make noise. Change to use `print` that can use `<silent>` to ignore
+ if not (result and result.signatures and result.signatures[1]) then
+ print('No signature help available')
+ return
+ end
+ local lines = util.convert_signature_help_to_markdown_lines(result)
+ lines = util.trim_empty_lines(lines)
+ if vim.tbl_isempty(lines) then
+ print('No signature help available')
+ return
+ end
util.focusable_preview(method, function()
- if not (result and result.signatures and result.signatures[1]) then
- return { 'No signature available' }
- end
- -- TODO show popup when signatures is empty?
- local lines = util.convert_signature_help_to_markdown_lines(result)
- lines = util.trim_empty_lines(lines)
- if vim.tbl_isempty(lines) then
- return { 'No signature available' }
- end
return lines, util.try_trim_markdown_code_blocks(lines)
end)
end
diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua
index 64080cf4f2..749a51fecc 100644
--- a/runtime/lua/vim/lsp/rpc.lua
+++ b/runtime/lua/vim/lsp/rpc.lua
@@ -494,10 +494,13 @@ local function start(cmd, cmd_args, handlers, extra_spawn_params)
decoded.error = convert_NIL(decoded.error)
decoded.result = convert_NIL(decoded.result)
- -- Do not surface RequestCancelled to users, it is RPC-internal.
- if decoded.error
- and decoded.error.code == protocol.ErrorCodes.RequestCancelled then
- local _ = log.debug() and log.debug("Received cancellation ack", decoded)
+ -- Do not surface RequestCancelled or ContentModified to users, it is RPC-internal.
+ if decoded.error then
+ if decoded.error.code == protocol.ErrorCodes.RequestCancelled then
+ local _ = log.debug() and log.debug("Received cancellation ack", decoded)
+ elseif decoded.error.code == protocol.ErrorCodes.ContentModified then
+ local _ = log.debug() and log.debug("Received content modified ack", decoded)
+ end
local result_id = tonumber(decoded.id)
-- Clear any callback since this is cancelled now.
-- This is safe to do assuming that these conditions hold:
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 24cb454e5b..53f88dea7d 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -505,13 +505,13 @@ function M.convert_signature_help_to_markdown_lines(signature_help)
if signature.documentation then
M.convert_input_to_markdown_lines(signature.documentation, contents)
end
- if signature_help.parameters then
+ if signature.parameters and #signature.parameters > 0 then
local active_parameter = signature_help.activeParameter or 0
-- If the activeParameter is not inside the valid range, then clip it.
- if active_parameter >= #signature_help.parameters then
+ if active_parameter >= #signature.parameters then
active_parameter = 0
end
- local parameter = signature.parameters and signature.parameters[active_parameter]
+ local parameter = signature.parameters[active_parameter + 1]
if parameter then
--[=[
--Represents a parameter of a callable-signature. A parameter can
@@ -532,8 +532,8 @@ function M.convert_signature_help_to_markdown_lines(signature_help)
}
--]=]
-- TODO highlight parameter
- if parameter.documentation then
- M.convert_input_help_to_markdown_lines(parameter.documentation, contents)
+ if parameter.documentation and parameter.documentation ~= vim.NIL then
+ M.convert_input_to_markdown_lines(parameter.documentation, contents)
end
end
end
@@ -668,7 +668,7 @@ function M.focusable_float(unique_name, fn)
local bufnr = api.nvim_get_current_buf()
do
local win = find_window_by_var(unique_name, bufnr)
- if win then
+ if win and api.nvim_win_is_valid(win) and not vim.fn.pumvisible() then
api.nvim_set_current_win(win)
api.nvim_command("stopinsert")
return
@@ -800,13 +800,14 @@ function M.fancy_floating_markdown(contents, opts)
local width, height = M._make_floating_popup_size(stripped, opts)
-- Insert blank line separator after code block
- local insert_separator = opts.separator or true
+ local insert_separator = opts.separator
+ if insert_separator == nil then insert_separator = true end
if insert_separator then
for i, h in ipairs(highlights) do
h.start = h.start + i - 1
h.finish = h.finish + i - 1
if h.finish + 1 <= #stripped then
- table.insert(stripped, h.finish + 1, string.rep("โ”€", width))
+ table.insert(stripped, h.finish + 1, string.rep("โ”€", math.min(width, opts.wrap_at)))
height = height + 1
end
end
@@ -1465,11 +1466,46 @@ end
function M.make_range_params()
local position = make_position_param()
return {
- textDocument = { uri = vim.uri_from_bufnr(0) },
+ textDocument = M.make_text_document_params(),
range = { start = position; ["end"] = position; }
}
end
+--- Using the given range in the current buffer, creates an object that
+--- is similar to |vim.lsp.util.make_range_params()|.
+---
+--@param start_pos ({number, number}, optional) mark-indexed position.
+---Defaults to the start of the last visual selection.
+--@param end_pos ({number, number}, optional) mark-indexed position.
+---Defaults to the end of the last visual selection.
+--@returns { textDocument = { uri = `current_file_uri` }, range = { start =
+---`start_position`, end = `end_position` } }
+function M.make_given_range_params(start_pos, end_pos)
+ validate {
+ start_pos = {start_pos, 't', true};
+ end_pos = {end_pos, 't', true};
+ }
+ local A = list_extend({}, start_pos or api.nvim_buf_get_mark(0, '<'))
+ local B = list_extend({}, end_pos or api.nvim_buf_get_mark(0, '>'))
+ -- convert to 0-index
+ A[1] = A[1] - 1
+ B[1] = B[1] - 1
+ -- account for encoding.
+ if A[2] > 0 then
+ A = {A[1], M.character_offset(0, A[1], A[2])}
+ end
+ if B[2] > 0 then
+ B = {B[1], M.character_offset(0, B[1], B[2])}
+ end
+ return {
+ textDocument = M.make_text_document_params(),
+ range = {
+ start = {line = A[1], character = A[2]},
+ ['end'] = {line = B[1], character = B[2]}
+ }
+ }
+end
+
--- Creates a `TextDocumentIdentifier` object for the current buffer.
---
--@returns `TextDocumentIdentifier`
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua
index 3a475b8f98..77bbfaa3ad 100644
--- a/runtime/lua/vim/treesitter.lua
+++ b/runtime/lua/vim/treesitter.lua
@@ -21,7 +21,9 @@ function Parser:parse()
return self.tree
end
local changes
- self.tree, changes = self._parser:parse_buf(self.bufnr)
+
+ self.tree, changes = self._parser:parse(self:input_source())
+
self.valid = true
if not vim.tbl_isempty(changes) then
@@ -33,6 +35,10 @@ function Parser:parse()
return self.tree, changes
end
+function Parser:input_source()
+ return self.bufnr or self.str
+end
+
function Parser:_on_bytes(bufnr, changed_tick,
start_row, start_col, start_byte,
old_row, old_col, old_byte,
@@ -152,4 +158,18 @@ function M.get_parser(bufnr, lang, buf_attach_cbs)
return parsers[id]
end
+function M.get_string_parser(str, lang)
+ vim.validate {
+ str = { str, 'string' },
+ lang = { lang, 'string' }
+ }
+ language.require_language(lang)
+
+ local self = setmetatable({str=str, lang=lang, valid=false}, Parser)
+ self._parser = vim._create_ts_parser(lang)
+ self:parse()
+
+ return self
+end
+
return M
diff --git a/runtime/lua/vim/treesitter/highlighter.lua b/runtime/lua/vim/treesitter/highlighter.lua
index 718088e0ad..5b964a6020 100644
--- a/runtime/lua/vim/treesitter/highlighter.lua
+++ b/runtime/lua/vim/treesitter/highlighter.lua
@@ -3,7 +3,8 @@ local a = vim.api
-- support reload for quick experimentation
local TSHighlighter = rawget(vim.treesitter, 'TSHighlighter') or {}
TSHighlighter.__index = TSHighlighter
-local ts_hs_ns = a.nvim_create_namespace("treesitter_hl")
+
+TSHighlighter.active = TSHighlighter.active or {}
-- These are conventions defined by tree-sitter, though it
-- needs to be user extensible also.
@@ -54,13 +55,16 @@ TSHighlighter.hl_map = {
}
function TSHighlighter.new(query, bufnr, ft)
+ if bufnr == nil or bufnr == 0 then
+ bufnr = a.nvim_get_current_buf()
+ end
+
local self = setmetatable({}, TSHighlighter)
self.parser = vim.treesitter.get_parser(
bufnr,
ft,
{
on_changedtree = function(...) self:on_changedtree(...) end,
- on_bytes = function() self.parser:parse() end
}
)
@@ -69,8 +73,12 @@ function TSHighlighter.new(query, bufnr, ft)
self.edit_count = 0
self.redraw_count = 0
self.line_count = {}
+ self.root = self.parser:parse():root()
a.nvim_buf_set_option(self.buf, "syntax", "")
+ -- TODO(bfredl): can has multiple highlighters per buffer????
+ TSHighlighter.active[bufnr] = self
+
-- Tricky: if syntax hasn't been enabled, we need to reload color scheme
-- but use synload.vim rather than syntax.vim to not enable
-- syntax FileType autocmds. Later on we should integrate with the
@@ -100,6 +108,12 @@ function TSHighlighter:get_hl_from_capture(capture)
end
end
+function TSHighlighter:on_changedtree(changes)
+ for _, ch in ipairs(changes or {}) do
+ a.nvim__buf_redraw_range(self.buf, ch[1], ch[3]+1)
+ end
+end
+
function TSHighlighter:set_query(query)
if type(query) == "string" then
query = vim.treesitter.parse_query(self.parser.lang, query)
@@ -123,28 +137,60 @@ function TSHighlighter:set_query(query)
end
})
- self:on_changedtree({{self.parser:parse():root():range()}})
+ a.nvim__buf_redraw_range(self.buf, 0, a.nvim_buf_line_count(self.buf))
end
-function TSHighlighter:on_changedtree(changes)
- -- Get a fresh root
- local root = self.parser:parse():root()
+function TSHighlighter._on_line(_, _win, buf, line)
+ -- on_line is only called when this is non-nil
+ local self = TSHighlighter.active[buf]
+ if self.root == nil then
+ return -- parser bought the farm already
+ end
- for _, ch in ipairs(changes or {}) do
- a.nvim_buf_clear_namespace(self.buf, ts_hs_ns, ch[1], ch[3]+1)
-
- for capture, node in self.query:iter_captures(root, self.buf, ch[1], ch[3] + 1) do
- local start_row, start_col, end_row, end_col = node:range()
- local hl = self.hl_cache[capture]
- if hl then
- a.nvim_buf_set_extmark(self.buf, ts_hs_ns, start_row, start_col, {
- end_col = end_col,
- end_line = end_row,
- hl_group = hl
- })
- end
+ if self.iter == nil then
+ self.iter = self.query:iter_captures(self.root,buf,line,self.botline)
+ end
+ while line >= self.nextrow do
+ local capture, node = self.iter()
+ if capture == nil then
+ break
+ end
+ local start_row, start_col, end_row, end_col = node:range()
+ local hl = self.hl_cache[capture]
+ if hl and end_row >= line then
+ a.nvim__put_attr(start_row, start_col, { end_line = end_row, end_col = end_col, hl_group = hl })
+ end
+ if start_row > line then
+ self.nextrow = start_row
end
end
end
+function TSHighlighter._on_start(_, buf, _tick)
+ local self = TSHighlighter.active[buf]
+ if self then
+ local tree = self.parser:parse()
+ self.root = (tree and tree:root()) or nil
+ end
+end
+
+function TSHighlighter._on_win(_, _win, buf, _topline, botline)
+ local self = TSHighlighter.active[buf]
+ if not self then
+ return false
+ end
+
+ self.iter = nil
+ self.nextrow = 0
+ self.botline = botline
+ self.redraw_count = self.redraw_count + 1
+ return true
+end
+
+a.nvim__set_luahl {
+ on_start = TSHighlighter._on_start;
+ on_win = TSHighlighter._on_win;
+ on_line = TSHighlighter._on_line;
+}
+
return TSHighlighter
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua
index ca27a50c6a..494fb59fa7 100644
--- a/runtime/lua/vim/treesitter/query.lua
+++ b/runtime/lua/vim/treesitter/query.lua
@@ -28,21 +28,27 @@ end
--- Gets the text corresponding to a given node
-- @param node the node
-- @param bufnr the buffer from which the node in extracted.
-function M.get_node_text(node, bufnr)
- local start_row, start_col, end_row, end_col = node:range()
- if start_row ~= end_row then
- return nil
+function M.get_node_text(node, source)
+ local start_row, start_col, start_byte = node:start()
+ local end_row, end_col, end_byte = node:end_()
+
+ if type(source) == "number" then
+ if start_row ~= end_row then
+ return nil
+ end
+ local line = a.nvim_buf_get_lines(source, start_row, start_row+1, true)[1]
+ return string.sub(line, start_col+1, end_col)
+ elseif type(source) == "string" then
+ return source:sub(start_byte+1, end_byte)
end
- local line = a.nvim_buf_get_lines(bufnr, start_row, start_row+1, true)[1]
- return string.sub(line, start_col+1, end_col)
end
-- Predicate handler receive the following arguments
-- (match, pattern, bufnr, predicate)
local predicate_handlers = {
- ["eq?"] = function(match, _, bufnr, predicate)
+ ["eq?"] = function(match, _, source, predicate)
local node = match[predicate[2]]
- local node_text = M.get_node_text(node, bufnr)
+ local node_text = M.get_node_text(node, source)
local str
if type(predicate[3]) == "string" then
@@ -50,7 +56,7 @@ local predicate_handlers = {
str = predicate[3]
else
-- (#eq? @aa @bb)
- str = M.get_node_text(match[predicate[3]], bufnr)
+ str = M.get_node_text(match[predicate[3]], source)
end
if node_text ~= str or str == nil then
@@ -60,7 +66,7 @@ local predicate_handlers = {
return true
end,
- ["lua-match?"] = function(match, _, bufnr, predicate)
+ ["lua-match?"] = function(match, _, source, predicate)
local node = match[predicate[2]]
local regex = predicate[3]
local start_row, _, end_row, _ = node:range()
@@ -68,7 +74,7 @@ local predicate_handlers = {
return false
end
- return string.find(M.get_node_text(node, bufnr), regex)
+ return string.find(M.get_node_text(node, source), regex)
end,
["match?"] = (function()
@@ -88,7 +94,7 @@ local predicate_handlers = {
end
})
- return function(match, _, bufnr, pred)
+ return function(match, _, source, pred)
local node = match[pred[2]]
local start_row, start_col, end_row, end_col = node:range()
if start_row ~= end_row then
@@ -96,13 +102,13 @@ local predicate_handlers = {
end
local regex = compiled_vim_regexes[pred[3]]
- return regex:match_line(bufnr, start_row, start_col, end_col)
+ return regex:match_line(source, start_row, start_col, end_col)
end
end)(),
- ["contains?"] = function(match, _, bufnr, predicate)
+ ["contains?"] = function(match, _, source, predicate)
local node = match[predicate[2]]
- local node_text = M.get_node_text(node, bufnr)
+ local node_text = M.get_node_text(node, source)
for i=3,#predicate do
if string.find(node_text, predicate[i], 1, true) then
@@ -139,7 +145,7 @@ local function xor(x, y)
return (x or y) and not (x and y)
end
-function Query:match_preds(match, pattern, bufnr)
+function Query:match_preds(match, pattern, source)
local preds = self.info.patterns[pattern]
for _, pred in pairs(preds or {}) do
@@ -164,7 +170,7 @@ function Query:match_preds(match, pattern, bufnr)
return false
end
- local pred_matches = handler(match, pattern, bufnr, pred)
+ local pred_matches = handler(match, pattern, source, pred)
if not xor(is_not, pred_matches) then
return false
@@ -182,15 +188,15 @@ end
--
-- @returns The matching capture id
-- @returns The captured node
-function Query:iter_captures(node, bufnr, start, stop)
- if bufnr == 0 then
- bufnr = vim.api.nvim_get_current_buf()
+function Query:iter_captures(node, source, start, stop)
+ if type(source) == "number" and source == 0 then
+ source = vim.api.nvim_get_current_buf()
end
local raw_iter = node:_rawquery(self.query, true, start, stop)
local function iter()
local capture, captured_node, match = raw_iter()
if match ~= nil then
- local active = self:match_preds(match, match.pattern, bufnr)
+ local active = self:match_preds(match, match.pattern, source)
match.active = active
if not active then
return iter() -- tail call: try next match
@@ -210,15 +216,15 @@ end
--
-- @returns The matching pattern id
-- @returns The matching match
-function Query:iter_matches(node, bufnr, start, stop)
- if bufnr == 0 then
- bufnr = vim.api.nvim_get_current_buf()
+function Query:iter_matches(node, source, start, stop)
+ if type(source) == "number" and source == 0 then
+ source = vim.api.nvim_get_current_buf()
end
local raw_iter = node:_rawquery(self.query, false, start, stop)
local function iter()
local pattern, match = raw_iter()
if match ~= nil then
- local active = self:match_preds(match, pattern, bufnr)
+ local active = self:match_preds(match, pattern, source)
if not active then
return iter() -- tail call: try next match
end
diff --git a/runtime/lua/vim/uri.lua b/runtime/lua/vim/uri.lua
index 9c3535c676..f1a12c72ec 100644
--- a/runtime/lua/vim/uri.lua
+++ b/runtime/lua/vim/uri.lua
@@ -7,6 +7,9 @@
local uri_decode
do
local schar = string.char
+
+ --- Convert hex to char
+ --@private
local function hex_to_char(hex)
return schar(tonumber(hex, 16))
end
@@ -34,6 +37,8 @@ do
else
tohex = function(b) return string.format("%02x", b) end
end
+
+ --@private
local function percent_encode_char(char)
return "%"..tohex(sbyte(char), 2)
end
@@ -45,10 +50,14 @@ do
end
+--@private
local function is_windows_file_uri(uri)
return uri:match('^file:///[a-zA-Z]:') ~= nil
end
+--- Get a URI from a file path.
+--@param path (string): Path to file
+--@return URI
local function uri_from_fname(path)
local volume_path, fname = path:match("^([a-zA-Z]:)(.*)")
local is_windows = volume_path ~= nil
@@ -67,6 +76,9 @@ end
local URI_SCHEME_PATTERN = '^([a-zA-Z]+[a-zA-Z0-9+-.]*)://.*'
+--- Get a URI from a bufnr
+--@param bufnr (number): Buffer number
+--@return URI
local function uri_from_bufnr(bufnr)
local fname = vim.api.nvim_buf_get_name(bufnr)
local scheme = fname:match(URI_SCHEME_PATTERN)
@@ -77,6 +89,9 @@ local function uri_from_bufnr(bufnr)
end
end
+--- Get a filename from a URI
+--@param uri (string): The URI
+--@return Filename
local function uri_to_fname(uri)
local scheme = assert(uri:match(URI_SCHEME_PATTERN), 'URI must contain a scheme: ' .. uri)
if scheme ~= 'file' then
@@ -93,7 +108,10 @@ local function uri_to_fname(uri)
return uri
end
--- Return or create a buffer for a uri.
+--- Return or create a buffer for a uri.
+--@param uri (string): The URI
+--@return bufnr.
+--@note Creates buffer but does not load it
local function uri_to_bufnr(uri)
local scheme = assert(uri:match(URI_SCHEME_PATTERN), 'URI must contain a scheme: ' .. uri)
if scheme == 'file' then
diff --git a/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim b/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
index 7a6464fc98..fe4455fe2e 100644
--- a/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
+++ b/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
@@ -1,15 +1,17 @@
" cfilter.vim: Plugin to filter entries from a quickfix/location list
-" Last Change: May 12, 2018
-" Maintainer: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
-" Version: 1.0
+" Last Change: Aug 23, 2018
+" Maintainer: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
+" Version: 1.1
"
" Commands to filter the quickfix list:
-" :Cfilter[!] {pat}
+" :Cfilter[!] /{pat}/
" Create a new quickfix list from entries matching {pat} in the current
" quickfix list. Both the file name and the text of the entries are
" matched against {pat}. If ! is supplied, then entries not matching
-" {pat} are used.
-" :Lfilter[!] {pat}
+" {pat} are used. The pattern can be optionally enclosed using one of
+" the following characters: ', ", /. If the pattern is empty, then the
+" last used search pattern is used.
+" :Lfilter[!] /{pat}/
" Same as :Cfilter but operates on the current location list.
"
if exists("loaded_cfilter")
@@ -17,7 +19,7 @@ if exists("loaded_cfilter")
endif
let loaded_cfilter = 1
-func s:Qf_filter(qf, pat, bang)
+func s:Qf_filter(qf, searchpat, bang)
if a:qf
let Xgetlist = function('getqflist')
let Xsetlist = function('setqflist')
@@ -28,14 +30,31 @@ func s:Qf_filter(qf, pat, bang)
let cmd = ':Lfilter' . a:bang
endif
+ let firstchar = a:searchpat[0]
+ let lastchar = a:searchpat[-1:]
+ if firstchar == lastchar &&
+ \ (firstchar == '/' || firstchar == '"' || firstchar == "'")
+ let pat = a:searchpat[1:-2]
+ if pat == ''
+ " Use the last search pattern
+ let pat = @/
+ endif
+ else
+ let pat = a:searchpat
+ endif
+
+ if pat == ''
+ return
+ endif
+
if a:bang == '!'
- let cond = 'v:val.text !~# a:pat && bufname(v:val.bufnr) !~# a:pat'
+ let cond = 'v:val.text !~# pat && bufname(v:val.bufnr) !~# pat'
else
- let cond = 'v:val.text =~# a:pat || bufname(v:val.bufnr) =~# a:pat'
+ let cond = 'v:val.text =~# pat || bufname(v:val.bufnr) =~# pat'
endif
let items = filter(Xgetlist(), cond)
- let title = cmd . ' ' . a:pat
+ let title = cmd . ' /' . pat . '/'
call Xsetlist([], ' ', {'title' : title, 'items' : items})
endfunc
diff --git a/runtime/syntax/resolv.vim b/runtime/syntax/resolv.vim
index a879116a5f..9a2dec51ce 100644
--- a/runtime/syntax/resolv.vim
+++ b/runtime/syntax/resolv.vim
@@ -2,12 +2,19 @@
" Language: resolver configuration file
" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
" URL: https://raw.github.com/rid9/vim-resolv/master/resolv.vim
-" Last Change: 2013 May 21
-" Version: 1.0
+" Last Change: 2020 Mar 10
+" Version: 1.4
"
" Credits:
" David Necas (Yeti) <yeti@physics.muni.cz>
" Stefano Zacchiroli <zack@debian.org>
+" DJ Lucas <dj@linuxfromscratch.org>
+"
+" Changelog:
+" - 1.4: Added IPv6 support for sortlist.
+" - 1.3: Added IPv6 support for IPv4 dot-decimal notation.
+" - 1.2: Added new options.
+" - 1.1: Added IPv6 support.
" quit when a syntax file was already loaded
if exists("b:current_syntax")
@@ -29,11 +36,47 @@ syn match resolvIP contained /\%(\d\{1,4}\.\)\{3}\d\{1,4}/ contains=@resolvIPClu
syn match resolvIPNetmask contained /\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\%(\%(\d\{1,4}\.\)\{,3}\d\{1,4}\)\)\?/ contains=resolvOperator,@resolvIPCluster
syn match resolvHostname contained /\w\{-}\.[-0-9A-Za-z_\.]*/
-" Particular
+" Nameserver IPv4
syn match resolvIPNameserver contained /\%(\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\s\|$\)\)\+/ contains=@resolvIPCluster
+
+" Nameserver IPv6
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{6}\%(\x\{1,4}:\x\{1,4}\)\>/
+syn match resolvIPNameserver contained /\s\@<=::\%(\x\{1,4}:\)\{,6}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\s\@<=::\%(\x\{1,4}:\)\{,5}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,5}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,4}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,4}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,3}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,3}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,2}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,2}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,1}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{5}:\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{6}:\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1,7}:\%(\s\|;\|$\)\@=/
+
+" Search hostname
syn match resolvHostnameSearch contained /\%(\%([-0-9A-Za-z_]\+\.\)*[-0-9A-Za-z_]\+\.\?\%(\s\|$\)\)\+/
+
+" Sortlist IPv4
syn match resolvIPNetmaskSortList contained /\%(\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\%(\%(\d\{1,4}\.\)\{,3}\d\{1,4}\)\)\?\%(\s\|$\)\)\+/ contains=resolvOperator,@resolvIPCluster
+" Sortlist IPv6
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{6}\%(\x\{1,4}:\x\{1,4}\)\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\s\@<=::\%(\x\{1,4}:\)\{,6}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\s\@<=::\%(\x\{1,4}:\)\{,5}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,5}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,4}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,4}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,3}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,3}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,2}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,2}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,1}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{5}:\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{6}:\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1,7}:\%(\s\|;\|$\)\@=\%(\/\d\{1,3}\)\?/
+
" Identifiers
syn match resolvNameserver /^\s*nameserver\>/ nextgroup=resolvIPNameserver skipwhite
syn match resolvLwserver /^\s*lwserver\>/ nextgroup=resolvIPNameserver skipwhite
@@ -43,13 +86,12 @@ syn match resolvSortList /^\s*sortlist\>/ nextgroup=resolvIPNetmaskSortList skip
syn match resolvOptions /^\s*options\>/ nextgroup=resolvOption skipwhite
" Options
-syn match resolvOption /\<\%(debug\|no_tld_query\|rotate\|no-check-names\|inet6\)\>/ contained nextgroup=resolvOption skipwhite
+syn match resolvOption /\<\%(debug\|no_tld_query\|no-tld-query\|rotate\|no-check-names\|inet6\|ip6-bytestring\|\%(no-\)\?ip6-dotint\|edns0\|single-request\%(-reopen\)\?\|use-vc\)\>/ contained nextgroup=resolvOption skipwhite
syn match resolvOption /\<\%(ndots\|timeout\|attempts\):\d\+\>/ contained contains=resolvOperator nextgroup=resolvOption skipwhite
" Additional errors
syn match resolvError /^search .\{257,}/
-
hi def link resolvIP Number
hi def link resolvIPNetmask Number
hi def link resolvHostname String
@@ -72,7 +114,6 @@ hi def link resolvError Error
hi def link resolvIPError Error
hi def link resolvIPSpecial Special
-
let b:current_syntax = "resolv"
" vim: ts=8 ft=vim
diff --git a/runtime/syntax/typescript.vim b/runtime/syntax/typescript.vim
index bc382610a9..767ba56d42 100644
--- a/runtime/syntax/typescript.vim
+++ b/runtime/syntax/typescript.vim
@@ -1,10 +1,13 @@
" Vim syntax file
" Language: TypeScript
-" Maintainer: Bram Moolenaar
-" Last Change: 2019 Jun 07
+" Maintainer: Bram Moolenaar, Herrington Darkholme
+" Last Change: 2019 Nov 30
" Based On: Herrington Darkholme's yats.vim
-" Changes: See https:github.com/HerringtonDarkholme/yats.vim
-" Credits: See yats.vim
+" Changes: Go to https:github.com/HerringtonDarkholme/yats.vim for recent changes.
+" Origin: https://github.com/othree/yajs
+" Credits: Kao Wei-Ko(othree), Jose Elera Campana, Zhao Yi, Claudio Fleiner, Scott Shattuck
+" (This file is based on their hard work), gumnos (From the #vim
+" IRC Channel in Freenode)
" This is the same syntax that is in yats.vim, but:
" - flattened into one file
@@ -21,6 +24,7 @@ endif
let s:cpo_save = &cpo
set cpo&vim
+" this region is NOT used in TypeScriptReact
" nextgroup doesn't contain objectLiteral, let outer region contains it
syntax region typescriptTypeCast matchgroup=typescriptTypeBrackets
\ start=/< \@!/ end=/>/
@@ -28,2045 +32,11 @@ syntax region typescriptTypeCast matchgroup=typescriptTypeBrackets
\ nextgroup=@typescriptExpression
\ contained skipwhite oneline
-" runtime syntax/common.vim
-" NOTE: this results in accurate highlighting, but can be slow.
-syntax sync fromstart
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+" Source the part common with typescriptreact.vim
+source <sfile>:h/typescriptcommon.vim
-"Dollar sign is permitted anywhere in an identifier
-setlocal iskeyword-=$
-if main_syntax == 'typescript' || main_syntax == 'typescript.tsx'
- setlocal iskeyword+=$
- " syntax cluster htmlJavaScript contains=TOP
-endif
-
-" lowest priority on least used feature
-syntax match typescriptLabel /[a-zA-Z_$]\k*:/he=e-1 contains=typescriptReserved nextgroup=@typescriptStatement skipwhite skipempty
-
-" other keywords like return,case,yield uses containedin
-syntax region typescriptBlock matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptStatement,@typescriptComments fold
-
-
-"runtime syntax/basic/identifiers.vim
-syntax cluster afterIdentifier contains=
- \ typescriptDotNotation,
- \ typescriptFuncCallArg,
- \ typescriptTemplate,
- \ typescriptIndexExpr,
- \ @typescriptSymbols,
- \ typescriptTypeArguments
-
-syntax match typescriptIdentifierName /\<\K\k*/
- \ nextgroup=@afterIdentifier
- \ transparent
- \ contains=@_semantic
- \ skipnl skipwhite
-
-syntax match typescriptProp contained /\K\k*!\?/
- \ transparent
- \ contains=@props
- \ nextgroup=@afterIdentifier
- \ skipwhite skipempty
-
-syntax region typescriptIndexExpr contained matchgroup=typescriptProperty start=/\[/rs=s+1 end=/]/he=e-1 contains=@typescriptValue nextgroup=@typescriptSymbols,typescriptDotNotation,typescriptFuncCallArg skipwhite skipempty
-
-syntax match typescriptDotNotation /\./ nextgroup=typescriptProp skipnl
-syntax match typescriptDotStyleNotation /\.style\./ nextgroup=typescriptDOMStyle transparent
-" syntax match typescriptFuncCall contained /[a-zA-Z]\k*\ze(/ nextgroup=typescriptFuncCallArg
-syntax region typescriptParenExp matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptComments,@typescriptValue,typescriptCastKeyword nextgroup=@typescriptSymbols skipwhite skipempty
-syntax region typescriptFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptValue,@typescriptComments nextgroup=@typescriptSymbols,typescriptDotNotation skipwhite skipempty skipnl
-syntax region typescriptEventFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptEventExpression
-syntax region typescriptEventString contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/ contains=typescriptASCII,@events
-
-"runtime syntax/basic/literal.vim
-"Syntax in the JavaScript code
-
-" String
-syntax match typescriptASCII contained /\\\d\d\d/
-
-syntax region typescriptTemplateSubstitution matchgroup=typescriptTemplateSB
- \ start=/\${/ end=/}/
- \ contains=@typescriptValue
- \ contained
-
-
-syntax region typescriptString
- \ start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ end=+$+
- \ contains=typescriptSpecial,@Spell
- \ extend
-
-syntax match typescriptSpecial contained "\v\\%(x\x\x|u%(\x{4}|\{\x{4,5}})|c\u|.)"
-
-" From vim runtime
-" <https://github.com/vim/vim/blob/master/runtime/syntax/javascript.vim#L48>
-syntax region typescriptRegexpString start=+/[^/*]+me=e-1 skip=+\\\\\|\\/+ end=+/[gimuy]\{0,5\}\s*$+ end=+/[gimuy]\{0,5\}\s*[;.,)\]}]+me=e-1 nextgroup=typescriptDotNotation oneline
-
-syntax region typescriptTemplate
- \ start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/
- \ contains=typescriptTemplateSubstitution
- \ nextgroup=@typescriptSymbols
- \ skipwhite skipempty
-
-"Array
-syntax region typescriptArray matchgroup=typescriptBraces
- \ start=/\[/ end=/]/
- \ contains=@typescriptValue,@typescriptComments
- \ nextgroup=@typescriptSymbols,typescriptDotNotation
- \ skipwhite skipempty fold
-
-" Number
-syntax match typescriptNumber /\<0[bB][01][01_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
-syntax match typescriptNumber /\<0[oO][0-7][0-7_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
-syntax match typescriptNumber /\<0[xX][0-9a-fA-F][0-9a-fA-F_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
-syntax match typescriptNumber /\d[0-9_]*\.\d[0-9_]*\|\d[0-9_]*\|\.\d[0-9]*/
- \ nextgroup=typescriptExponent,@typescriptSymbols skipwhite skipempty
-syntax match typescriptExponent /[eE][+-]\=\d[0-9]*\>/
- \ nextgroup=@typescriptSymbols skipwhite skipempty contained
-
-
-" runtime syntax/basic/object.vim
-syntax region typescriptObjectLiteral matchgroup=typescriptBraces
- \ start=/{/ end=/}/
- \ contains=@typescriptComments,typescriptObjectLabel,typescriptStringProperty,typescriptComputedPropertyName
- \ fold contained
-
-syntax match typescriptObjectLabel contained /\k\+\_s*/
- \ nextgroup=typescriptObjectColon,@typescriptCallImpl
- \ skipwhite skipempty
-
-syntax region typescriptStringProperty contained
- \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
- \ nextgroup=typescriptObjectColon,@typescriptCallImpl
- \ skipwhite skipempty
-
-" syntax region typescriptPropertyName contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1(/me=e-1 nextgroup=@typescriptCallSignature skipwhite skipempty oneline
-syntax region typescriptComputedPropertyName contained matchgroup=typescriptBraces
- \ start=/\[/rs=s+1 end=/]/
- \ contains=@typescriptValue
- \ nextgroup=typescriptObjectColon,@typescriptCallImpl
- \ skipwhite skipempty
-
-" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*:/he=e-1 contains=@typescriptValue nextgroup=@typescriptValue skipwhite skipempty
-" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*(/me=e-1 contains=@typescriptValue nextgroup=@typescriptCallSignature skipwhite skipempty
-" Value for object, statement for label statement
-syntax match typescriptRestOrSpread /\.\.\./ contained
-syntax match typescriptObjectSpread /\.\.\./ contained containedin=typescriptObjectLiteral,typescriptArray nextgroup=@typescriptValue
-
-syntax match typescriptObjectColon contained /:/ nextgroup=@typescriptValue skipwhite skipempty
-
-"runtime syntax/basic/symbols.vim
-" + - ^ ~
-syntax match typescriptUnaryOp /[+\-~!]/
- \ nextgroup=@typescriptValue
- \ skipwhite
-
-syntax region typescriptTernary matchgroup=typescriptTernaryOp start=/?/ end=/:/ contained contains=@typescriptValue,@typescriptComments nextgroup=@typescriptValue skipwhite skipempty
-
-syntax match typescriptAssign /=/ nextgroup=@typescriptValue
- \ skipwhite skipempty
-
-" 2: ==, ===
-syntax match typescriptBinaryOp contained /===\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 6: >>>=, >>>, >>=, >>, >=, >
-syntax match typescriptBinaryOp contained />\(>>=\|>>\|>=\|>\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 4: <<=, <<, <=, <
-syntax match typescriptBinaryOp contained /<\(<=\|<\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 3: ||, |=, |
-syntax match typescriptBinaryOp contained /|\(|\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 3: &&, &=, &
-syntax match typescriptBinaryOp contained /&\(&\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 2: *=, *
-syntax match typescriptBinaryOp contained /\*=\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 2: %=, %
-syntax match typescriptBinaryOp contained /%=\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 2: /=, /
-syntax match typescriptBinaryOp contained +/\(=\|[^\*/]\@=\)+ nextgroup=@typescriptValue skipwhite skipempty
-syntax match typescriptBinaryOp contained /!==\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 2: !=, !==
-syntax match typescriptBinaryOp contained /+\(+\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 3: +, ++, +=
-syntax match typescriptBinaryOp contained /-\(-\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
-" 3: -, --, -=
-
-" exponentiation operator
-" 2: **, **=
-syntax match typescriptBinaryOp contained /\*\*=\?/ nextgroup=@typescriptValue
-
-syntax cluster typescriptSymbols contains=typescriptBinaryOp,typescriptKeywordOp,typescriptTernary,typescriptAssign,typescriptCastKeyword
-
-"" runtime syntax/basic/reserved.vim
-
-"runtime syntax/basic/keyword.vim
-"Import
-syntax keyword typescriptImport from as import
-syntax keyword typescriptExport export
-syntax keyword typescriptModule namespace module
-
-"this
-
-"JavaScript Prototype
-syntax keyword typescriptPrototype prototype
- \ nextgroup=@afterIdentifier
-
-syntax keyword typescriptCastKeyword as
- \ nextgroup=@typescriptType
- \ skipwhite
-
-"Program Keywords
-syntax keyword typescriptIdentifier arguments this super
- \ nextgroup=@afterIdentifier
-
-syntax keyword typescriptVariable let var
- \ nextgroup=typescriptVariableDeclaration
- \ skipwhite skipempty skipnl
-
-syntax keyword typescriptVariable const
- \ nextgroup=typescriptEnum,typescriptVariableDeclaration
- \ skipwhite
-
-syntax match typescriptVariableDeclaration /[A-Za-z_$]\k*/
- \ nextgroup=typescriptTypeAnnotation,typescriptAssign
- \ contained skipwhite skipempty skipnl
-
-syntax region typescriptEnum matchgroup=typescriptEnumKeyword start=/enum / end=/\ze{/
- \ nextgroup=typescriptBlock
- \ skipwhite
-
-syntax keyword typescriptKeywordOp
- \ contained in instanceof nextgroup=@typescriptValue
-syntax keyword typescriptOperator delete new typeof void
- \ nextgroup=@typescriptValue
- \ skipwhite skipempty
-
-syntax keyword typescriptForOperator contained in of
-syntax keyword typescriptBoolean true false nextgroup=@typescriptSymbols skipwhite skipempty
-syntax keyword typescriptNull null undefined nextgroup=@typescriptSymbols skipwhite skipempty
-syntax keyword typescriptMessage alert confirm prompt status
- \ nextgroup=typescriptDotNotation,typescriptFuncCallArg
-syntax keyword typescriptGlobal self top parent
- \ nextgroup=@afterIdentifier
-
-"Statement Keywords
-syntax keyword typescriptConditional if else switch
- \ nextgroup=typescriptConditionalParen
- \ skipwhite skipempty skipnl
-syntax keyword typescriptConditionalElse else
-syntax keyword typescriptRepeat do while for nextgroup=typescriptLoopParen skipwhite skipempty
-syntax keyword typescriptRepeat for nextgroup=typescriptLoopParen,typescriptAsyncFor skipwhite skipempty
-syntax keyword typescriptBranch break continue containedin=typescriptBlock
-syntax keyword typescriptCase case nextgroup=@typescriptPrimitive skipwhite containedin=typescriptBlock
-syntax keyword typescriptDefault default containedin=typescriptBlock nextgroup=@typescriptValue,typescriptClassKeyword,typescriptInterfaceKeyword skipwhite oneline
-syntax keyword typescriptStatementKeyword with
-syntax keyword typescriptStatementKeyword yield skipwhite nextgroup=@typescriptValue containedin=typescriptBlock
-syntax keyword typescriptStatementKeyword return skipwhite contained nextgroup=@typescriptValue containedin=typescriptBlock
-
-syntax keyword typescriptTry try
-syntax keyword typescriptExceptions catch throw finally
-syntax keyword typescriptDebugger debugger
-
-syntax keyword typescriptAsyncFor await nextgroup=typescriptLoopParen skipwhite skipempty contained
-
-syntax region typescriptLoopParen contained matchgroup=typescriptParens
- \ start=/(/ end=/)/
- \ contains=typescriptVariable,typescriptForOperator,typescriptEndColons,@typescriptValue,@typescriptComments
- \ nextgroup=typescriptBlock
- \ skipwhite skipempty
-syntax region typescriptConditionalParen contained matchgroup=typescriptParens
- \ start=/(/ end=/)/
- \ contains=@typescriptValue,@typescriptComments
- \ nextgroup=typescriptBlock
- \ skipwhite skipempty
-syntax match typescriptEndColons /[;,]/ contained
-
-syntax keyword typescriptAmbientDeclaration declare nextgroup=@typescriptAmbients
- \ skipwhite skipempty
-
-syntax cluster typescriptAmbients contains=
- \ typescriptVariable,
- \ typescriptFuncKeyword,
- \ typescriptClassKeyword,
- \ typescriptAbstract,
- \ typescriptEnumKeyword,typescriptEnum,
- \ typescriptModule
-
-"runtime syntax/basic/doc.vim
-"Syntax coloring for Node.js shebang line
-syntax match shellbang "^#!.*node\>"
-syntax match shellbang "^#!.*iojs\>"
-
-
-"JavaScript comments
-syntax keyword typescriptCommentTodo TODO FIXME XXX TBD
-syntax match typescriptLineComment "//.*"
- \ contains=@Spell,typescriptCommentTodo,typescriptRef
-syntax region typescriptComment
- \ start="/\*" end="\*/"
- \ contains=@Spell,typescriptCommentTodo extend
-syntax cluster typescriptComments
- \ contains=typescriptDocComment,typescriptComment,typescriptLineComment
-
-syntax match typescriptRef +///\s*<reference\s\+.*\/>$+
- \ contains=typescriptString
-syntax match typescriptRef +///\s*<amd-dependency\s\+.*\/>$+
- \ contains=typescriptString
-syntax match typescriptRef +///\s*<amd-module\s\+.*\/>$+
- \ contains=typescriptString
-
-"JSDoc
-syntax case ignore
-
-syntax region typescriptDocComment matchgroup=typescriptComment
- \ start="/\*\*" end="\*/"
- \ contains=typescriptDocNotation,typescriptCommentTodo,@Spell
- \ fold keepend
-syntax match typescriptDocNotation contained /@/ nextgroup=typescriptDocTags
-
-syntax keyword typescriptDocTags contained constant constructor constructs function ignore inner private public readonly static
-syntax keyword typescriptDocTags contained const dict expose inheritDoc interface nosideeffects override protected struct internal
-syntax keyword typescriptDocTags contained example global
-
-" syntax keyword typescriptDocTags contained ngdoc nextgroup=typescriptDocNGDirective
-syntax keyword typescriptDocTags contained ngdoc scope priority animations
-syntax keyword typescriptDocTags contained ngdoc restrict methodOf propertyOf eventOf eventType nextgroup=typescriptDocParam skipwhite
-syntax keyword typescriptDocNGDirective contained overview service object function method property event directive filter inputType error
-
-syntax keyword typescriptDocTags contained abstract virtual access augments
-
-syntax keyword typescriptDocTags contained arguments callback lends memberOf name type kind link mixes mixin tutorial nextgroup=typescriptDocParam skipwhite
-syntax keyword typescriptDocTags contained variation nextgroup=typescriptDocNumParam skipwhite
-
-syntax keyword typescriptDocTags contained author class classdesc copyright default defaultvalue nextgroup=typescriptDocDesc skipwhite
-syntax keyword typescriptDocTags contained deprecated description external host nextgroup=typescriptDocDesc skipwhite
-syntax keyword typescriptDocTags contained file fileOverview overview namespace requires since version nextgroup=typescriptDocDesc skipwhite
-syntax keyword typescriptDocTags contained summary todo license preserve nextgroup=typescriptDocDesc skipwhite
-
-syntax keyword typescriptDocTags contained borrows exports nextgroup=typescriptDocA skipwhite
-syntax keyword typescriptDocTags contained param arg argument property prop module nextgroup=typescriptDocNamedParamType,typescriptDocParamName skipwhite
-syntax keyword typescriptDocTags contained define enum extends implements this typedef nextgroup=typescriptDocParamType skipwhite
-syntax keyword typescriptDocTags contained return returns throws exception nextgroup=typescriptDocParamType,typescriptDocParamName skipwhite
-syntax keyword typescriptDocTags contained see nextgroup=typescriptDocRef skipwhite
-
-syntax keyword typescriptDocTags contained function func method nextgroup=typescriptDocName skipwhite
-syntax match typescriptDocName contained /\h\w*/
-
-syntax keyword typescriptDocTags contained fires event nextgroup=typescriptDocEventRef skipwhite
-syntax match typescriptDocEventRef contained /\h\w*#\(\h\w*\:\)\?\h\w*/
-
-syntax match typescriptDocNamedParamType contained /{.\+}/ nextgroup=typescriptDocParamName skipwhite
-syntax match typescriptDocParamName contained /\[\?0-9a-zA-Z_\.]\+\]\?/ nextgroup=typescriptDocDesc skipwhite
-syntax match typescriptDocParamType contained /{.\+}/ nextgroup=typescriptDocDesc skipwhite
-syntax match typescriptDocA contained /\%(#\|\w\|\.\|:\|\/\)\+/ nextgroup=typescriptDocAs skipwhite
-syntax match typescriptDocAs contained /\s*as\s*/ nextgroup=typescriptDocB skipwhite
-syntax match typescriptDocB contained /\%(#\|\w\|\.\|:\|\/\)\+/
-syntax match typescriptDocParam contained /\%(#\|\w\|\.\|:\|\/\|-\)\+/
-syntax match typescriptDocNumParam contained /\d\+/
-syntax match typescriptDocRef contained /\%(#\|\w\|\.\|:\|\/\)\+/
-syntax region typescriptDocLinkTag contained matchgroup=typescriptDocLinkTag start=/{/ end=/}/ contains=typescriptDocTags
-
-syntax cluster typescriptDocs contains=typescriptDocParamType,typescriptDocNamedParamType,typescriptDocParam
-
-if main_syntax == "typescript"
- syntax sync clear
- syntax sync ccomment typescriptComment minlines=200
-endif
-
-syntax case match
-
-"runtime syntax/basic/type.vim
-" Types
-syntax match typescriptOptionalMark /?/ contained
-
-syntax region typescriptTypeParameters matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/
- \ contains=typescriptTypeParameter
- \ contained
-
-syntax match typescriptTypeParameter /\K\k*/
- \ nextgroup=typescriptConstraint,typescriptGenericDefault
- \ contained skipwhite skipnl
-
-syntax keyword typescriptConstraint extends
- \ nextgroup=@typescriptType
- \ contained skipwhite skipnl
-
-syntax match typescriptGenericDefault /=/
- \ nextgroup=@typescriptType
- \ contained skipwhite
-
-"><
-" class A extend B<T> {} // ClassBlock
-" func<T>() // FuncCallArg
-syntax region typescriptTypeArguments matchgroup=typescriptTypeBrackets
- \ start=/\></ end=/>/
- \ contains=@typescriptType
- \ nextgroup=typescriptFuncCallArg,@typescriptTypeOperator
- \ contained skipwhite
-
-
-syntax cluster typescriptType contains=
- \ @typescriptPrimaryType,
- \ typescriptUnion,
- \ @typescriptFunctionType,
- \ typescriptConstructorType
-
-" array type: A[]
-" type indexing A['key']
-syntax region typescriptTypeBracket contained
- \ start=/\[/ end=/\]/
- \ contains=typescriptString,typescriptNumber
- \ nextgroup=@typescriptTypeOperator
- \ skipwhite skipempty
-
-syntax cluster typescriptPrimaryType contains=
- \ typescriptParenthesizedType,
- \ typescriptPredefinedType,
- \ typescriptTypeReference,
- \ typescriptObjectType,
- \ typescriptTupleType,
- \ typescriptTypeQuery,
- \ typescriptStringLiteralType,
- \ typescriptReadonlyArrayKeyword
-
-syntax region typescriptStringLiteralType contained
- \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/
- \ nextgroup=typescriptUnion
- \ skipwhite skipempty
-
-syntax region typescriptParenthesizedType matchgroup=typescriptParens
- \ start=/(/ end=/)/
- \ contains=@typescriptType
- \ nextgroup=@typescriptTypeOperator
- \ contained skipwhite skipempty fold
-
-syntax match typescriptTypeReference /\K\k*\(\.\K\k*\)*/
- \ nextgroup=typescriptTypeArguments,@typescriptTypeOperator,typescriptUserDefinedType
- \ skipwhite contained skipempty
-
-syntax keyword typescriptPredefinedType any number boolean string void never undefined null object unknown
- \ nextgroup=@typescriptTypeOperator
- \ contained skipwhite skipempty
-
-syntax match typescriptPredefinedType /unique symbol/
- \ nextgroup=@typescriptTypeOperator
- \ contained skipwhite skipempty
-
-syntax region typescriptObjectType matchgroup=typescriptBraces
- \ start=/{/ end=/}/
- \ contains=@typescriptTypeMember,typescriptEndColons,@typescriptComments,typescriptAccessibilityModifier,typescriptReadonlyModifier
- \ nextgroup=@typescriptTypeOperator
- \ contained skipwhite fold
-
-syntax cluster typescriptTypeMember contains=
- \ @typescriptCallSignature,
- \ typescriptConstructSignature,
- \ typescriptIndexSignature,
- \ @typescriptMembers
-
-syntax region typescriptTupleType matchgroup=typescriptBraces
- \ start=/\[/ end=/\]/
- \ contains=@typescriptType
- \ contained skipwhite oneline
-
-syntax cluster typescriptTypeOperator
- \ contains=typescriptUnion,typescriptTypeBracket
-
-syntax match typescriptUnion /|\|&/ contained nextgroup=@typescriptPrimaryType skipwhite skipempty
-
-syntax cluster typescriptFunctionType contains=typescriptGenericFunc,typescriptFuncType
-syntax region typescriptGenericFunc matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/
- \ contains=typescriptTypeParameter
- \ nextgroup=typescriptFuncType
- \ containedin=typescriptFunctionType
- \ contained skipwhite skipnl
-
-syntax region typescriptFuncType matchgroup=typescriptParens
- \ start=/(/ end=/)\s*=>/me=e-2
- \ contains=@typescriptParameterList
- \ nextgroup=typescriptFuncTypeArrow
- \ contained skipwhite skipnl oneline
-
-syntax match typescriptFuncTypeArrow /=>/
- \ nextgroup=@typescriptType
- \ containedin=typescriptFuncType
- \ contained skipwhite skipnl
-
-
-syntax keyword typescriptConstructorType new
- \ nextgroup=@typescriptFunctionType
- \ contained skipwhite skipnl
-
-syntax keyword typescriptUserDefinedType is
- \ contained nextgroup=@typescriptType skipwhite skipempty
-
-syntax keyword typescriptTypeQuery typeof keyof
- \ nextgroup=typescriptTypeReference
- \ contained skipwhite skipnl
-
-syntax cluster typescriptCallSignature contains=typescriptGenericCall,typescriptCall
-syntax region typescriptGenericCall matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/
- \ contains=typescriptTypeParameter
- \ nextgroup=typescriptCall
- \ contained skipwhite skipnl
-syntax region typescriptCall matchgroup=typescriptParens
- \ start=/(/ end=/)/
- \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
- \ nextgroup=typescriptTypeAnnotation,typescriptBlock
- \ contained skipwhite skipnl
-
-syntax match typescriptTypeAnnotation /:/
- \ nextgroup=@typescriptType
- \ contained skipwhite skipnl
-
-syntax cluster typescriptParameterList contains=
- \ typescriptTypeAnnotation,
- \ typescriptAccessibilityModifier,
- \ typescriptOptionalMark,
- \ typescriptRestOrSpread,
- \ typescriptFuncComma,
- \ typescriptDefaultParam
-
-syntax match typescriptFuncComma /,/ contained
-
-syntax match typescriptDefaultParam /=/
- \ nextgroup=@typescriptValue
- \ contained skipwhite
-
-syntax keyword typescriptConstructSignature new
- \ nextgroup=@typescriptCallSignature
- \ contained skipwhite
-
-syntax region typescriptIndexSignature matchgroup=typescriptBraces
- \ start=/\[/ end=/\]/
- \ contains=typescriptPredefinedType,typescriptMappedIn,typescriptString
- \ nextgroup=typescriptTypeAnnotation
- \ contained skipwhite oneline
-
-syntax keyword typescriptMappedIn in
- \ nextgroup=@typescriptType
- \ contained skipwhite skipnl skipempty
-
-syntax keyword typescriptAliasKeyword type
- \ nextgroup=typescriptAliasDeclaration
- \ skipwhite skipnl skipempty
-
-syntax region typescriptAliasDeclaration matchgroup=typescriptUnion
- \ start=/ / end=/=/
- \ nextgroup=@typescriptType
- \ contains=typescriptConstraint,typescriptTypeParameters
- \ contained skipwhite skipempty
-
-syntax keyword typescriptReadonlyArrayKeyword readonly
- \ nextgroup=@typescriptPrimaryType
- \ skipwhite
-
-" extension
-if get(g:, 'yats_host_keyword', 1)
- "runtime syntax/yats.vim
- "runtime syntax/yats/typescript.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function Boolean
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Error EvalError
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName InternalError
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName RangeError ReferenceError
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName StopIteration
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName SyntaxError TypeError
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName URIError Date
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float32Array
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float64Array
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int16Array Int32Array
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int8Array Uint16Array
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint32Array Uint8Array
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint8ClampedArray
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName ParallelArray
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName ArrayBuffer DataView
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Iterator Generator
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect Proxy
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName arguments
- hi def link typescriptGlobal Structure
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName eval uneval nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isFinite nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isNaN parseFloat nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName parseInt nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURI nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURIComponent nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURI nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURIComponent nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptGlobalMethod
- hi def link typescriptGlobalMethod Structure
-
- "runtime syntax/yats/es6-number.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Number nextgroup=typescriptGlobalNumberDot,typescriptFuncCallArg
- syntax match typescriptGlobalNumberDot /\./ contained nextgroup=typescriptNumberStaticProp,typescriptNumberStaticMethod,typescriptProp
- syntax keyword typescriptNumberStaticProp contained EPSILON MAX_SAFE_INTEGER MAX_VALUE
- syntax keyword typescriptNumberStaticProp contained MIN_SAFE_INTEGER MIN_VALUE NEGATIVE_INFINITY
- syntax keyword typescriptNumberStaticProp contained NaN POSITIVE_INFINITY
- hi def link typescriptNumberStaticProp Keyword
- syntax keyword typescriptNumberStaticMethod contained isFinite isInteger isNaN isSafeInteger nextgroup=typescriptFuncCallArg
- syntax keyword typescriptNumberStaticMethod contained parseFloat parseInt nextgroup=typescriptFuncCallArg
- hi def link typescriptNumberStaticMethod Keyword
- syntax keyword typescriptNumberMethod contained toExponential toFixed toLocaleString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptNumberMethod contained toPrecision toSource toString valueOf nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptNumberMethod
- hi def link typescriptNumberMethod Keyword
-
- "runtime syntax/yats/es6-string.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName String nextgroup=typescriptGlobalStringDot,typescriptFuncCallArg
- syntax match typescriptGlobalStringDot /\./ contained nextgroup=typescriptStringStaticMethod,typescriptProp
- syntax keyword typescriptStringStaticMethod contained fromCharCode fromCodePoint raw nextgroup=typescriptFuncCallArg
- hi def link typescriptStringStaticMethod Keyword
- syntax keyword typescriptStringMethod contained anchor charAt charCodeAt codePointAt nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained concat endsWith includes indexOf lastIndexOf nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained link localeCompare match normalize nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained padStart padEnd repeat replace search nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained slice split startsWith substr substring nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained toLocaleLowerCase toLocaleUpperCase nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained toLowerCase toString toUpperCase trim nextgroup=typescriptFuncCallArg
- syntax keyword typescriptStringMethod contained valueOf nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptStringMethod
- hi def link typescriptStringMethod Keyword
-
- "runtime syntax/yats/es6-array.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Array nextgroup=typescriptGlobalArrayDot,typescriptFuncCallArg
- syntax match typescriptGlobalArrayDot /\./ contained nextgroup=typescriptArrayStaticMethod,typescriptProp
- syntax keyword typescriptArrayStaticMethod contained from isArray of nextgroup=typescriptFuncCallArg
- hi def link typescriptArrayStaticMethod Keyword
- syntax keyword typescriptArrayMethod contained concat copyWithin entries every fill nextgroup=typescriptFuncCallArg
- syntax keyword typescriptArrayMethod contained filter find findIndex forEach indexOf nextgroup=typescriptFuncCallArg
- syntax keyword typescriptArrayMethod contained includes join keys lastIndexOf map nextgroup=typescriptFuncCallArg
- syntax keyword typescriptArrayMethod contained pop push reduce reduceRight reverse nextgroup=typescriptFuncCallArg
- syntax keyword typescriptArrayMethod contained shift slice some sort splice toLocaleString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptArrayMethod contained toSource toString unshift nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptArrayMethod
- hi def link typescriptArrayMethod Keyword
-
- "runtime syntax/yats/es6-object.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Object nextgroup=typescriptGlobalObjectDot,typescriptFuncCallArg
- syntax match typescriptGlobalObjectDot /\./ contained nextgroup=typescriptObjectStaticMethod,typescriptProp
- syntax keyword typescriptObjectStaticMethod contained create defineProperties defineProperty nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectStaticMethod contained entries freeze getOwnPropertyDescriptors nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectStaticMethod contained getOwnPropertyDescriptor getOwnPropertyNames nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectStaticMethod contained getOwnPropertySymbols getPrototypeOf nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectStaticMethod contained is isExtensible isFrozen isSealed nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectStaticMethod contained keys preventExtensions values nextgroup=typescriptFuncCallArg
- hi def link typescriptObjectStaticMethod Keyword
- syntax keyword typescriptObjectMethod contained getOwnPropertyDescriptors hasOwnProperty nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectMethod contained isPrototypeOf propertyIsEnumerable nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectMethod contained toLocaleString toString valueOf seal nextgroup=typescriptFuncCallArg
- syntax keyword typescriptObjectMethod contained setPrototypeOf nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptObjectMethod
- hi def link typescriptObjectMethod Keyword
-
- "runtime syntax/yats/es6-symbol.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Symbol nextgroup=typescriptGlobalSymbolDot,typescriptFuncCallArg
- syntax match typescriptGlobalSymbolDot /\./ contained nextgroup=typescriptSymbolStaticProp,typescriptSymbolStaticMethod,typescriptProp
- syntax keyword typescriptSymbolStaticProp contained length iterator match replace
- syntax keyword typescriptSymbolStaticProp contained search split hasInstance isConcatSpreadable
- syntax keyword typescriptSymbolStaticProp contained unscopables species toPrimitive
- syntax keyword typescriptSymbolStaticProp contained toStringTag
- hi def link typescriptSymbolStaticProp Keyword
- syntax keyword typescriptSymbolStaticMethod contained for keyFor nextgroup=typescriptFuncCallArg
- hi def link typescriptSymbolStaticMethod Keyword
-
- "runtime syntax/yats/es6-function.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function
- syntax keyword typescriptFunctionMethod contained apply bind call nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptFunctionMethod
- hi def link typescriptFunctionMethod Keyword
-
- "runtime syntax/yats/es6-math.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Math nextgroup=typescriptGlobalMathDot,typescriptFuncCallArg
- syntax match typescriptGlobalMathDot /\./ contained nextgroup=typescriptMathStaticProp,typescriptMathStaticMethod,typescriptProp
- syntax keyword typescriptMathStaticProp contained E LN10 LN2 LOG10E LOG2E PI SQRT1_2
- syntax keyword typescriptMathStaticProp contained SQRT2
- hi def link typescriptMathStaticProp Keyword
- syntax keyword typescriptMathStaticMethod contained abs acos acosh asin asinh atan nextgroup=typescriptFuncCallArg
- syntax keyword typescriptMathStaticMethod contained atan2 atanh cbrt ceil clz32 cos nextgroup=typescriptFuncCallArg
- syntax keyword typescriptMathStaticMethod contained cosh exp expm1 floor fround hypot nextgroup=typescriptFuncCallArg
- syntax keyword typescriptMathStaticMethod contained imul log log10 log1p log2 max nextgroup=typescriptFuncCallArg
- syntax keyword typescriptMathStaticMethod contained min pow random round sign sin nextgroup=typescriptFuncCallArg
- syntax keyword typescriptMathStaticMethod contained sinh sqrt tan tanh trunc nextgroup=typescriptFuncCallArg
- hi def link typescriptMathStaticMethod Keyword
-
- "runtime syntax/yats/es6-date.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Date nextgroup=typescriptGlobalDateDot,typescriptFuncCallArg
- syntax match typescriptGlobalDateDot /\./ contained nextgroup=typescriptDateStaticMethod,typescriptProp
- syntax keyword typescriptDateStaticMethod contained UTC now parse nextgroup=typescriptFuncCallArg
- hi def link typescriptDateStaticMethod Keyword
- syntax keyword typescriptDateMethod contained getDate getDay getFullYear getHours nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained getMilliseconds getMinutes getMonth nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained getSeconds getTime getTimezoneOffset nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained getUTCDate getUTCDay getUTCFullYear nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained getUTCHours getUTCMilliseconds getUTCMinutes nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained getUTCMonth getUTCSeconds setDate setFullYear nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained setHours setMilliseconds setMinutes nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained setMonth setSeconds setTime setUTCDate nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained setUTCFullYear setUTCHours setUTCMilliseconds nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained setUTCMinutes setUTCMonth setUTCSeconds nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained toDateString toISOString toJSON toLocaleDateString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained toLocaleFormat toLocaleString toLocaleTimeString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained toSource toString toTimeString toUTCString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDateMethod contained valueOf nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptDateMethod
- hi def link typescriptDateMethod Keyword
-
- "runtime syntax/yats/es6-json.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName JSON nextgroup=typescriptGlobalJSONDot,typescriptFuncCallArg
- syntax match typescriptGlobalJSONDot /\./ contained nextgroup=typescriptJSONStaticMethod,typescriptProp
- syntax keyword typescriptJSONStaticMethod contained parse stringify nextgroup=typescriptFuncCallArg
- hi def link typescriptJSONStaticMethod Keyword
-
- "runtime syntax/yats/es6-regexp.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName RegExp nextgroup=typescriptGlobalRegExpDot,typescriptFuncCallArg
- syntax match typescriptGlobalRegExpDot /\./ contained nextgroup=typescriptRegExpStaticProp,typescriptProp
- syntax keyword typescriptRegExpStaticProp contained lastIndex
- hi def link typescriptRegExpStaticProp Keyword
- syntax keyword typescriptRegExpProp contained global ignoreCase multiline source sticky
- syntax cluster props add=typescriptRegExpProp
- hi def link typescriptRegExpProp Keyword
- syntax keyword typescriptRegExpMethod contained exec test nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptRegExpMethod
- hi def link typescriptRegExpMethod Keyword
-
- "runtime syntax/yats/es6-map.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Map WeakMap
- syntax keyword typescriptES6MapProp contained size
- syntax cluster props add=typescriptES6MapProp
- hi def link typescriptES6MapProp Keyword
- syntax keyword typescriptES6MapMethod contained clear delete entries forEach get has nextgroup=typescriptFuncCallArg
- syntax keyword typescriptES6MapMethod contained keys set values nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptES6MapMethod
- hi def link typescriptES6MapMethod Keyword
-
- "runtime syntax/yats/es6-set.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Set WeakSet
- syntax keyword typescriptES6SetProp contained size
- syntax cluster props add=typescriptES6SetProp
- hi def link typescriptES6SetProp Keyword
- syntax keyword typescriptES6SetMethod contained add clear delete entries forEach has nextgroup=typescriptFuncCallArg
- syntax keyword typescriptES6SetMethod contained values nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptES6SetMethod
- hi def link typescriptES6SetMethod Keyword
-
- "runtime syntax/yats/es6-proxy.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Proxy
- syntax keyword typescriptProxyAPI contained getOwnPropertyDescriptor getOwnPropertyNames
- syntax keyword typescriptProxyAPI contained defineProperty deleteProperty freeze seal
- syntax keyword typescriptProxyAPI contained preventExtensions has hasOwn get set enumerate
- syntax keyword typescriptProxyAPI contained iterate ownKeys apply construct
- hi def link typescriptProxyAPI Keyword
-
- "runtime syntax/yats/es6-promise.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Promise nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg
- syntax match typescriptGlobalPromiseDot /\./ contained nextgroup=typescriptPromiseStaticMethod,typescriptProp
- syntax keyword typescriptPromiseStaticMethod contained resolve reject all race nextgroup=typescriptFuncCallArg
- hi def link typescriptPromiseStaticMethod Keyword
- syntax keyword typescriptPromiseMethod contained then catch finally nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptPromiseMethod
- hi def link typescriptPromiseMethod Keyword
-
- "runtime syntax/yats/es6-reflect.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect
- syntax keyword typescriptReflectMethod contained apply construct defineProperty deleteProperty nextgroup=typescriptFuncCallArg
- syntax keyword typescriptReflectMethod contained enumerate get getOwnPropertyDescriptor nextgroup=typescriptFuncCallArg
- syntax keyword typescriptReflectMethod contained getPrototypeOf has isExtensible ownKeys nextgroup=typescriptFuncCallArg
- syntax keyword typescriptReflectMethod contained preventExtensions set setPrototypeOf nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptReflectMethod
- hi def link typescriptReflectMethod Keyword
-
- "runtime syntax/yats/ecma-402.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Intl
- syntax keyword typescriptIntlMethod contained Collator DateTimeFormat NumberFormat nextgroup=typescriptFuncCallArg
- syntax keyword typescriptIntlMethod contained PluralRules nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptIntlMethod
- hi def link typescriptIntlMethod Keyword
-
- "runtime syntax/yats/node.vim
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName global process
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName console Buffer
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName module exports
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setTimeout
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearTimeout
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setInterval
- syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearInterval
- hi def link typescriptNodeGlobal Structure
-
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName describe it test
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName before after
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName beforeEach afterEach
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName beforeAll afterAll
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName expect assert
-
- "runtime syntax/yats/web.vim
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AbortController
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AbstractWorker AnalyserNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName App Apps ArrayBuffer
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ArrayBufferView
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Attr AudioBuffer
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioBufferSourceNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioContext AudioDestinationNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioListener AudioNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioParam BatteryManager
- syntax keyword typescriptBOM containedin=typescriptIdentifierName BiquadFilterNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName BlobEvent BluetoothAdapter
- syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothDevice
- syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothManager
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraCapabilities
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraControl CameraManager
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasGradient CanvasImageSource
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasPattern CanvasRenderingContext2D
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CaretPosition CDATASection
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelMergerNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelSplitterNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CharacterData ChildNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ChromeWorker Comment
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Connection Console
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ContactManager Contacts
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ConvolverNode Coordinates
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSS CSSConditionRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSGroupingRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframeRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframesRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSMediaRule CSSNamespaceRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSPageRule CSSRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSRuleList CSSStyleDeclaration
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSStyleRule CSSStyleSheet
- syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSSupportsRule
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DataTransfer DataView
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DedicatedWorkerGlobalScope
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DelayNode DeviceAcceleration
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceRotationRate
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceStorage DirectoryEntry
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryEntrySync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReader
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReaderSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Document DocumentFragment
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DocumentTouch DocumentType
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMCursor DOMError
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMException DOMHighResTimeStamp
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementation
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementationRegistry
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMParser DOMRequest
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMString DOMStringList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMStringMap DOMTimeStamp
- syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMTokenList DynamicsCompressorNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Element Entry EntrySync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Extensions FileException
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Float32Array Float64Array
- syntax keyword typescriptBOM containedin=typescriptIdentifierName FMRadio FormData
- syntax keyword typescriptBOM containedin=typescriptIdentifierName GainNode Gamepad
- syntax keyword typescriptBOM containedin=typescriptIdentifierName GamepadButton Geolocation
- syntax keyword typescriptBOM containedin=typescriptIdentifierName History HTMLAnchorElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAreaElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAudioElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBaseElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBodyElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBRElement HTMLButtonElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCanvasElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCollection HTMLDataElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDataListElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDivElement HTMLDListElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDocument HTMLElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLEmbedElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFieldSetElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormControlsCollection
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadingElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHRElement HTMLHtmlElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLIFrameElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLImageElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLInputElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLKeygenElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLabelElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLegendElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLIElement HTMLLinkElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMapElement HTMLMediaElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMetaElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMeterElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLModElement HTMLObjectElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOListElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptGroupElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionsCollection
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOutputElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParagraphElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParamElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLPreElement HTMLProgressElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLQuoteElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLScriptElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSelectElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSourceElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSpanElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLStyleElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCaptionElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCellElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableColElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableDataCellElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableHeaderCellElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableRowElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableSectionElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTextAreaElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTimeElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTitleElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTrackElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUListElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUnknownElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLVideoElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursor IDBCursorSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursorWithValue
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBDatabase IDBDatabaseSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBEnvironment IDBEnvironmentSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBFactory IDBFactorySync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBIndex IDBIndexSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBKeyRange IDBObjectStore
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBObjectStoreSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBOpenDBRequest
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBRequest IDBTransaction
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBTransactionSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBVersionChangeEvent
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ImageData IndexedDB
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Int16Array Int32Array
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Int8Array L10n LinkStyle
- syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystem
- syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystemSync
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Location LockedFile
- syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaQueryList MediaQueryListListener
- syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaRecorder MediaSource
- syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaStream MediaStreamTrack
- syntax keyword typescriptBOM containedin=typescriptIdentifierName MutationObserver
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Navigator NavigatorGeolocation
- syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorID NavigatorLanguage
- syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorOnLine
- syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorPlugins
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Node NodeFilter
- syntax keyword typescriptBOM containedin=typescriptIdentifierName NodeIterator NodeList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Notification OfflineAudioContext
- syntax keyword typescriptBOM containedin=typescriptIdentifierName OscillatorNode PannerNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ParentNode Performance
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceNavigation
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceTiming
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Permissions PermissionSettings
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Plugin PluginArray
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Position PositionError
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PositionOptions
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PowerManager ProcessingInstruction
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PromiseResolver
- syntax keyword typescriptBOM containedin=typescriptIdentifierName PushManager Range
- syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCConfiguration
- syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnection
- syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnectionErrorCallback
- syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescription
- syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescriptionCallback
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ScriptProcessorNode
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Selection SettingsLock
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SettingsManager
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SharedWorker StyleSheet
- syntax keyword typescriptBOM containedin=typescriptIdentifierName StyleSheetList SVGAElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAngle SVGAnimateColorElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedAngle
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedBoolean
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedEnumeration
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedInteger
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLength
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLengthList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumber
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumberList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPoints
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPreserveAspectRatio
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedRect
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedString
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedTransformList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateMotionElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateTransformElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimationElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCircleElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGClipPathElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCursorElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGDefsElement SVGDescElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGElement SVGEllipseElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFilterElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontElement SVGFontFaceElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceFormatElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceNameElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceSrcElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceUriElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGForeignObjectElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGElement SVGGlyphElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGradientElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGHKernElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGImageElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLength SVGLengthList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLinearGradientElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLineElement SVGMaskElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMatrix SVGMissingGlyphElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMPathElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGNumber SVGNumberList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPathElement SVGPatternElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPoint SVGPolygonElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPolylineElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPreserveAspectRatio
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRadialGradientElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRect SVGRectElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGScriptElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSetElement SVGStopElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStringList SVGStylable
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStyleElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSVGElement SVGSwitchElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSymbolElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTests SVGTextElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTextPositioningElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTitleElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransform SVGTransformable
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransformList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTRefElement SVGTSpanElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGUseElement SVGViewElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGVKernElement
- syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPServerSocket
- syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPSocket Telephony
- syntax keyword typescriptBOM containedin=typescriptIdentifierName TelephonyCall Text
- syntax keyword typescriptBOM containedin=typescriptIdentifierName TextDecoder TextEncoder
- syntax keyword typescriptBOM containedin=typescriptIdentifierName TextMetrics TimeRanges
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Touch TouchList
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Transferable TreeWalker
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint16Array Uint32Array
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint8Array Uint8ClampedArray
- syntax keyword typescriptBOM containedin=typescriptIdentifierName URLSearchParams
- syntax keyword typescriptBOM containedin=typescriptIdentifierName URLUtilsReadOnly
- syntax keyword typescriptBOM containedin=typescriptIdentifierName UserProximityEvent
- syntax keyword typescriptBOM containedin=typescriptIdentifierName ValidityState VideoPlaybackQuality
- syntax keyword typescriptBOM containedin=typescriptIdentifierName WaveShaperNode WebBluetooth
- syntax keyword typescriptBOM containedin=typescriptIdentifierName WebGLRenderingContext
- syntax keyword typescriptBOM containedin=typescriptIdentifierName WebSMS WebSocket
- syntax keyword typescriptBOM containedin=typescriptIdentifierName WebVTT WifiManager
- syntax keyword typescriptBOM containedin=typescriptIdentifierName Window Worker WorkerConsole
- syntax keyword typescriptBOM containedin=typescriptIdentifierName WorkerLocation WorkerNavigator
- syntax keyword typescriptBOM containedin=typescriptIdentifierName XDomainRequest XMLDocument
- syntax keyword typescriptBOM containedin=typescriptIdentifierName XMLHttpRequestEventTarget
- hi def link typescriptBOM Structure
-
- "runtime syntax/yats/web-window.vim
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName applicationCache
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName closed
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName Components
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName controllers
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName dialogArguments
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName document
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frameElement
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frames
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName fullScreen
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName history
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerHeight
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerWidth
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName length
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName location
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName locationbar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName menubar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName messageManager
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName name navigator
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName opener
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerHeight
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerWidth
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageXOffset
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageYOffset
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName parent
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName performance
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName personalbar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName returnValue
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screen
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenX
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenY
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollbars
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxX
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxY
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollX
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollY
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName self sidebar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName status
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName statusbar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName toolbar
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName top visualViewport
- syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName window
- syntax cluster props add=typescriptBOMWindowProp
- hi def link typescriptBOMWindowProp Structure
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName alert nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName atob nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName blur nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName btoa nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearImmediate nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearInterval nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearTimeout nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName close nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName confirm nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName dispatchEvent nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName find nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName focus nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttention nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttentionWithCycleCount nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getComputedStyle nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getDefaulComputedStyle nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getSelection nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName matchMedia nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName maximize nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveBy nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveTo nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName open nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName openDialog nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName postMessage nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName print nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName prompt nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName removeEventListener nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeBy nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeTo nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName restore nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scroll nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollBy nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByLines nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByPages nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollTo nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setCursor nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setImmediate nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setInterval nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setResizable nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setTimeout nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName showModalDialog nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName sizeToContent nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName stop nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName updateCommands nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptBOMWindowMethod
- hi def link typescriptBOMWindowMethod Structure
- syntax keyword typescriptBOMWindowEvent contained onabort onbeforeunload onblur onchange
- syntax keyword typescriptBOMWindowEvent contained onclick onclose oncontextmenu ondevicelight
- syntax keyword typescriptBOMWindowEvent contained ondevicemotion ondeviceorientation
- syntax keyword typescriptBOMWindowEvent contained ondeviceproximity ondragdrop onerror
- syntax keyword typescriptBOMWindowEvent contained onfocus onhashchange onkeydown onkeypress
- syntax keyword typescriptBOMWindowEvent contained onkeyup onload onmousedown onmousemove
- syntax keyword typescriptBOMWindowEvent contained onmouseout onmouseover onmouseup
- syntax keyword typescriptBOMWindowEvent contained onmozbeforepaint onpaint onpopstate
- syntax keyword typescriptBOMWindowEvent contained onreset onresize onscroll onselect
- syntax keyword typescriptBOMWindowEvent contained onsubmit onunload onuserproximity
- syntax keyword typescriptBOMWindowEvent contained onpageshow onpagehide
- hi def link typescriptBOMWindowEvent Keyword
- syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName DOMParser
- syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName QueryInterface
- syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName XMLSerializer
- hi def link typescriptBOMWindowCons Structure
-
- "runtime syntax/yats/web-navigator.vim
- syntax keyword typescriptBOMNavigatorProp contained battery buildID connection cookieEnabled
- syntax keyword typescriptBOMNavigatorProp contained doNotTrack maxTouchPoints oscpu
- syntax keyword typescriptBOMNavigatorProp contained productSub push serviceWorker
- syntax keyword typescriptBOMNavigatorProp contained vendor vendorSub
- syntax cluster props add=typescriptBOMNavigatorProp
- hi def link typescriptBOMNavigatorProp Keyword
- syntax keyword typescriptBOMNavigatorMethod contained addIdleObserver geolocation nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMNavigatorMethod contained getDeviceStorage getDeviceStorages nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMNavigatorMethod contained getGamepads getUserMedia registerContentHandler nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMNavigatorMethod contained removeIdleObserver requestWakeLock nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMNavigatorMethod contained share vibrate watch registerProtocolHandler nextgroup=typescriptFuncCallArg
- syntax keyword typescriptBOMNavigatorMethod contained sendBeacon nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptBOMNavigatorMethod
- hi def link typescriptBOMNavigatorMethod Keyword
- syntax keyword typescriptServiceWorkerMethod contained register nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptServiceWorkerMethod
- hi def link typescriptServiceWorkerMethod Keyword
-
- "runtime syntax/yats/web-location.vim
- syntax keyword typescriptBOMLocationProp contained href protocol host hostname port
- syntax keyword typescriptBOMLocationProp contained pathname search hash username password
- syntax keyword typescriptBOMLocationProp contained origin
- syntax cluster props add=typescriptBOMLocationProp
- hi def link typescriptBOMLocationProp Keyword
- syntax keyword typescriptBOMLocationMethod contained assign reload replace toString nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptBOMLocationMethod
- hi def link typescriptBOMLocationMethod Keyword
-
- "runtime syntax/yats/web-history.vim
- syntax keyword typescriptBOMHistoryProp contained length current next previous state
- syntax keyword typescriptBOMHistoryProp contained scrollRestoration
- syntax cluster props add=typescriptBOMHistoryProp
- hi def link typescriptBOMHistoryProp Keyword
- syntax keyword typescriptBOMHistoryMethod contained back forward go pushState replaceState nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptBOMHistoryMethod
- hi def link typescriptBOMHistoryMethod Keyword
-
- "runtime syntax/yats/web-console.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName console
- syntax keyword typescriptConsoleMethod contained count dir error group groupCollapsed nextgroup=typescriptFuncCallArg
- syntax keyword typescriptConsoleMethod contained groupEnd info log time timeEnd trace nextgroup=typescriptFuncCallArg
- syntax keyword typescriptConsoleMethod contained warn nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptConsoleMethod
- hi def link typescriptConsoleMethod Keyword
-
- "runtime syntax/yats/web-xhr.vim
- syntax keyword typescriptXHRGlobal containedin=typescriptIdentifierName XMLHttpRequest
- hi def link typescriptXHRGlobal Structure
- syntax keyword typescriptXHRProp contained onreadystatechange readyState response
- syntax keyword typescriptXHRProp contained responseText responseType responseXML status
- syntax keyword typescriptXHRProp contained statusText timeout ontimeout upload withCredentials
- syntax cluster props add=typescriptXHRProp
- hi def link typescriptXHRProp Keyword
- syntax keyword typescriptXHRMethod contained abort getAllResponseHeaders getResponseHeader nextgroup=typescriptFuncCallArg
- syntax keyword typescriptXHRMethod contained open overrideMimeType send setRequestHeader nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptXHRMethod
- hi def link typescriptXHRMethod Keyword
-
- "runtime syntax/yats/web-blob.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Blob BlobBuilder
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName File FileReader
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName FileReaderSync
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName URL nextgroup=typescriptGlobalURLDot,typescriptFuncCallArg
- syntax match typescriptGlobalURLDot /\./ contained nextgroup=typescriptURLStaticMethod,typescriptProp
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName URLUtils
- syntax keyword typescriptFileMethod contained readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptFileMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptFileMethod
- hi def link typescriptFileMethod Keyword
- syntax keyword typescriptFileReaderProp contained error readyState result
- syntax cluster props add=typescriptFileReaderProp
- hi def link typescriptFileReaderProp Keyword
- syntax keyword typescriptFileReaderMethod contained abort readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
- syntax keyword typescriptFileReaderMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptFileReaderMethod
- hi def link typescriptFileReaderMethod Keyword
- syntax keyword typescriptFileListMethod contained item nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptFileListMethod
- hi def link typescriptFileListMethod Keyword
- syntax keyword typescriptBlobMethod contained append getBlob getFile nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptBlobMethod
- hi def link typescriptBlobMethod Keyword
- syntax keyword typescriptURLUtilsProp contained hash host hostname href origin password
- syntax keyword typescriptURLUtilsProp contained pathname port protocol search searchParams
- syntax keyword typescriptURLUtilsProp contained username
- syntax cluster props add=typescriptURLUtilsProp
- hi def link typescriptURLUtilsProp Keyword
- syntax keyword typescriptURLStaticMethod contained createObjectURL revokeObjectURL nextgroup=typescriptFuncCallArg
- hi def link typescriptURLStaticMethod Keyword
-
- "runtime syntax/yats/web-crypto.vim
- syntax keyword typescriptCryptoGlobal containedin=typescriptIdentifierName crypto
- hi def link typescriptCryptoGlobal Structure
- syntax keyword typescriptSubtleCryptoMethod contained encrypt decrypt sign verify nextgroup=typescriptFuncCallArg
- syntax keyword typescriptSubtleCryptoMethod contained digest nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptSubtleCryptoMethod
- hi def link typescriptSubtleCryptoMethod Keyword
- syntax keyword typescriptCryptoProp contained subtle
- syntax cluster props add=typescriptCryptoProp
- hi def link typescriptCryptoProp Keyword
- syntax keyword typescriptCryptoMethod contained getRandomValues nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptCryptoMethod
- hi def link typescriptCryptoMethod Keyword
-
- "runtime syntax/yats/web-fetch.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Headers Request
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Response
- syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName fetch nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptGlobalMethod
- hi def link typescriptGlobalMethod Structure
- syntax keyword typescriptHeadersMethod contained append delete get getAll has set nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptHeadersMethod
- hi def link typescriptHeadersMethod Keyword
- syntax keyword typescriptRequestProp contained method url headers context referrer
- syntax keyword typescriptRequestProp contained mode credentials cache
- syntax cluster props add=typescriptRequestProp
- hi def link typescriptRequestProp Keyword
- syntax keyword typescriptRequestMethod contained clone nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptRequestMethod
- hi def link typescriptRequestMethod Keyword
- syntax keyword typescriptResponseProp contained type url status statusText headers
- syntax keyword typescriptResponseProp contained redirected
- syntax cluster props add=typescriptResponseProp
- hi def link typescriptResponseProp Keyword
- syntax keyword typescriptResponseMethod contained clone nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptResponseMethod
- hi def link typescriptResponseMethod Keyword
-
- "runtime syntax/yats/web-service-worker.vim
- syntax keyword typescriptServiceWorkerProp contained controller ready
- syntax cluster props add=typescriptServiceWorkerProp
- hi def link typescriptServiceWorkerProp Keyword
- syntax keyword typescriptServiceWorkerMethod contained register getRegistration nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptServiceWorkerMethod
- hi def link typescriptServiceWorkerMethod Keyword
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Cache
- syntax keyword typescriptCacheMethod contained match matchAll add addAll put delete nextgroup=typescriptFuncCallArg
- syntax keyword typescriptCacheMethod contained keys nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptCacheMethod
- hi def link typescriptCacheMethod Keyword
-
- "runtime syntax/yats/web-encoding.vim
- syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextEncoder
- syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextDecoder
- hi def link typescriptEncodingGlobal Structure
- syntax keyword typescriptEncodingProp contained encoding fatal ignoreBOM
- syntax cluster props add=typescriptEncodingProp
- hi def link typescriptEncodingProp Keyword
- syntax keyword typescriptEncodingMethod contained encode decode nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptEncodingMethod
- hi def link typescriptEncodingMethod Keyword
-
- "runtime syntax/yats/web-geo.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName Geolocation
- syntax keyword typescriptGeolocationMethod contained getCurrentPosition watchPosition nextgroup=typescriptFuncCallArg
- syntax keyword typescriptGeolocationMethod contained clearWatch nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptGeolocationMethod
- hi def link typescriptGeolocationMethod Keyword
-
- "runtime syntax/yats/web-network.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName NetworkInformation
- syntax keyword typescriptBOMNetworkProp contained downlink downlinkMax effectiveType
- syntax keyword typescriptBOMNetworkProp contained rtt type
- syntax cluster props add=typescriptBOMNetworkProp
- hi def link typescriptBOMNetworkProp Keyword
-
- "runtime syntax/yats/web-payment.vim
- syntax keyword typescriptGlobal containedin=typescriptIdentifierName PaymentRequest
- syntax keyword typescriptPaymentMethod contained show abort canMakePayment nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptPaymentMethod
- hi def link typescriptPaymentMethod Keyword
- syntax keyword typescriptPaymentProp contained shippingAddress shippingOption result
- syntax cluster props add=typescriptPaymentProp
- hi def link typescriptPaymentProp Keyword
- syntax keyword typescriptPaymentEvent contained onshippingaddresschange onshippingoptionchange
- hi def link typescriptPaymentEvent Keyword
- syntax keyword typescriptPaymentResponseMethod contained complete nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptPaymentResponseMethod
- hi def link typescriptPaymentResponseMethod Keyword
- syntax keyword typescriptPaymentResponseProp contained details methodName payerEmail
- syntax keyword typescriptPaymentResponseProp contained payerPhone shippingAddress
- syntax keyword typescriptPaymentResponseProp contained shippingOption
- syntax cluster props add=typescriptPaymentResponseProp
- hi def link typescriptPaymentResponseProp Keyword
- syntax keyword typescriptPaymentAddressProp contained addressLine careOf city country
- syntax keyword typescriptPaymentAddressProp contained country dependentLocality languageCode
- syntax keyword typescriptPaymentAddressProp contained organization phone postalCode
- syntax keyword typescriptPaymentAddressProp contained recipient region sortingCode
- syntax cluster props add=typescriptPaymentAddressProp
- hi def link typescriptPaymentAddressProp Keyword
- syntax keyword typescriptPaymentShippingOptionProp contained id label amount selected
- syntax cluster props add=typescriptPaymentShippingOptionProp
- hi def link typescriptPaymentShippingOptionProp Keyword
-
- "runtime syntax/yats/dom-node.vim
- syntax keyword typescriptDOMNodeProp contained attributes baseURI baseURIObject childNodes
- syntax keyword typescriptDOMNodeProp contained firstChild lastChild localName namespaceURI
- syntax keyword typescriptDOMNodeProp contained nextSibling nodeName nodePrincipal
- syntax keyword typescriptDOMNodeProp contained nodeType nodeValue ownerDocument parentElement
- syntax keyword typescriptDOMNodeProp contained parentNode prefix previousSibling textContent
- syntax cluster props add=typescriptDOMNodeProp
- hi def link typescriptDOMNodeProp Keyword
- syntax keyword typescriptDOMNodeMethod contained appendChild cloneNode compareDocumentPosition nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMNodeMethod contained getUserData hasAttributes hasChildNodes nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMNodeMethod contained insertBefore isDefaultNamespace isEqualNode nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMNodeMethod contained isSameNode isSupported lookupNamespaceURI nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMNodeMethod contained lookupPrefix normalize removeChild nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMNodeMethod contained replaceChild setUserData nextgroup=typescriptFuncCallArg
- syntax match typescriptDOMNodeMethod contained /contains/
- syntax cluster props add=typescriptDOMNodeMethod
- hi def link typescriptDOMNodeMethod Keyword
- syntax keyword typescriptDOMNodeType contained ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE
- syntax keyword typescriptDOMNodeType contained CDATA_SECTION_NODEN_NODE ENTITY_REFERENCE_NODE
- syntax keyword typescriptDOMNodeType contained ENTITY_NODE PROCESSING_INSTRUCTION_NODEN_NODE
- syntax keyword typescriptDOMNodeType contained COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE
- syntax keyword typescriptDOMNodeType contained DOCUMENT_FRAGMENT_NODE NOTATION_NODE
- hi def link typescriptDOMNodeType Keyword
-
- "runtime syntax/yats/dom-elem.vim
- syntax keyword typescriptDOMElemAttrs contained accessKey clientHeight clientLeft
- syntax keyword typescriptDOMElemAttrs contained clientTop clientWidth id innerHTML
- syntax keyword typescriptDOMElemAttrs contained length onafterscriptexecute onbeforescriptexecute
- syntax keyword typescriptDOMElemAttrs contained oncopy oncut onpaste onwheel scrollHeight
- syntax keyword typescriptDOMElemAttrs contained scrollLeft scrollTop scrollWidth tagName
- syntax keyword typescriptDOMElemAttrs contained classList className name outerHTML
- syntax keyword typescriptDOMElemAttrs contained style
- hi def link typescriptDOMElemAttrs Keyword
- syntax keyword typescriptDOMElemFuncs contained getAttributeNS getAttributeNode getAttributeNodeNS
- syntax keyword typescriptDOMElemFuncs contained getBoundingClientRect getClientRects
- syntax keyword typescriptDOMElemFuncs contained getElementsByClassName getElementsByTagName
- syntax keyword typescriptDOMElemFuncs contained getElementsByTagNameNS hasAttribute
- syntax keyword typescriptDOMElemFuncs contained hasAttributeNS insertAdjacentHTML
- syntax keyword typescriptDOMElemFuncs contained matches querySelector querySelectorAll
- syntax keyword typescriptDOMElemFuncs contained removeAttribute removeAttributeNS
- syntax keyword typescriptDOMElemFuncs contained removeAttributeNode requestFullscreen
- syntax keyword typescriptDOMElemFuncs contained requestPointerLock scrollIntoView
- syntax keyword typescriptDOMElemFuncs contained setAttribute setAttributeNS setAttributeNode
- syntax keyword typescriptDOMElemFuncs contained setAttributeNodeNS setCapture supports
- syntax keyword typescriptDOMElemFuncs contained getAttribute
- hi def link typescriptDOMElemFuncs Keyword
-
- "runtime syntax/yats/dom-document.vim
- syntax keyword typescriptDOMDocProp contained activeElement body cookie defaultView
- syntax keyword typescriptDOMDocProp contained designMode dir domain embeds forms head
- syntax keyword typescriptDOMDocProp contained images lastModified links location plugins
- syntax keyword typescriptDOMDocProp contained postMessage readyState referrer registerElement
- syntax keyword typescriptDOMDocProp contained scripts styleSheets title vlinkColor
- syntax keyword typescriptDOMDocProp contained xmlEncoding characterSet compatMode
- syntax keyword typescriptDOMDocProp contained contentType currentScript doctype documentElement
- syntax keyword typescriptDOMDocProp contained documentURI documentURIObject firstChild
- syntax keyword typescriptDOMDocProp contained implementation lastStyleSheetSet namespaceURI
- syntax keyword typescriptDOMDocProp contained nodePrincipal ononline pointerLockElement
- syntax keyword typescriptDOMDocProp contained popupNode preferredStyleSheetSet selectedStyleSheetSet
- syntax keyword typescriptDOMDocProp contained styleSheetSets textContent tooltipNode
- syntax cluster props add=typescriptDOMDocProp
- hi def link typescriptDOMDocProp Keyword
- syntax keyword typescriptDOMDocMethod contained caretPositionFromPoint close createNodeIterator nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained createRange createTreeWalker elementFromPoint nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained getElementsByName adoptNode createAttribute nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained createCDATASection createComment createDocumentFragment nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained createElement createElementNS createEvent nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained createExpression createNSResolver nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained createProcessingInstruction createTextNode nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained enableStyleSheetsForSet evaluate execCommand nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained exitPointerLock getBoxObjectFor getElementById nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained getElementsByClassName getElementsByTagName nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained getElementsByTagNameNS getSelection nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained hasFocus importNode loadOverlay open nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained queryCommandSupported querySelector nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMDocMethod contained querySelectorAll write writeln nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptDOMDocMethod
- hi def link typescriptDOMDocMethod Keyword
-
- "runtime syntax/yats/dom-event.vim
- syntax keyword typescriptDOMEventTargetMethod contained addEventListener removeEventListener nextgroup=typescriptEventFuncCallArg
- syntax keyword typescriptDOMEventTargetMethod contained dispatchEvent waitUntil nextgroup=typescriptEventFuncCallArg
- syntax cluster props add=typescriptDOMEventTargetMethod
- hi def link typescriptDOMEventTargetMethod Keyword
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AnimationEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AudioProcessingEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeInputEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeUnloadEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BlobEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ClipboardEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CloseEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CompositionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CSSFontFaceLoadEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CustomEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceLightEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceMotionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceOrientationEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceProximityEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DOMTransactionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DragEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName EditingBeforeInputEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ErrorEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName FocusEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName GamepadEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName HashChangeEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName IDBVersionChangeEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName KeyboardEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MediaStreamEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MessageEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MouseEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MutationEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName OfflineAudioCompletionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PageTransitionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PointerEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PopStateEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ProgressEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RelatedEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RTCPeerConnectionIceEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SensorEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName StorageEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGZoomEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TimeEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TouchEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TrackEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TransitionEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UIEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UserProximityEvent
- syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName WheelEvent
- hi def link typescriptDOMEventCons Structure
- syntax keyword typescriptDOMEventProp contained bubbles cancelable currentTarget defaultPrevented
- syntax keyword typescriptDOMEventProp contained eventPhase target timeStamp type isTrusted
- syntax keyword typescriptDOMEventProp contained isReload
- syntax cluster props add=typescriptDOMEventProp
- hi def link typescriptDOMEventProp Keyword
- syntax keyword typescriptDOMEventMethod contained initEvent preventDefault stopImmediatePropagation nextgroup=typescriptEventFuncCallArg
- syntax keyword typescriptDOMEventMethod contained stopPropagation respondWith default nextgroup=typescriptEventFuncCallArg
- syntax cluster props add=typescriptDOMEventMethod
- hi def link typescriptDOMEventMethod Keyword
-
- "runtime syntax/yats/dom-storage.vim
- syntax keyword typescriptDOMStorage contained sessionStorage localStorage
- hi def link typescriptDOMStorage Keyword
- syntax keyword typescriptDOMStorageProp contained length
- syntax cluster props add=typescriptDOMStorageProp
- hi def link typescriptDOMStorageProp Keyword
- syntax keyword typescriptDOMStorageMethod contained getItem key setItem removeItem nextgroup=typescriptFuncCallArg
- syntax keyword typescriptDOMStorageMethod contained clear nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptDOMStorageMethod
- hi def link typescriptDOMStorageMethod Keyword
-
- "runtime syntax/yats/dom-form.vim
- syntax keyword typescriptDOMFormProp contained acceptCharset action elements encoding
- syntax keyword typescriptDOMFormProp contained enctype length method name target
- syntax cluster props add=typescriptDOMFormProp
- hi def link typescriptDOMFormProp Keyword
- syntax keyword typescriptDOMFormMethod contained reportValidity reset submit nextgroup=typescriptFuncCallArg
- syntax cluster props add=typescriptDOMFormMethod
- hi def link typescriptDOMFormMethod Keyword
-
- "runtime syntax/yats/css.vim
- syntax keyword typescriptDOMStyle contained alignContent alignItems alignSelf animation
- syntax keyword typescriptDOMStyle contained animationDelay animationDirection animationDuration
- syntax keyword typescriptDOMStyle contained animationFillMode animationIterationCount
- syntax keyword typescriptDOMStyle contained animationName animationPlayState animationTimingFunction
- syntax keyword typescriptDOMStyle contained appearance backfaceVisibility background
- syntax keyword typescriptDOMStyle contained backgroundAttachment backgroundBlendMode
- syntax keyword typescriptDOMStyle contained backgroundClip backgroundColor backgroundImage
- syntax keyword typescriptDOMStyle contained backgroundOrigin backgroundPosition backgroundRepeat
- syntax keyword typescriptDOMStyle contained backgroundSize border borderBottom borderBottomColor
- syntax keyword typescriptDOMStyle contained borderBottomLeftRadius borderBottomRightRadius
- syntax keyword typescriptDOMStyle contained borderBottomStyle borderBottomWidth borderCollapse
- syntax keyword typescriptDOMStyle contained borderColor borderImage borderImageOutset
- syntax keyword typescriptDOMStyle contained borderImageRepeat borderImageSlice borderImageSource
- syntax keyword typescriptDOMStyle contained borderImageWidth borderLeft borderLeftColor
- syntax keyword typescriptDOMStyle contained borderLeftStyle borderLeftWidth borderRadius
- syntax keyword typescriptDOMStyle contained borderRight borderRightColor borderRightStyle
- syntax keyword typescriptDOMStyle contained borderRightWidth borderSpacing borderStyle
- syntax keyword typescriptDOMStyle contained borderTop borderTopColor borderTopLeftRadius
- syntax keyword typescriptDOMStyle contained borderTopRightRadius borderTopStyle borderTopWidth
- syntax keyword typescriptDOMStyle contained borderWidth bottom boxDecorationBreak
- syntax keyword typescriptDOMStyle contained boxShadow boxSizing breakAfter breakBefore
- syntax keyword typescriptDOMStyle contained breakInside captionSide caretColor caretShape
- syntax keyword typescriptDOMStyle contained caret clear clip clipPath color columns
- syntax keyword typescriptDOMStyle contained columnCount columnFill columnGap columnRule
- syntax keyword typescriptDOMStyle contained columnRuleColor columnRuleStyle columnRuleWidth
- syntax keyword typescriptDOMStyle contained columnSpan columnWidth content counterIncrement
- syntax keyword typescriptDOMStyle contained counterReset cursor direction display
- syntax keyword typescriptDOMStyle contained emptyCells flex flexBasis flexDirection
- syntax keyword typescriptDOMStyle contained flexFlow flexGrow flexShrink flexWrap
- syntax keyword typescriptDOMStyle contained float font fontFamily fontFeatureSettings
- syntax keyword typescriptDOMStyle contained fontKerning fontLanguageOverride fontSize
- syntax keyword typescriptDOMStyle contained fontSizeAdjust fontStretch fontStyle fontSynthesis
- syntax keyword typescriptDOMStyle contained fontVariant fontVariantAlternates fontVariantCaps
- syntax keyword typescriptDOMStyle contained fontVariantEastAsian fontVariantLigatures
- syntax keyword typescriptDOMStyle contained fontVariantNumeric fontVariantPosition
- syntax keyword typescriptDOMStyle contained fontWeight grad grid gridArea gridAutoColumns
- syntax keyword typescriptDOMStyle contained gridAutoFlow gridAutoPosition gridAutoRows
- syntax keyword typescriptDOMStyle contained gridColumn gridColumnStart gridColumnEnd
- syntax keyword typescriptDOMStyle contained gridRow gridRowStart gridRowEnd gridTemplate
- syntax keyword typescriptDOMStyle contained gridTemplateAreas gridTemplateRows gridTemplateColumns
- syntax keyword typescriptDOMStyle contained height hyphens imageRendering imageResolution
- syntax keyword typescriptDOMStyle contained imageOrientation imeMode inherit justifyContent
- syntax keyword typescriptDOMStyle contained left letterSpacing lineBreak lineHeight
- syntax keyword typescriptDOMStyle contained listStyle listStyleImage listStylePosition
- syntax keyword typescriptDOMStyle contained listStyleType margin marginBottom marginLeft
- syntax keyword typescriptDOMStyle contained marginRight marginTop marks mask maskType
- syntax keyword typescriptDOMStyle contained maxHeight maxWidth minHeight minWidth
- syntax keyword typescriptDOMStyle contained mixBlendMode objectFit objectPosition
- syntax keyword typescriptDOMStyle contained opacity order orphans outline outlineColor
- syntax keyword typescriptDOMStyle contained outlineOffset outlineStyle outlineWidth
- syntax keyword typescriptDOMStyle contained overflow overflowWrap overflowX overflowY
- syntax keyword typescriptDOMStyle contained overflowClipBox padding paddingBottom
- syntax keyword typescriptDOMStyle contained paddingLeft paddingRight paddingTop pageBreakAfter
- syntax keyword typescriptDOMStyle contained pageBreakBefore pageBreakInside perspective
- syntax keyword typescriptDOMStyle contained perspectiveOrigin pointerEvents position
- syntax keyword typescriptDOMStyle contained quotes resize right shapeImageThreshold
- syntax keyword typescriptDOMStyle contained shapeMargin shapeOutside tableLayout tabSize
- syntax keyword typescriptDOMStyle contained textAlign textAlignLast textCombineHorizontal
- syntax keyword typescriptDOMStyle contained textDecoration textDecorationColor textDecorationLine
- syntax keyword typescriptDOMStyle contained textDecorationStyle textIndent textOrientation
- syntax keyword typescriptDOMStyle contained textOverflow textRendering textShadow
- syntax keyword typescriptDOMStyle contained textTransform textUnderlinePosition top
- syntax keyword typescriptDOMStyle contained touchAction transform transformOrigin
- syntax keyword typescriptDOMStyle contained transformStyle transition transitionDelay
- syntax keyword typescriptDOMStyle contained transitionDuration transitionProperty
- syntax keyword typescriptDOMStyle contained transitionTimingFunction unicodeBidi unicodeRange
- syntax keyword typescriptDOMStyle contained userSelect userZoom verticalAlign visibility
- syntax keyword typescriptDOMStyle contained whiteSpace width willChange wordBreak
- syntax keyword typescriptDOMStyle contained wordSpacing wordWrap writingMode zIndex
- hi def link typescriptDOMStyle Keyword
-
-
-
- let typescript_props = 1
-
- "runtime syntax/yats/event.vim
- syntax keyword typescriptAnimationEvent contained animationend animationiteration
- syntax keyword typescriptAnimationEvent contained animationstart beginEvent endEvent
- syntax keyword typescriptAnimationEvent contained repeatEvent
- syntax cluster events add=typescriptAnimationEvent
- hi def link typescriptAnimationEvent Title
- syntax keyword typescriptCSSEvent contained CssRuleViewRefreshed CssRuleViewChanged
- syntax keyword typescriptCSSEvent contained CssRuleViewCSSLinkClicked transitionend
- syntax cluster events add=typescriptCSSEvent
- hi def link typescriptCSSEvent Title
- syntax keyword typescriptDatabaseEvent contained blocked complete error success upgradeneeded
- syntax keyword typescriptDatabaseEvent contained versionchange
- syntax cluster events add=typescriptDatabaseEvent
- hi def link typescriptDatabaseEvent Title
- syntax keyword typescriptDocumentEvent contained DOMLinkAdded DOMLinkRemoved DOMMetaAdded
- syntax keyword typescriptDocumentEvent contained DOMMetaRemoved DOMWillOpenModalDialog
- syntax keyword typescriptDocumentEvent contained DOMModalDialogClosed unload
- syntax cluster events add=typescriptDocumentEvent
- hi def link typescriptDocumentEvent Title
- syntax keyword typescriptDOMMutationEvent contained DOMAttributeNameChanged DOMAttrModified
- syntax keyword typescriptDOMMutationEvent contained DOMCharacterDataModified DOMContentLoaded
- syntax keyword typescriptDOMMutationEvent contained DOMElementNameChanged DOMNodeInserted
- syntax keyword typescriptDOMMutationEvent contained DOMNodeInsertedIntoDocument DOMNodeRemoved
- syntax keyword typescriptDOMMutationEvent contained DOMNodeRemovedFromDocument DOMSubtreeModified
- syntax cluster events add=typescriptDOMMutationEvent
- hi def link typescriptDOMMutationEvent Title
- syntax keyword typescriptDragEvent contained drag dragdrop dragend dragenter dragexit
- syntax keyword typescriptDragEvent contained draggesture dragleave dragover dragstart
- syntax keyword typescriptDragEvent contained drop
- syntax cluster events add=typescriptDragEvent
- hi def link typescriptDragEvent Title
- syntax keyword typescriptElementEvent contained invalid overflow underflow DOMAutoComplete
- syntax keyword typescriptElementEvent contained command commandupdate
- syntax cluster events add=typescriptElementEvent
- hi def link typescriptElementEvent Title
- syntax keyword typescriptFocusEvent contained blur change DOMFocusIn DOMFocusOut focus
- syntax keyword typescriptFocusEvent contained focusin focusout
- syntax cluster events add=typescriptFocusEvent
- hi def link typescriptFocusEvent Title
- syntax keyword typescriptFormEvent contained reset submit
- syntax cluster events add=typescriptFormEvent
- hi def link typescriptFormEvent Title
- syntax keyword typescriptFrameEvent contained DOMFrameContentLoaded
- syntax cluster events add=typescriptFrameEvent
- hi def link typescriptFrameEvent Title
- syntax keyword typescriptInputDeviceEvent contained click contextmenu DOMMouseScroll
- syntax keyword typescriptInputDeviceEvent contained dblclick gamepadconnected gamepaddisconnected
- syntax keyword typescriptInputDeviceEvent contained keydown keypress keyup MozGamepadButtonDown
- syntax keyword typescriptInputDeviceEvent contained MozGamepadButtonUp mousedown mouseenter
- syntax keyword typescriptInputDeviceEvent contained mouseleave mousemove mouseout
- syntax keyword typescriptInputDeviceEvent contained mouseover mouseup mousewheel MozMousePixelScroll
- syntax keyword typescriptInputDeviceEvent contained pointerlockchange pointerlockerror
- syntax keyword typescriptInputDeviceEvent contained wheel
- syntax cluster events add=typescriptInputDeviceEvent
- hi def link typescriptInputDeviceEvent Title
- syntax keyword typescriptMediaEvent contained audioprocess canplay canplaythrough
- syntax keyword typescriptMediaEvent contained durationchange emptied ended ended loadeddata
- syntax keyword typescriptMediaEvent contained loadedmetadata MozAudioAvailable pause
- syntax keyword typescriptMediaEvent contained play playing ratechange seeked seeking
- syntax keyword typescriptMediaEvent contained stalled suspend timeupdate volumechange
- syntax keyword typescriptMediaEvent contained waiting complete
- syntax cluster events add=typescriptMediaEvent
- hi def link typescriptMediaEvent Title
- syntax keyword typescriptMenuEvent contained DOMMenuItemActive DOMMenuItemInactive
- syntax cluster events add=typescriptMenuEvent
- hi def link typescriptMenuEvent Title
- syntax keyword typescriptNetworkEvent contained datachange dataerror disabled enabled
- syntax keyword typescriptNetworkEvent contained offline online statuschange connectionInfoUpdate
- syntax cluster events add=typescriptNetworkEvent
- hi def link typescriptNetworkEvent Title
- syntax keyword typescriptProgressEvent contained abort error load loadend loadstart
- syntax keyword typescriptProgressEvent contained progress timeout uploadprogress
- syntax cluster events add=typescriptProgressEvent
- hi def link typescriptProgressEvent Title
- syntax keyword typescriptResourceEvent contained cached error load
- syntax cluster events add=typescriptResourceEvent
- hi def link typescriptResourceEvent Title
- syntax keyword typescriptScriptEvent contained afterscriptexecute beforescriptexecute
- syntax cluster events add=typescriptScriptEvent
- hi def link typescriptScriptEvent Title
- syntax keyword typescriptSensorEvent contained compassneedscalibration devicelight
- syntax keyword typescriptSensorEvent contained devicemotion deviceorientation deviceproximity
- syntax keyword typescriptSensorEvent contained orientationchange userproximity
- syntax cluster events add=typescriptSensorEvent
- hi def link typescriptSensorEvent Title
- syntax keyword typescriptSessionHistoryEvent contained pagehide pageshow popstate
- syntax cluster events add=typescriptSessionHistoryEvent
- hi def link typescriptSessionHistoryEvent Title
- syntax keyword typescriptStorageEvent contained change storage
- syntax cluster events add=typescriptStorageEvent
- hi def link typescriptStorageEvent Title
- syntax keyword typescriptSVGEvent contained SVGAbort SVGError SVGLoad SVGResize SVGScroll
- syntax keyword typescriptSVGEvent contained SVGUnload SVGZoom
- syntax cluster events add=typescriptSVGEvent
- hi def link typescriptSVGEvent Title
- syntax keyword typescriptTabEvent contained visibilitychange
- syntax cluster events add=typescriptTabEvent
- hi def link typescriptTabEvent Title
- syntax keyword typescriptTextEvent contained compositionend compositionstart compositionupdate
- syntax keyword typescriptTextEvent contained copy cut paste select text
- syntax cluster events add=typescriptTextEvent
- hi def link typescriptTextEvent Title
- syntax keyword typescriptTouchEvent contained touchcancel touchend touchenter touchleave
- syntax keyword typescriptTouchEvent contained touchmove touchstart
- syntax cluster events add=typescriptTouchEvent
- hi def link typescriptTouchEvent Title
- syntax keyword typescriptUpdateEvent contained checking downloading error noupdate
- syntax keyword typescriptUpdateEvent contained obsolete updateready
- syntax cluster events add=typescriptUpdateEvent
- hi def link typescriptUpdateEvent Title
- syntax keyword typescriptValueChangeEvent contained hashchange input readystatechange
- syntax cluster events add=typescriptValueChangeEvent
- hi def link typescriptValueChangeEvent Title
- syntax keyword typescriptViewEvent contained fullscreen fullscreenchange fullscreenerror
- syntax keyword typescriptViewEvent contained resize scroll
- syntax cluster events add=typescriptViewEvent
- hi def link typescriptViewEvent Title
- syntax keyword typescriptWebsocketEvent contained close error message open
- syntax cluster events add=typescriptWebsocketEvent
- hi def link typescriptWebsocketEvent Title
- syntax keyword typescriptWindowEvent contained DOMWindowCreated DOMWindowClose DOMTitleChanged
- syntax cluster events add=typescriptWindowEvent
- hi def link typescriptWindowEvent Title
- syntax keyword typescriptUncategorizedEvent contained beforeunload message open show
- syntax cluster events add=typescriptUncategorizedEvent
- hi def link typescriptUncategorizedEvent Title
- syntax keyword typescriptServiceWorkerEvent contained install activate fetch
- syntax cluster events add=typescriptServiceWorkerEvent
- hi def link typescriptServiceWorkerEvent Title
-
-
-endif
-
-" patch
-"runtime syntax/basic/patch.vim
-" patch for generated code
-syntax keyword typescriptGlobal Promise
- \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
-syntax keyword typescriptGlobal Map WeakMap
- \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
-
-"runtime syntax/basic/members.vim
-syntax keyword typescriptConstructor contained constructor
- \ nextgroup=@typescriptCallSignature
- \ skipwhite skipempty
-
-
-syntax cluster memberNextGroup contains=typescriptMemberOptionality,typescriptTypeAnnotation,@typescriptCallSignature
-
-syntax match typescriptMember /\K\k*/
- \ nextgroup=@memberNextGroup
- \ contained skipwhite
-
-syntax match typescriptMethodAccessor contained /\v(get|set)\s\K/me=e-1
- \ nextgroup=@typescriptMembers
-
-syntax cluster typescriptPropertyMemberDeclaration contains=
- \ typescriptClassStatic,
- \ typescriptAccessibilityModifier,
- \ typescriptReadonlyModifier,
- \ typescriptMethodAccessor,
- \ @typescriptMembers
- " \ typescriptMemberVariableDeclaration
-
-syntax match typescriptMemberOptionality /?\|!/ contained
- \ nextgroup=typescriptTypeAnnotation,@typescriptCallSignature
- \ skipwhite skipempty
-
-syntax cluster typescriptMembers contains=typescriptMember,typescriptStringMember,typescriptComputedMember
-
-syntax keyword typescriptClassStatic static
- \ nextgroup=@typescriptMembers,typescriptAsyncFuncKeyword,typescriptReadonlyModifier
- \ skipwhite contained
-
-syntax keyword typescriptAccessibilityModifier public private protected contained
-
-syntax keyword typescriptReadonlyModifier readonly contained
-
-syntax region typescriptStringMember contained
- \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
- \ nextgroup=@memberNextGroup
- \ skipwhite skipempty
-
-syntax region typescriptComputedMember contained matchgroup=typescriptProperty
- \ start=/\[/rs=s+1 end=/]/
- \ contains=@typescriptValue,typescriptMember,typescriptMappedIn
- \ nextgroup=@memberNextGroup
- \ skipwhite skipempty
-
-"runtime syntax/basic/class.vim
-"don't add typescriptMembers to nextgroup, let outer scope match it
-" so we won't match abstract method outside abstract class
-syntax keyword typescriptAbstract abstract
- \ nextgroup=typescriptClassKeyword
- \ skipwhite skipnl
-syntax keyword typescriptClassKeyword class
- \ nextgroup=typescriptClassName,typescriptClassExtends,typescriptClassBlock
- \ skipwhite
-
-syntax match typescriptClassName contained /\K\k*/
- \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptClassTypeParameter
- \ skipwhite skipnl
-
-syntax region typescriptClassTypeParameter
- \ start=/</ end=/>/
- \ contains=typescriptTypeParameter
- \ nextgroup=typescriptClassBlock,typescriptClassExtends
- \ contained skipwhite skipnl
-
-syntax keyword typescriptClassExtends contained extends implements nextgroup=typescriptClassHeritage skipwhite skipnl
-
-syntax match typescriptClassHeritage contained /\v(\k|\.|\(|\))+/
- \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptMixinComma,typescriptClassTypeArguments
- \ contains=@typescriptValue
- \ skipwhite skipnl
- \ contained
-
-syntax region typescriptClassTypeArguments matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/
- \ contains=@typescriptType
- \ nextgroup=typescriptClassExtends,typescriptClassBlock,typescriptMixinComma
- \ contained skipwhite skipnl
-
-syntax match typescriptMixinComma /,/ contained nextgroup=typescriptClassHeritage skipwhite skipnl
-
-" we need add arrowFunc to class block for high order arrow func
-" see test case
-syntax region typescriptClassBlock matchgroup=typescriptBraces start=/{/ end=/}/
- \ contains=@typescriptPropertyMemberDeclaration,typescriptAbstract,@typescriptComments,typescriptBlock,typescriptAssign,typescriptDecorator,typescriptAsyncFuncKeyword,typescriptArrowFunc
- \ contained fold
-
-syntax keyword typescriptInterfaceKeyword interface nextgroup=typescriptInterfaceName skipwhite
-syntax match typescriptInterfaceName contained /\k\+/
- \ nextgroup=typescriptObjectType,typescriptInterfaceExtends,typescriptInterfaceTypeParameter
- \ skipwhite skipnl
-syntax region typescriptInterfaceTypeParameter
- \ start=/</ end=/>/
- \ contains=typescriptTypeParameter
- \ nextgroup=typescriptObjectType,typescriptInterfaceExtends
- \ contained
- \ skipwhite skipnl
-
-syntax keyword typescriptInterfaceExtends contained extends nextgroup=typescriptInterfaceHeritage skipwhite skipnl
-
-syntax match typescriptInterfaceHeritage contained /\v(\k|\.)+/
- \ nextgroup=typescriptObjectType,typescriptInterfaceComma,typescriptInterfaceTypeArguments
- \ skipwhite
-
-syntax region typescriptInterfaceTypeArguments matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/ skip=/\s*,\s*/
- \ contains=@typescriptType
- \ nextgroup=typescriptObjectType,typescriptInterfaceComma
- \ contained skipwhite
-
-syntax match typescriptInterfaceComma /,/ contained nextgroup=typescriptInterfaceHeritage skipwhite skipnl
-
-"runtime syntax/basic/cluster.vim
-"Block VariableStatement EmptyStatement ExpressionStatement IfStatement IterationStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement SwitchStatement ThrowStatement TryStatement DebuggerStatement
-syntax cluster typescriptStatement
- \ contains=typescriptBlock,typescriptVariable,
- \ @typescriptTopExpression,typescriptAssign,
- \ typescriptConditional,typescriptRepeat,typescriptBranch,
- \ typescriptLabel,typescriptStatementKeyword,
- \ typescriptFuncKeyword,
- \ typescriptTry,typescriptExceptions,typescriptDebugger,
- \ typescriptExport,typescriptInterfaceKeyword,typescriptEnum,
- \ typescriptModule,typescriptAliasKeyword,typescriptImport
-
-syntax cluster typescriptPrimitive contains=typescriptString,typescriptTemplate,typescriptRegexpString,typescriptNumber,typescriptBoolean,typescriptNull,typescriptArray
-
-syntax cluster typescriptEventTypes contains=typescriptEventString,typescriptTemplate,typescriptNumber,typescriptBoolean,typescriptNull
-
-" top level expression: no arrow func
-" also no func keyword. funcKeyword is contained in statement
-" funcKeyword allows overloading (func without body)
-" funcImpl requires body
-syntax cluster typescriptTopExpression
- \ contains=@typescriptPrimitive,
- \ typescriptIdentifier,typescriptIdentifierName,
- \ typescriptOperator,typescriptUnaryOp,
- \ typescriptParenExp,typescriptRegexpString,
- \ typescriptGlobal,typescriptAsyncFuncKeyword,
- \ typescriptClassKeyword,typescriptTypeCast
-
-" no object literal, used in type cast and arrow func
-" TODO: change func keyword to funcImpl
-syntax cluster typescriptExpression
- \ contains=@typescriptTopExpression,
- \ typescriptArrowFuncDef,
- \ typescriptFuncImpl
-
-syntax cluster typescriptValue
- \ contains=@typescriptExpression,typescriptObjectLiteral
-
-syntax cluster typescriptEventExpression contains=typescriptArrowFuncDef,typescriptParenExp,@typescriptValue,typescriptRegexpString,@typescriptEventTypes,typescriptOperator,typescriptGlobal,jsxRegion
-
-"runtime syntax/basic/function.vim
-syntax keyword typescriptAsyncFuncKeyword async
- \ nextgroup=typescriptFuncKeyword,typescriptArrowFuncDef
- \ skipwhite
-
-syntax keyword typescriptAsyncFuncKeyword await
- \ nextgroup=@typescriptValue
- \ skipwhite
-
-syntax keyword typescriptFuncKeyword function
- \ nextgroup=typescriptAsyncFunc,typescriptFuncName,@typescriptCallSignature
- \ skipwhite skipempty
-
-syntax match typescriptAsyncFunc contained /*/
- \ nextgroup=typescriptFuncName,@typescriptCallSignature
- \ skipwhite skipempty
-
-syntax match typescriptFuncName contained /\K\k*/
- \ nextgroup=@typescriptCallSignature
- \ skipwhite
-
-" destructuring ({ a: ee }) =>
-syntax match typescriptArrowFuncDef contained /({\_[^}]*}\(:\_[^)]\)\?)\s*=>/
- \ contains=typescriptArrowFuncArg,typescriptArrowFunc
- \ nextgroup=@typescriptExpression,typescriptBlock
- \ skipwhite skipempty
-
-" matches `(a) =>` or `([a]) =>` or
-" `(
-" a) =>`
-syntax match typescriptArrowFuncDef contained /(\(\_s*[a-zA-Z\$_\[]\_[^)]*\)*)\s*=>/
- \ contains=typescriptArrowFuncArg,typescriptArrowFunc
- \ nextgroup=@typescriptExpression,typescriptBlock
- \ skipwhite skipempty
-
-syntax match typescriptArrowFuncDef contained /\K\k*\s*=>/
- \ contains=typescriptArrowFuncArg,typescriptArrowFunc
- \ nextgroup=@typescriptExpression,typescriptBlock
- \ skipwhite skipempty
-
-" TODO: optimize this pattern
-syntax region typescriptArrowFuncDef contained start=/(\_[^)]*):/ end=/=>/
- \ contains=typescriptArrowFuncArg,typescriptArrowFunc,typescriptTypeAnnotation
- \ nextgroup=@typescriptExpression,typescriptBlock
- \ skipwhite skipempty keepend
-
-syntax match typescriptArrowFunc /=>/
-syntax match typescriptArrowFuncArg contained /\K\k*/
-syntax region typescriptArrowFuncArg contained start=/<\|(/ end=/\ze=>/ contains=@typescriptCallSignature
-
-syntax region typescriptReturnAnnotation contained start=/:/ end=/{/me=e-1 contains=@typescriptType nextgroup=typescriptBlock
-
-
-syntax region typescriptFuncImpl contained start=/function/ end=/{/me=e-1
- \ contains=typescriptFuncKeyword
- \ nextgroup=typescriptBlock
-
-syntax cluster typescriptCallImpl contains=typescriptGenericImpl,typescriptParamImpl
-syntax region typescriptGenericImpl matchgroup=typescriptTypeBrackets
- \ start=/</ end=/>/ skip=/\s*,\s*/
- \ contains=typescriptTypeParameter
- \ nextgroup=typescriptParamImpl
- \ contained skipwhite
-syntax region typescriptParamImpl matchgroup=typescriptParens
- \ start=/(/ end=/)/
- \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
- \ nextgroup=typescriptReturnAnnotation,typescriptBlock
- \ contained skipwhite skipnl
-
-"runtime syntax/basic/decorator.vim
-syntax match typescriptDecorator /@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>/
- \ nextgroup=typescriptArgumentList
- \ contains=@_semantic,typescriptDotNotation
-
-" Define the default highlighting.
-hi def link typescriptReserved Error
-
-hi def link typescriptEndColons Exception
-hi def link typescriptSymbols Normal
-hi def link typescriptBraces Function
-hi def link typescriptParens Normal
-hi def link typescriptComment Comment
-hi def link typescriptLineComment Comment
-hi def link typescriptDocComment Comment
-hi def link typescriptCommentTodo Todo
-hi def link typescriptRef Include
-hi def link typescriptDocNotation SpecialComment
-hi def link typescriptDocTags SpecialComment
-hi def link typescriptDocNGParam typescriptDocParam
-hi def link typescriptDocParam Function
-hi def link typescriptDocNumParam Function
-hi def link typescriptDocEventRef Function
-hi def link typescriptDocNamedParamType Type
-hi def link typescriptDocParamName Type
-hi def link typescriptDocParamType Type
-hi def link typescriptString String
-hi def link typescriptSpecial Special
-hi def link typescriptStringLiteralType String
-hi def link typescriptStringMember String
-hi def link typescriptTemplate String
-hi def link typescriptEventString String
-hi def link typescriptASCII Special
-hi def link typescriptTemplateSB Label
-hi def link typescriptRegexpString String
-hi def link typescriptGlobal Constant
-hi def link typescriptPrototype Type
-hi def link typescriptConditional Conditional
-hi def link typescriptConditionalElse Conditional
-hi def link typescriptCase Conditional
-hi def link typescriptDefault typescriptCase
-hi def link typescriptBranch Conditional
-hi def link typescriptIdentifier Structure
-hi def link typescriptVariable Identifier
-hi def link typescriptEnumKeyword Identifier
-hi def link typescriptRepeat Repeat
-hi def link typescriptForOperator Repeat
-hi def link typescriptStatementKeyword Statement
-hi def link typescriptMessage Keyword
-hi def link typescriptOperator Identifier
-hi def link typescriptKeywordOp Identifier
-hi def link typescriptCastKeyword Special
-hi def link typescriptType Type
-hi def link typescriptNull Boolean
-hi def link typescriptNumber Number
-hi def link typescriptExponent Number
-hi def link typescriptBoolean Boolean
-hi def link typescriptObjectLabel typescriptLabel
-hi def link typescriptLabel Label
-hi def link typescriptStringProperty String
-hi def link typescriptImport Special
-hi def link typescriptAmbientDeclaration Special
-hi def link typescriptExport Special
-hi def link typescriptModule Special
-hi def link typescriptTry Special
-hi def link typescriptExceptions Special
-
-hi def link typescriptMember Function
-hi def link typescriptMethodAccessor Operator
-
-hi def link typescriptAsyncFuncKeyword Keyword
-hi def link typescriptAsyncFor Keyword
-hi def link typescriptFuncKeyword Keyword
-hi def link typescriptAsyncFunc Keyword
-hi def link typescriptArrowFunc Type
-hi def link typescriptFuncName Function
-hi def link typescriptFuncArg PreProc
-hi def link typescriptArrowFuncArg PreProc
-hi def link typescriptFuncComma Operator
-
-hi def link typescriptClassKeyword Keyword
-hi def link typescriptClassExtends Keyword
-" hi def link typescriptClassName Function
-hi def link typescriptAbstract Special
-" hi def link typescriptClassHeritage Function
-" hi def link typescriptInterfaceHeritage Function
-hi def link typescriptClassStatic StorageClass
-hi def link typescriptReadonlyModifier Keyword
-hi def link typescriptInterfaceKeyword Keyword
-hi def link typescriptInterfaceExtends Keyword
-hi def link typescriptInterfaceName Function
-
-hi def link shellbang Comment
-
-hi def link typescriptTypeParameter Identifier
-hi def link typescriptConstraint Keyword
-hi def link typescriptPredefinedType Type
-hi def link typescriptReadonlyArrayKeyword Keyword
-hi def link typescriptUnion Operator
-hi def link typescriptFuncTypeArrow Function
-hi def link typescriptConstructorType Function
-hi def link typescriptTypeQuery Keyword
-hi def link typescriptAccessibilityModifier Keyword
-hi def link typescriptOptionalMark PreProc
-hi def link typescriptFuncType Special
-hi def link typescriptMappedIn Special
-hi def link typescriptCall PreProc
-hi def link typescriptParamImpl PreProc
-hi def link typescriptConstructSignature Identifier
-hi def link typescriptAliasDeclaration Identifier
-hi def link typescriptAliasKeyword Keyword
-hi def link typescriptUserDefinedType Keyword
-hi def link typescriptTypeReference Identifier
-hi def link typescriptConstructor Keyword
-hi def link typescriptDecorator Special
-
-hi link typeScript NONE
let b:current_syntax = "typescript"
if main_syntax == 'typescript'
diff --git a/runtime/syntax/typescriptcommon.vim b/runtime/syntax/typescriptcommon.vim
new file mode 100644
index 0000000000..ff53168329
--- /dev/null
+++ b/runtime/syntax/typescriptcommon.vim
@@ -0,0 +1,2067 @@
+" Vim syntax file
+" Language: TypeScript and TypeScriptReact
+" Maintainer: Bram Moolenaar, Herrington Darkholme
+" Last Change: 2019 Nov 30
+" Based On: Herrington Darkholme's yats.vim
+" Changes: See https:github.com/HerringtonDarkholme/yats.vim
+" Credits: See yats.vim on github
+
+if &cpo =~ 'C'
+ let s:cpo_save = &cpo
+ set cpo&vim
+endif
+
+
+" NOTE: this results in accurate highlighting, but can be slow.
+syntax sync fromstart
+
+"Dollar sign is permitted anywhere in an identifier
+setlocal iskeyword-=$
+if main_syntax == 'typescript' || main_syntax == 'typescriptreact'
+ setlocal iskeyword+=$
+ " syntax cluster htmlJavaScript contains=TOP
+endif
+
+" lowest priority on least used feature
+syntax match typescriptLabel /[a-zA-Z_$]\k*:/he=e-1 contains=typescriptReserved nextgroup=@typescriptStatement skipwhite skipempty
+
+" other keywords like return,case,yield uses containedin
+syntax region typescriptBlock matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptStatement,@typescriptComments fold
+
+
+"runtime syntax/basic/identifiers.vim
+syntax cluster afterIdentifier contains=
+ \ typescriptDotNotation,
+ \ typescriptFuncCallArg,
+ \ typescriptTemplate,
+ \ typescriptIndexExpr,
+ \ @typescriptSymbols,
+ \ typescriptTypeArguments
+
+syntax match typescriptIdentifierName /\<\K\k*/
+ \ nextgroup=@afterIdentifier
+ \ transparent
+ \ contains=@_semantic
+ \ skipnl skipwhite
+
+syntax match typescriptProp contained /\K\k*!\?/
+ \ transparent
+ \ contains=@props
+ \ nextgroup=@afterIdentifier
+ \ skipwhite skipempty
+
+syntax region typescriptIndexExpr contained matchgroup=typescriptProperty start=/\[/rs=s+1 end=/]/he=e-1 contains=@typescriptValue nextgroup=@typescriptSymbols,typescriptDotNotation,typescriptFuncCallArg skipwhite skipempty
+
+syntax match typescriptDotNotation /\.\|?\.\|!\./ nextgroup=typescriptProp skipnl
+syntax match typescriptDotStyleNotation /\.style\./ nextgroup=typescriptDOMStyle transparent
+" syntax match typescriptFuncCall contained /[a-zA-Z]\k*\ze(/ nextgroup=typescriptFuncCallArg
+syntax region typescriptParenExp matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptComments,@typescriptValue,typescriptCastKeyword nextgroup=@typescriptSymbols skipwhite skipempty
+syntax region typescriptFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptValue,@typescriptComments nextgroup=@typescriptSymbols,typescriptDotNotation skipwhite skipempty skipnl
+syntax region typescriptEventFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptEventExpression
+syntax region typescriptEventString contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/ contains=typescriptASCII,@events
+
+"runtime syntax/basic/literal.vim
+"Syntax in the JavaScript code
+
+" String
+syntax match typescriptASCII contained /\\\d\d\d/
+
+syntax region typescriptTemplateSubstitution matchgroup=typescriptTemplateSB
+ \ start=/\${/ end=/}/
+ \ contains=@typescriptValue
+ \ contained
+
+
+syntax region typescriptString
+ \ start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ end=+$+
+ \ contains=typescriptSpecial,@Spell
+ \ extend
+
+syntax match typescriptSpecial contained "\v\\%(x\x\x|u%(\x{4}|\{\x{4,5}})|c\u|.)"
+
+" From vim runtime
+" <https://github.com/vim/vim/blob/master/runtime/syntax/javascript.vim#L48>
+syntax region typescriptRegexpString start=+/[^/*]+me=e-1 skip=+\\\\\|\\/+ end=+/[gimuy]\{0,5\}\s*$+ end=+/[gimuy]\{0,5\}\s*[;.,)\]}]+me=e-1 nextgroup=typescriptDotNotation oneline
+
+syntax region typescriptTemplate
+ \ start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/
+ \ contains=typescriptTemplateSubstitution
+ \ nextgroup=@typescriptSymbols
+ \ skipwhite skipempty
+
+"Array
+syntax region typescriptArray matchgroup=typescriptBraces
+ \ start=/\[/ end=/]/
+ \ contains=@typescriptValue,@typescriptComments
+ \ nextgroup=@typescriptSymbols,typescriptDotNotation
+ \ skipwhite skipempty fold
+
+" Number
+syntax match typescriptNumber /\<0[bB][01][01_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\<0[oO][0-7][0-7_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\<0[xX][0-9a-fA-F][0-9a-fA-F_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\d[0-9_]*\.\d[0-9_]*\|\d[0-9_]*\|\.\d[0-9]*/
+ \ nextgroup=typescriptExponent,@typescriptSymbols skipwhite skipempty
+syntax match typescriptExponent /[eE][+-]\=\d[0-9]*\>/
+ \ nextgroup=@typescriptSymbols skipwhite skipempty contained
+
+
+" runtime syntax/basic/object.vim
+syntax region typescriptObjectLiteral matchgroup=typescriptBraces
+ \ start=/{/ end=/}/
+ \ contains=@typescriptComments,typescriptObjectLabel,typescriptStringProperty,typescriptComputedPropertyName
+ \ fold contained
+
+syntax match typescriptObjectLabel contained /\k\+\_s*/
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+syntax region typescriptStringProperty contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+" syntax region typescriptPropertyName contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1(/me=e-1 nextgroup=@typescriptCallSignature skipwhite skipempty oneline
+syntax region typescriptComputedPropertyName contained matchgroup=typescriptBraces
+ \ start=/\[/rs=s+1 end=/]/
+ \ contains=@typescriptValue
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*:/he=e-1 contains=@typescriptValue nextgroup=@typescriptValue skipwhite skipempty
+" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*(/me=e-1 contains=@typescriptValue nextgroup=@typescriptCallSignature skipwhite skipempty
+" Value for object, statement for label statement
+syntax match typescriptRestOrSpread /\.\.\./ contained
+syntax match typescriptObjectSpread /\.\.\./ contained containedin=typescriptObjectLiteral,typescriptArray nextgroup=@typescriptValue
+
+syntax match typescriptObjectColon contained /:/ nextgroup=@typescriptValue skipwhite skipempty
+
+"runtime syntax/basic/symbols.vim
+" + - ^ ~
+syntax match typescriptUnaryOp /[+\-~!]/
+ \ nextgroup=@typescriptValue
+ \ skipwhite
+
+syntax region typescriptTernary matchgroup=typescriptTernaryOp start=/?[.?]\@!/ end=/:/ contained contains=@typescriptValue,@typescriptComments nextgroup=@typescriptValue skipwhite skipempty
+
+syntax match typescriptAssign /=/ nextgroup=@typescriptValue
+ \ skipwhite skipempty
+
+" 2: ==, ===
+syntax match typescriptBinaryOp contained /===\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 6: >>>=, >>>, >>=, >>, >=, >
+syntax match typescriptBinaryOp contained />\(>>=\|>>\|>=\|>\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 4: <<=, <<, <=, <
+syntax match typescriptBinaryOp contained /<\(<=\|<\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: ||, |=, |
+syntax match typescriptBinaryOp contained /|\(|\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: &&, &=, &
+syntax match typescriptBinaryOp contained /&\(&\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: *=, *
+syntax match typescriptBinaryOp contained /\*=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: %=, %
+syntax match typescriptBinaryOp contained /%=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: /=, /
+syntax match typescriptBinaryOp contained +/\(=\|[^\*/]\@=\)+ nextgroup=@typescriptValue skipwhite skipempty
+syntax match typescriptBinaryOp contained /!==\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: !=, !==
+syntax match typescriptBinaryOp contained /+\(+\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: +, ++, +=
+syntax match typescriptBinaryOp contained /-\(-\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: -, --, -=
+
+" exponentiation operator
+" 2: **, **=
+syntax match typescriptBinaryOp contained /\*\*=\?/ nextgroup=@typescriptValue
+
+syntax cluster typescriptSymbols contains=typescriptBinaryOp,typescriptKeywordOp,typescriptTernary,typescriptAssign,typescriptCastKeyword
+
+" runtime syntax/basic/reserved.vim
+
+"runtime syntax/basic/keyword.vim
+"Import
+syntax keyword typescriptImport from as import
+syntax keyword typescriptExport export
+syntax keyword typescriptModule namespace module
+
+"this
+
+"JavaScript Prototype
+syntax keyword typescriptPrototype prototype
+ \ nextgroup=@afterIdentifier
+
+syntax keyword typescriptCastKeyword as
+ \ nextgroup=@typescriptType
+ \ skipwhite
+
+"Program Keywords
+syntax keyword typescriptIdentifier arguments this super
+ \ nextgroup=@afterIdentifier
+
+syntax keyword typescriptVariable let var
+ \ nextgroup=typescriptVariableDeclaration
+ \ skipwhite skipempty skipnl
+
+syntax keyword typescriptVariable const
+ \ nextgroup=typescriptEnum,typescriptVariableDeclaration
+ \ skipwhite
+
+syntax match typescriptVariableDeclaration /[A-Za-z_$]\k*/
+ \ nextgroup=typescriptTypeAnnotation,typescriptAssign
+ \ contained skipwhite skipempty skipnl
+
+syntax region typescriptEnum matchgroup=typescriptEnumKeyword start=/enum / end=/\ze{/
+ \ nextgroup=typescriptBlock
+ \ skipwhite
+
+syntax keyword typescriptKeywordOp
+ \ contained in instanceof nextgroup=@typescriptValue
+syntax keyword typescriptOperator delete new typeof void
+ \ nextgroup=@typescriptValue
+ \ skipwhite skipempty
+
+syntax keyword typescriptForOperator contained in of
+syntax keyword typescriptBoolean true false nextgroup=@typescriptSymbols skipwhite skipempty
+syntax keyword typescriptNull null undefined nextgroup=@typescriptSymbols skipwhite skipempty
+syntax keyword typescriptMessage alert confirm prompt status
+ \ nextgroup=typescriptDotNotation,typescriptFuncCallArg
+syntax keyword typescriptGlobal self top parent
+ \ nextgroup=@afterIdentifier
+
+"Statement Keywords
+syntax keyword typescriptConditional if else switch
+ \ nextgroup=typescriptConditionalParen
+ \ skipwhite skipempty skipnl
+syntax keyword typescriptConditionalElse else
+syntax keyword typescriptRepeat do while for nextgroup=typescriptLoopParen skipwhite skipempty
+syntax keyword typescriptRepeat for nextgroup=typescriptLoopParen,typescriptAsyncFor skipwhite skipempty
+syntax keyword typescriptBranch break continue containedin=typescriptBlock
+syntax keyword typescriptCase case nextgroup=@typescriptPrimitive skipwhite containedin=typescriptBlock
+syntax keyword typescriptDefault default containedin=typescriptBlock nextgroup=@typescriptValue,typescriptClassKeyword,typescriptInterfaceKeyword skipwhite oneline
+syntax keyword typescriptStatementKeyword with
+syntax keyword typescriptStatementKeyword yield skipwhite nextgroup=@typescriptValue containedin=typescriptBlock
+syntax keyword typescriptStatementKeyword return skipwhite contained nextgroup=@typescriptValue containedin=typescriptBlock
+
+syntax keyword typescriptTry try
+syntax keyword typescriptExceptions catch throw finally
+syntax keyword typescriptDebugger debugger
+
+syntax keyword typescriptAsyncFor await nextgroup=typescriptLoopParen skipwhite skipempty contained
+
+syntax region typescriptLoopParen contained matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptVariable,typescriptForOperator,typescriptEndColons,@typescriptValue,@typescriptComments
+ \ nextgroup=typescriptBlock
+ \ skipwhite skipempty
+syntax region typescriptConditionalParen contained matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=@typescriptValue,@typescriptComments
+ \ nextgroup=typescriptBlock
+ \ skipwhite skipempty
+syntax match typescriptEndColons /[;,]/ contained
+
+syntax keyword typescriptAmbientDeclaration declare nextgroup=@typescriptAmbients
+ \ skipwhite skipempty
+
+syntax cluster typescriptAmbients contains=
+ \ typescriptVariable,
+ \ typescriptFuncKeyword,
+ \ typescriptClassKeyword,
+ \ typescriptAbstract,
+ \ typescriptEnumKeyword,typescriptEnum,
+ \ typescriptModule
+
+"runtime syntax/basic/doc.vim
+"Syntax coloring for Node.js shebang line
+syntax match shellbang "^#!.*node\>"
+syntax match shellbang "^#!.*iojs\>"
+
+
+"JavaScript comments
+syntax keyword typescriptCommentTodo TODO FIXME XXX TBD
+syntax match typescriptLineComment "//.*"
+ \ contains=@Spell,typescriptCommentTodo,typescriptRef
+syntax region typescriptComment
+ \ start="/\*" end="\*/"
+ \ contains=@Spell,typescriptCommentTodo extend
+syntax cluster typescriptComments
+ \ contains=typescriptDocComment,typescriptComment,typescriptLineComment
+
+syntax match typescriptRef +///\s*<reference\s\+.*\/>$+
+ \ contains=typescriptString
+syntax match typescriptRef +///\s*<amd-dependency\s\+.*\/>$+
+ \ contains=typescriptString
+syntax match typescriptRef +///\s*<amd-module\s\+.*\/>$+
+ \ contains=typescriptString
+
+"JSDoc
+syntax case ignore
+
+syntax region typescriptDocComment matchgroup=typescriptComment
+ \ start="/\*\*" end="\*/"
+ \ contains=typescriptDocNotation,typescriptCommentTodo,@Spell
+ \ fold keepend
+syntax match typescriptDocNotation contained /@/ nextgroup=typescriptDocTags
+
+syntax keyword typescriptDocTags contained constant constructor constructs function ignore inner private public readonly static
+syntax keyword typescriptDocTags contained const dict expose inheritDoc interface nosideeffects override protected struct internal
+syntax keyword typescriptDocTags contained example global
+syntax keyword typescriptDocTags contained alpha beta defaultValue eventProperty experimental label
+syntax keyword typescriptDocTags contained packageDocumentation privateRemarks remarks sealed typeParam
+
+" syntax keyword typescriptDocTags contained ngdoc nextgroup=typescriptDocNGDirective
+syntax keyword typescriptDocTags contained ngdoc scope priority animations
+syntax keyword typescriptDocTags contained ngdoc restrict methodOf propertyOf eventOf eventType nextgroup=typescriptDocParam skipwhite
+syntax keyword typescriptDocNGDirective contained overview service object function method property event directive filter inputType error
+
+syntax keyword typescriptDocTags contained abstract virtual access augments
+
+syntax keyword typescriptDocTags contained arguments callback lends memberOf name type kind link mixes mixin tutorial nextgroup=typescriptDocParam skipwhite
+syntax keyword typescriptDocTags contained variation nextgroup=typescriptDocNumParam skipwhite
+
+syntax keyword typescriptDocTags contained author class classdesc copyright default defaultvalue nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained deprecated description external host nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained file fileOverview overview namespace requires since version nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained summary todo license preserve nextgroup=typescriptDocDesc skipwhite
+
+syntax keyword typescriptDocTags contained borrows exports nextgroup=typescriptDocA skipwhite
+syntax keyword typescriptDocTags contained param arg argument property prop module nextgroup=typescriptDocNamedParamType,typescriptDocParamName skipwhite
+syntax keyword typescriptDocTags contained define enum extends implements this typedef nextgroup=typescriptDocParamType skipwhite
+syntax keyword typescriptDocTags contained return returns throws exception nextgroup=typescriptDocParamType,typescriptDocParamName skipwhite
+syntax keyword typescriptDocTags contained see nextgroup=typescriptDocRef skipwhite
+
+syntax keyword typescriptDocTags contained function func method nextgroup=typescriptDocName skipwhite
+syntax match typescriptDocName contained /\h\w*/
+
+syntax keyword typescriptDocTags contained fires event nextgroup=typescriptDocEventRef skipwhite
+syntax match typescriptDocEventRef contained /\h\w*#\(\h\w*\:\)\?\h\w*/
+
+syntax match typescriptDocNamedParamType contained /{.\+}/ nextgroup=typescriptDocParamName skipwhite
+syntax match typescriptDocParamName contained /\[\?0-9a-zA-Z_\.]\+\]\?/ nextgroup=typescriptDocDesc skipwhite
+syntax match typescriptDocParamType contained /{.\+}/ nextgroup=typescriptDocDesc skipwhite
+syntax match typescriptDocA contained /\%(#\|\w\|\.\|:\|\/\)\+/ nextgroup=typescriptDocAs skipwhite
+syntax match typescriptDocAs contained /\s*as\s*/ nextgroup=typescriptDocB skipwhite
+syntax match typescriptDocB contained /\%(#\|\w\|\.\|:\|\/\)\+/
+syntax match typescriptDocParam contained /\%(#\|\w\|\.\|:\|\/\|-\)\+/
+syntax match typescriptDocNumParam contained /\d\+/
+syntax match typescriptDocRef contained /\%(#\|\w\|\.\|:\|\/\)\+/
+syntax region typescriptDocLinkTag contained matchgroup=typescriptDocLinkTag start=/{/ end=/}/ contains=typescriptDocTags
+
+syntax cluster typescriptDocs contains=typescriptDocParamType,typescriptDocNamedParamType,typescriptDocParam
+
+if main_syntax == "typescript"
+ syntax sync clear
+ syntax sync ccomment typescriptComment minlines=200
+endif
+
+syntax case match
+
+"runtime syntax/basic/type.vim
+" Types
+syntax match typescriptOptionalMark /?/ contained
+
+syntax region typescriptTypeParameters matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ contained
+
+syntax match typescriptTypeParameter /\K\k*/
+ \ nextgroup=typescriptConstraint,typescriptGenericDefault
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptConstraint extends
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl
+
+syntax match typescriptGenericDefault /=/
+ \ nextgroup=@typescriptType
+ \ contained skipwhite
+
+"><
+" class A extend B<T> {} // ClassBlock
+" func<T>() // FuncCallArg
+syntax region typescriptTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/\></ end=/>/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptFuncCallArg,@typescriptTypeOperator
+ \ contained skipwhite
+
+
+syntax cluster typescriptType contains=
+ \ @typescriptPrimaryType,
+ \ typescriptUnion,
+ \ @typescriptFunctionType,
+ \ typescriptConstructorType
+
+" array type: A[]
+" type indexing A['key']
+syntax region typescriptTypeBracket contained
+ \ start=/\[/ end=/\]/
+ \ contains=typescriptString,typescriptNumber
+ \ nextgroup=@typescriptTypeOperator
+ \ skipwhite skipempty
+
+syntax cluster typescriptPrimaryType contains=
+ \ typescriptParenthesizedType,
+ \ typescriptPredefinedType,
+ \ typescriptTypeReference,
+ \ typescriptObjectType,
+ \ typescriptTupleType,
+ \ typescriptTypeQuery,
+ \ typescriptStringLiteralType,
+ \ typescriptReadonlyArrayKeyword,
+ \ typescriptAssertType
+
+syntax region typescriptStringLiteralType contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/
+ \ nextgroup=typescriptUnion
+ \ skipwhite skipempty
+
+syntax region typescriptParenthesizedType matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=@typescriptType
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty fold
+
+syntax match typescriptTypeReference /\K\k*\(\.\K\k*\)*/
+ \ nextgroup=typescriptTypeArguments,@typescriptTypeOperator,typescriptUserDefinedType
+ \ skipwhite contained skipempty
+
+syntax keyword typescriptPredefinedType any number boolean string void never undefined null object unknown
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty
+
+syntax match typescriptPredefinedType /unique symbol/
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty
+
+syntax region typescriptObjectType matchgroup=typescriptBraces
+ \ start=/{/ end=/}/
+ \ contains=@typescriptTypeMember,typescriptEndColons,@typescriptComments,typescriptAccessibilityModifier,typescriptReadonlyModifier
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite fold
+
+syntax cluster typescriptTypeMember contains=
+ \ @typescriptCallSignature,
+ \ typescriptConstructSignature,
+ \ typescriptIndexSignature,
+ \ @typescriptMembers
+
+syntax region typescriptTupleType matchgroup=typescriptBraces
+ \ start=/\[/ end=/\]/
+ \ contains=@typescriptType,@typescriptComments
+ \ contained skipwhite
+
+syntax cluster typescriptTypeOperator
+ \ contains=typescriptUnion,typescriptTypeBracket
+
+syntax match typescriptUnion /|\|&/ contained nextgroup=@typescriptPrimaryType skipwhite skipempty
+
+syntax cluster typescriptFunctionType contains=typescriptGenericFunc,typescriptFuncType
+syntax region typescriptGenericFunc matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptFuncType
+ \ containedin=typescriptFunctionType
+ \ contained skipwhite skipnl
+
+syntax region typescriptFuncType matchgroup=typescriptParens
+ \ start=/(/ end=/)\s*=>/me=e-2
+ \ contains=@typescriptParameterList
+ \ nextgroup=typescriptFuncTypeArrow
+ \ contained skipwhite skipnl oneline
+
+syntax match typescriptFuncTypeArrow /=>/
+ \ nextgroup=@typescriptType
+ \ containedin=typescriptFuncType
+ \ contained skipwhite skipnl
+
+
+syntax keyword typescriptConstructorType new
+ \ nextgroup=@typescriptFunctionType
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptUserDefinedType is
+ \ contained nextgroup=@typescriptType skipwhite skipempty
+
+syntax keyword typescriptTypeQuery typeof keyof
+ \ nextgroup=typescriptTypeReference
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptAssertType asserts
+ \ nextgroup=typescriptTypeReference
+ \ contained skipwhite skipnl
+
+syntax cluster typescriptCallSignature contains=typescriptGenericCall,typescriptCall
+syntax region typescriptGenericCall matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptCall
+ \ contained skipwhite skipnl
+syntax region typescriptCall matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
+ \ nextgroup=typescriptTypeAnnotation,typescriptBlock
+ \ contained skipwhite skipnl
+
+syntax match typescriptTypeAnnotation /:/
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl
+
+syntax cluster typescriptParameterList contains=
+ \ typescriptTypeAnnotation,
+ \ typescriptAccessibilityModifier,
+ \ typescriptOptionalMark,
+ \ typescriptRestOrSpread,
+ \ typescriptFuncComma,
+ \ typescriptDefaultParam
+
+syntax match typescriptFuncComma /,/ contained
+
+syntax match typescriptDefaultParam /=/
+ \ nextgroup=@typescriptValue
+ \ contained skipwhite
+
+syntax keyword typescriptConstructSignature new
+ \ nextgroup=@typescriptCallSignature
+ \ contained skipwhite
+
+syntax region typescriptIndexSignature matchgroup=typescriptBraces
+ \ start=/\[/ end=/\]/
+ \ contains=typescriptPredefinedType,typescriptMappedIn,typescriptString
+ \ nextgroup=typescriptTypeAnnotation
+ \ contained skipwhite oneline
+
+syntax keyword typescriptMappedIn in
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl skipempty
+
+syntax keyword typescriptAliasKeyword type
+ \ nextgroup=typescriptAliasDeclaration
+ \ skipwhite skipnl skipempty
+
+syntax region typescriptAliasDeclaration matchgroup=typescriptUnion
+ \ start=/ / end=/=/
+ \ nextgroup=@typescriptType
+ \ contains=typescriptConstraint,typescriptTypeParameters
+ \ contained skipwhite skipempty
+
+syntax keyword typescriptReadonlyArrayKeyword readonly
+ \ nextgroup=@typescriptPrimaryType
+ \ skipwhite
+
+" extension
+if get(g:, 'yats_host_keyword', 1)
+ "runtime syntax/yats.vim
+ "runtime syntax/yats/typescript.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function Boolean
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Error EvalError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName InternalError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName RangeError ReferenceError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName StopIteration
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName SyntaxError TypeError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URIError Date
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float32Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float64Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int16Array Int32Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int8Array Uint16Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint32Array Uint8Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint8ClampedArray
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName ParallelArray
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName ArrayBuffer DataView
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Iterator Generator
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect Proxy
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName arguments
+ hi def link typescriptGlobal Structure
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName eval uneval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isFinite nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isNaN parseFloat nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName parseInt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURIComponent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURIComponent nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGlobalMethod
+ hi def link typescriptGlobalMethod Structure
+
+ "runtime syntax/yats/es6-number.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Number nextgroup=typescriptGlobalNumberDot,typescriptFuncCallArg
+ syntax match typescriptGlobalNumberDot /\./ contained nextgroup=typescriptNumberStaticProp,typescriptNumberStaticMethod,typescriptProp
+ syntax keyword typescriptNumberStaticProp contained EPSILON MAX_SAFE_INTEGER MAX_VALUE
+ syntax keyword typescriptNumberStaticProp contained MIN_SAFE_INTEGER MIN_VALUE NEGATIVE_INFINITY
+ syntax keyword typescriptNumberStaticProp contained NaN POSITIVE_INFINITY
+ hi def link typescriptNumberStaticProp Keyword
+ syntax keyword typescriptNumberStaticMethod contained isFinite isInteger isNaN isSafeInteger nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptNumberStaticMethod contained parseFloat parseInt nextgroup=typescriptFuncCallArg
+ hi def link typescriptNumberStaticMethod Keyword
+ syntax keyword typescriptNumberMethod contained toExponential toFixed toLocaleString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptNumberMethod contained toPrecision toSource toString valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptNumberMethod
+ hi def link typescriptNumberMethod Keyword
+
+ "runtime syntax/yats/es6-string.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName String nextgroup=typescriptGlobalStringDot,typescriptFuncCallArg
+ syntax match typescriptGlobalStringDot /\./ contained nextgroup=typescriptStringStaticMethod,typescriptProp
+ syntax keyword typescriptStringStaticMethod contained fromCharCode fromCodePoint raw nextgroup=typescriptFuncCallArg
+ hi def link typescriptStringStaticMethod Keyword
+ syntax keyword typescriptStringMethod contained anchor charAt charCodeAt codePointAt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained concat endsWith includes indexOf lastIndexOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained link localeCompare match normalize nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained padStart padEnd repeat replace search nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained slice split startsWith substr substring nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained toLocaleLowerCase toLocaleUpperCase nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained toLowerCase toString toUpperCase trim nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptStringMethod
+ hi def link typescriptStringMethod Keyword
+
+ "runtime syntax/yats/es6-array.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Array nextgroup=typescriptGlobalArrayDot,typescriptFuncCallArg
+ syntax match typescriptGlobalArrayDot /\./ contained nextgroup=typescriptArrayStaticMethod,typescriptProp
+ syntax keyword typescriptArrayStaticMethod contained from isArray of nextgroup=typescriptFuncCallArg
+ hi def link typescriptArrayStaticMethod Keyword
+ syntax keyword typescriptArrayMethod contained concat copyWithin entries every fill nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained filter find findIndex forEach indexOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained includes join keys lastIndexOf map nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained pop push reduce reduceRight reverse nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained shift slice some sort splice toLocaleString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained toSource toString unshift nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptArrayMethod
+ hi def link typescriptArrayMethod Keyword
+
+ "runtime syntax/yats/es6-object.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Object nextgroup=typescriptGlobalObjectDot,typescriptFuncCallArg
+ syntax match typescriptGlobalObjectDot /\./ contained nextgroup=typescriptObjectStaticMethod,typescriptProp
+ syntax keyword typescriptObjectStaticMethod contained create defineProperties defineProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained entries freeze getOwnPropertyDescriptors nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained getOwnPropertyDescriptor getOwnPropertyNames nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained getOwnPropertySymbols getPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained is isExtensible isFrozen isSealed nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained keys preventExtensions values nextgroup=typescriptFuncCallArg
+ hi def link typescriptObjectStaticMethod Keyword
+ syntax keyword typescriptObjectMethod contained getOwnPropertyDescriptors hasOwnProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained isPrototypeOf propertyIsEnumerable nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained toLocaleString toString valueOf seal nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained setPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptObjectMethod
+ hi def link typescriptObjectMethod Keyword
+
+ "runtime syntax/yats/es6-symbol.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Symbol nextgroup=typescriptGlobalSymbolDot,typescriptFuncCallArg
+ syntax match typescriptGlobalSymbolDot /\./ contained nextgroup=typescriptSymbolStaticProp,typescriptSymbolStaticMethod,typescriptProp
+ syntax keyword typescriptSymbolStaticProp contained length iterator match replace
+ syntax keyword typescriptSymbolStaticProp contained search split hasInstance isConcatSpreadable
+ syntax keyword typescriptSymbolStaticProp contained unscopables species toPrimitive
+ syntax keyword typescriptSymbolStaticProp contained toStringTag
+ hi def link typescriptSymbolStaticProp Keyword
+ syntax keyword typescriptSymbolStaticMethod contained for keyFor nextgroup=typescriptFuncCallArg
+ hi def link typescriptSymbolStaticMethod Keyword
+
+ "runtime syntax/yats/es6-function.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function
+ syntax keyword typescriptFunctionMethod contained apply bind call nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFunctionMethod
+ hi def link typescriptFunctionMethod Keyword
+
+ "runtime syntax/yats/es6-math.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Math nextgroup=typescriptGlobalMathDot,typescriptFuncCallArg
+ syntax match typescriptGlobalMathDot /\./ contained nextgroup=typescriptMathStaticProp,typescriptMathStaticMethod,typescriptProp
+ syntax keyword typescriptMathStaticProp contained E LN10 LN2 LOG10E LOG2E PI SQRT1_2
+ syntax keyword typescriptMathStaticProp contained SQRT2
+ hi def link typescriptMathStaticProp Keyword
+ syntax keyword typescriptMathStaticMethod contained abs acos acosh asin asinh atan nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained atan2 atanh cbrt ceil clz32 cos nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained cosh exp expm1 floor fround hypot nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained imul log log10 log1p log2 max nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained min pow random round sign sin nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained sinh sqrt tan tanh trunc nextgroup=typescriptFuncCallArg
+ hi def link typescriptMathStaticMethod Keyword
+
+ "runtime syntax/yats/es6-date.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Date nextgroup=typescriptGlobalDateDot,typescriptFuncCallArg
+ syntax match typescriptGlobalDateDot /\./ contained nextgroup=typescriptDateStaticMethod,typescriptProp
+ syntax keyword typescriptDateStaticMethod contained UTC now parse nextgroup=typescriptFuncCallArg
+ hi def link typescriptDateStaticMethod Keyword
+ syntax keyword typescriptDateMethod contained getDate getDay getFullYear getHours nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getMilliseconds getMinutes getMonth nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getSeconds getTime getTimezoneOffset nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCDate getUTCDay getUTCFullYear nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCHours getUTCMilliseconds getUTCMinutes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCMonth getUTCSeconds setDate setFullYear nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setHours setMilliseconds setMinutes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setMonth setSeconds setTime setUTCDate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setUTCFullYear setUTCHours setUTCMilliseconds nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setUTCMinutes setUTCMonth setUTCSeconds nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toDateString toISOString toJSON toLocaleDateString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toLocaleFormat toLocaleString toLocaleTimeString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toSource toString toTimeString toUTCString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDateMethod
+ hi def link typescriptDateMethod Keyword
+
+ "runtime syntax/yats/es6-json.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName JSON nextgroup=typescriptGlobalJSONDot,typescriptFuncCallArg
+ syntax match typescriptGlobalJSONDot /\./ contained nextgroup=typescriptJSONStaticMethod,typescriptProp
+ syntax keyword typescriptJSONStaticMethod contained parse stringify nextgroup=typescriptFuncCallArg
+ hi def link typescriptJSONStaticMethod Keyword
+
+ "runtime syntax/yats/es6-regexp.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName RegExp nextgroup=typescriptGlobalRegExpDot,typescriptFuncCallArg
+ syntax match typescriptGlobalRegExpDot /\./ contained nextgroup=typescriptRegExpStaticProp,typescriptProp
+ syntax keyword typescriptRegExpStaticProp contained lastIndex
+ hi def link typescriptRegExpStaticProp Keyword
+ syntax keyword typescriptRegExpProp contained global ignoreCase multiline source sticky
+ syntax cluster props add=typescriptRegExpProp
+ hi def link typescriptRegExpProp Keyword
+ syntax keyword typescriptRegExpMethod contained exec test nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptRegExpMethod
+ hi def link typescriptRegExpMethod Keyword
+
+ "runtime syntax/yats/es6-map.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Map WeakMap
+ syntax keyword typescriptES6MapProp contained size
+ syntax cluster props add=typescriptES6MapProp
+ hi def link typescriptES6MapProp Keyword
+ syntax keyword typescriptES6MapMethod contained clear delete entries forEach get has nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptES6MapMethod contained keys set values nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptES6MapMethod
+ hi def link typescriptES6MapMethod Keyword
+
+ "runtime syntax/yats/es6-set.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Set WeakSet
+ syntax keyword typescriptES6SetProp contained size
+ syntax cluster props add=typescriptES6SetProp
+ hi def link typescriptES6SetProp Keyword
+ syntax keyword typescriptES6SetMethod contained add clear delete entries forEach has nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptES6SetMethod contained values nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptES6SetMethod
+ hi def link typescriptES6SetMethod Keyword
+
+ "runtime syntax/yats/es6-proxy.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Proxy
+ syntax keyword typescriptProxyAPI contained getOwnPropertyDescriptor getOwnPropertyNames
+ syntax keyword typescriptProxyAPI contained defineProperty deleteProperty freeze seal
+ syntax keyword typescriptProxyAPI contained preventExtensions has hasOwn get set enumerate
+ syntax keyword typescriptProxyAPI contained iterate ownKeys apply construct
+ hi def link typescriptProxyAPI Keyword
+
+ "runtime syntax/yats/es6-promise.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Promise nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg
+ syntax match typescriptGlobalPromiseDot /\./ contained nextgroup=typescriptPromiseStaticMethod,typescriptProp
+ syntax keyword typescriptPromiseStaticMethod contained resolve reject all race nextgroup=typescriptFuncCallArg
+ hi def link typescriptPromiseStaticMethod Keyword
+ syntax keyword typescriptPromiseMethod contained then catch finally nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPromiseMethod
+ hi def link typescriptPromiseMethod Keyword
+
+ "runtime syntax/yats/es6-reflect.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect
+ syntax keyword typescriptReflectMethod contained apply construct defineProperty deleteProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained enumerate get getOwnPropertyDescriptor nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained getPrototypeOf has isExtensible ownKeys nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained preventExtensions set setPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptReflectMethod
+ hi def link typescriptReflectMethod Keyword
+
+ "runtime syntax/yats/ecma-402.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Intl
+ syntax keyword typescriptIntlMethod contained Collator DateTimeFormat NumberFormat nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptIntlMethod contained PluralRules nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptIntlMethod
+ hi def link typescriptIntlMethod Keyword
+
+ "runtime syntax/yats/node.vim
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName global process
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName console Buffer
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName module exports
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setTimeout
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearTimeout
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setInterval
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearInterval
+ hi def link typescriptNodeGlobal Structure
+
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName describe
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName it test before
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName after beforeEach
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName afterEach
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName beforeAll
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName afterAll
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName expect assert
+
+ "runtime syntax/yats/web.vim
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AbortController
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AbstractWorker AnalyserNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName App Apps ArrayBuffer
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ArrayBufferView
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Attr AudioBuffer
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioBufferSourceNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioContext AudioDestinationNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioListener AudioNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioParam BatteryManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BiquadFilterNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BlobEvent BluetoothAdapter
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothDevice
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraCapabilities
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraControl CameraManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasGradient CanvasImageSource
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasPattern CanvasRenderingContext2D
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CaretPosition CDATASection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelMergerNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelSplitterNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CharacterData ChildNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChromeWorker Comment
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Connection Console
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ContactManager Contacts
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ConvolverNode Coordinates
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSS CSSConditionRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSGroupingRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframeRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframesRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSMediaRule CSSNamespaceRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSPageRule CSSRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSRuleList CSSStyleDeclaration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSStyleRule CSSStyleSheet
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSSupportsRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DataTransfer DataView
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DedicatedWorkerGlobalScope
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DelayNode DeviceAcceleration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceRotationRate
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceStorage DirectoryEntry
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryEntrySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReader
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReaderSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Document DocumentFragment
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DocumentTouch DocumentType
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMCursor DOMError
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMException DOMHighResTimeStamp
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementationRegistry
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMParser DOMRequest
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMString DOMStringList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMStringMap DOMTimeStamp
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMTokenList DynamicsCompressorNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Element Entry EntrySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Extensions FileException
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Float32Array Float64Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName FMRadio FormData
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName GainNode Gamepad
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName GamepadButton Geolocation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName History HTMLAnchorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAreaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAudioElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBaseElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBodyElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBRElement HTMLButtonElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCanvasElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCollection HTMLDataElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDataListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDivElement HTMLDListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDocument HTMLElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLEmbedElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFieldSetElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormControlsCollection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadingElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHRElement HTMLHtmlElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLIFrameElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLImageElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLInputElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLKeygenElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLabelElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLegendElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLIElement HTMLLinkElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMapElement HTMLMediaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMetaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMeterElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLModElement HTMLObjectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptGroupElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionsCollection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOutputElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParagraphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParamElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLPreElement HTMLProgressElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLQuoteElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLScriptElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSelectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSourceElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSpanElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLStyleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCaptionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableColElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableDataCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableHeaderCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableRowElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableSectionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTextAreaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTimeElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTitleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTrackElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUnknownElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLVideoElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursor IDBCursorSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursorWithValue
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBDatabase IDBDatabaseSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBEnvironment IDBEnvironmentSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBFactory IDBFactorySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBIndex IDBIndexSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBKeyRange IDBObjectStore
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBObjectStoreSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBOpenDBRequest
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBRequest IDBTransaction
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBTransactionSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBVersionChangeEvent
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ImageData IndexedDB
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Int16Array Int32Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Int8Array L10n LinkStyle
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystem
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystemSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Location LockedFile
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaQueryList MediaQueryListListener
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaRecorder MediaSource
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaStream MediaStreamTrack
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MutationObserver
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Navigator NavigatorGeolocation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorID NavigatorLanguage
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorOnLine
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorPlugins
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Node NodeFilter
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NodeIterator NodeList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Notification OfflineAudioContext
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName OscillatorNode PannerNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ParentNode Performance
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceNavigation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceTiming
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Permissions PermissionSettings
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Plugin PluginArray
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Position PositionError
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PositionOptions
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PowerManager ProcessingInstruction
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PromiseResolver
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PushManager Range
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCConfiguration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnectionErrorCallback
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescription
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescriptionCallback
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ScriptProcessorNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Selection SettingsLock
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SettingsManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SharedWorker StyleSheet
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName StyleSheetList SVGAElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAngle SVGAnimateColorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedAngle
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedBoolean
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedEnumeration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedInteger
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLength
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLengthList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumber
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumberList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPoints
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPreserveAspectRatio
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedRect
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedString
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedTransformList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateMotionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateTransformElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimationElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCircleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGClipPathElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCursorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGDefsElement SVGDescElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGElement SVGEllipseElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFilterElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontElement SVGFontFaceElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceFormatElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceNameElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceSrcElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceUriElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGForeignObjectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGElement SVGGlyphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGHKernElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGImageElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLength SVGLengthList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLinearGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLineElement SVGMaskElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMatrix SVGMissingGlyphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMPathElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGNumber SVGNumberList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPathElement SVGPatternElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPoint SVGPolygonElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPolylineElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPreserveAspectRatio
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRadialGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRect SVGRectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGScriptElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSetElement SVGStopElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStringList SVGStylable
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStyleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSVGElement SVGSwitchElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSymbolElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTests SVGTextElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTextPositioningElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTitleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransform SVGTransformable
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransformList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTRefElement SVGTSpanElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGUseElement SVGViewElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGVKernElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPServerSocket
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPSocket Telephony
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TelephonyCall Text
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TextDecoder TextEncoder
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TextMetrics TimeRanges
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Touch TouchList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Transferable TreeWalker
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint16Array Uint32Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint8Array Uint8ClampedArray
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName URLSearchParams
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName URLUtilsReadOnly
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName UserProximityEvent
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ValidityState VideoPlaybackQuality
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WaveShaperNode WebBluetooth
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebGLRenderingContext
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebSMS WebSocket
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebVTT WifiManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Window Worker WorkerConsole
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WorkerLocation WorkerNavigator
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName XDomainRequest XMLDocument
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName XMLHttpRequestEventTarget
+ hi def link typescriptBOM Structure
+
+ "runtime syntax/yats/web-window.vim
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName applicationCache
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName closed
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName Components
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName controllers
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName dialogArguments
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName document
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frameElement
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frames
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName fullScreen
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName history
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerHeight
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerWidth
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName length
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName location
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName locationbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName menubar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName messageManager
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName name navigator
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName opener
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerHeight
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerWidth
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageXOffset
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageYOffset
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName parent
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName performance
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName personalbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName returnValue
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screen
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollbars
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName self sidebar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName status
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName statusbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName toolbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName top visualViewport
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName window
+ syntax cluster props add=typescriptBOMWindowProp
+ hi def link typescriptBOMWindowProp Structure
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName alert nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName atob nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName blur nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName btoa nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearImmediate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearInterval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearTimeout nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName close nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName confirm nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName dispatchEvent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName find nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName focus nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttention nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttentionWithCycleCount nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getComputedStyle nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getDefaulComputedStyle nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getSelection nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName matchMedia nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName maximize nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName open nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName openDialog nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName postMessage nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName print nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName prompt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName removeEventListener nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName restore nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scroll nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByLines nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByPages nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setCursor nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setImmediate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setInterval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setResizable nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setTimeout nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName showModalDialog nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName sizeToContent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName stop nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName updateCommands nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMWindowMethod
+ hi def link typescriptBOMWindowMethod Structure
+ syntax keyword typescriptBOMWindowEvent contained onabort onbeforeunload onblur onchange
+ syntax keyword typescriptBOMWindowEvent contained onclick onclose oncontextmenu ondevicelight
+ syntax keyword typescriptBOMWindowEvent contained ondevicemotion ondeviceorientation
+ syntax keyword typescriptBOMWindowEvent contained ondeviceproximity ondragdrop onerror
+ syntax keyword typescriptBOMWindowEvent contained onfocus onhashchange onkeydown onkeypress
+ syntax keyword typescriptBOMWindowEvent contained onkeyup onload onmousedown onmousemove
+ syntax keyword typescriptBOMWindowEvent contained onmouseout onmouseover onmouseup
+ syntax keyword typescriptBOMWindowEvent contained onmozbeforepaint onpaint onpopstate
+ syntax keyword typescriptBOMWindowEvent contained onreset onresize onscroll onselect
+ syntax keyword typescriptBOMWindowEvent contained onsubmit onunload onuserproximity
+ syntax keyword typescriptBOMWindowEvent contained onpageshow onpagehide
+ hi def link typescriptBOMWindowEvent Keyword
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName DOMParser
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName QueryInterface
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName XMLSerializer
+ hi def link typescriptBOMWindowCons Structure
+
+ "runtime syntax/yats/web-navigator.vim
+ syntax keyword typescriptBOMNavigatorProp contained battery buildID connection cookieEnabled
+ syntax keyword typescriptBOMNavigatorProp contained doNotTrack maxTouchPoints oscpu
+ syntax keyword typescriptBOMNavigatorProp contained productSub push serviceWorker
+ syntax keyword typescriptBOMNavigatorProp contained vendor vendorSub
+ syntax cluster props add=typescriptBOMNavigatorProp
+ hi def link typescriptBOMNavigatorProp Keyword
+ syntax keyword typescriptBOMNavigatorMethod contained addIdleObserver geolocation nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained getDeviceStorage getDeviceStorages nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained getGamepads getUserMedia registerContentHandler nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained removeIdleObserver requestWakeLock nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained share vibrate watch registerProtocolHandler nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained sendBeacon nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMNavigatorMethod
+ hi def link typescriptBOMNavigatorMethod Keyword
+ syntax keyword typescriptServiceWorkerMethod contained register nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptServiceWorkerMethod
+ hi def link typescriptServiceWorkerMethod Keyword
+
+ "runtime syntax/yats/web-location.vim
+ syntax keyword typescriptBOMLocationProp contained href protocol host hostname port
+ syntax keyword typescriptBOMLocationProp contained pathname search hash username password
+ syntax keyword typescriptBOMLocationProp contained origin
+ syntax cluster props add=typescriptBOMLocationProp
+ hi def link typescriptBOMLocationProp Keyword
+ syntax keyword typescriptBOMLocationMethod contained assign reload replace toString nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMLocationMethod
+ hi def link typescriptBOMLocationMethod Keyword
+
+ "runtime syntax/yats/web-history.vim
+ syntax keyword typescriptBOMHistoryProp contained length current next previous state
+ syntax keyword typescriptBOMHistoryProp contained scrollRestoration
+ syntax cluster props add=typescriptBOMHistoryProp
+ hi def link typescriptBOMHistoryProp Keyword
+ syntax keyword typescriptBOMHistoryMethod contained back forward go pushState replaceState nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMHistoryMethod
+ hi def link typescriptBOMHistoryMethod Keyword
+
+ "runtime syntax/yats/web-console.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName console
+ syntax keyword typescriptConsoleMethod contained count dir error group groupCollapsed nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptConsoleMethod contained groupEnd info log time timeEnd trace nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptConsoleMethod contained warn nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptConsoleMethod
+ hi def link typescriptConsoleMethod Keyword
+
+ "runtime syntax/yats/web-xhr.vim
+ syntax keyword typescriptXHRGlobal containedin=typescriptIdentifierName XMLHttpRequest
+ hi def link typescriptXHRGlobal Structure
+ syntax keyword typescriptXHRProp contained onreadystatechange readyState response
+ syntax keyword typescriptXHRProp contained responseText responseType responseXML status
+ syntax keyword typescriptXHRProp contained statusText timeout ontimeout upload withCredentials
+ syntax cluster props add=typescriptXHRProp
+ hi def link typescriptXHRProp Keyword
+ syntax keyword typescriptXHRMethod contained abort getAllResponseHeaders getResponseHeader nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptXHRMethod contained open overrideMimeType send setRequestHeader nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptXHRMethod
+ hi def link typescriptXHRMethod Keyword
+
+ "runtime syntax/yats/web-blob.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Blob BlobBuilder
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName File FileReader
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName FileReaderSync
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URL nextgroup=typescriptGlobalURLDot,typescriptFuncCallArg
+ syntax match typescriptGlobalURLDot /\./ contained nextgroup=typescriptURLStaticMethod,typescriptProp
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URLUtils
+ syntax keyword typescriptFileMethod contained readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptFileMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileMethod
+ hi def link typescriptFileMethod Keyword
+ syntax keyword typescriptFileReaderProp contained error readyState result
+ syntax cluster props add=typescriptFileReaderProp
+ hi def link typescriptFileReaderProp Keyword
+ syntax keyword typescriptFileReaderMethod contained abort readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptFileReaderMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileReaderMethod
+ hi def link typescriptFileReaderMethod Keyword
+ syntax keyword typescriptFileListMethod contained item nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileListMethod
+ hi def link typescriptFileListMethod Keyword
+ syntax keyword typescriptBlobMethod contained append getBlob getFile nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBlobMethod
+ hi def link typescriptBlobMethod Keyword
+ syntax keyword typescriptURLUtilsProp contained hash host hostname href origin password
+ syntax keyword typescriptURLUtilsProp contained pathname port protocol search searchParams
+ syntax keyword typescriptURLUtilsProp contained username
+ syntax cluster props add=typescriptURLUtilsProp
+ hi def link typescriptURLUtilsProp Keyword
+ syntax keyword typescriptURLStaticMethod contained createObjectURL revokeObjectURL nextgroup=typescriptFuncCallArg
+ hi def link typescriptURLStaticMethod Keyword
+
+ "runtime syntax/yats/web-crypto.vim
+ syntax keyword typescriptCryptoGlobal containedin=typescriptIdentifierName crypto
+ hi def link typescriptCryptoGlobal Structure
+ syntax keyword typescriptSubtleCryptoMethod contained encrypt decrypt sign verify nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptSubtleCryptoMethod contained digest nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptSubtleCryptoMethod
+ hi def link typescriptSubtleCryptoMethod Keyword
+ syntax keyword typescriptCryptoProp contained subtle
+ syntax cluster props add=typescriptCryptoProp
+ hi def link typescriptCryptoProp Keyword
+ syntax keyword typescriptCryptoMethod contained getRandomValues nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptCryptoMethod
+ hi def link typescriptCryptoMethod Keyword
+
+ "runtime syntax/yats/web-fetch.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Headers Request
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Response
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName fetch nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGlobalMethod
+ hi def link typescriptGlobalMethod Structure
+ syntax keyword typescriptHeadersMethod contained append delete get getAll has set nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptHeadersMethod
+ hi def link typescriptHeadersMethod Keyword
+ syntax keyword typescriptRequestProp contained method url headers context referrer
+ syntax keyword typescriptRequestProp contained mode credentials cache
+ syntax cluster props add=typescriptRequestProp
+ hi def link typescriptRequestProp Keyword
+ syntax keyword typescriptRequestMethod contained clone nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptRequestMethod
+ hi def link typescriptRequestMethod Keyword
+ syntax keyword typescriptResponseProp contained type url status statusText headers
+ syntax keyword typescriptResponseProp contained redirected
+ syntax cluster props add=typescriptResponseProp
+ hi def link typescriptResponseProp Keyword
+ syntax keyword typescriptResponseMethod contained clone nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptResponseMethod
+ hi def link typescriptResponseMethod Keyword
+
+ "runtime syntax/yats/web-service-worker.vim
+ syntax keyword typescriptServiceWorkerProp contained controller ready
+ syntax cluster props add=typescriptServiceWorkerProp
+ hi def link typescriptServiceWorkerProp Keyword
+ syntax keyword typescriptServiceWorkerMethod contained register getRegistration nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptServiceWorkerMethod
+ hi def link typescriptServiceWorkerMethod Keyword
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Cache
+ syntax keyword typescriptCacheMethod contained match matchAll add addAll put delete nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptCacheMethod contained keys nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptCacheMethod
+ hi def link typescriptCacheMethod Keyword
+
+ "runtime syntax/yats/web-encoding.vim
+ syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextEncoder
+ syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextDecoder
+ hi def link typescriptEncodingGlobal Structure
+ syntax keyword typescriptEncodingProp contained encoding fatal ignoreBOM
+ syntax cluster props add=typescriptEncodingProp
+ hi def link typescriptEncodingProp Keyword
+ syntax keyword typescriptEncodingMethod contained encode decode nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptEncodingMethod
+ hi def link typescriptEncodingMethod Keyword
+
+ "runtime syntax/yats/web-geo.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Geolocation
+ syntax keyword typescriptGeolocationMethod contained getCurrentPosition watchPosition nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGeolocationMethod contained clearWatch nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGeolocationMethod
+ hi def link typescriptGeolocationMethod Keyword
+
+ "runtime syntax/yats/web-network.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName NetworkInformation
+ syntax keyword typescriptBOMNetworkProp contained downlink downlinkMax effectiveType
+ syntax keyword typescriptBOMNetworkProp contained rtt type
+ syntax cluster props add=typescriptBOMNetworkProp
+ hi def link typescriptBOMNetworkProp Keyword
+
+ "runtime syntax/yats/web-payment.vim
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName PaymentRequest
+ syntax keyword typescriptPaymentMethod contained show abort canMakePayment nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPaymentMethod
+ hi def link typescriptPaymentMethod Keyword
+ syntax keyword typescriptPaymentProp contained shippingAddress shippingOption result
+ syntax cluster props add=typescriptPaymentProp
+ hi def link typescriptPaymentProp Keyword
+ syntax keyword typescriptPaymentEvent contained onshippingaddresschange onshippingoptionchange
+ hi def link typescriptPaymentEvent Keyword
+ syntax keyword typescriptPaymentResponseMethod contained complete nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPaymentResponseMethod
+ hi def link typescriptPaymentResponseMethod Keyword
+ syntax keyword typescriptPaymentResponseProp contained details methodName payerEmail
+ syntax keyword typescriptPaymentResponseProp contained payerPhone shippingAddress
+ syntax keyword typescriptPaymentResponseProp contained shippingOption
+ syntax cluster props add=typescriptPaymentResponseProp
+ hi def link typescriptPaymentResponseProp Keyword
+ syntax keyword typescriptPaymentAddressProp contained addressLine careOf city country
+ syntax keyword typescriptPaymentAddressProp contained country dependentLocality languageCode
+ syntax keyword typescriptPaymentAddressProp contained organization phone postalCode
+ syntax keyword typescriptPaymentAddressProp contained recipient region sortingCode
+ syntax cluster props add=typescriptPaymentAddressProp
+ hi def link typescriptPaymentAddressProp Keyword
+ syntax keyword typescriptPaymentShippingOptionProp contained id label amount selected
+ syntax cluster props add=typescriptPaymentShippingOptionProp
+ hi def link typescriptPaymentShippingOptionProp Keyword
+
+ "runtime syntax/yats/dom-node.vim
+ syntax keyword typescriptDOMNodeProp contained attributes baseURI baseURIObject childNodes
+ syntax keyword typescriptDOMNodeProp contained firstChild lastChild localName namespaceURI
+ syntax keyword typescriptDOMNodeProp contained nextSibling nodeName nodePrincipal
+ syntax keyword typescriptDOMNodeProp contained nodeType nodeValue ownerDocument parentElement
+ syntax keyword typescriptDOMNodeProp contained parentNode prefix previousSibling textContent
+ syntax cluster props add=typescriptDOMNodeProp
+ hi def link typescriptDOMNodeProp Keyword
+ syntax keyword typescriptDOMNodeMethod contained appendChild cloneNode compareDocumentPosition nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained getUserData hasAttributes hasChildNodes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained insertBefore isDefaultNamespace isEqualNode nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained isSameNode isSupported lookupNamespaceURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained lookupPrefix normalize removeChild nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained replaceChild setUserData nextgroup=typescriptFuncCallArg
+ syntax match typescriptDOMNodeMethod contained /contains/
+ syntax cluster props add=typescriptDOMNodeMethod
+ hi def link typescriptDOMNodeMethod Keyword
+ syntax keyword typescriptDOMNodeType contained ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE
+ syntax keyword typescriptDOMNodeType contained CDATA_SECTION_NODEN_NODE ENTITY_REFERENCE_NODE
+ syntax keyword typescriptDOMNodeType contained ENTITY_NODE PROCESSING_INSTRUCTION_NODEN_NODE
+ syntax keyword typescriptDOMNodeType contained COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE
+ syntax keyword typescriptDOMNodeType contained DOCUMENT_FRAGMENT_NODE NOTATION_NODE
+ hi def link typescriptDOMNodeType Keyword
+
+ "runtime syntax/yats/dom-elem.vim
+ syntax keyword typescriptDOMElemAttrs contained accessKey clientHeight clientLeft
+ syntax keyword typescriptDOMElemAttrs contained clientTop clientWidth id innerHTML
+ syntax keyword typescriptDOMElemAttrs contained length onafterscriptexecute onbeforescriptexecute
+ syntax keyword typescriptDOMElemAttrs contained oncopy oncut onpaste onwheel scrollHeight
+ syntax keyword typescriptDOMElemAttrs contained scrollLeft scrollTop scrollWidth tagName
+ syntax keyword typescriptDOMElemAttrs contained classList className name outerHTML
+ syntax keyword typescriptDOMElemAttrs contained style
+ hi def link typescriptDOMElemAttrs Keyword
+ syntax keyword typescriptDOMElemFuncs contained getAttributeNS getAttributeNode getAttributeNodeNS
+ syntax keyword typescriptDOMElemFuncs contained getBoundingClientRect getClientRects
+ syntax keyword typescriptDOMElemFuncs contained getElementsByClassName getElementsByTagName
+ syntax keyword typescriptDOMElemFuncs contained getElementsByTagNameNS hasAttribute
+ syntax keyword typescriptDOMElemFuncs contained hasAttributeNS insertAdjacentHTML
+ syntax keyword typescriptDOMElemFuncs contained matches querySelector querySelectorAll
+ syntax keyword typescriptDOMElemFuncs contained removeAttribute removeAttributeNS
+ syntax keyword typescriptDOMElemFuncs contained removeAttributeNode requestFullscreen
+ syntax keyword typescriptDOMElemFuncs contained requestPointerLock scrollIntoView
+ syntax keyword typescriptDOMElemFuncs contained setAttribute setAttributeNS setAttributeNode
+ syntax keyword typescriptDOMElemFuncs contained setAttributeNodeNS setCapture supports
+ syntax keyword typescriptDOMElemFuncs contained getAttribute
+ hi def link typescriptDOMElemFuncs Keyword
+
+ "runtime syntax/yats/dom-document.vim
+ syntax keyword typescriptDOMDocProp contained activeElement body cookie defaultView
+ syntax keyword typescriptDOMDocProp contained designMode dir domain embeds forms head
+ syntax keyword typescriptDOMDocProp contained images lastModified links location plugins
+ syntax keyword typescriptDOMDocProp contained postMessage readyState referrer registerElement
+ syntax keyword typescriptDOMDocProp contained scripts styleSheets title vlinkColor
+ syntax keyword typescriptDOMDocProp contained xmlEncoding characterSet compatMode
+ syntax keyword typescriptDOMDocProp contained contentType currentScript doctype documentElement
+ syntax keyword typescriptDOMDocProp contained documentURI documentURIObject firstChild
+ syntax keyword typescriptDOMDocProp contained implementation lastStyleSheetSet namespaceURI
+ syntax keyword typescriptDOMDocProp contained nodePrincipal ononline pointerLockElement
+ syntax keyword typescriptDOMDocProp contained popupNode preferredStyleSheetSet selectedStyleSheetSet
+ syntax keyword typescriptDOMDocProp contained styleSheetSets textContent tooltipNode
+ syntax cluster props add=typescriptDOMDocProp
+ hi def link typescriptDOMDocProp Keyword
+ syntax keyword typescriptDOMDocMethod contained caretPositionFromPoint close createNodeIterator nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createRange createTreeWalker elementFromPoint nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByName adoptNode createAttribute nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createCDATASection createComment createDocumentFragment nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createElement createElementNS createEvent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createExpression createNSResolver nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createProcessingInstruction createTextNode nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained enableStyleSheetsForSet evaluate execCommand nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained exitPointerLock getBoxObjectFor getElementById nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByClassName getElementsByTagName nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByTagNameNS getSelection nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained hasFocus importNode loadOverlay open nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained queryCommandSupported querySelector nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained querySelectorAll write writeln nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMDocMethod
+ hi def link typescriptDOMDocMethod Keyword
+
+ "runtime syntax/yats/dom-event.vim
+ syntax keyword typescriptDOMEventTargetMethod contained addEventListener removeEventListener nextgroup=typescriptEventFuncCallArg
+ syntax keyword typescriptDOMEventTargetMethod contained dispatchEvent waitUntil nextgroup=typescriptEventFuncCallArg
+ syntax cluster props add=typescriptDOMEventTargetMethod
+ hi def link typescriptDOMEventTargetMethod Keyword
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AnimationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AudioProcessingEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeInputEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeUnloadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BlobEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ClipboardEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CloseEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CompositionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CSSFontFaceLoadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CustomEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceLightEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceMotionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceOrientationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceProximityEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DOMTransactionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DragEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName EditingBeforeInputEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ErrorEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName FocusEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName GamepadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName HashChangeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName IDBVersionChangeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName KeyboardEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MediaStreamEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MessageEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MouseEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MutationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName OfflineAudioCompletionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PageTransitionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PointerEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PopStateEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ProgressEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RelatedEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RTCPeerConnectionIceEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SensorEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName StorageEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGZoomEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TimeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TouchEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TrackEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TransitionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UIEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UserProximityEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName WheelEvent
+ hi def link typescriptDOMEventCons Structure
+ syntax keyword typescriptDOMEventProp contained bubbles cancelable currentTarget defaultPrevented
+ syntax keyword typescriptDOMEventProp contained eventPhase target timeStamp type isTrusted
+ syntax keyword typescriptDOMEventProp contained isReload
+ syntax cluster props add=typescriptDOMEventProp
+ hi def link typescriptDOMEventProp Keyword
+ syntax keyword typescriptDOMEventMethod contained initEvent preventDefault stopImmediatePropagation nextgroup=typescriptEventFuncCallArg
+ syntax keyword typescriptDOMEventMethod contained stopPropagation respondWith default nextgroup=typescriptEventFuncCallArg
+ syntax cluster props add=typescriptDOMEventMethod
+ hi def link typescriptDOMEventMethod Keyword
+
+ "runtime syntax/yats/dom-storage.vim
+ syntax keyword typescriptDOMStorage contained sessionStorage localStorage
+ hi def link typescriptDOMStorage Keyword
+ syntax keyword typescriptDOMStorageProp contained length
+ syntax cluster props add=typescriptDOMStorageProp
+ hi def link typescriptDOMStorageProp Keyword
+ syntax keyword typescriptDOMStorageMethod contained getItem key setItem removeItem nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMStorageMethod contained clear nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMStorageMethod
+ hi def link typescriptDOMStorageMethod Keyword
+
+ "runtime syntax/yats/dom-form.vim
+ syntax keyword typescriptDOMFormProp contained acceptCharset action elements encoding
+ syntax keyword typescriptDOMFormProp contained enctype length method name target
+ syntax cluster props add=typescriptDOMFormProp
+ hi def link typescriptDOMFormProp Keyword
+ syntax keyword typescriptDOMFormMethod contained reportValidity reset submit nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMFormMethod
+ hi def link typescriptDOMFormMethod Keyword
+
+ "runtime syntax/yats/css.vim
+ syntax keyword typescriptDOMStyle contained alignContent alignItems alignSelf animation
+ syntax keyword typescriptDOMStyle contained animationDelay animationDirection animationDuration
+ syntax keyword typescriptDOMStyle contained animationFillMode animationIterationCount
+ syntax keyword typescriptDOMStyle contained animationName animationPlayState animationTimingFunction
+ syntax keyword typescriptDOMStyle contained appearance backfaceVisibility background
+ syntax keyword typescriptDOMStyle contained backgroundAttachment backgroundBlendMode
+ syntax keyword typescriptDOMStyle contained backgroundClip backgroundColor backgroundImage
+ syntax keyword typescriptDOMStyle contained backgroundOrigin backgroundPosition backgroundRepeat
+ syntax keyword typescriptDOMStyle contained backgroundSize border borderBottom borderBottomColor
+ syntax keyword typescriptDOMStyle contained borderBottomLeftRadius borderBottomRightRadius
+ syntax keyword typescriptDOMStyle contained borderBottomStyle borderBottomWidth borderCollapse
+ syntax keyword typescriptDOMStyle contained borderColor borderImage borderImageOutset
+ syntax keyword typescriptDOMStyle contained borderImageRepeat borderImageSlice borderImageSource
+ syntax keyword typescriptDOMStyle contained borderImageWidth borderLeft borderLeftColor
+ syntax keyword typescriptDOMStyle contained borderLeftStyle borderLeftWidth borderRadius
+ syntax keyword typescriptDOMStyle contained borderRight borderRightColor borderRightStyle
+ syntax keyword typescriptDOMStyle contained borderRightWidth borderSpacing borderStyle
+ syntax keyword typescriptDOMStyle contained borderTop borderTopColor borderTopLeftRadius
+ syntax keyword typescriptDOMStyle contained borderTopRightRadius borderTopStyle borderTopWidth
+ syntax keyword typescriptDOMStyle contained borderWidth bottom boxDecorationBreak
+ syntax keyword typescriptDOMStyle contained boxShadow boxSizing breakAfter breakBefore
+ syntax keyword typescriptDOMStyle contained breakInside captionSide caretColor caretShape
+ syntax keyword typescriptDOMStyle contained caret clear clip clipPath color columns
+ syntax keyword typescriptDOMStyle contained columnCount columnFill columnGap columnRule
+ syntax keyword typescriptDOMStyle contained columnRuleColor columnRuleStyle columnRuleWidth
+ syntax keyword typescriptDOMStyle contained columnSpan columnWidth content counterIncrement
+ syntax keyword typescriptDOMStyle contained counterReset cursor direction display
+ syntax keyword typescriptDOMStyle contained emptyCells flex flexBasis flexDirection
+ syntax keyword typescriptDOMStyle contained flexFlow flexGrow flexShrink flexWrap
+ syntax keyword typescriptDOMStyle contained float font fontFamily fontFeatureSettings
+ syntax keyword typescriptDOMStyle contained fontKerning fontLanguageOverride fontSize
+ syntax keyword typescriptDOMStyle contained fontSizeAdjust fontStretch fontStyle fontSynthesis
+ syntax keyword typescriptDOMStyle contained fontVariant fontVariantAlternates fontVariantCaps
+ syntax keyword typescriptDOMStyle contained fontVariantEastAsian fontVariantLigatures
+ syntax keyword typescriptDOMStyle contained fontVariantNumeric fontVariantPosition
+ syntax keyword typescriptDOMStyle contained fontWeight grad grid gridArea gridAutoColumns
+ syntax keyword typescriptDOMStyle contained gridAutoFlow gridAutoPosition gridAutoRows
+ syntax keyword typescriptDOMStyle contained gridColumn gridColumnStart gridColumnEnd
+ syntax keyword typescriptDOMStyle contained gridRow gridRowStart gridRowEnd gridTemplate
+ syntax keyword typescriptDOMStyle contained gridTemplateAreas gridTemplateRows gridTemplateColumns
+ syntax keyword typescriptDOMStyle contained height hyphens imageRendering imageResolution
+ syntax keyword typescriptDOMStyle contained imageOrientation imeMode inherit justifyContent
+ syntax keyword typescriptDOMStyle contained left letterSpacing lineBreak lineHeight
+ syntax keyword typescriptDOMStyle contained listStyle listStyleImage listStylePosition
+ syntax keyword typescriptDOMStyle contained listStyleType margin marginBottom marginLeft
+ syntax keyword typescriptDOMStyle contained marginRight marginTop marks mask maskType
+ syntax keyword typescriptDOMStyle contained maxHeight maxWidth minHeight minWidth
+ syntax keyword typescriptDOMStyle contained mixBlendMode objectFit objectPosition
+ syntax keyword typescriptDOMStyle contained opacity order orphans outline outlineColor
+ syntax keyword typescriptDOMStyle contained outlineOffset outlineStyle outlineWidth
+ syntax keyword typescriptDOMStyle contained overflow overflowWrap overflowX overflowY
+ syntax keyword typescriptDOMStyle contained overflowClipBox padding paddingBottom
+ syntax keyword typescriptDOMStyle contained paddingLeft paddingRight paddingTop pageBreakAfter
+ syntax keyword typescriptDOMStyle contained pageBreakBefore pageBreakInside perspective
+ syntax keyword typescriptDOMStyle contained perspectiveOrigin pointerEvents position
+ syntax keyword typescriptDOMStyle contained quotes resize right shapeImageThreshold
+ syntax keyword typescriptDOMStyle contained shapeMargin shapeOutside tableLayout tabSize
+ syntax keyword typescriptDOMStyle contained textAlign textAlignLast textCombineHorizontal
+ syntax keyword typescriptDOMStyle contained textDecoration textDecorationColor textDecorationLine
+ syntax keyword typescriptDOMStyle contained textDecorationStyle textIndent textOrientation
+ syntax keyword typescriptDOMStyle contained textOverflow textRendering textShadow
+ syntax keyword typescriptDOMStyle contained textTransform textUnderlinePosition top
+ syntax keyword typescriptDOMStyle contained touchAction transform transformOrigin
+ syntax keyword typescriptDOMStyle contained transformStyle transition transitionDelay
+ syntax keyword typescriptDOMStyle contained transitionDuration transitionProperty
+ syntax keyword typescriptDOMStyle contained transitionTimingFunction unicodeBidi unicodeRange
+ syntax keyword typescriptDOMStyle contained userSelect userZoom verticalAlign visibility
+ syntax keyword typescriptDOMStyle contained whiteSpace width willChange wordBreak
+ syntax keyword typescriptDOMStyle contained wordSpacing wordWrap writingMode zIndex
+ hi def link typescriptDOMStyle Keyword
+
+
+
+ let typescript_props = 1
+
+ "runtime syntax/yats/event.vim
+ syntax keyword typescriptAnimationEvent contained animationend animationiteration
+ syntax keyword typescriptAnimationEvent contained animationstart beginEvent endEvent
+ syntax keyword typescriptAnimationEvent contained repeatEvent
+ syntax cluster events add=typescriptAnimationEvent
+ hi def link typescriptAnimationEvent Title
+ syntax keyword typescriptCSSEvent contained CssRuleViewRefreshed CssRuleViewChanged
+ syntax keyword typescriptCSSEvent contained CssRuleViewCSSLinkClicked transitionend
+ syntax cluster events add=typescriptCSSEvent
+ hi def link typescriptCSSEvent Title
+ syntax keyword typescriptDatabaseEvent contained blocked complete error success upgradeneeded
+ syntax keyword typescriptDatabaseEvent contained versionchange
+ syntax cluster events add=typescriptDatabaseEvent
+ hi def link typescriptDatabaseEvent Title
+ syntax keyword typescriptDocumentEvent contained DOMLinkAdded DOMLinkRemoved DOMMetaAdded
+ syntax keyword typescriptDocumentEvent contained DOMMetaRemoved DOMWillOpenModalDialog
+ syntax keyword typescriptDocumentEvent contained DOMModalDialogClosed unload
+ syntax cluster events add=typescriptDocumentEvent
+ hi def link typescriptDocumentEvent Title
+ syntax keyword typescriptDOMMutationEvent contained DOMAttributeNameChanged DOMAttrModified
+ syntax keyword typescriptDOMMutationEvent contained DOMCharacterDataModified DOMContentLoaded
+ syntax keyword typescriptDOMMutationEvent contained DOMElementNameChanged DOMNodeInserted
+ syntax keyword typescriptDOMMutationEvent contained DOMNodeInsertedIntoDocument DOMNodeRemoved
+ syntax keyword typescriptDOMMutationEvent contained DOMNodeRemovedFromDocument DOMSubtreeModified
+ syntax cluster events add=typescriptDOMMutationEvent
+ hi def link typescriptDOMMutationEvent Title
+ syntax keyword typescriptDragEvent contained drag dragdrop dragend dragenter dragexit
+ syntax keyword typescriptDragEvent contained draggesture dragleave dragover dragstart
+ syntax keyword typescriptDragEvent contained drop
+ syntax cluster events add=typescriptDragEvent
+ hi def link typescriptDragEvent Title
+ syntax keyword typescriptElementEvent contained invalid overflow underflow DOMAutoComplete
+ syntax keyword typescriptElementEvent contained command commandupdate
+ syntax cluster events add=typescriptElementEvent
+ hi def link typescriptElementEvent Title
+ syntax keyword typescriptFocusEvent contained blur change DOMFocusIn DOMFocusOut focus
+ syntax keyword typescriptFocusEvent contained focusin focusout
+ syntax cluster events add=typescriptFocusEvent
+ hi def link typescriptFocusEvent Title
+ syntax keyword typescriptFormEvent contained reset submit
+ syntax cluster events add=typescriptFormEvent
+ hi def link typescriptFormEvent Title
+ syntax keyword typescriptFrameEvent contained DOMFrameContentLoaded
+ syntax cluster events add=typescriptFrameEvent
+ hi def link typescriptFrameEvent Title
+ syntax keyword typescriptInputDeviceEvent contained click contextmenu DOMMouseScroll
+ syntax keyword typescriptInputDeviceEvent contained dblclick gamepadconnected gamepaddisconnected
+ syntax keyword typescriptInputDeviceEvent contained keydown keypress keyup MozGamepadButtonDown
+ syntax keyword typescriptInputDeviceEvent contained MozGamepadButtonUp mousedown mouseenter
+ syntax keyword typescriptInputDeviceEvent contained mouseleave mousemove mouseout
+ syntax keyword typescriptInputDeviceEvent contained mouseover mouseup mousewheel MozMousePixelScroll
+ syntax keyword typescriptInputDeviceEvent contained pointerlockchange pointerlockerror
+ syntax keyword typescriptInputDeviceEvent contained wheel
+ syntax cluster events add=typescriptInputDeviceEvent
+ hi def link typescriptInputDeviceEvent Title
+ syntax keyword typescriptMediaEvent contained audioprocess canplay canplaythrough
+ syntax keyword typescriptMediaEvent contained durationchange emptied ended ended loadeddata
+ syntax keyword typescriptMediaEvent contained loadedmetadata MozAudioAvailable pause
+ syntax keyword typescriptMediaEvent contained play playing ratechange seeked seeking
+ syntax keyword typescriptMediaEvent contained stalled suspend timeupdate volumechange
+ syntax keyword typescriptMediaEvent contained waiting complete
+ syntax cluster events add=typescriptMediaEvent
+ hi def link typescriptMediaEvent Title
+ syntax keyword typescriptMenuEvent contained DOMMenuItemActive DOMMenuItemInactive
+ syntax cluster events add=typescriptMenuEvent
+ hi def link typescriptMenuEvent Title
+ syntax keyword typescriptNetworkEvent contained datachange dataerror disabled enabled
+ syntax keyword typescriptNetworkEvent contained offline online statuschange connectionInfoUpdate
+ syntax cluster events add=typescriptNetworkEvent
+ hi def link typescriptNetworkEvent Title
+ syntax keyword typescriptProgressEvent contained abort error load loadend loadstart
+ syntax keyword typescriptProgressEvent contained progress timeout uploadprogress
+ syntax cluster events add=typescriptProgressEvent
+ hi def link typescriptProgressEvent Title
+ syntax keyword typescriptResourceEvent contained cached error load
+ syntax cluster events add=typescriptResourceEvent
+ hi def link typescriptResourceEvent Title
+ syntax keyword typescriptScriptEvent contained afterscriptexecute beforescriptexecute
+ syntax cluster events add=typescriptScriptEvent
+ hi def link typescriptScriptEvent Title
+ syntax keyword typescriptSensorEvent contained compassneedscalibration devicelight
+ syntax keyword typescriptSensorEvent contained devicemotion deviceorientation deviceproximity
+ syntax keyword typescriptSensorEvent contained orientationchange userproximity
+ syntax cluster events add=typescriptSensorEvent
+ hi def link typescriptSensorEvent Title
+ syntax keyword typescriptSessionHistoryEvent contained pagehide pageshow popstate
+ syntax cluster events add=typescriptSessionHistoryEvent
+ hi def link typescriptSessionHistoryEvent Title
+ syntax keyword typescriptStorageEvent contained change storage
+ syntax cluster events add=typescriptStorageEvent
+ hi def link typescriptStorageEvent Title
+ syntax keyword typescriptSVGEvent contained SVGAbort SVGError SVGLoad SVGResize SVGScroll
+ syntax keyword typescriptSVGEvent contained SVGUnload SVGZoom
+ syntax cluster events add=typescriptSVGEvent
+ hi def link typescriptSVGEvent Title
+ syntax keyword typescriptTabEvent contained visibilitychange
+ syntax cluster events add=typescriptTabEvent
+ hi def link typescriptTabEvent Title
+ syntax keyword typescriptTextEvent contained compositionend compositionstart compositionupdate
+ syntax keyword typescriptTextEvent contained copy cut paste select text
+ syntax cluster events add=typescriptTextEvent
+ hi def link typescriptTextEvent Title
+ syntax keyword typescriptTouchEvent contained touchcancel touchend touchenter touchleave
+ syntax keyword typescriptTouchEvent contained touchmove touchstart
+ syntax cluster events add=typescriptTouchEvent
+ hi def link typescriptTouchEvent Title
+ syntax keyword typescriptUpdateEvent contained checking downloading error noupdate
+ syntax keyword typescriptUpdateEvent contained obsolete updateready
+ syntax cluster events add=typescriptUpdateEvent
+ hi def link typescriptUpdateEvent Title
+ syntax keyword typescriptValueChangeEvent contained hashchange input readystatechange
+ syntax cluster events add=typescriptValueChangeEvent
+ hi def link typescriptValueChangeEvent Title
+ syntax keyword typescriptViewEvent contained fullscreen fullscreenchange fullscreenerror
+ syntax keyword typescriptViewEvent contained resize scroll
+ syntax cluster events add=typescriptViewEvent
+ hi def link typescriptViewEvent Title
+ syntax keyword typescriptWebsocketEvent contained close error message open
+ syntax cluster events add=typescriptWebsocketEvent
+ hi def link typescriptWebsocketEvent Title
+ syntax keyword typescriptWindowEvent contained DOMWindowCreated DOMWindowClose DOMTitleChanged
+ syntax cluster events add=typescriptWindowEvent
+ hi def link typescriptWindowEvent Title
+ syntax keyword typescriptUncategorizedEvent contained beforeunload message open show
+ syntax cluster events add=typescriptUncategorizedEvent
+ hi def link typescriptUncategorizedEvent Title
+ syntax keyword typescriptServiceWorkerEvent contained install activate fetch
+ syntax cluster events add=typescriptServiceWorkerEvent
+ hi def link typescriptServiceWorkerEvent Title
+
+
+endif
+
+" patch
+"runtime syntax/basic/patch.vim
+" patch for generated code
+syntax keyword typescriptGlobal Promise
+ \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
+syntax keyword typescriptGlobal Map WeakMap
+ \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
+
+"runtime syntax/basic/members.vim
+syntax keyword typescriptConstructor contained constructor
+ \ nextgroup=@typescriptCallSignature
+ \ skipwhite skipempty
+
+
+syntax cluster memberNextGroup contains=typescriptMemberOptionality,typescriptTypeAnnotation,@typescriptCallSignature
+
+syntax match typescriptMember /\K\k*/
+ \ nextgroup=@memberNextGroup
+ \ contained skipwhite
+
+syntax match typescriptMethodAccessor contained /\v(get|set)\s\K/me=e-1
+ \ nextgroup=@typescriptMembers
+
+syntax cluster typescriptPropertyMemberDeclaration contains=
+ \ typescriptClassStatic,
+ \ typescriptAccessibilityModifier,
+ \ typescriptReadonlyModifier,
+ \ typescriptMethodAccessor,
+ \ @typescriptMembers
+ " \ typescriptMemberVariableDeclaration
+
+syntax match typescriptMemberOptionality /?\|!/ contained
+ \ nextgroup=typescriptTypeAnnotation,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax cluster typescriptMembers contains=typescriptMember,typescriptStringMember,typescriptComputedMember
+
+syntax keyword typescriptClassStatic static
+ \ nextgroup=@typescriptMembers,typescriptAsyncFuncKeyword,typescriptReadonlyModifier
+ \ skipwhite contained
+
+syntax keyword typescriptAccessibilityModifier public private protected contained
+
+syntax keyword typescriptReadonlyModifier readonly contained
+
+syntax region typescriptStringMember contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
+ \ nextgroup=@memberNextGroup
+ \ skipwhite skipempty
+
+syntax region typescriptComputedMember contained matchgroup=typescriptProperty
+ \ start=/\[/rs=s+1 end=/]/
+ \ contains=@typescriptValue,typescriptMember,typescriptMappedIn
+ \ nextgroup=@memberNextGroup
+ \ skipwhite skipempty
+
+"runtime syntax/basic/class.vim
+"don't add typescriptMembers to nextgroup, let outer scope match it
+" so we won't match abstract method outside abstract class
+syntax keyword typescriptAbstract abstract
+ \ nextgroup=typescriptClassKeyword
+ \ skipwhite skipnl
+syntax keyword typescriptClassKeyword class
+ \ nextgroup=typescriptClassName,typescriptClassExtends,typescriptClassBlock
+ \ skipwhite
+
+syntax match typescriptClassName contained /\K\k*/
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptClassTypeParameter
+ \ skipwhite skipnl
+
+syntax region typescriptClassTypeParameter
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptClassExtends contained extends implements nextgroup=typescriptClassHeritage skipwhite skipnl
+
+syntax match typescriptClassHeritage contained /\v(\k|\.|\(|\))+/
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptMixinComma,typescriptClassTypeArguments
+ \ contains=@typescriptValue
+ \ skipwhite skipnl
+ \ contained
+
+syntax region typescriptClassTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptClassExtends,typescriptClassBlock,typescriptMixinComma
+ \ contained skipwhite skipnl
+
+syntax match typescriptMixinComma /,/ contained nextgroup=typescriptClassHeritage skipwhite skipnl
+
+" we need add arrowFunc to class block for high order arrow func
+" see test case
+syntax region typescriptClassBlock matchgroup=typescriptBraces start=/{/ end=/}/
+ \ contains=@typescriptPropertyMemberDeclaration,typescriptAbstract,@typescriptComments,typescriptBlock,typescriptAssign,typescriptDecorator,typescriptAsyncFuncKeyword,typescriptArrowFunc
+ \ contained fold
+
+syntax keyword typescriptInterfaceKeyword interface nextgroup=typescriptInterfaceName skipwhite
+syntax match typescriptInterfaceName contained /\k\+/
+ \ nextgroup=typescriptObjectType,typescriptInterfaceExtends,typescriptInterfaceTypeParameter
+ \ skipwhite skipnl
+syntax region typescriptInterfaceTypeParameter
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptObjectType,typescriptInterfaceExtends
+ \ contained
+ \ skipwhite skipnl
+
+syntax keyword typescriptInterfaceExtends contained extends nextgroup=typescriptInterfaceHeritage skipwhite skipnl
+
+syntax match typescriptInterfaceHeritage contained /\v(\k|\.)+/
+ \ nextgroup=typescriptObjectType,typescriptInterfaceComma,typescriptInterfaceTypeArguments
+ \ skipwhite
+
+syntax region typescriptInterfaceTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/ skip=/\s*,\s*/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptObjectType,typescriptInterfaceComma
+ \ contained skipwhite
+
+syntax match typescriptInterfaceComma /,/ contained nextgroup=typescriptInterfaceHeritage skipwhite skipnl
+
+"runtime syntax/basic/cluster.vim
+"Block VariableStatement EmptyStatement ExpressionStatement IfStatement IterationStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement SwitchStatement ThrowStatement TryStatement DebuggerStatement
+syntax cluster typescriptStatement
+ \ contains=typescriptBlock,typescriptVariable,
+ \ @typescriptTopExpression,typescriptAssign,
+ \ typescriptConditional,typescriptRepeat,typescriptBranch,
+ \ typescriptLabel,typescriptStatementKeyword,
+ \ typescriptFuncKeyword,
+ \ typescriptTry,typescriptExceptions,typescriptDebugger,
+ \ typescriptExport,typescriptInterfaceKeyword,typescriptEnum,
+ \ typescriptModule,typescriptAliasKeyword,typescriptImport
+
+syntax cluster typescriptPrimitive contains=typescriptString,typescriptTemplate,typescriptRegexpString,typescriptNumber,typescriptBoolean,typescriptNull,typescriptArray
+
+syntax cluster typescriptEventTypes contains=typescriptEventString,typescriptTemplate,typescriptNumber,typescriptBoolean,typescriptNull
+
+" top level expression: no arrow func
+" also no func keyword. funcKeyword is contained in statement
+" funcKeyword allows overloading (func without body)
+" funcImpl requires body
+syntax cluster typescriptTopExpression
+ \ contains=@typescriptPrimitive,
+ \ typescriptIdentifier,typescriptIdentifierName,
+ \ typescriptOperator,typescriptUnaryOp,
+ \ typescriptParenExp,typescriptRegexpString,
+ \ typescriptGlobal,typescriptAsyncFuncKeyword,
+ \ typescriptClassKeyword,typescriptTypeCast
+
+" no object literal, used in type cast and arrow func
+" TODO: change func keyword to funcImpl
+syntax cluster typescriptExpression
+ \ contains=@typescriptTopExpression,
+ \ typescriptArrowFuncDef,
+ \ typescriptFuncImpl
+
+syntax cluster typescriptValue
+ \ contains=@typescriptExpression,typescriptObjectLiteral
+
+syntax cluster typescriptEventExpression contains=typescriptArrowFuncDef,typescriptParenExp,@typescriptValue,typescriptRegexpString,@typescriptEventTypes,typescriptOperator,typescriptGlobal,jsxRegion
+
+"runtime syntax/basic/function.vim
+syntax keyword typescriptAsyncFuncKeyword async
+ \ nextgroup=typescriptFuncKeyword,typescriptArrowFuncDef
+ \ skipwhite
+
+syntax keyword typescriptAsyncFuncKeyword await
+ \ nextgroup=@typescriptValue
+ \ skipwhite
+
+syntax keyword typescriptFuncKeyword function
+ \ nextgroup=typescriptAsyncFunc,typescriptFuncName,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax match typescriptAsyncFunc contained /*/
+ \ nextgroup=typescriptFuncName,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax match typescriptFuncName contained /\K\k*/
+ \ nextgroup=@typescriptCallSignature
+ \ skipwhite
+
+" destructuring ({ a: ee }) =>
+syntax match typescriptArrowFuncDef contained /({\_[^}]*}\(:\_[^)]\)\?)\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+" matches `(a) =>` or `([a]) =>` or
+" `(
+" a) =>`
+syntax match typescriptArrowFuncDef contained /(\(\_s*[a-zA-Z\$_\[.]\_[^)]*\)*)\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+syntax match typescriptArrowFuncDef contained /\K\k*\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+" TODO: optimize this pattern
+syntax region typescriptArrowFuncDef contained start=/(\_[^)]*):/ end=/=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc,typescriptTypeAnnotation
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty keepend
+
+syntax match typescriptArrowFunc /=>/
+syntax match typescriptArrowFuncArg contained /\K\k*/
+syntax region typescriptArrowFuncArg contained start=/<\|(/ end=/\ze=>/ contains=@typescriptCallSignature
+
+syntax region typescriptReturnAnnotation contained start=/:/ end=/{/me=e-1 contains=@typescriptType nextgroup=typescriptBlock
+
+
+syntax region typescriptFuncImpl contained start=/function/ end=/{/me=e-1
+ \ contains=typescriptFuncKeyword
+ \ nextgroup=typescriptBlock
+
+syntax cluster typescriptCallImpl contains=typescriptGenericImpl,typescriptParamImpl
+syntax region typescriptGenericImpl matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/ skip=/\s*,\s*/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptParamImpl
+ \ contained skipwhite
+syntax region typescriptParamImpl matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
+ \ nextgroup=typescriptReturnAnnotation,typescriptBlock
+ \ contained skipwhite skipnl
+
+"runtime syntax/basic/decorator.vim
+syntax match typescriptDecorator /@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>/
+ \ nextgroup=typescriptArgumentList,typescriptTypeArguments
+ \ contains=@_semantic,typescriptDotNotation
+
+" Define the default highlighting.
+hi def link typescriptReserved Error
+
+hi def link typescriptEndColons Exception
+hi def link typescriptSymbols Normal
+hi def link typescriptBraces Function
+hi def link typescriptParens Normal
+hi def link typescriptComment Comment
+hi def link typescriptLineComment Comment
+hi def link typescriptDocComment Comment
+hi def link typescriptCommentTodo Todo
+hi def link typescriptRef Include
+hi def link typescriptDocNotation SpecialComment
+hi def link typescriptDocTags SpecialComment
+hi def link typescriptDocNGParam typescriptDocParam
+hi def link typescriptDocParam Function
+hi def link typescriptDocNumParam Function
+hi def link typescriptDocEventRef Function
+hi def link typescriptDocNamedParamType Type
+hi def link typescriptDocParamName Type
+hi def link typescriptDocParamType Type
+hi def link typescriptString String
+hi def link typescriptSpecial Special
+hi def link typescriptStringLiteralType String
+hi def link typescriptStringMember String
+hi def link typescriptTemplate String
+hi def link typescriptEventString String
+hi def link typescriptASCII Special
+hi def link typescriptTemplateSB Label
+hi def link typescriptRegexpString String
+hi def link typescriptGlobal Constant
+hi def link typescriptTestGlobal Function
+hi def link typescriptPrototype Type
+hi def link typescriptConditional Conditional
+hi def link typescriptConditionalElse Conditional
+hi def link typescriptCase Conditional
+hi def link typescriptDefault typescriptCase
+hi def link typescriptBranch Conditional
+hi def link typescriptIdentifier Structure
+hi def link typescriptVariable Identifier
+hi def link typescriptEnumKeyword Identifier
+hi def link typescriptRepeat Repeat
+hi def link typescriptForOperator Repeat
+hi def link typescriptStatementKeyword Statement
+hi def link typescriptMessage Keyword
+hi def link typescriptOperator Identifier
+hi def link typescriptKeywordOp Identifier
+hi def link typescriptCastKeyword Special
+hi def link typescriptType Type
+hi def link typescriptNull Boolean
+hi def link typescriptNumber Number
+hi def link typescriptExponent Number
+hi def link typescriptBoolean Boolean
+hi def link typescriptObjectLabel typescriptLabel
+hi def link typescriptLabel Label
+hi def link typescriptStringProperty String
+hi def link typescriptImport Special
+hi def link typescriptAmbientDeclaration Special
+hi def link typescriptExport Special
+hi def link typescriptModule Special
+hi def link typescriptTry Special
+hi def link typescriptExceptions Special
+
+hi def link typescriptMember Function
+hi def link typescriptMethodAccessor Operator
+
+hi def link typescriptAsyncFuncKeyword Keyword
+hi def link typescriptAsyncFor Keyword
+hi def link typescriptFuncKeyword Keyword
+hi def link typescriptAsyncFunc Keyword
+hi def link typescriptArrowFunc Type
+hi def link typescriptFuncName Function
+hi def link typescriptFuncArg PreProc
+hi def link typescriptArrowFuncArg PreProc
+hi def link typescriptFuncComma Operator
+
+hi def link typescriptClassKeyword Keyword
+hi def link typescriptClassExtends Keyword
+" hi def link typescriptClassName Function
+hi def link typescriptAbstract Special
+" hi def link typescriptClassHeritage Function
+" hi def link typescriptInterfaceHeritage Function
+hi def link typescriptClassStatic StorageClass
+hi def link typescriptReadonlyModifier Keyword
+hi def link typescriptInterfaceKeyword Keyword
+hi def link typescriptInterfaceExtends Keyword
+hi def link typescriptInterfaceName Function
+
+hi def link shellbang Comment
+
+hi def link typescriptTypeParameter Identifier
+hi def link typescriptConstraint Keyword
+hi def link typescriptPredefinedType Type
+hi def link typescriptReadonlyArrayKeyword Keyword
+hi def link typescriptUnion Operator
+hi def link typescriptFuncTypeArrow Function
+hi def link typescriptConstructorType Function
+hi def link typescriptTypeQuery Keyword
+hi def link typescriptAccessibilityModifier Keyword
+hi def link typescriptOptionalMark PreProc
+hi def link typescriptFuncType Special
+hi def link typescriptMappedIn Special
+hi def link typescriptCall PreProc
+hi def link typescriptParamImpl PreProc
+hi def link typescriptConstructSignature Identifier
+hi def link typescriptAliasDeclaration Identifier
+hi def link typescriptAliasKeyword Keyword
+hi def link typescriptUserDefinedType Keyword
+hi def link typescriptTypeReference Identifier
+hi def link typescriptConstructor Keyword
+hi def link typescriptDecorator Special
+hi def link typescriptAssertType Keyword
+
+hi link typeScript NONE
+
+if exists('s:cpo_save')
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+endif
diff --git a/runtime/syntax/typescriptreact.vim b/runtime/syntax/typescriptreact.vim
new file mode 100644
index 0000000000..f29fe785b9
--- /dev/null
+++ b/runtime/syntax/typescriptreact.vim
@@ -0,0 +1,160 @@
+" Vim syntax file
+" Language: TypeScript with React (JSX)
+" Maintainer: Bram Moolenaar
+" Last Change: 2019 Nov 30
+" Based On: Herrington Darkholme's yats.vim
+" Changes: See https:github.com/HerringtonDarkholme/yats.vim
+" Credits: See yats.vim on github
+
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'typescriptreact'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax region tsxTag
+ \ start=+<\([^/!?<>="':]\+\)\@=+
+ \ skip=+</[^ /!?<>"']\+>+
+ \ end=+/\@<!>+
+ \ end=+\(/>\)\@=+
+ \ contained
+ \ contains=tsxTagName,tsxIntrinsicTagName,tsxAttrib,tsxEscJs,
+ \tsxCloseString,@tsxComment
+
+syntax match tsxTag /<>/ contained
+
+
+" <tag></tag>
+" s~~~~~~~~~e
+" and self close tag
+" <tag/>
+" s~~~~e
+" A big start regexp borrowed from https://git.io/vDyxc
+syntax region tsxRegion
+ \ start=+<\_s*\z([a-zA-Z1-9\$_-]\+\(\.\k\+\)*\)+
+ \ skip=+<!--\_.\{-}-->+
+ \ end=+</\_s*\z1>+
+ \ matchgroup=tsxCloseString end=+/>+
+ \ fold
+ \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell
+ \ keepend
+ \ extend
+
+" <> </>
+" s~~~~~~e
+" A big start regexp borrowed from https://git.io/vDyxc
+syntax region tsxFragment
+ \ start=+\(\((\|{\|}\|\[\|,\|&&\|||\|?\|:\|=\|=>\|\Wreturn\|^return\|\Wdefault\|^\|>\)\_s*\)\@<=<>+
+ \ skip=+<!--\_.\{-}-->+
+ \ end=+</>+
+ \ fold
+ \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell
+ \ keepend
+ \ extend
+
+" </tag>
+" ~~~~~~
+syntax match tsxCloseTag
+ \ +</\_s*[^/!?<>"']\+>+
+ \ contained
+ \ contains=tsxTagName,tsxIntrinsicTagName
+
+syntax match tsxCloseTag +</>+ contained
+
+syntax match tsxCloseString
+ \ +/>+
+ \ contained
+
+" <!-- -->
+" ~~~~~~~~
+syntax match tsxCommentInvalid /<!--\_.\{-}-->/ display
+
+syntax region tsxBlockComment
+ \ contained
+ \ start="/\*"
+ \ end="\*/"
+
+syntax match tsxLineComment
+ \ "//.*$"
+ \ contained
+ \ display
+
+syntax cluster tsxComment contains=tsxBlockComment,tsxLineComment
+
+syntax match tsxEntity "&[^; \t]*;" contains=tsxEntityPunct
+syntax match tsxEntityPunct contained "[&.;]"
+
+" <tag key={this.props.key}>
+" ~~~
+syntax match tsxTagName
+ \ +[</]\_s*[^/!?<>"'* ]\++hs=s+1
+ \ contained
+ \ nextgroup=tsxAttrib
+ \ skipwhite
+ \ display
+syntax match tsxIntrinsicTagName
+ \ +[</]\_s*[a-z1-9-]\++hs=s+1
+ \ contained
+ \ nextgroup=tsxAttrib
+ \ skipwhite
+ \ display
+
+" <tag key={this.props.key}>
+" ~~~
+syntax match tsxAttrib
+ \ +[a-zA-Z_][-0-9a-zA-Z_]*+
+ \ nextgroup=tsxEqual skipwhite
+ \ contained
+ \ display
+
+" <tag id="sample">
+" ~
+syntax match tsxEqual +=+ display contained
+ \ nextgroup=tsxString skipwhite
+
+" <tag id="sample">
+" s~~~~~~e
+syntax region tsxString contained start=+"+ end=+"+ contains=tsxEntity,@Spell display
+
+" <tag key={this.props.key}>
+" s~~~~~~~~~~~~~~e
+syntax region tsxEscJs
+ \ contained
+ \ contains=@typescriptValue,@tsxComment
+ \ matchgroup=typescriptBraces
+ \ start=+{+
+ \ end=+}+
+ \ extend
+
+
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+" Source the part common with typescriptreact.vim
+source <sfile>:h/typescriptcommon.vim
+
+
+syntax cluster typescriptExpression add=tsxRegion,tsxFragment
+
+hi def link tsxTag htmlTag
+hi def link tsxTagName Function
+hi def link tsxIntrinsicTagName htmlTagName
+hi def link tsxString String
+hi def link tsxNameSpace Function
+hi def link tsxCommentInvalid Error
+hi def link tsxBlockComment Comment
+hi def link tsxLineComment Comment
+hi def link tsxAttrib Type
+hi def link tsxEscJs tsxEscapeJs
+hi def link tsxCloseTag htmlTag
+hi def link tsxCloseString Identifier
+
+let b:current_syntax = "typescriptreact"
+if main_syntax == 'typescriptreact'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/scripts/download-unicode-files.sh b/scripts/download-unicode-files.sh
index 5f38d0589a..12474d3c1e 100755
--- a/scripts/download-unicode-files.sh
+++ b/scripts/download-unicode-files.sh
@@ -30,7 +30,7 @@ for filename in $data_files ; do
done
for filename in $emoji_files ; do
- curl -L -o "$UNIDIR/$filename" "$DOWNLOAD_URL_BASE/emoji/latest/$filename"
+ curl -L -o "$UNIDIR/$filename" "$DOWNLOAD_URL_BASE/UNIDATA/emoji/$filename"
(
cd "$UNIDIR"
git add $filename
diff --git a/scripts/gen_vimdoc.py b/scripts/gen_vimdoc.py
index f754452c02..c42b568220 100755
--- a/scripts/gen_vimdoc.py
+++ b/scripts/gen_vimdoc.py
@@ -113,10 +113,12 @@ CONFIG = {
'section_order': [
'vim.lua',
'shared.lua',
+ 'uri.lua',
],
'files': ' '.join([
os.path.join(base_dir, 'src/nvim/lua/vim.lua'),
os.path.join(base_dir, 'runtime/lua/vim/shared.lua'),
+ os.path.join(base_dir, 'runtime/lua/vim/uri.lua'),
]),
'file_patterns': '*.lua',
'fn_name_prefix': '',
@@ -129,6 +131,7 @@ CONFIG = {
'module_override': {
# `shared` functions are exposed on the `vim` module.
'shared': 'vim',
+ 'uri': 'vim',
},
'append_only': [
'shared.lua',
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 15065760b3..2811a2da12 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -244,78 +244,6 @@ Boolean nvim_buf_detach(uint64_t channel_id,
return true;
}
-static void buf_clear_luahl(buf_T *buf, bool force)
-{
- if (buf->b_luahl || force) {
- api_free_luaref(buf->b_luahl_start);
- api_free_luaref(buf->b_luahl_window);
- api_free_luaref(buf->b_luahl_line);
- api_free_luaref(buf->b_luahl_end);
- }
- buf->b_luahl_start = LUA_NOREF;
- buf->b_luahl_window = LUA_NOREF;
- buf->b_luahl_line = LUA_NOREF;
- buf->b_luahl_end = LUA_NOREF;
-}
-
-/// Unstabilized interface for defining syntax hl in lua.
-///
-/// This is not yet safe for general use, lua callbacks will need to
-/// be restricted, like textlock and probably other stuff.
-///
-/// The API on_line/nvim__put_attr is quite raw and not intended to be the
-/// final shape. Ideally this should operate on chunks larger than a single
-/// line to reduce interpreter overhead, and generate annotation objects
-/// (bufhl/virttext) on the fly but using the same representation.
-void nvim__buf_set_luahl(uint64_t channel_id, Buffer buffer,
- DictionaryOf(LuaRef) opts, Error *err)
- FUNC_API_LUA_ONLY
-{
- buf_T *buf = find_buffer_by_handle(buffer, err);
-
- if (!buf) {
- return;
- }
-
- redraw_buf_later(buf, NOT_VALID);
- buf_clear_luahl(buf, false);
-
- for (size_t i = 0; i < opts.size; i++) {
- String k = opts.items[i].key;
- Object *v = &opts.items[i].value;
- if (strequal("on_start", k.data)) {
- if (v->type != kObjectTypeLuaRef) {
- api_set_error(err, kErrorTypeValidation, "callback is not a function");
- goto error;
- }
- buf->b_luahl_start = v->data.luaref;
- v->data.luaref = LUA_NOREF;
- } else if (strequal("on_window", k.data)) {
- if (v->type != kObjectTypeLuaRef) {
- api_set_error(err, kErrorTypeValidation, "callback is not a function");
- goto error;
- }
- buf->b_luahl_window = v->data.luaref;
- v->data.luaref = LUA_NOREF;
- } else if (strequal("on_line", k.data)) {
- if (v->type != kObjectTypeLuaRef) {
- api_set_error(err, kErrorTypeValidation, "callback is not a function");
- goto error;
- }
- buf->b_luahl_line = v->data.luaref;
- v->data.luaref = LUA_NOREF;
- } else {
- api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
- goto error;
- }
- }
- buf->b_luahl = true;
- return;
-error:
- buf_clear_luahl(buf, true);
- buf->b_luahl = false;
-}
-
void nvim__buf_redraw_range(Buffer buffer, Integer first, Integer last,
Error *err)
FUNC_API_LUA_ONLY
@@ -1465,15 +1393,17 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
}
if (col2 >= 0) {
- if (line2 >= 0) {
- len = STRLEN(ml_get_buf(buf, (linenr_T)line2+1, false));
+ if (line2 >= 0 && line2 < buf->b_ml.ml_line_count) {
+ len = STRLEN(ml_get_buf(buf, (linenr_T)line2 + 1, false));
+ } else if (line2 == buf->b_ml.ml_line_count) {
+ // We are trying to add an extmark past final newline
+ len = 0;
} else {
// reuse len from before
line2 = (int)line;
}
if (col2 > (Integer)len) {
- api_set_error(err, kErrorTypeValidation,
- "end_col value outside range");
+ api_set_error(err, kErrorTypeValidation, "end_col value outside range");
goto error;
}
} else if (line2 >= 0) {
@@ -1490,7 +1420,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id,
}
id = extmark_set(buf, (uint64_t)ns_id, id,
- (int)line, (colnr_T)col, line2, col2, decor, kExtmarkUndo);
+ (int)line, (colnr_T)col, line2, col2, decor, kExtmarkNoUndo);
return (Integer)id;
@@ -1601,10 +1531,10 @@ Integer nvim_buf_add_highlight(Buffer buffer,
end_line++;
}
- ns_id = extmark_set(buf, ns_id, 0,
- (int)line, (colnr_T)col_start,
- end_line, (colnr_T)col_end,
- decoration_hl(hl_id), kExtmarkUndo);
+ extmark_set(buf, ns_id, 0,
+ (int)line, (colnr_T)col_start,
+ end_line, (colnr_T)col_end,
+ decoration_hl(hl_id), kExtmarkNoUndo);
return src_id;
}
@@ -1664,43 +1594,6 @@ void nvim_buf_clear_highlight(Buffer buffer,
nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
}
-static VirtText parse_virt_text(Array chunks, Error *err)
-{
- VirtText virt_text = KV_INITIAL_VALUE;
- for (size_t i = 0; i < chunks.size; i++) {
- if (chunks.items[i].type != kObjectTypeArray) {
- api_set_error(err, kErrorTypeValidation, "Chunk is not an array");
- goto free_exit;
- }
- Array chunk = chunks.items[i].data.array;
- if (chunk.size == 0 || chunk.size > 2
- || chunk.items[0].type != kObjectTypeString
- || (chunk.size == 2 && chunk.items[1].type != kObjectTypeString)) {
- api_set_error(err, kErrorTypeValidation,
- "Chunk is not an array with one or two strings");
- goto free_exit;
- }
-
- String str = chunk.items[0].data.string;
- char *text = transstr(str.size > 0 ? str.data : ""); // allocates
-
- int hl_id = 0;
- if (chunk.size == 2) {
- String hl = chunk.items[1].data.string;
- if (hl.size > 0) {
- hl_id = syn_check_group((char_u *)hl.data, (int)hl.size);
- }
- }
- kv_push(virt_text, ((VirtTextChunk){ .text = text, .hl_id = hl_id }));
- }
-
- return virt_text;
-
-free_exit:
- clear_virttext(&virt_text);
- return virt_text;
-}
-
/// Set the virtual text (annotation) for a buffer line.
///
@@ -1771,10 +1664,48 @@ Integer nvim_buf_set_virtual_text(Buffer buffer,
Decoration *decor = xcalloc(1, sizeof(*decor));
decor->virt_text = virt_text;
- extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, kExtmarkUndo);
+ extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, kExtmarkNoUndo);
return src_id;
}
+/// call a function with buffer as temporary current buffer
+///
+/// This temporarily switches current buffer to "buffer".
+/// If the current window already shows "buffer", the window is not switched
+/// If a window inside the current tabpage (including a float) already shows the
+/// buffer One of these windows will be set as current window temporarily.
+/// Otherwise a temporary scratch window (calleed the "autocmd window" for
+/// historical reasons) will be used.
+///
+/// This is useful e.g. to call vimL functions that only work with the current
+/// buffer/window currently, like |termopen()|.
+///
+/// @param buffer Buffer handle, or 0 for current buffer
+/// @param fun Function to call inside the buffer (currently lua callable
+/// only)
+/// @param[out] err Error details, if any
+/// @return Return value of function. NB: will deepcopy lua values
+/// currently, use upvalues to send lua references in and out.
+Object nvim_buf_call(Buffer buffer, LuaRef fun, Error *err)
+ FUNC_API_SINCE(7)
+ FUNC_API_LUA_ONLY
+{
+ buf_T *buf = find_buffer_by_handle(buffer, err);
+ if (!buf) {
+ return NIL;
+ }
+ try_start();
+ aco_save_T aco;
+ aucmd_prepbuf(&aco, (buf_T *)buf);
+
+ Array args = ARRAY_DICT_INIT;
+ Object res = nlua_call_ref(fun, NULL, args, true, err);
+
+ aucmd_restbuf(&aco);
+ try_end(err);
+ return res;
+}
+
Dictionary nvim__buf_stats(Buffer buffer, Error *err)
{
Dictionary rv = ARRAY_DICT_INIT;
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 13f77d2d85..e0d5862e02 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -15,6 +15,8 @@
#include "nvim/lua/executor.h"
#include "nvim/ascii.h"
#include "nvim/assert.h"
+#include "nvim/charset.h"
+#include "nvim/syntax.h"
#include "nvim/vim.h"
#include "nvim/buffer.h"
#include "nvim/window.h"
@@ -1579,3 +1581,52 @@ bool extmark_get_index_from_obj(buf_T *buf, Integer ns_id, Object obj, int
return false;
}
}
+
+VirtText parse_virt_text(Array chunks, Error *err)
+{
+ VirtText virt_text = KV_INITIAL_VALUE;
+ for (size_t i = 0; i < chunks.size; i++) {
+ if (chunks.items[i].type != kObjectTypeArray) {
+ api_set_error(err, kErrorTypeValidation, "Chunk is not an array");
+ goto free_exit;
+ }
+ Array chunk = chunks.items[i].data.array;
+ if (chunk.size == 0 || chunk.size > 2
+ || chunk.items[0].type != kObjectTypeString
+ || (chunk.size == 2 && chunk.items[1].type != kObjectTypeString)) {
+ api_set_error(err, kErrorTypeValidation,
+ "Chunk is not an array with one or two strings");
+ goto free_exit;
+ }
+
+ String str = chunk.items[0].data.string;
+ char *text = transstr(str.size > 0 ? str.data : ""); // allocates
+
+ int hl_id = 0;
+ if (chunk.size == 2) {
+ String hl = chunk.items[1].data.string;
+ if (hl.size > 0) {
+ hl_id = syn_check_group((char_u *)hl.data, (int)hl.size);
+ }
+ }
+ kv_push(virt_text, ((VirtTextChunk){ .text = text, .hl_id = hl_id }));
+ }
+
+ return virt_text;
+
+free_exit:
+ clear_virttext(&virt_text);
+ return virt_text;
+}
+
+bool api_is_truthy(Object obj, const char *what, Error *err)
+{
+ if (obj.type == kObjectTypeBoolean) {
+ return obj.data.boolean;
+ } else if (obj.type == kObjectTypeInteger) {
+ return obj.data.integer; // C semantics: non-zery int is true
+ } else {
+ api_set_error(err, kErrorTypeValidation, "%s is not an boolean", what);
+ return false;
+ }
+}
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 9155ffcfb8..1de1472fc2 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -2610,22 +2610,91 @@ Array nvim__inspect_cell(Integer grid, Integer row, Integer col, Error *err)
/// interface should probably be derived from a reformed
/// bufhl/virttext interface with full support for multi-line
/// ranges etc
-void nvim__put_attr(Integer id, Integer start_row, Integer start_col,
- Integer end_row, Integer end_col)
+void nvim__put_attr(Integer line, Integer col, Dictionary opts, Error *err)
FUNC_API_LUA_ONLY
{
if (!lua_attr_active) {
return;
}
- if (id == 0 || syn_get_final_id((int)id) == 0) {
- return;
+ int line2 = -1, hl_id = 0;
+ colnr_T col2 = 0;
+ VirtText virt_text = KV_INITIAL_VALUE;
+ for (size_t i = 0; i < opts.size; i++) {
+ String k = opts.items[i].key;
+ Object *v = &opts.items[i].value;
+ if (strequal("end_line", k.data)) {
+ if (v->type != kObjectTypeInteger) {
+ api_set_error(err, kErrorTypeValidation,
+ "end_line is not an integer");
+ goto error;
+ }
+ if (v->data.integer < 0) {
+ api_set_error(err, kErrorTypeValidation,
+ "end_line value outside range");
+ goto error;
+ }
+
+ line2 = (int)v->data.integer;
+ } else if (strequal("end_col", k.data)) {
+ if (v->type != kObjectTypeInteger) {
+ api_set_error(err, kErrorTypeValidation,
+ "end_col is not an integer");
+ goto error;
+ }
+ if (v->data.integer < 0 || v->data.integer > MAXCOL) {
+ api_set_error(err, kErrorTypeValidation,
+ "end_col value outside range");
+ goto error;
+ }
+
+ col2 = (colnr_T)v->data.integer;
+ } else if (strequal("hl_group", k.data)) {
+ String hl_group;
+ switch (v->type) {
+ case kObjectTypeString:
+ hl_group = v->data.string;
+ hl_id = syn_check_group(
+ (char_u *)(hl_group.data),
+ (int)hl_group.size);
+ break;
+ case kObjectTypeInteger:
+ hl_id = (int)v->data.integer;
+ break;
+ default:
+ api_set_error(err, kErrorTypeValidation,
+ "hl_group is not valid.");
+ goto error;
+ }
+ } else if (strequal("virt_text", k.data)) {
+ if (v->type != kObjectTypeArray) {
+ api_set_error(err, kErrorTypeValidation,
+ "virt_text is not an Array");
+ goto error;
+ }
+ virt_text = parse_virt_text(v->data.array, err);
+ if (ERROR_SET(err)) {
+ goto error;
+ }
+ } else {
+ api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
+ goto error;
+ }
+ }
+ if (col2 && line2 < 0) {
+ line2 = (int)line;
}
- int attr = syn_id2attr((int)id);
- if (attr == 0) {
+
+ int attr = hl_id ? syn_id2attr((int)hl_id) : 0;
+ if (attr == 0 && !kv_size(virt_text)) {
return;
}
- decorations_add_luahl_attr(attr, (int)start_row, (colnr_T)start_col,
- (int)end_row, (colnr_T)end_col);
+
+ VirtText *v = xmalloc(sizeof(*v));
+ *v = virt_text; // LeakSanitizer be sad
+ decorations_add_luahl_attr(attr, (int)line, (colnr_T)col,
+ (int)line2, (colnr_T)col2, v);
+error:
+ return;
}
void nvim__screenshot(String path)
@@ -2633,3 +2702,68 @@ void nvim__screenshot(String path)
{
ui_call_screenshot(path);
}
+
+static void clear_luahl(bool force)
+{
+ if (luahl_active || force) {
+ api_free_luaref(luahl_start);
+ api_free_luaref(luahl_win);
+ api_free_luaref(luahl_line);
+ api_free_luaref(luahl_end);
+ }
+ luahl_start = LUA_NOREF;
+ luahl_win = LUA_NOREF;
+ luahl_line = LUA_NOREF;
+ luahl_end = LUA_NOREF;
+ luahl_active = false;
+}
+
+/// Unstabilized interface for defining syntax hl in lua.
+///
+/// This is not yet safe for general use, lua callbacks will need to
+/// be restricted, like textlock and probably other stuff.
+///
+/// The API on_line/nvim__put_attr is quite raw and not intended to be the
+/// final shape. Ideally this should operate on chunks larger than a single
+/// line to reduce interpreter overhead, and generate annotation objects
+/// (bufhl/virttext) on the fly but using the same representation.
+void nvim__set_luahl(DictionaryOf(LuaRef) opts, Error *err)
+ FUNC_API_LUA_ONLY
+{
+ redraw_later(NOT_VALID);
+ clear_luahl(false);
+
+ for (size_t i = 0; i < opts.size; i++) {
+ String k = opts.items[i].key;
+ Object *v = &opts.items[i].value;
+ if (strequal("on_start", k.data)) {
+ if (v->type != kObjectTypeLuaRef) {
+ api_set_error(err, kErrorTypeValidation, "callback is not a function");
+ goto error;
+ }
+ luahl_start = v->data.luaref;
+ v->data.luaref = LUA_NOREF;
+ } else if (strequal("on_win", k.data)) {
+ if (v->type != kObjectTypeLuaRef) {
+ api_set_error(err, kErrorTypeValidation, "callback is not a function");
+ goto error;
+ }
+ luahl_win = v->data.luaref;
+ v->data.luaref = LUA_NOREF;
+ } else if (strequal("on_line", k.data)) {
+ if (v->type != kObjectTypeLuaRef) {
+ api_set_error(err, kErrorTypeValidation, "callback is not a function");
+ goto error;
+ }
+ luahl_line = v->data.luaref;
+ v->data.luaref = LUA_NOREF;
+ } else {
+ api_set_error(err, kErrorTypeValidation, "unexpected key: %s", k.data);
+ goto error;
+ }
+ }
+ luahl_active = true;
+ return;
+error:
+ clear_luahl(true);
+}
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 4648631ebe..ec633dcc26 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -837,7 +837,7 @@ static void clear_wininfo(buf_T *buf)
buf->b_wininfo = wip->wi_next;
if (wip->wi_optset) {
clear_winopt(&wip->wi_opt);
- deleteFoldRecurse(&wip->wi_folds);
+ deleteFoldRecurse(buf, &wip->wi_folds);
}
xfree(wip);
}
@@ -1941,6 +1941,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
vim_regfree(buf->b_s.b_cap_prog);
buf->b_s.b_cap_prog = NULL;
clear_string_option(&buf->b_s.b_p_spl);
+ clear_string_option(&buf->b_s.b_p_spo);
clear_string_option(&buf->b_p_sua);
clear_string_option(&buf->b_p_ft);
clear_string_option(&buf->b_p_cink);
@@ -2502,7 +2503,7 @@ void buflist_setfpos(buf_T *const buf, win_T *const win,
}
if (copy_options && wip->wi_optset) {
clear_winopt(&wip->wi_opt);
- deleteFoldRecurse(&wip->wi_folds);
+ deleteFoldRecurse(buf, &wip->wi_folds);
}
}
if (lnum != 0) {
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index b3c95f9362..ea968d9592 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -451,6 +451,7 @@ typedef struct {
regprog_T *b_cap_prog; // program for 'spellcapcheck'
char_u *b_p_spf; // 'spellfile'
char_u *b_p_spl; // 'spelllang'
+ char_u *b_p_spo; // 'spelloptions'
int b_cjk; // all CJK letters as OK
char_u b_syn_chartab[32]; // syntax iskeyword option
char_u *b_syn_isk; // iskeyword option
@@ -842,12 +843,6 @@ struct file_buffer {
// The number for times the current line has been flushed in the memline.
int flush_count;
- bool b_luahl;
- LuaRef b_luahl_start;
- LuaRef b_luahl_window;
- LuaRef b_luahl_line;
- LuaRef b_luahl_end;
-
int b_diff_failed; // internal diff failed for this buffer
};
diff --git a/src/nvim/change.c b/src/nvim/change.c
index b8bc08b747..71614363d2 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -362,8 +362,7 @@ void changed_bytes(linenr_T lnum, colnr_T col)
/// insert/delete bytes at column
///
/// Like changed_bytes() but also adjust extmark for "new" bytes.
-/// When "new" is negative text was deleted.
-static void inserted_bytes(linenr_T lnum, colnr_T col, int old, int new)
+void inserted_bytes(linenr_T lnum, colnr_T col, int old, int new)
{
if (curbuf_splice_pending == 0) {
extmark_splice_cols(curbuf, (int)lnum-1, col, old, new, kExtmarkUndo);
@@ -1677,9 +1676,16 @@ int open_line(
truncate_spaces(saved_line);
}
ml_replace(curwin->w_cursor.lnum, saved_line, false);
- extmark_splice_cols(
- curbuf, (int)curwin->w_cursor.lnum,
- 0, curwin->w_cursor.col, (int)STRLEN(saved_line), kExtmarkUndo);
+
+ int new_len = (int)STRLEN(saved_line);
+
+ // TODO(vigoux): maybe there is issues there with expandtabs ?
+ if (new_len < curwin->w_cursor.col) {
+ extmark_splice_cols(
+ curbuf, (int)curwin->w_cursor.lnum,
+ new_len, curwin->w_cursor.col - new_len, 0, kExtmarkUndo);
+ }
+
saved_line = NULL;
if (did_append) {
changed_lines(curwin->w_cursor.lnum, curwin->w_cursor.col,
diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c
index 3f06340611..0d21080aa5 100644
--- a/src/nvim/cursor_shape.c
+++ b/src/nvim/cursor_shape.c
@@ -13,6 +13,10 @@
#include "nvim/api/private/helpers.h"
#include "nvim/ui.h"
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "cursor_shape.c.generated.h"
+#endif
+
/// Handling of cursor and mouse pointer shapes in various modes.
cursorentry_T shape_table[SHAPE_IDX_COUNT] =
{
@@ -77,7 +81,9 @@ Array mode_style_array(void)
return all;
}
-/// Parse the 'guicursor' option
+/// Parses the 'guicursor' option.
+///
+/// Clears `shape_table` if 'guicursor' is empty.
///
/// @param what SHAPE_CURSOR or SHAPE_MOUSE ('mouseshape')
///
@@ -99,11 +105,17 @@ char_u *parse_shape_opt(int what)
// First round: check for errors; second round: do it for real.
for (round = 1; round <= 2; round++) {
+ if (round == 2 || *p_guicursor == NUL) {
+ // Set all entries to default (block, blinkon0, default color).
+ // This is the default for anything that is not set.
+ clear_shape_table();
+ if (*p_guicursor == NUL) {
+ ui_mode_info_set();
+ return NULL;
+ }
+ }
// Repeat for all comma separated parts.
modep = p_guicursor;
- if (*p_guicursor == NUL) {
- modep = (char_u *)"a:block-blinkon0";
- }
while (modep != NULL && *modep != NUL) {
colonp = vim_strchr(modep, ':');
commap = vim_strchr(modep, ',');
@@ -144,14 +156,6 @@ char_u *parse_shape_opt(int what)
if (all_idx >= 0) {
idx = all_idx--;
- } else if (round == 2) {
- {
- // Set the defaults, for the missing parts
- shape_table[idx].shape = SHAPE_BLOCK;
- shape_table[idx].blinkwait = 0L;
- shape_table[idx].blinkon = 0L;
- shape_table[idx].blinkoff = 0L;
- }
}
/* Parse the part after the colon */
@@ -330,3 +334,16 @@ int cursor_get_mode_idx(void)
return SHAPE_IDX_N;
}
}
+
+/// Clears all entries in shape_table to block, blinkon0, and default color.
+static void clear_shape_table(void)
+{
+ for (int idx = 0; idx < SHAPE_IDX_COUNT; idx++) {
+ shape_table[idx].shape = SHAPE_BLOCK;
+ shape_table[idx].blinkwait = 0L;
+ shape_table[idx].blinkon = 0L;
+ shape_table[idx].blinkoff = 0L;
+ shape_table[idx].id = 0;
+ shape_table[idx].id_lm = 0;
+ }
+}
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 1e149da1dc..de2346a9d8 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -1254,14 +1254,6 @@ check_pum:
normalchar:
// Insert a normal character.
- if (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META) {
- // Unmapped ALT/META chord behaves like ESC+c. #8213
- stuffcharReadbuff(ESC);
- stuffcharReadbuff(s->c);
- u_sync(false);
- break;
- }
-
if (!p_paste) {
// Trigger InsertCharPre.
char_u *str = do_insert_char_pre(s->c);
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 32830c5d7f..a2490be355 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -736,7 +736,7 @@ int eval_expr_typval(const typval_T *expr, typval_T *argv,
if (s == NULL || *s == NUL) {
return FAIL;
}
- if (call_func(s, (int)STRLEN(s), rettv, argc, argv, NULL,
+ if (call_func(s, -1, rettv, argc, argv, NULL,
0L, 0L, &dummy, true, NULL, NULL) == FAIL) {
return FAIL;
}
@@ -746,7 +746,7 @@ int eval_expr_typval(const typval_T *expr, typval_T *argv,
if (s == NULL || *s == NUL) {
return FAIL;
}
- if (call_func(s, (int)STRLEN(s), rettv, argc, argv, NULL,
+ if (call_func(s, -1, rettv, argc, argv, NULL,
0L, 0L, &dummy, true, partial, NULL) == FAIL) {
return FAIL;
}
@@ -3802,8 +3802,9 @@ static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string)
*/
for (;; ) {
op = **arg;
- if (op != '*' && op != '/' && op != '%')
+ if (op != '*' && op != '/' && op != '%') {
break;
+ }
if (evaluate) {
if (rettv->v_type == VAR_FLOAT) {
@@ -3905,6 +3906,7 @@ static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string)
// (expression) nested expression
// [expr, expr] List
// {key: val, key: val} Dictionary
+// #{key: val, key: val} Dictionary with literal keys
//
// Also handle:
// ! in front logical NOT
@@ -4012,11 +4014,21 @@ static int eval7(
case '[': ret = get_list_tv(arg, rettv, evaluate);
break;
+ // Dictionary: #{key: val, key: val}
+ case '#':
+ if ((*arg)[1] == '{') {
+ (*arg)++;
+ ret = dict_get_tv(arg, rettv, evaluate, true);
+ } else {
+ ret = NOTDONE;
+ }
+ break;
+
// Lambda: {arg, arg -> expr}
- // Dictionary: {key: val, key: val}
+ // Dictionary: {'key': val, 'key': val}
case '{': ret = get_lambda_tv(arg, rettv, evaluate);
if (ret == NOTDONE) {
- ret = dict_get_tv(arg, rettv, evaluate);
+ ret = dict_get_tv(arg, rettv, evaluate, false);
}
break;
@@ -4518,7 +4530,6 @@ int get_option_tv(const char **const arg, typval_T *const rettv,
static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
{
char_u *p;
- char_u *name;
unsigned int extra = 0;
/*
@@ -4526,11 +4537,14 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
*/
for (p = *arg + 1; *p != NUL && *p != '"'; MB_PTR_ADV(p)) {
if (*p == '\\' && p[1] != NUL) {
- ++p;
- /* A "\<x>" form occupies at least 4 characters, and produces up
- * to 6 characters: reserve space for 2 extra */
- if (*p == '<')
- extra += 2;
+ p++;
+ // A "\<x>" form occupies at least 4 characters, and produces up
+ // to 21 characters (3 * 6 for the char and 3 for a modifier):
+ // reserve space for 18 extra.
+ // Each byte in the char could be encoded as K_SPECIAL K_EXTRA x.
+ if (*p == '<') {
+ extra += 18;
+ }
}
}
@@ -4549,7 +4563,8 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
* Copy the string into allocated memory, handling backslashed
* characters.
*/
- name = xmalloc(p - *arg + extra);
+ const int len = (int)(p - *arg + extra);
+ char_u *name = xmalloc(len);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = name;
@@ -4616,6 +4631,9 @@ static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
extra = trans_special((const char_u **)&p, STRLEN(p), name, true, true);
if (extra != 0) {
name += extra;
+ if (name >= rettv->vval.v_string + len) {
+ iemsg("get_string_tv() used more space than allocated");
+ }
break;
}
FALLTHROUGH;
@@ -5341,11 +5359,31 @@ static inline bool set_ref_dict(dict_T *dict, int copyID)
return false;
}
-/*
- * Allocate a variable for a Dictionary and fill it from "*arg".
- * Return OK or FAIL. Returns NOTDONE for {expr}.
- */
-static int dict_get_tv(char_u **arg, typval_T *rettv, int evaluate)
+
+// Get the key for *{key: val} into "tv" and advance "arg".
+// Return FAIL when there is no valid key.
+static int get_literal_key(char_u **arg, typval_T *tv)
+ FUNC_ATTR_NONNULL_ALL
+{
+ char_u *p;
+
+ if (!ASCII_ISALNUM(**arg) && **arg != '_' && **arg != '-') {
+ return FAIL;
+ }
+ for (p = *arg; ASCII_ISALNUM(*p) || *p == '_' || *p == '-'; p++) {
+ }
+ tv->v_type = VAR_STRING;
+ tv->vval.v_string = vim_strnsave(*arg, (int)(p - *arg));
+
+ *arg = skipwhite(p);
+ return OK;
+}
+
+// Allocate a variable for a Dictionary and fill it from "*arg".
+// "literal" is true for *{key: val}
+// Return OK or FAIL. Returns NOTDONE for {expr}.
+static int dict_get_tv(char_u **arg, typval_T *rettv, int evaluate,
+ bool literal)
{
dict_T *d = NULL;
typval_T tvkey;
@@ -5379,7 +5417,9 @@ static int dict_get_tv(char_u **arg, typval_T *rettv, int evaluate)
*arg = skipwhite(*arg + 1);
while (**arg != '}' && **arg != NUL) {
- if (eval1(arg, &tvkey, evaluate) == FAIL) { // recursive!
+ if ((literal
+ ? get_literal_key(arg, &tvkey)
+ : eval1(arg, &tvkey, evaluate)) == FAIL) { // recursive!
goto failret;
}
if (**arg != ':') {
@@ -6962,9 +7002,10 @@ void set_buffer_lines(buf_T *buf, linenr_T lnum_arg, bool append,
if (!append && lnum <= curbuf->b_ml.ml_line_count) {
// Existing line, replace it.
+ int old_len = (int)STRLEN(ml_get(lnum));
if (u_savesub(lnum) == OK
&& ml_replace(lnum, (char_u *)line, true) == OK) {
- changed_bytes(lnum, 0);
+ inserted_bytes(lnum, 0, old_len, STRLEN(line));
if (is_curbuf && lnum == curwin->w_cursor.lnum) {
check_cursor_col();
}
@@ -7263,7 +7304,7 @@ bool callback_call(Callback *const callback, const int argcount_in,
}
int dummy;
- return call_func(name, (int)STRLEN(name), rettv, argcount_in, argvars_in,
+ return call_func(name, -1, rettv, argcount_in, argvars_in,
NULL, curwin->w_cursor.lnum, curwin->w_cursor.lnum, &dummy,
true, partial, NULL);
}
@@ -8485,7 +8526,7 @@ handle_subscript(
} else {
s = (char_u *)"";
}
- ret = get_func_tv(s, lua ? slen : (int)STRLEN(s), rettv, (char_u **)arg,
+ ret = get_func_tv(s, lua ? slen : -1, rettv, (char_u **)arg,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&len, evaluate, pt, selfdict);
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index 3a4b4f2a50..83ad948a93 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -2584,8 +2584,6 @@ static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char_u *text;
char_u buf[FOLD_TEXT_LEN];
- foldinfo_T foldinfo;
- int fold_count;
static bool entered = false;
rettv->v_type = VAR_STRING;
@@ -2599,9 +2597,10 @@ static void f_foldtextresult(typval_T *argvars, typval_T *rettv, FunPtr fptr)
if (lnum < 0) {
lnum = 0;
}
- fold_count = foldedCount(curwin, lnum, &foldinfo);
- if (fold_count > 0) {
- text = get_foldtext(curwin, lnum, lnum + fold_count - 1, &foldinfo, buf);
+
+ foldinfo_T info = fold_info(curwin, lnum);
+ if (info.fi_lines > 0) {
+ text = get_foldtext(curwin, lnum, lnum + info.fi_lines - 1, info, buf);
if (text == buf) {
text = vim_strsave(text);
}
@@ -9175,7 +9174,7 @@ static int item_compare2(const void *s1, const void *s2, bool keep_zero)
rettv.v_type = VAR_UNKNOWN; // tv_clear() uses this
res = call_func((const char_u *)func_name,
- (int)STRLEN(func_name),
+ -1,
&rettv, 2, argv, NULL, 0L, 0L, &dummy, true,
partial, sortinfo->item_compare_selfdict);
tv_clear(&argv[0]);
diff --git a/src/nvim/eval/userfunc.c b/src/nvim/eval/userfunc.c
index 1b80b22213..e0361048bc 100644
--- a/src/nvim/eval/userfunc.c
+++ b/src/nvim/eval/userfunc.c
@@ -32,7 +32,11 @@
#define FC_DELETED 0x10 // :delfunction used while uf_refcount > 0
#define FC_REMOVED 0x20 // function redefined while uf_refcount > 0
#define FC_SANDBOX 0x40 // function defined in the sandbox
-#define FC_CFUNC 0x80 // C function extension
+#define FC_DEAD 0x80 // function kept only for reference to dfunc
+#define FC_EXPORT 0x100 // "export def Func()"
+#define FC_NOARGS 0x200 // no a: variables in lambda
+#define FC_VIM9 0x400 // defined in vim9 script file
+#define FC_CFUNC 0x800 // C function extension
#ifdef INCLUDE_GENERATED_DECLARATIONS
#include "eval/userfunc.c.generated.h"
@@ -246,6 +250,10 @@ int get_lambda_tv(char_u **arg, typval_T *rettv, bool evaluate)
((char_u **)(newlines.ga_data))[newlines.ga_len++] = p;
STRCPY(p, "return ");
STRLCPY(p + 7, s, e - s + 1);
+ if (strstr((char *)p + 7, "a:") == NULL) {
+ // No a: variables are used for sure.
+ flags |= FC_NOARGS;
+ }
fp->uf_refcount = 1;
STRCPY(fp->uf_name, name);
@@ -367,7 +375,7 @@ void emsg_funcname(char *ermsg, const char_u *name)
int
get_func_tv(
const char_u *name, // name of the function
- int len, // length of "name"
+ int len, // length of "name" or -1 to use strlen()
typval_T *rettv,
char_u **arg, // argument, pointing to the '('
linenr_T firstline, // first line of range
@@ -813,17 +821,12 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
current_funccal = fc;
fc->func = fp;
fc->rettv = rettv;
- rettv->vval.v_number = 0;
- fc->linenr = 0;
- fc->returned = FALSE;
fc->level = ex_nesting_level;
// Check if this function has a breakpoint.
fc->breakpoint = dbg_find_breakpoint(false, fp->uf_name, (linenr_T)0);
fc->dbg_tick = debug_tick;
// Set up fields for closure.
- fc->fc_refcount = 0;
- fc->fc_copyID = 0;
ga_init(&fc->fc_funcs, sizeof(ufunc_T *), 1);
func_ptr_ref(fp);
@@ -853,37 +856,42 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
++selfdict->dv_refcount;
}
- /*
- * Init a: variables.
- * Set a:0 to "argcount".
- * Set a:000 to a list with room for the "..." arguments.
- */
+ // Init a: variables, unless none found (in lambda).
+ // Set a:0 to "argcount".
+ // Set a:000 to a list with room for the "..." arguments.
init_var_dict(&fc->l_avars, &fc->l_avars_var, VAR_SCOPE);
- add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++], "0",
- (varnumber_T)(argcount - fp->uf_args.ga_len));
+ if ((fp->uf_flags & FC_NOARGS) == 0) {
+ add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++], "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
+ }
fc->l_avars.dv_lock = VAR_FIXED;
- // Use "name" to avoid a warning from some compiler that checks the
- // destination size.
- v = (dictitem_T *)&fc->fixvar[fixvar_idx++];
+ if ((fp->uf_flags & FC_NOARGS) == 0) {
+ // Use "name" to avoid a warning from some compiler that checks the
+ // destination size.
+ v = (dictitem_T *)&fc->fixvar[fixvar_idx++];
#ifndef __clang_analyzer__
- name = v->di_key;
- STRCPY(name, "000");
+ name = v->di_key;
+ STRCPY(name, "000");
#endif
- v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
- tv_dict_add(&fc->l_avars, v);
- v->di_tv.v_type = VAR_LIST;
- v->di_tv.v_lock = VAR_FIXED;
- v->di_tv.vval.v_list = &fc->l_varlist;
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ tv_dict_add(&fc->l_avars, v);
+ v->di_tv.v_type = VAR_LIST;
+ v->di_tv.v_lock = VAR_FIXED;
+ v->di_tv.vval.v_list = &fc->l_varlist;
+ }
tv_list_init_static(&fc->l_varlist);
tv_list_set_lock(&fc->l_varlist, VAR_FIXED);
// Set a:firstline to "firstline" and a:lastline to "lastline".
// Set a:name to named arguments.
// Set a:N to the "..." arguments.
- add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++],
- "firstline", (varnumber_T)firstline);
- add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++],
- "lastline", (varnumber_T)lastline);
+ // Skipped when no a: variables used (in lambda).
+ if ((fp->uf_flags & FC_NOARGS) == 0) {
+ add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++],
+ "firstline", (varnumber_T)firstline);
+ add_nr_var(&fc->l_avars, (dictitem_T *)&fc->fixvar[fixvar_idx++],
+ "lastline", (varnumber_T)lastline);
+ }
for (int i = 0; i < argcount; i++) {
bool addlocal = false;
@@ -895,6 +903,10 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
addlocal = true;
}
} else {
+ if ((fp->uf_flags & FC_NOARGS) != 0) {
+ // Bail out if no a: arguments used (in lambda).
+ break;
+ }
// "..." argument a:1, a:2, etc.
snprintf((char *)numbuf, sizeof(numbuf), "%d", ai + 1);
name = numbuf;
@@ -1034,9 +1046,19 @@ void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars,
save_did_emsg = did_emsg;
did_emsg = FALSE;
- // call do_cmdline() to execute the lines
- do_cmdline(NULL, get_func_line, (void *)fc,
- DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+ if (islambda) {
+ char_u *p = *(char_u **)fp->uf_lines.ga_data + 7;
+
+ // A Lambda always has the command "return {expr}". It is much faster
+ // to evaluate {expr} directly.
+ ex_nesting_level++;
+ eval1(&p, rettv, true);
+ ex_nesting_level--;
+ } else {
+ // call do_cmdline() to execute the lines
+ do_cmdline(NULL, get_func_line, (void *)fc,
+ DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+ }
--RedrawingDisabled;
@@ -1291,7 +1313,7 @@ int func_call(char_u *name, typval_T *args, partial_T *partial,
tv_copy(TV_LIST_ITEM_TV(item), &argv[argc++]);
});
- r = call_func(name, (int)STRLEN(name), rettv, argc, argv, NULL,
+ r = call_func(name, -1, rettv, argc, argv, NULL,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&dummy, true, partial, selfdict);
@@ -1304,6 +1326,36 @@ func_call_skip_call:
return r;
}
+// Give an error message for the result of a function.
+// Nothing if "error" is FCERR_NONE.
+static void user_func_error(int error, const char_u *name)
+ FUNC_ATTR_NONNULL_ALL
+{
+ switch (error) {
+ case ERROR_UNKNOWN:
+ emsg_funcname(N_("E117: Unknown function: %s"), name);
+ break;
+ case ERROR_DELETED:
+ emsg_funcname(N_("E933: Function was deleted: %s"), name);
+ break;
+ case ERROR_TOOMANY:
+ emsg_funcname(_(e_toomanyarg), name);
+ break;
+ case ERROR_TOOFEW:
+ emsg_funcname(N_("E119: Not enough arguments for function: %s"),
+ name);
+ break;
+ case ERROR_SCRIPT:
+ emsg_funcname(N_("E120: Using <SID> not in a script context: %s"),
+ name);
+ break;
+ case ERROR_DICT:
+ emsg_funcname(N_("E725: Calling dict function without Dictionary: %s"),
+ name);
+ break;
+ }
+}
+
/// Call a function with its resolved parameters
///
/// "argv_func", when not NULL, can be used to fill in arguments only when the
@@ -1316,7 +1368,7 @@ func_call_skip_call:
int
call_func(
const char_u *funcname, // name of the function
- int len, // length of "name"
+ int len, // length of "name" or -1 to use strlen()
typval_T *rettv, // [out] value goes here
int argcount_in, // number of "argvars"
typval_T *argvars_in, // vars for arguments, must have "argcount"
@@ -1333,11 +1385,11 @@ call_func(
{
int ret = FAIL;
int error = ERROR_NONE;
- ufunc_T *fp;
+ ufunc_T *fp = NULL;
char_u fname_buf[FLEN_FIXED + 1];
char_u *tofree = NULL;
- char_u *fname;
- char_u *name;
+ char_u *fname = NULL;
+ char_u *name = NULL;
int argcount = argcount_in;
typval_T *argvars = argvars_in;
dict_T *selfdict = selfdict_in;
@@ -1348,11 +1400,18 @@ call_func(
// even when call_func() returns FAIL.
rettv->v_type = VAR_UNKNOWN;
- // Make a copy of the name, if it comes from a funcref variable it could
- // be changed or deleted in the called function.
- name = vim_strnsave(funcname, len);
-
- fname = fname_trans_sid(name, fname_buf, &tofree, &error);
+ if (len <= 0) {
+ len = (int)STRLEN(funcname);
+ }
+ if (partial != NULL) {
+ fp = partial->pt_func;
+ }
+ if (fp == NULL) {
+ // Make a copy of the name, if it comes from a funcref variable it could
+ // be changed or deleted in the called function.
+ name = vim_strnsave(funcname, len);
+ fname = fname_trans_sid(name, fname_buf, &tofree, &error);
+ }
*doesrange = false;
@@ -1384,7 +1443,7 @@ call_func(
char_u *rfname = fname;
// Ignore "g:" before a function name.
- if (fname[0] == 'g' && fname[1] == ':') {
+ if (fp == NULL && fname[0] == 'g' && fname[1] == ':') {
rfname = fname + 2;
}
@@ -1397,11 +1456,9 @@ call_func(
error = ERROR_NONE;
nlua_typval_call((const char *)funcname, len, argvars, argcount, rettv);
}
- } else if (!builtin_function((const char *)rfname, -1)) {
+ } else if (fp != NULL || !builtin_function((const char *)rfname, -1)) {
// User defined function.
- if (partial != NULL && partial->pt_func != NULL) {
- fp = partial->pt_func;
- } else {
+ if (fp == NULL) {
fp = find_func(rfname);
}
@@ -1480,29 +1537,7 @@ theend:
// Report an error unless the argument evaluation or function call has been
// cancelled due to an aborting error, an interrupt, or an exception.
if (!aborting()) {
- switch (error) {
- case ERROR_UNKNOWN:
- emsg_funcname(N_("E117: Unknown function: %s"), name);
- break;
- case ERROR_DELETED:
- emsg_funcname(N_("E933: Function was deleted: %s"), name);
- break;
- case ERROR_TOOMANY:
- emsg_funcname(_(e_toomanyarg), name);
- break;
- case ERROR_TOOFEW:
- emsg_funcname(N_("E119: Not enough arguments for function: %s"),
- name);
- break;
- case ERROR_SCRIPT:
- emsg_funcname(N_("E120: Using <SID> not in a script context: %s"),
- name);
- break;
- case ERROR_DICT:
- emsg_funcname(N_("E725: Calling dict function without Dictionary: %s"),
- name);
- break;
- }
+ user_func_error(error, (name != NULL) ? name : funcname);
}
while (argv_clear > 0) {
@@ -2853,7 +2888,7 @@ void ex_call(exarg_T *eap)
curwin->w_cursor.coladd = 0;
}
arg = startarg;
- if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
+ if (get_func_tv(name, -1, &rettv, &arg,
eap->line1, eap->line2, &doesrange,
true, partial, fudi.fd_dict) == FAIL) {
failed = true;
@@ -3347,9 +3382,13 @@ bool set_ref_in_previous_funccal(int copyID)
{
bool abort = false;
- for (funccall_T *fc = previous_funccal; fc != NULL; fc = fc->caller) {
- abort = abort || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL);
- abort = abort || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL);
+ for (funccall_T *fc = previous_funccal; !abort && fc != NULL;
+ fc = fc->caller) {
+ fc->fc_copyID = copyID + 1;
+ abort = abort
+ || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL)
+ || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL)
+ || set_ref_in_list(&fc->l_varlist, copyID + 1, NULL);
}
return abort;
}
@@ -3360,9 +3399,11 @@ static bool set_ref_in_funccal(funccall_T *fc, int copyID)
if (fc->fc_copyID != copyID) {
fc->fc_copyID = copyID;
- abort = abort || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL);
- abort = abort || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL);
- abort = abort || set_ref_in_func(NULL, fc->func, copyID);
+ abort = abort
+ || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL)
+ || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL)
+ || set_ref_in_list(&fc->l_varlist, copyID, NULL)
+ || set_ref_in_func(NULL, fc->func, copyID);
}
return abort;
}
@@ -3372,12 +3413,13 @@ bool set_ref_in_call_stack(int copyID)
{
bool abort = false;
- for (funccall_T *fc = current_funccal; fc != NULL; fc = fc->caller) {
+ for (funccall_T *fc = current_funccal; !abort && fc != NULL;
+ fc = fc->caller) {
abort = abort || set_ref_in_funccal(fc, copyID);
}
// Also go through the funccal_stack.
- for (funccal_entry_T *entry = funccal_stack; entry != NULL;
+ for (funccal_entry_T *entry = funccal_stack; !abort && entry != NULL;
entry = entry->next) {
for (funccall_T *fc = entry->top_funccal; !abort && fc != NULL;
fc = fc->caller) {
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 9be6adcd61..bb4e92efc0 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -2497,8 +2497,12 @@ int do_ecmd(
new_name = NULL;
}
set_bufref(&bufref, buf);
- if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur) {
- // Save all the text, so that the reload can be undone.
+
+ // If the buffer was used before, store the current contents so that
+ // the reload can be undone. Do not do this if the (empty) buffer is
+ // being re-used for another file.
+ if (!(curbuf->b_flags & BF_NEVERLOADED)
+ && (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur)) {
// Sync first so that this is a separate undo-able action.
u_sync(false);
if (u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, true)
diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua
index a01f92df27..d62b00fee1 100644
--- a/src/nvim/ex_cmds.lua
+++ b/src/nvim/ex_cmds.lua
@@ -337,7 +337,7 @@ return {
},
{
command='caddexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
@@ -409,7 +409,7 @@ return {
},
{
command='cexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR, BANG),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
@@ -447,7 +447,7 @@ return {
},
{
command='cgetexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
@@ -1299,7 +1299,7 @@ return {
},
{
command='laddexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
@@ -1389,7 +1389,7 @@ return {
},
{
command='lexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR, BANG),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
@@ -1427,7 +1427,7 @@ return {
},
{
command='lgetexpr',
- flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, TRLBAR),
+ flags=bit.bor(NEEDARG, WORD1, NOTRLCOM),
addr_type=ADDR_LINES,
func='ex_cexpr',
},
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index dfebd13868..ccaa0b0e52 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -258,6 +258,27 @@ void do_exmode(int improved)
msg_scroll = save_msg_scroll;
}
+// Print the executed command for when 'verbose' is set.
+// When "lnum" is 0 only print the command.
+static void msg_verbose_cmd(linenr_T lnum, char_u *cmd)
+ FUNC_ATTR_NONNULL_ALL
+{
+ no_wait_return++;
+ verbose_enter_scroll();
+
+ if (lnum == 0) {
+ smsg(_("Executing: %s"), cmd);
+ } else {
+ smsg(_("line %" PRIdLINENR ": %s"), lnum, cmd);
+ }
+ if (msg_silent == 0) {
+ msg_puts("\n"); // don't overwrite this
+ }
+
+ verbose_leave_scroll();
+ no_wait_return--;
+}
+
/*
* Execute a simple command line. Used for translated commands like "*".
*/
@@ -567,17 +588,8 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,
}
}
- if (p_verbose >= 15 && sourcing_name != NULL) {
- ++no_wait_return;
- verbose_enter_scroll();
-
- smsg(_("line %" PRIdLINENR ": %s"), sourcing_lnum, cmdline_copy);
- if (msg_silent == 0) {
- msg_puts("\n"); // don't overwrite this either
- }
-
- verbose_leave_scroll();
- --no_wait_return;
+ if ((p_verbose >= 15 && sourcing_name != NULL) || p_verbose >= 16) {
+ msg_verbose_cmd(sourcing_lnum, cmdline_copy);
}
/*
@@ -2228,17 +2240,19 @@ int parse_command_modifiers(exarg_T *eap, char_u **errormsg, bool skip_only)
continue;
case 't': if (checkforcmd(&p, "tab", 3)) {
- long tabnr = get_address(
- eap, &eap->cmd, ADDR_TABS, eap->skip, skip_only, false, 1);
+ if (!skip_only) {
+ long tabnr = get_address(
+ eap, &eap->cmd, ADDR_TABS, eap->skip, skip_only, false, 1);
- if (tabnr == MAXLNUM) {
- cmdmod.tab = tabpage_index(curtab) + 1;
- } else {
- if (tabnr < 0 || tabnr > LAST_TAB_NR) {
- *errormsg = (char_u *)_(e_invrange);
- return false;
+ if (tabnr == MAXLNUM) {
+ cmdmod.tab = tabpage_index(curtab) + 1;
+ } else {
+ if (tabnr < 0 || tabnr > LAST_TAB_NR) {
+ *errormsg = (char_u *)_(e_invrange);
+ return false;
+ }
+ cmdmod.tab = tabnr + 1;
}
- cmdmod.tab = tabnr + 1;
}
eap->cmd = p;
continue;
@@ -9295,14 +9309,17 @@ static void ex_match(exarg_T *eap)
static void ex_fold(exarg_T *eap)
{
if (foldManualAllowed(true)) {
- foldCreate(curwin, eap->line1, eap->line2);
+ pos_T start = { eap->line1, 1, 0 };
+ pos_T end = { eap->line2, 1, 0 };
+ foldCreate(curwin, start, end);
}
}
static void ex_foldopen(exarg_T *eap)
{
- opFoldRange(eap->line1, eap->line2, eap->cmdidx == CMD_foldopen,
- eap->forceit, FALSE);
+ pos_T start = { eap->line1, 1, 0 };
+ pos_T end = { eap->line2, 1, 0 };
+ opFoldRange(start, end, eap->cmdidx == CMD_foldopen, eap->forceit, false);
}
static void ex_folddo(exarg_T *eap)
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index c966c780a0..f9ca7bfa42 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -276,6 +276,7 @@ static void init_incsearch_state(incsearch_state_T *s)
// Sets search_first_line and search_last_line to the address range.
static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
int *skiplen, int *patlen)
+ FUNC_ATTR_NONNULL_ALL
{
char_u *cmd;
cmdmod_T save_cmdmod = cmdmod;
@@ -287,6 +288,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
exarg_T ea;
pos_T save_cursor;
bool use_last_pat;
+ bool retval = false;
*skiplen = 0;
*patlen = ccline.cmdlen;
@@ -306,6 +308,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
return false;
}
+ emsg_off++;
memset(&ea, 0, sizeof(ea));
ea.line1 = 1;
ea.line2 = 1;
@@ -317,13 +320,13 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
cmd = skip_range(ea.cmd, NULL);
if (vim_strchr((char_u *)"sgvl", *cmd) == NULL) {
- return false;
+ goto theend;
}
// Skip over "substitute" to find the pattern separator.
for (p = cmd; ASCII_ISALPHA(*p); p++) {}
if (*skipwhite(p) == NUL) {
- return false;
+ goto theend;
}
if (STRNCMP(cmd, "substitute", p - cmd) == 0
@@ -336,12 +339,15 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
p_magic = false;
}
} else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0) {
- // skip over flags.
+ // skip over ! and flags
+ if (*p == '!') {
+ p = skipwhite(p + 1);
+ }
while (ASCII_ISALPHA(*(p = skipwhite(p)))) {
p++;
}
if (*p == NUL) {
- return false;
+ goto theend;
}
} else if (STRNCMP(cmd, "vimgrep", MAX(p - cmd, 3)) == 0
|| STRNCMP(cmd, "vimgrepadd", MAX(p - cmd, 8)) == 0
@@ -352,14 +358,14 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
if (*p == '!') {
p++;
if (*skipwhite(p) == NUL) {
- return false;
+ goto theend;
}
}
if (*cmd != 'g') {
delim_optional = true;
}
} else {
- return false;
+ goto theend;
}
p = skipwhite(p);
@@ -368,7 +374,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
use_last_pat = end == p && *end == delim;
if (end == p && !use_last_pat) {
- return false;
+ goto theend;
}
// Don't do 'hlsearch' highlighting if the pattern matches everything.
@@ -380,7 +386,7 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
empty = empty_pattern(p);
*end = c;
if (empty) {
- return false;
+ goto theend;
}
}
@@ -408,7 +414,10 @@ static bool do_incsearch_highlighting(int firstc, incsearch_state_T *s,
}
curwin->w_cursor = save_cursor;
- return true;
+ retval = true;
+theend:
+ emsg_off--;
+ return retval;
}
// May do 'incsearch' highlighting if desired.
@@ -443,6 +452,10 @@ static void may_do_incsearch_highlighting(int firstc, long count,
if (search_first_line == 0) {
// start at the original cursor position
curwin->w_cursor = s->search_start;
+ } else if (search_first_line > curbuf->b_ml.ml_line_count) {
+ // start after the last line
+ curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
+ curwin->w_cursor.col = MAXCOL;
} else {
// start at the first line in the range
curwin->w_cursor.lnum = search_first_line;
@@ -544,6 +557,7 @@ static void may_do_incsearch_highlighting(int firstc, long count,
}
update_screen(SOME_VALID);
+ highlight_match = false;
restore_last_search_pattern();
// Leave it at the end to make CTRL-R CTRL-W work. But not when beyond the
@@ -563,6 +577,7 @@ static void may_do_incsearch_highlighting(int firstc, long count,
// May set "*c" to the added character.
// Return OK when calling command_line_not_changed.
static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s)
+ FUNC_ATTR_NONNULL_ALL
{
int skiplen, patlen;
@@ -579,8 +594,8 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s)
if (s->did_incsearch) {
curwin->w_cursor = s->match_end;
- if (!equalpos(curwin->w_cursor, s->search_start)) {
- *c = gchar_cursor();
+ *c = gchar_cursor();
+ if (*c != NUL) {
// If 'ignorecase' and 'smartcase' are set and the
// command line has no uppercase characters, convert
// the character to lowercase
@@ -588,16 +603,14 @@ static int may_add_char_to_search(int firstc, int *c, incsearch_state_T *s)
&& !pat_has_uppercase(ccline.cmdbuff + skiplen)) {
*c = mb_tolower(*c);
}
- if (*c != NUL) {
- if (*c == firstc
- || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), *c)
- != NULL) {
- // put a backslash before special characters
- stuffcharReadbuff(*c);
- *c = '\\';
- }
- return FAIL;
+ if (*c == firstc
+ || vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), *c)
+ != NULL) {
+ // put a backslash before special characters
+ stuffcharReadbuff(*c);
+ *c = '\\';
}
+ return FAIL;
}
}
return OK;
@@ -1444,6 +1457,7 @@ static int command_line_execute(VimState *state, int key)
static int may_do_command_line_next_incsearch(int firstc, long count,
incsearch_state_T *s,
bool next_match)
+ FUNC_ATTR_NONNULL_ALL
{
int skiplen, patlen;
@@ -1536,7 +1550,9 @@ static int may_do_command_line_next_incsearch(int firstc, long count,
highlight_match = true;
save_viewstate(&s->old_viewstate);
update_screen(NOT_VALID);
+ highlight_match = false;
redrawcmdline();
+ curwin->w_cursor = s->match_end;
} else {
vim_beep(BO_ERROR);
}
@@ -6457,12 +6473,15 @@ static int open_cmdwin(void)
// Save the command line info, can be used recursively.
save_cmdline(&save_ccline);
- /* No Ex mode here! */
+ // No Ex mode here!
exmode_active = 0;
State = NORMAL;
setmouse();
+ // Reset here so it can be set by a CmdWinEnter autocommand.
+ cmdwin_result = 0;
+
// Trigger CmdwinEnter autocommands.
typestr[0] = (char_u)cmdwin_type;
typestr[1] = NUL;
@@ -6478,7 +6497,6 @@ static int open_cmdwin(void)
/*
* Call the main loop until <CR> or CTRL-C is typed.
*/
- cmdwin_result = 0;
normal_enter(true, false);
RedrawingDisabled = i;
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c
index 3a04908ccb..0de396fd1f 100644
--- a/src/nvim/extmark.c
+++ b/src/nvim/extmark.c
@@ -568,8 +568,18 @@ void extmark_splice(buf_T *buf,
int new_row, colnr_T new_col, bcount_t new_byte,
ExtmarkOp undo)
{
- long offset = ml_find_line_or_offset(buf, start_row+1, NULL, true);
- extmark_splice_impl(buf, start_row, start_col, offset+start_col,
+ long offset = ml_find_line_or_offset(buf, start_row + 1, NULL, true);
+
+ // On empty buffers, when editing the first line, the line is buffered,
+ // causing offset to be < 0. While the buffer is not actually empty, the
+ // buffered line has not been flushed (and should not be) yet, so the call is
+ // valid but an edge case.
+ //
+ // TODO(vigoux): maybe the is a better way of testing that ?
+ if (offset < 0 && buf->b_ml.ml_chunksize == NULL) {
+ offset = 0;
+ }
+ extmark_splice_impl(buf, start_row, start_col, offset + start_col,
old_row, old_col, old_byte, new_row, new_col, new_byte,
undo);
}
@@ -773,7 +783,7 @@ void bufhl_add_hl_pos_offset(buf_T *buf,
}
(void)extmark_set(buf, (uint64_t)src_id, 0,
(int)lnum-1, hl_start, (int)lnum-1+end_off, hl_end,
- decor, kExtmarkUndo);
+ decor, kExtmarkNoUndo);
}
}
@@ -844,8 +854,15 @@ VirtText *extmark_find_virttext(buf_T *buf, int row, uint64_t ns_id)
bool decorations_redraw_reset(buf_T *buf, DecorationRedrawState *state)
{
state->row = -1;
+ for (size_t i = 0; i < kv_size(state->active); i++) {
+ HlRange item = kv_A(state->active, i);
+ if (item.virt_text_owned) {
+ clear_virttext(item.virt_text);
+ xfree(item.virt_text);
+ }
+ }
kv_size(state->active) = 0;
- return buf->b_extmark_index || buf->b_luahl;
+ return buf->b_extmark_index;
}
@@ -889,10 +906,10 @@ bool decorations_redraw_start(buf_T *buf, int top_row,
HlRange range;
if (mark.id&MARKTREE_END_FLAG) {
range = (HlRange){ altpos.row, altpos.col, mark.row, mark.col,
- attr_id, vt };
+ attr_id, vt, false };
} else {
range = (HlRange){ mark.row, mark.col, altpos.row,
- altpos.col, attr_id, vt };
+ altpos.col, attr_id, vt, false };
}
kv_push(state->active, range);
@@ -957,7 +974,7 @@ int decorations_redraw_col(buf_T *buf, int col, DecorationRedrawState *state)
VirtText *vt = kv_size(decor->virt_text) ? &decor->virt_text : NULL;
kv_push(state->active, ((HlRange){ mark.row, mark.col,
endpos.row, endpos.col,
- attr_id, vt }));
+ attr_id, vt, false }));
next_mark:
marktree_itr_next(buf->b_marktree, state->itr);
@@ -991,6 +1008,9 @@ next_mark:
}
if (keep) {
kv_A(state->active, j++) = kv_A(state->active, i);
+ } else if (item.virt_text_owned) {
+ clear_virttext(item.virt_text);
+ xfree(item.virt_text);
}
}
kv_size(state->active) = j;
diff --git a/src/nvim/extmark.h b/src/nvim/extmark.h
index 534e97a7f4..d394d4d806 100644
--- a/src/nvim/extmark.h
+++ b/src/nvim/extmark.h
@@ -85,6 +85,7 @@ typedef struct {
int end_col;
int attr_id;
VirtText *virt_text;
+ bool virt_text_owned;
} HlRange;
typedef struct {
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index 286f2b4fca..1b4a89fb6c 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -210,7 +210,8 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr)
if (msg_silent != 0) {
return;
}
- add_quoted_fname((char *)IObuff, IOSIZE - 80, buf, (const char *)name);
+ add_quoted_fname((char *)IObuff, IOSIZE - 100, buf, (const char *)name);
+ // Avoid an over-long translation to cause trouble.
xstrlcat((char *)IObuff, (const char *)s, IOSIZE);
// For the first message may have to start a new line.
// For further ones overwrite the previous one, reset msg_scroll before
@@ -349,6 +350,7 @@ readfile(
char_u *old_b_fname;
int using_b_ffname;
int using_b_fname;
+ static char *msg_is_a_directory = N_("is a directory");
au_did_filetype = false; // reset before triggering any autocommands
@@ -443,21 +445,31 @@ readfile(
else
msg_scroll = TRUE; /* don't overwrite previous file message */
- /*
- * If the name is too long we might crash further on, quit here.
- */
+ // If the name is too long we might crash further on, quit here.
if (fname != NULL && *fname != NUL) {
- if (STRLEN(fname) >= MAXPATHL) {
+ size_t namelen = STRLEN(fname);
+
+ // If the name is too long we might crash further on, quit here.
+ if (namelen >= MAXPATHL) {
filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
msg_end();
msg_scroll = msg_save;
return FAIL;
}
+
+ // If the name ends in a path separator, we can't open it. Check here,
+ // because reading the file may actually work, but then creating the
+ // swap file may destroy it! Reported on MS-DOS and Win 95.
+ if (after_pathsep((const char *)fname, (const char *)(fname + namelen))) {
+ filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0);
+ msg_end();
+ msg_scroll = msg_save;
+ return FAIL;
+ }
}
if (!read_buffer && !read_stdin && !read_fifo) {
perm = os_getperm((const char *)fname);
-#ifdef UNIX
// On Unix it is possible to read a directory, so we have to
// check for it before os_open().
if (perm >= 0 && !S_ISREG(perm) // not a regular file ...
@@ -473,7 +485,7 @@ readfile(
# endif
) {
if (S_ISDIR(perm)) {
- filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
+ filemess(curbuf, fname, (char_u *)_(msg_is_a_directory), 0);
} else {
filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
}
@@ -481,7 +493,6 @@ readfile(
msg_scroll = msg_save;
return S_ISDIR(perm) ? NOTDONE : FAIL;
}
-#endif
}
/* Set default or forced 'fileformat' and 'binary'. */
@@ -540,13 +551,6 @@ readfile(
if (fd < 0) { // cannot open at all
msg_scroll = msg_save;
-#ifndef UNIX
- // On non-unix systems we can't open a directory, check here.
- if (os_isdir(fname)) {
- filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
- curbuf->b_p_ro = true; // must use "w!" now
- } else {
-#endif
if (!newfile) {
return FAIL;
}
@@ -604,9 +608,6 @@ readfile(
return FAIL;
}
-#ifndef UNIX
- }
-#endif
/*
* Only set the 'ro' flag for readonly files the first time they are
diff --git a/src/nvim/fold.c b/src/nvim/fold.c
index 9994ad3ea8..197aedabec 100644
--- a/src/nvim/fold.c
+++ b/src/nvim/fold.c
@@ -153,14 +153,22 @@ bool hasFolding(linenr_T lnum, linenr_T *firstp, linenr_T *lastp)
return hasFoldingWin(curwin, lnum, firstp, lastp, true, NULL);
}
-/* hasFoldingWin() {{{2 */
+// hasFoldingWin() {{{2
+/// Search folds starting at lnum
+/// @param lnum first line to search
+/// @param[out] first first line of fold containing lnum
+/// @param[out] lastp last line with a fold
+/// @param cache when true: use cached values of window
+/// @param[out] infop where to store fold info
+///
+/// @return true if range contains folds
bool hasFoldingWin(
win_T *const win,
const linenr_T lnum,
linenr_T *const firstp,
linenr_T *const lastp,
- const bool cache, // when true: use cached values of window
- foldinfo_T *const infop // where to store fold info
+ const bool cache,
+ foldinfo_T *const infop
)
{
bool had_folded = false;
@@ -280,26 +288,31 @@ int foldLevel(linenr_T lnum)
// Return false if line is not folded.
bool lineFolded(win_T *const win, const linenr_T lnum)
{
- return foldedCount(win, lnum, NULL) != 0;
+ return fold_info(win, lnum).fi_lines != 0;
}
-/* foldedCount() {{{2 */
-/*
- * Count the number of lines that are folded at line number "lnum".
- * Normally "lnum" is the first line of a possible fold, and the returned
- * number is the number of lines in the fold.
- * Doesn't use caching from the displayed window.
- * Returns number of folded lines from "lnum", or 0 if line is not folded.
- * When "infop" is not NULL, fills *infop with the fold level info.
- */
-long foldedCount(win_T *win, linenr_T lnum, foldinfo_T *infop)
+/// fold_info() {{{2
+///
+/// Count the number of lines that are folded at line number "lnum".
+/// Normally "lnum" is the first line of a possible fold, and the returned
+/// number is the number of lines in the fold.
+/// Doesn't use caching from the displayed window.
+///
+/// @return with the fold level info.
+/// fi_lines = number of folded lines from "lnum",
+/// or 0 if line is not folded.
+foldinfo_T fold_info(win_T *win, linenr_T lnum)
{
+ foldinfo_T info;
linenr_T last;
- if (hasFoldingWin(win, lnum, NULL, &last, false, infop)) {
- return (long)(last - lnum + 1);
+ if (hasFoldingWin(win, lnum, NULL, &last, false, &info)) {
+ info.fi_lines = (long)(last - lnum + 1);
+ } else {
+ info.fi_lines = 0;
}
- return 0;
+
+ return info;
}
/* foldmethodIsManual() {{{2 */
@@ -356,23 +369,21 @@ int foldmethodIsDiff(win_T *wp)
return wp->w_p_fdm[0] == 'd';
}
-/* closeFold() {{{2 */
-/*
- * Close fold for current window at line "lnum".
- * Repeat "count" times.
- */
-void closeFold(linenr_T lnum, long count)
+// closeFold() {{{2
+/// Close fold for current window at line "lnum".
+/// Repeat "count" times.
+void closeFold(pos_T pos, long count)
{
- setFoldRepeat(lnum, count, FALSE);
+ setFoldRepeat(pos, count, false);
}
/* closeFoldRecurse() {{{2 */
/*
* Close fold for current window at line "lnum" recursively.
*/
-void closeFoldRecurse(linenr_T lnum)
+void closeFoldRecurse(pos_T pos)
{
- (void)setManualFold(lnum, FALSE, TRUE, NULL);
+ (void)setManualFold(pos, false, true, NULL);
}
/* opFoldRange() {{{2 */
@@ -382,28 +393,32 @@ void closeFoldRecurse(linenr_T lnum)
*/
void
opFoldRange(
- linenr_T first,
- linenr_T last,
+ pos_T firstpos,
+ pos_T lastpos,
int opening, // TRUE to open, FALSE to close
int recurse, // TRUE to do it recursively
int had_visual // TRUE when Visual selection used
)
{
- int done = DONE_NOTHING; /* avoid error messages */
+ int done = DONE_NOTHING; // avoid error messages
+ linenr_T first = firstpos.lnum;
+ linenr_T last = lastpos.lnum;
linenr_T lnum;
linenr_T lnum_next;
for (lnum = first; lnum <= last; lnum = lnum_next + 1) {
+ pos_T temp = { lnum, 0, 0 };
lnum_next = lnum;
/* Opening one level only: next fold to open is after the one going to
* be opened. */
if (opening && !recurse)
(void)hasFolding(lnum, NULL, &lnum_next);
- (void)setManualFold(lnum, opening, recurse, &done);
- /* Closing one level only: next line to close a fold is after just
- * closed fold. */
- if (!opening && !recurse)
+ (void)setManualFold(temp, opening, recurse, &done);
+ // Closing one level only: next line to close a fold is after just
+ // closed fold.
+ if (!opening && !recurse) {
(void)hasFolding(lnum, NULL, &lnum_next);
+ }
}
if (done == DONE_NOTHING)
EMSG(_(e_nofold));
@@ -417,18 +432,18 @@ opFoldRange(
* Open fold for current window at line "lnum".
* Repeat "count" times.
*/
-void openFold(linenr_T lnum, long count)
+void openFold(pos_T pos, long count)
{
- setFoldRepeat(lnum, count, TRUE);
+ setFoldRepeat(pos, count, true);
}
/* openFoldRecurse() {{{2 */
/*
* Open fold for current window at line "lnum" recursively.
*/
-void openFoldRecurse(linenr_T lnum)
+void openFoldRecurse(pos_T pos)
{
- (void)setManualFold(lnum, TRUE, TRUE, NULL);
+ (void)setManualFold(pos, true, true, NULL);
}
/* foldOpenCursor() {{{2 */
@@ -443,9 +458,10 @@ void foldOpenCursor(void)
if (hasAnyFolding(curwin))
for (;; ) {
done = DONE_NOTHING;
- (void)setManualFold(curwin->w_cursor.lnum, TRUE, FALSE, &done);
- if (!(done & DONE_ACTION))
+ (void)setManualFold(curwin->w_cursor, true, false, &done);
+ if (!(done & DONE_ACTION)) {
break;
+ }
}
}
@@ -542,21 +558,21 @@ int foldManualAllowed(int create)
// foldCreate() {{{2
/// Create a fold from line "start" to line "end" (inclusive) in the current
/// window.
-void foldCreate(win_T *wp, linenr_T start, linenr_T end)
+void foldCreate(win_T *wp, pos_T start, pos_T end)
{
fold_T *fp;
garray_T *gap;
garray_T fold_ga;
- int i, j;
+ int i;
int cont;
int use_level = FALSE;
int closed = FALSE;
int level = 0;
- linenr_T start_rel = start;
- linenr_T end_rel = end;
+ pos_T start_rel = start;
+ pos_T end_rel = end;
- if (start > end) {
- /* reverse the range */
+ if (start.lnum > end.lnum) {
+ // reverse the range
end = start_rel;
start = end_rel;
start_rel = start;
@@ -577,14 +593,14 @@ void foldCreate(win_T *wp, linenr_T start, linenr_T end)
i = 0;
} else {
for (;;) {
- if (!foldFind(gap, start_rel, &fp)) {
+ if (!foldFind(gap, start_rel.lnum, &fp)) {
break;
}
- if (fp->fd_top + fp->fd_len > end_rel) {
+ if (fp->fd_top + fp->fd_len > end_rel.lnum) {
// New fold is completely inside this fold: Go one level deeper.
gap = &fp->fd_nested;
- start_rel -= fp->fd_top;
- end_rel -= fp->fd_top;
+ start_rel.lnum -= fp->fd_top;
+ end_rel.lnum -= fp->fd_top;
if (use_level || fp->fd_flags == FD_LEVEL) {
use_level = true;
if (level >= wp->w_p_fdl) {
@@ -608,30 +624,35 @@ void foldCreate(win_T *wp, linenr_T start, linenr_T end)
fp = (fold_T *)gap->ga_data + i;
ga_init(&fold_ga, (int)sizeof(fold_T), 10);
- /* Count number of folds that will be contained in the new fold. */
- for (cont = 0; i + cont < gap->ga_len; ++cont)
- if (fp[cont].fd_top > end_rel)
+ // Count number of folds that will be contained in the new fold.
+ for (cont = 0; i + cont < gap->ga_len; cont++) {
+ if (fp[cont].fd_top > end_rel.lnum) {
break;
+ }
+ }
if (cont > 0) {
ga_grow(&fold_ga, cont);
/* If the first fold starts before the new fold, let the new fold
* start there. Otherwise the existing fold would change. */
- if (start_rel > fp->fd_top)
- start_rel = fp->fd_top;
-
- /* When last contained fold isn't completely contained, adjust end
- * of new fold. */
- if (end_rel < fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1)
- end_rel = fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1;
- /* Move contained folds to inside new fold. */
+ if (start_rel.lnum > fp->fd_top) {
+ start_rel.lnum = fp->fd_top;
+ }
+
+ // When last contained fold isn't completely contained, adjust end
+ // of new fold.
+ if (end_rel.lnum < fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1) {
+ end_rel.lnum = fp[cont - 1].fd_top + fp[cont - 1].fd_len - 1;
+ }
+ // Move contained folds to inside new fold
memmove(fold_ga.ga_data, fp, sizeof(fold_T) * (size_t)cont);
fold_ga.ga_len += cont;
i += cont;
/* Adjust line numbers in contained folds to be relative to the
* new fold. */
- for (j = 0; j < cont; ++j)
- ((fold_T *)fold_ga.ga_data)[j].fd_top -= start_rel;
+ for (int j = 0; j < cont; j++) {
+ ((fold_T *)fold_ga.ga_data)[j].fd_top -= start_rel.lnum;
+ }
}
/* Move remaining entries to after the new fold. */
if (i < gap->ga_len)
@@ -641,8 +662,8 @@ void foldCreate(win_T *wp, linenr_T start, linenr_T end)
/* insert new fold */
fp->fd_nested = fold_ga;
- fp->fd_top = start_rel;
- fp->fd_len = end_rel - start_rel + 1;
+ fp->fd_top = start_rel.lnum;
+ fp->fd_len = end_rel.lnum - start_rel.lnum + 1;
/* We want the new fold to be closed. If it would remain open because
* of using 'foldlevel', need to adjust fd_flags of containing folds.
@@ -771,7 +792,7 @@ void deleteFold(
*/
void clearFolding(win_T *win)
{
- deleteFoldRecurse(&win->w_folds);
+ deleteFoldRecurse(win->w_buffer, &win->w_folds);
win->w_foldinvalid = false;
}
@@ -1143,14 +1164,14 @@ static void checkupdate(win_T *wp)
* Open or close fold for current window at line "lnum".
* Repeat "count" times.
*/
-static void setFoldRepeat(linenr_T lnum, long count, int do_open)
+static void setFoldRepeat(pos_T pos, long count, int do_open)
{
int done;
long n;
for (n = 0; n < count; ++n) {
done = DONE_NOTHING;
- (void)setManualFold(lnum, do_open, FALSE, &done);
+ (void)setManualFold(pos, do_open, false, &done);
if (!(done & DONE_ACTION)) {
/* Only give an error message when no fold could be opened. */
if (n == 0 && !(done & DONE_FOLD))
@@ -1167,12 +1188,13 @@ static void setFoldRepeat(linenr_T lnum, long count, int do_open)
*/
static linenr_T
setManualFold(
- linenr_T lnum,
+ pos_T pos,
int opening, // TRUE when opening, FALSE when closing
int recurse, // TRUE when closing/opening recursive
int *donep
)
{
+ linenr_T lnum = pos.lnum;
if (foldmethodIsDiff(curwin) && curwin->w_p_scb) {
linenr_T dlnum;
@@ -1326,7 +1348,7 @@ static void deleteFoldEntry(win_T *const wp, garray_T *const gap, const int idx,
fold_T *fp = (fold_T *)gap->ga_data + idx;
if (recursive || GA_EMPTY(&fp->fd_nested)) {
// recursively delete the contained folds
- deleteFoldRecurse(&fp->fd_nested);
+ deleteFoldRecurse(wp->w_buffer, &fp->fd_nested);
gap->ga_len--;
if (idx < gap->ga_len) {
memmove(fp, fp + 1, sizeof(*fp) * (size_t)(gap->ga_len - idx));
@@ -1368,9 +1390,9 @@ static void deleteFoldEntry(win_T *const wp, garray_T *const gap, const int idx,
/*
* Delete nested folds in a fold.
*/
-void deleteFoldRecurse(garray_T *gap)
+void deleteFoldRecurse(buf_T *bp, garray_T *gap)
{
-# define DELETE_FOLD_NESTED(fd) deleteFoldRecurse(&((fd)->fd_nested))
+# define DELETE_FOLD_NESTED(fd) deleteFoldRecurse(bp, &((fd)->fd_nested))
GA_DEEP_CLEAR(gap, fold_T, DELETE_FOLD_NESTED);
}
@@ -1610,7 +1632,7 @@ static void setSmallMaybe(garray_T *gap)
* Create a fold from line "start" to line "end" (inclusive) in the current
* window by adding markers.
*/
-static void foldCreateMarkers(win_T *wp, linenr_T start, linenr_T end)
+static void foldCreateMarkers(win_T *wp, pos_T start, pos_T end)
{
buf_T *buf = wp->w_buffer;
if (!MODIFIABLE(buf)) {
@@ -1625,13 +1647,13 @@ static void foldCreateMarkers(win_T *wp, linenr_T start, linenr_T end)
/* Update both changes here, to avoid all folds after the start are
* changed when the start marker is inserted and the end isn't. */
// TODO(teto): pass the buffer
- changed_lines(start, (colnr_T)0, end, 0L, false);
+ changed_lines(start.lnum, (colnr_T)0, end.lnum, 0L, false);
// Note: foldAddMarker() may not actually change start and/or end if
// u_save() is unable to save the buffer line, but we send the
// nvim_buf_lines_event anyway since it won't do any harm.
- int64_t num_changed = 1 + end - start;
- buf_updates_send_changes(buf, start, num_changed, num_changed, true);
+ int64_t num_changed = 1 + end.lnum - start.lnum;
+ buf_updates_send_changes(buf, start.lnum, num_changed, num_changed, true);
}
/* foldAddMarker() {{{2 */
@@ -1639,13 +1661,14 @@ static void foldCreateMarkers(win_T *wp, linenr_T start, linenr_T end)
* Add "marker[markerlen]" in 'commentstring' to line "lnum".
*/
static void foldAddMarker(
- buf_T *buf, linenr_T lnum, const char_u *marker, size_t markerlen)
+ buf_T *buf, pos_T pos, const char_u *marker, size_t markerlen)
{
char_u *cms = buf->b_p_cms;
char_u *line;
char_u *newline;
char_u *p = (char_u *)strstr((char *)buf->b_p_cms, "%s");
bool line_is_comment = false;
+ linenr_T lnum = pos.lnum;
// Allocate a new line: old-line + 'cms'-start + marker + 'cms'-end
line = ml_get_buf(buf, lnum, false);
@@ -1751,11 +1774,16 @@ static void foldDelMarker(
}
// get_foldtext() {{{2
-/// Return the text for a closed fold at line "lnum", with last line "lnume".
-/// When 'foldtext' isn't set puts the result in "buf[FOLD_TEXT_LEN]".
+/// Generates text to display
+///
+/// @param buf allocated memory of length FOLD_TEXT_LEN. Used when 'foldtext'
+/// isn't set puts the result in "buf[FOLD_TEXT_LEN]".
+/// @param at line "lnum", with last line "lnume".
+/// @return the text for a closed fold
+///
/// Otherwise the result is in allocated memory.
char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
- foldinfo_T *foldinfo, char_u *buf)
+ foldinfo_T foldinfo, char_u *buf)
FUNC_ATTR_NONNULL_ARG(1)
{
char_u *text = NULL;
@@ -1783,11 +1811,12 @@ char_u *get_foldtext(win_T *wp, linenr_T lnum, linenr_T lnume,
set_vim_var_nr(VV_FOLDSTART, (varnumber_T) lnum);
set_vim_var_nr(VV_FOLDEND, (varnumber_T) lnume);
- /* Set "v:folddashes" to a string of "level" dashes. */
- /* Set "v:foldlevel" to "level". */
- level = foldinfo->fi_level;
- if (level > (int)sizeof(dashes) - 1)
+ // Set "v:folddashes" to a string of "level" dashes.
+ // Set "v:foldlevel" to "level".
+ level = foldinfo.fi_level;
+ if (level > (int)sizeof(dashes) - 1) {
level = (int)sizeof(dashes) - 1;
+ }
memset(dashes, '-', (size_t)level);
dashes[level] = NUL;
set_vim_var_string(VV_FOLDDASHES, dashes, -1);
diff --git a/src/nvim/fold.h b/src/nvim/fold.h
index f35b328fb1..95c4b0c1dc 100644
--- a/src/nvim/fold.h
+++ b/src/nvim/fold.h
@@ -18,6 +18,7 @@ typedef struct foldinfo {
other fields are invalid */
int fi_low_level; /* lowest fold level that starts in the same
line */
+ long fi_lines;
} foldinfo_T;
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index c35398cd8d..cbd9582f8b 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1528,6 +1528,17 @@ int vgetc(void)
c = utf_ptr2char(buf);
}
+ // If mappings are enabled (i.e., not Ctrl-v) and the user directly typed
+ // something with a meta- or alt- modifier that was not mapped, interpret
+ // <M-x> as <Esc>x rather than as an unbound meta keypress. #8213
+ if (!no_mapping && KeyTyped
+ && (mod_mask == MOD_MASK_ALT || mod_mask == MOD_MASK_META)) {
+ mod_mask = 0;
+ stuffcharReadbuff(c);
+ u_sync(false);
+ c = ESC;
+ }
+
break;
}
}
@@ -2044,14 +2055,19 @@ static int vgetorpeek(bool advance)
*/
if (mp->m_expr) {
int save_vgetc_busy = vgetc_busy;
+ const bool save_may_garbage_collect = may_garbage_collect;
vgetc_busy = 0;
+ may_garbage_collect = false;
+
save_m_keys = vim_strsave(mp->m_keys);
save_m_str = vim_strsave(mp->m_str);
s = eval_map_expr(save_m_str, NUL);
vgetc_busy = save_vgetc_busy;
- } else
+ may_garbage_collect = save_may_garbage_collect;
+ } else {
s = mp->m_str;
+ }
/*
* Insert the 'to' part in the typebuf.tb_buf.
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 205be4b811..ddb69fc567 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -405,6 +405,12 @@ EXTERN int sys_menu INIT(= false);
// ('lines' and 'rows') must not be changed.
EXTERN int updating_screen INIT(= 0);
+EXTERN bool luahl_active INIT(= false);
+EXTERN LuaRef luahl_start INIT(= LUA_NOREF);
+EXTERN LuaRef luahl_win INIT(= LUA_NOREF);
+EXTERN LuaRef luahl_line INIT(= LUA_NOREF);
+EXTERN LuaRef luahl_end INIT(= LUA_NOREF);
+
// All windows are linked in a list. firstwin points to the first entry,
// lastwin to the last entry (can be the same as firstwin) and curwin to the
// currently active window.
diff --git a/src/nvim/log.h b/src/nvim/log.h
index 17ff095473..f2e74df031 100644
--- a/src/nvim/log.h
+++ b/src/nvim/log.h
@@ -5,6 +5,17 @@
#include <stdbool.h>
#include "auto/config.h"
+#include "nvim/macros.h"
+
+// USDT probes. Example invokation:
+// NVIM_PROBE(nvim_foo_bar, 1, string.data);
+#if defined(HAVE_SYS_SDT_H)
+#include <sys/sdt.h> // NOLINT
+#define NVIM_PROBE(name, n, ...) STAP_PROBE##n(neovim, name, __VA_ARGS__)
+#else
+#define NVIM_PROBE(name, n, ...)
+#endif
+
#define DEBUG_LOG_LEVEL 0
#define INFO_LOG_LEVEL 1
@@ -68,6 +79,10 @@
# define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
#endif
+#if NVIM_HAS_INCLUDE("sanitizer/asan_interface.h")
+# include "sanitizer/asan_interface.h"
+#endif
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "log.h.generated.h"
#endif
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 7722f9cdc3..5c665920b5 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -299,45 +299,66 @@ static int nlua_wait(lua_State *lstate)
return luaL_error(lstate, "timeout must be > 0");
}
- // Check if condition can be called.
- bool is_function = (lua_type(lstate, 2) == LUA_TFUNCTION);
+ int lua_top = lua_gettop(lstate);
- // Check if condition is callable table
- if (!is_function && luaL_getmetafield(lstate, 2, "__call") != 0) {
- is_function = (lua_type(lstate, -1) == LUA_TFUNCTION);
- lua_pop(lstate, 1);
- }
+ // Check if condition can be called.
+ bool is_function = false;
+ if (lua_top >= 2 && !lua_isnil(lstate, 2)) {
+ is_function = (lua_type(lstate, 2) == LUA_TFUNCTION);
+
+ // Check if condition is callable table
+ if (!is_function && luaL_getmetafield(lstate, 2, "__call") != 0) {
+ is_function = (lua_type(lstate, -1) == LUA_TFUNCTION);
+ lua_pop(lstate, 1);
+ }
- if (!is_function) {
- lua_pushliteral(lstate, "vim.wait: condition must be a function");
- return lua_error(lstate);
+ if (!is_function) {
+ lua_pushliteral(
+ lstate,
+ "vim.wait: if passed, condition must be a function");
+ return lua_error(lstate);
+ }
}
intptr_t interval = 200;
- if (lua_gettop(lstate) >= 3) {
+ if (lua_top >= 3 && !lua_isnil(lstate, 3)) {
interval = luaL_checkinteger(lstate, 3);
if (interval < 0) {
return luaL_error(lstate, "interval must be > 0");
}
}
+ bool fast_only = false;
+ if (lua_top >= 4) {
+ fast_only = lua_toboolean(lstate, 4);
+ }
+
+ MultiQueue *loop_events = fast_only || in_fast_callback > 0
+ ? main_loop.fast_events : main_loop.events;
+
TimeWatcher *tw = xmalloc(sizeof(TimeWatcher));
// Start dummy timer.
time_watcher_init(&main_loop, tw, NULL);
- tw->events = main_loop.events;
+ tw->events = loop_events;
tw->blockable = true;
- time_watcher_start(tw, dummy_timer_due_cb,
- (uint64_t)interval, (uint64_t)interval);
+ time_watcher_start(
+ tw,
+ dummy_timer_due_cb,
+ (uint64_t)interval,
+ (uint64_t)interval);
int pcall_status = 0;
bool callback_result = false;
LOOP_PROCESS_EVENTS_UNTIL(
&main_loop,
- main_loop.events,
+ loop_events,
(int)timeout,
- nlua_wait_condition(lstate, &pcall_status, &callback_result) || got_int);
+ is_function ? nlua_wait_condition(
+ lstate,
+ &pcall_status,
+ &callback_result) : false || got_int);
// Stop dummy timer
time_watcher_stop(tw);
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c
index 8be4b6f376..33d9772bec 100644
--- a/src/nvim/lua/treesitter.c
+++ b/src/nvim/lua/treesitter.c
@@ -39,7 +39,7 @@ typedef struct {
static struct luaL_Reg parser_meta[] = {
{ "__gc", parser_gc },
{ "__tostring", parser_tostring },
- { "parse_buf", parser_parse_buf },
+ { "parse", parser_parse },
{ "edit", parser_edit },
{ "tree", parser_tree },
{ "set_included_ranges", parser_set_ranges },
@@ -174,6 +174,14 @@ int tslua_add_language(lua_State *L)
return luaL_error(L, "Failed to load parser: internal error");
}
+ uint32_t lang_version = ts_language_version(lang);
+ if (lang_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION) {
+ return luaL_error(
+ L,
+ "ABI version mismatch : expected %" PRIu32 ", found %" PRIu32,
+ TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION, lang_version);
+ }
+
pmap_put(cstr_t)(langs, xstrdup(lang_name), lang);
lua_pushboolean(L, true);
@@ -306,22 +314,44 @@ static const char *input_cb(void *payload, uint32_t byte_index,
#undef BUFSIZE
}
-static int parser_parse_buf(lua_State *L)
+static int parser_parse(lua_State *L)
{
TSLua_parser *p = parser_check(L);
if (!p) {
return 0;
}
- long bufnr = lua_tointeger(L, 2);
- buf_T *buf = handle_get_buffer(bufnr);
+ TSTree *new_tree;
+ size_t len;
+ const char *str;
+ long bufnr;
+ buf_T *buf;
+ TSInput input;
+
+ // This switch is necessary because of the behavior of lua_isstring, that
+ // consider numbers as strings...
+ switch (lua_type(L, 2)) {
+ case LUA_TSTRING:
+ str = lua_tolstring(L, 2, &len);
+ new_tree = ts_parser_parse_string(p->parser, p->tree, str, len);
+ break;
+
+ case LUA_TNUMBER:
+ bufnr = lua_tointeger(L, 2);
+ buf = handle_get_buffer(bufnr);
+
+ if (!buf) {
+ return luaL_error(L, "invalid buffer handle: %d", bufnr);
+ }
- if (!buf) {
- return luaL_error(L, "invalid buffer handle: %d", bufnr);
- }
+ input = (TSInput){ (void *)buf, input_cb, TSInputEncodingUTF8 };
+ new_tree = ts_parser_parse(p->parser, p->tree, input);
- TSInput input = { (void *)buf, input_cb, TSInputEncodingUTF8 };
- TSTree *new_tree = ts_parser_parse(p->parser, p->tree, input);
+ break;
+
+ default:
+ return luaL_error(L, "invalid argument to parser:parse()");
+ }
uint32_t n_ranges = 0;
TSRange *changed = p->tree ? ts_tree_get_changed_ranges(p->tree, new_tree,
diff --git a/src/nvim/macros.h b/src/nvim/macros.h
index 0bbaa87aba..07dcb4a8e8 100644
--- a/src/nvim/macros.h
+++ b/src/nvim/macros.h
@@ -152,6 +152,12 @@
#define STR_(x) #x
#define STR(x) STR_(x)
+#ifndef __has_include
+# define NVIM_HAS_INCLUDE(x) 0
+#else
+# define NVIM_HAS_INCLUDE __has_include
+#endif
+
#ifndef __has_attribute
# define NVIM_HAS_ATTRIBUTE(x) 0
#elif defined(__clang__) && __clang__ == 1 \
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 1374c5eb5d..a22df9cc69 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -7,6 +7,8 @@
#include <string.h>
#include <stdbool.h>
+#include <lua.h>
+#include <lauxlib.h>
#include <msgpack.h>
#include "nvim/ascii.h"
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index f9390bcb88..2a75f13cc2 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -1818,6 +1818,7 @@ ml_get_buf (
linenr_T lnum,
bool will_change // line will be changed
)
+ FUNC_ATTR_NONNULL_ALL
{
bhdr_T *hp;
DATA_BL *dp;
diff --git a/src/nvim/move.c b/src/nvim/move.c
index 8a8a639a52..e2a304efa5 100644
--- a/src/nvim/move.c
+++ b/src/nvim/move.c
@@ -641,7 +641,7 @@ void validate_virtcol_win(win_T *wp)
/*
* Validate curwin->w_cline_height only.
*/
-static void validate_cheight(void)
+void validate_cheight(void)
{
check_cursor_moved(curwin);
if (!(curwin->w_valid & VALID_CHEIGHT)) {
@@ -943,6 +943,9 @@ void curs_columns(
redraw_later(SOME_VALID);
}
+ // now w_leftcol is valid, avoid check_cursor_moved() thinking otherwise
+ curwin->w_valid_leftcol = curwin->w_leftcol;
+
curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
}
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 968cfde388..a51aa0dc07 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -1977,20 +1977,20 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
case OP_FOLD:
VIsual_reselect = false; // don't reselect now
- foldCreate(curwin, oap->start.lnum, oap->end.lnum);
+ foldCreate(curwin, oap->start, oap->end);
break;
case OP_FOLDOPEN:
case OP_FOLDOPENREC:
case OP_FOLDCLOSE:
case OP_FOLDCLOSEREC:
- VIsual_reselect = false; /* don't reselect now */
- opFoldRange(oap->start.lnum, oap->end.lnum,
- oap->op_type == OP_FOLDOPEN
- || oap->op_type == OP_FOLDOPENREC,
- oap->op_type == OP_FOLDOPENREC
- || oap->op_type == OP_FOLDCLOSEREC,
- oap->is_VIsual);
+ VIsual_reselect = false; // don't reselect now
+ opFoldRange(oap->start, oap->end,
+ oap->op_type == OP_FOLDOPEN
+ || oap->op_type == OP_FOLDOPENREC,
+ oap->op_type == OP_FOLDOPENREC
+ || oap->op_type == OP_FOLDCLOSEREC,
+ oap->is_VIsual);
break;
case OP_FOLDDEL:
@@ -2483,7 +2483,7 @@ do_mouse (
typval_T rettv;
int doesrange;
(void)call_func((char_u *)tab_page_click_defs[mouse_col].func,
- (int)strlen(tab_page_click_defs[mouse_col].func),
+ -1,
&rettv, ARRAY_SIZE(argv), argv, NULL,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&doesrange, true, NULL, NULL);
@@ -2590,14 +2590,16 @@ do_mouse (
&& !is_drag
&& (jump_flags & (MOUSE_FOLD_CLOSE | MOUSE_FOLD_OPEN))
&& which_button == MOUSE_LEFT) {
- /* open or close a fold at this line */
- if (jump_flags & MOUSE_FOLD_OPEN)
- openFold(curwin->w_cursor.lnum, 1L);
- else
- closeFold(curwin->w_cursor.lnum, 1L);
- /* don't move the cursor if still in the same window */
- if (curwin == old_curwin)
+ // open or close a fold at this line
+ if (jump_flags & MOUSE_FOLD_OPEN) {
+ openFold(curwin->w_cursor, 1L);
+ } else {
+ closeFold(curwin->w_cursor, 1L);
+ }
+ // don't move the cursor if still in the same window
+ if (curwin == old_curwin) {
curwin->w_cursor = save_cursor;
+ }
}
@@ -4393,51 +4395,55 @@ dozet:
case 'i': curwin->w_p_fen = !curwin->w_p_fen;
break;
- /* "za": open closed fold or close open fold at cursor */
- case 'a': if (hasFolding(curwin->w_cursor.lnum, NULL, NULL))
- openFold(curwin->w_cursor.lnum, cap->count1);
- else {
- closeFold(curwin->w_cursor.lnum, cap->count1);
+ // "za": open closed fold or close open fold at cursor
+ case 'a': if (hasFolding(curwin->w_cursor.lnum, NULL, NULL)) {
+ openFold(curwin->w_cursor, cap->count1);
+ } else {
+ closeFold(curwin->w_cursor, cap->count1);
curwin->w_p_fen = true;
}
break;
- /* "zA": open fold at cursor recursively */
- case 'A': if (hasFolding(curwin->w_cursor.lnum, NULL, NULL))
- openFoldRecurse(curwin->w_cursor.lnum);
- else {
- closeFoldRecurse(curwin->w_cursor.lnum);
+ // "zA": open fold at cursor recursively
+ case 'A': if (hasFolding(curwin->w_cursor.lnum, NULL, NULL)) {
+ openFoldRecurse(curwin->w_cursor);
+ } else {
+ closeFoldRecurse(curwin->w_cursor);
curwin->w_p_fen = true;
}
break;
- /* "zo": open fold at cursor or Visual area */
- case 'o': if (VIsual_active)
+ // "zo": open fold at cursor or Visual area
+ case 'o': if (VIsual_active) {
nv_operator(cap);
- else
- openFold(curwin->w_cursor.lnum, cap->count1);
+ } else {
+ openFold(curwin->w_cursor, cap->count1);
+ }
break;
- /* "zO": open fold recursively */
- case 'O': if (VIsual_active)
+ // "zO": open fold recursively
+ case 'O': if (VIsual_active) {
nv_operator(cap);
- else
- openFoldRecurse(curwin->w_cursor.lnum);
+ } else {
+ openFoldRecurse(curwin->w_cursor);
+ }
break;
- /* "zc": close fold at cursor or Visual area */
- case 'c': if (VIsual_active)
+ // "zc": close fold at cursor or Visual area
+ case 'c': if (VIsual_active) {
nv_operator(cap);
- else
- closeFold(curwin->w_cursor.lnum, cap->count1);
+ } else {
+ closeFold(curwin->w_cursor, cap->count1);
+ }
curwin->w_p_fen = true;
break;
- /* "zC": close fold recursively */
- case 'C': if (VIsual_active)
+ // "zC": close fold recursively
+ case 'C': if (VIsual_active) {
nv_operator(cap);
- else
- closeFoldRecurse(curwin->w_cursor.lnum);
+ } else {
+ closeFoldRecurse(curwin->w_cursor);
+ }
curwin->w_p_fen = true;
break;
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 1f55d2c315..8329daf5f1 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -119,7 +119,7 @@ static char opchars[][3] =
{ 'r', NUL, OPF_CHANGE }, // OP_REPLACE
{ 'I', NUL, OPF_CHANGE }, // OP_INSERT
{ 'A', NUL, OPF_CHANGE }, // OP_APPEND
- { 'z', 'f', OPF_LINES }, // OP_FOLD
+ { 'z', 'f', 0 }, // OP_FOLD
{ 'z', 'o', OPF_LINES }, // OP_FOLDOPEN
{ 'z', 'O', OPF_LINES }, // OP_FOLDOPENREC
{ 'z', 'c', OPF_LINES }, // OP_FOLDCLOSE
@@ -1544,10 +1544,10 @@ int op_delete(oparg_T *oap)
oap->line_count = 0; // no lines deleted
} else if (oap->motion_type == kMTLineWise) {
if (oap->op_type == OP_CHANGE) {
- /* Delete the lines except the first one. Temporarily move the
- * cursor to the next line. Save the current line number, if the
- * last line is deleted it may be changed.
- */
+ // Delete the lines except the first one. Temporarily move the
+ // cursor to the next line. Save the current line number, if the
+ // last line is deleted it may be changed.
+
if (oap->line_count > 1) {
lnum = curwin->w_cursor.lnum;
++curwin->w_cursor.lnum;
@@ -1560,12 +1560,21 @@ int op_delete(oparg_T *oap)
beginline(BL_WHITE); // cursor on first non-white
did_ai = true; // delete the indent when ESC hit
ai_col = curwin->w_cursor.col;
- } else
- beginline(0); /* cursor in column 0 */
- truncate_line(FALSE); /* delete the rest of the line */
- /* leave cursor past last char in line */
- if (oap->line_count > 1)
- u_clearline(); /* "U" command not possible after "2cc" */
+ } else {
+ beginline(0); // cursor in column 0
+ }
+
+ int old_len = (int)STRLEN(ml_get(curwin->w_cursor.lnum));
+ truncate_line(false); // delete the rest of the line
+
+ extmark_splice_cols(curbuf,
+ (int)curwin->w_cursor.lnum-1, curwin->w_cursor.col,
+ old_len - curwin->w_cursor.col, 0, kExtmarkUndo);
+
+ // leave cursor past last char in line
+ if (oap->line_count > 1) {
+ u_clearline(); // "U" command not possible after "2cc"
+ }
} else {
del_lines(oap->line_count, TRUE);
beginline(BL_WHITE | BL_FIX);
@@ -3100,6 +3109,9 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
for (i = 0; i < y_size; i++) {
int spaces;
char shortline;
+ // can just be 0 or 1, needed for blockwise paste beyond the current
+ // buffer end
+ int lines_appended = 0;
bd.startspaces = 0;
bd.endspaces = 0;
@@ -3113,6 +3125,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
break;
}
nr_lines++;
+ lines_appended = 1;
}
/* get the old line and advance to the position to insert at */
oldp = get_cursor_line_ptr();
@@ -3185,14 +3198,15 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
memmove(ptr, oldp + bd.textcol + delcount, (size_t)columns);
ml_replace(curwin->w_cursor.lnum, newp, false);
extmark_splice_cols(curbuf, (int)curwin->w_cursor.lnum-1, bd.textcol,
- delcount, (int)totlen, kExtmarkUndo);
+ delcount, (int)totlen + lines_appended, kExtmarkUndo);
++curwin->w_cursor.lnum;
if (i == 0)
curwin->w_cursor.col += bd.startspaces;
}
- changed_lines(lnum, 0, curwin->w_cursor.lnum, nr_lines, true);
+ changed_lines(lnum, 0, curbuf->b_op_start.lnum + (linenr_T)y_size
+ - (linenr_T)nr_lines , nr_lines, true);
/* Set '[ mark. */
curbuf->b_op_start = curwin->w_cursor;
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 8d74cead8d..6ae9378236 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -174,6 +174,7 @@ static char_u *p_syn;
static char_u *p_spc;
static char_u *p_spf;
static char_u *p_spl;
+static char_u *p_spo;
static long p_ts;
static long p_tw;
static int p_udf;
@@ -2285,6 +2286,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_s.b_p_spc);
check_string_option(&buf->b_s.b_p_spf);
check_string_option(&buf->b_s.b_p_spl);
+ check_string_option(&buf->b_s.b_p_spo);
check_string_option(&buf->b_p_sua);
check_string_option(&buf->b_p_cink);
check_string_option(&buf->b_p_cino);
@@ -3090,6 +3092,10 @@ ambw_end:
} else if (varp == &(curwin->w_s->b_p_spc)) {
// When 'spellcapcheck' is set compile the regexp program.
errmsg = compile_cap_prog(curwin->w_s);
+ } else if (varp == &(curwin->w_s->b_p_spo)) { // 'spelloptions'
+ if (**varp != NUL && STRCMP("camel", *varp) != 0) {
+ errmsg = e_invarg;
+ }
} else if (varp == &p_sps) { // 'spellsuggest'
if (spell_check_sps() != OK) {
errmsg = e_invarg;
@@ -5896,6 +5902,7 @@ static char_u *get_varp(vimoption_T *p)
case PV_SPC: return (char_u *)&(curwin->w_s->b_p_spc);
case PV_SPF: return (char_u *)&(curwin->w_s->b_p_spf);
case PV_SPL: return (char_u *)&(curwin->w_s->b_p_spl);
+ case PV_SPO: return (char_u *)&(curwin->w_s->b_p_spo);
case PV_SW: return (char_u *)&(curbuf->b_p_sw);
case PV_TFU: return (char_u *)&(curbuf->b_p_tfu);
case PV_TS: return (char_u *)&(curbuf->b_p_ts);
@@ -6175,6 +6182,7 @@ void buf_copy_options(buf_T *buf, int flags)
(void)compile_cap_prog(&buf->b_s);
buf->b_s.b_p_spf = vim_strsave(p_spf);
buf->b_s.b_p_spl = vim_strsave(p_spl);
+ buf->b_s.b_p_spo = vim_strsave(p_spo);
buf->b_p_inde = vim_strsave(p_inde);
buf->b_p_indk = vim_strsave(p_indk);
buf->b_p_fp = empty_option;
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 02fa7ac216..a09811c8fb 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -787,6 +787,7 @@ enum {
, BV_SPC
, BV_SPF
, BV_SPL
+ , BV_SPO
, BV_STS
, BV_SUA
, BV_SW
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index f1221a52a2..02df0ab276 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -2320,6 +2320,16 @@ return {
defaults={if_true={vi="best"}}
},
{
+ full_name='spelloptions', abbreviation='spo',
+ type='string', list='onecomma', scope={'buffer'},
+ deny_duplicates=true,
+ secure=true,
+ vi_def=true,
+ expand=true,
+ varname='p_spo',
+ defaults={if_true={vi="", vim=""}}
+ },
+ {
full_name='splitbelow', abbreviation='sb',
type='bool', scope={'global'},
vi_def=true,
diff --git a/src/nvim/os/lang.c b/src/nvim/os/lang.c
index fe2d7986bf..603191a0ff 100644
--- a/src/nvim/os/lang.c
+++ b/src/nvim/os/lang.c
@@ -43,14 +43,20 @@ void lang_init(void)
}
}
+ char buf[50] = { 0 };
+ bool set_lang;
if (lang_region) {
- os_setenv("LANG", lang_region, true);
+ set_lang = true;
+ xstrlcpy(buf, lang_region, sizeof(buf));
} else {
- char buf[20] = { 0 };
- if (CFStringGetCString(cf_lang_region, buf, 20,
- kCFStringEncodingUTF8)) {
- os_setenv("LANG", buf, true);
+ set_lang = CFStringGetCString(cf_lang_region, buf, 40,
+ kCFStringEncodingUTF8);
+ }
+ if (set_lang) {
+ if (strcasestr(buf, "utf-8") == NULL) {
+ xstrlcat(buf, ".UTF-8", sizeof(buf));
}
+ os_setenv("LANG", buf, true);
}
CFRelease(cf_lang_region);
# ifdef HAVE_LOCALE_H
diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c
index c712762bdf..3beada5bc9 100644
--- a/src/nvim/popupmnu.c
+++ b/src/nvim/popupmnu.c
@@ -226,6 +226,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
pum_above = false;
// Leave two lines of context if possible
+ validate_cheight();
if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) {
context_lines = 3;
} else {
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index e897be5f6b..fc2e1a4295 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -811,7 +811,7 @@ retry:
}
break;
}
- if (STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 1] == '\n') {
+ if (STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 2] == '\n') {
break;
}
}
@@ -904,6 +904,7 @@ static bool qf_list_has_valid_entries(qf_list_T *qfl)
/// Return a pointer to a list in the specified quickfix stack
static qf_list_T * qf_get_list(qf_info_T *qi, int idx)
+ FUNC_ATTR_NONNULL_ALL
{
return &qi->qf_lists[idx];
}
@@ -1233,6 +1234,7 @@ static char_u * qf_cmdtitle(char_u *cmd)
/// Return a pointer to the current list in the specified quickfix stack
static qf_list_T * qf_get_curlist(qf_info_T *qi)
+ FUNC_ATTR_NONNULL_ALL
{
return qf_get_list(qi, qi->qf_curlist);
}
@@ -3840,7 +3842,7 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
// Add an error line to the quickfix buffer.
static int qf_buf_add_line(buf_T *buf, linenr_T lnum, const qfline_T *qfp,
- char_u *dirname)
+ char_u *dirname, bool first_bufline)
FUNC_ATTR_NONNULL_ALL
{
int len;
@@ -3855,9 +3857,12 @@ static int qf_buf_add_line(buf_T *buf, linenr_T lnum, const qfline_T *qfp,
if (qfp->qf_type == 1) { // :helpgrep
STRLCPY(IObuff, path_tail(errbuf->b_fname), IOSIZE - 1);
} else {
- // shorten the file name if not done already
- if (errbuf->b_sfname == NULL
- || path_is_absolute(errbuf->b_sfname)) {
+ // Shorten the file name if not done already.
+ // For optimization, do this only for the first entry in a
+ // buffer.
+ if (first_bufline
+ && (errbuf->b_sfname == NULL
+ || path_is_absolute(errbuf->b_sfname))) {
if (*dirname == NUL) {
os_dirname(dirname, MAXPATHL);
}
@@ -3935,6 +3940,7 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last)
// Check if there is anything to display
if (qfl != NULL) {
char_u dirname[MAXPATHL];
+ int prev_bufnr = -1;
*dirname = NUL;
@@ -3947,9 +3953,11 @@ static void qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last)
lnum = buf->b_ml.ml_line_count;
}
while (lnum < qfl->qf_count) {
- if (qf_buf_add_line(buf, lnum, qfp, dirname) == FAIL) {
+ if (qf_buf_add_line(buf, lnum, qfp, dirname,
+ prev_bufnr != qfp->qf_fnum) == FAIL) {
break;
}
+ prev_bufnr = qfp->qf_fnum;
lnum++;
qfp = qfp->qf_next;
if (qfp == NULL) {
@@ -4915,12 +4923,13 @@ static bool vgr_qflist_valid(win_T *wp, qf_info_T *qi, unsigned qfid,
/// Search for a pattern in all the lines in a buffer and add the matching lines
/// to a quickfix list.
static bool vgr_match_buflines(qf_info_T *qi, char_u *fname, buf_T *buf,
- regmmatch_T *regmatch, long tomatch,
+ regmmatch_T *regmatch, long *tomatch,
int duplicate_name, int flags)
+ FUNC_ATTR_NONNULL_ARG(1, 3, 4, 5)
{
bool found_match = false;
- for (long lnum = 1; lnum <= buf->b_ml.ml_line_count && tomatch > 0; lnum++) {
+ for (long lnum = 1; lnum <= buf->b_ml.ml_line_count && *tomatch > 0; lnum++) {
colnr_T col = 0;
while (vim_regexec_multi(regmatch, curwin, buf, lnum, col, NULL,
NULL) > 0) {
@@ -4946,7 +4955,7 @@ static bool vgr_match_buflines(qf_info_T *qi, char_u *fname, buf_T *buf,
break;
}
found_match = true;
- if (--tomatch == 0) {
+ if (--*tomatch == 0) {
break;
}
if ((flags & VGR_GLOBAL) == 0 || regmatch->endpos[0].lnum > 0) {
@@ -5120,7 +5129,7 @@ void ex_vimgrep(exarg_T *eap)
} else {
// Try for a match in all lines of the buffer.
// For ":1vimgrep" look for first match only.
- found_match = vgr_match_buflines(qi, fname, buf, &regmatch, tomatch,
+ found_match = vgr_match_buflines(qi, fname, buf, &regmatch, &tomatch,
duplicate_name, flags);
if (using_dummy) {
@@ -6458,7 +6467,7 @@ void ex_cexpr(exarg_T *eap)
// Evaluate the expression. When the result is a string or a list we can
// use it to fill the errorlist.
typval_T tv;
- if (eval0(eap->arg, &tv, NULL, true) != FAIL) {
+ if (eval0(eap->arg, &tv, &eap->nextcmd, true) != FAIL) {
if ((tv.v_type == VAR_STRING && tv.vval.v_string != NULL)
|| tv.v_type == VAR_LIST) {
incr_quickfix_busy();
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index bcf02af4ef..6316129c6a 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -6708,14 +6708,14 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest,
argv[0].vval.v_list = &matchList.sl_list;
if (expr->v_type == VAR_FUNC) {
s = expr->vval.v_string;
- call_func(s, (int)STRLEN(s), &rettv, 1, argv,
+ call_func(s, -1, &rettv, 1, argv,
fill_submatch_list, 0L, 0L, &dummy,
true, NULL, NULL);
} else if (expr->v_type == VAR_PARTIAL) {
partial_T *partial = expr->vval.v_partial;
s = partial_name(partial);
- call_func(s, (int)STRLEN(s), &rettv, 1, argv,
+ call_func(s, -1, &rettv, 1, argv,
fill_submatch_list, 0L, 0L, &dummy,
true, partial, NULL);
}
@@ -7387,6 +7387,7 @@ long vim_regexec_multi(
proftime_T *tm, // timeout limit or NULL
int *timed_out // flag is set when timeout limit reached
)
+ FUNC_ATTR_NONNULL_ARG(1)
{
regexec_T rex_save;
bool rex_in_use_save = rex_in_use;
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 3c2e1ccaf5..a75b146024 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -133,8 +133,6 @@ static sattr_T *linebuf_attr = NULL;
static match_T search_hl; /* used for 'hlsearch' highlight matching */
-static foldinfo_T win_foldinfo; /* info for 'foldcolumn' */
-
StlClickDefinition *tab_page_click_defs = NULL;
long tab_page_click_defs_size = 0;
@@ -158,6 +156,8 @@ static bool msg_grid_invalid = false;
static bool resizing = false;
+static bool do_luahl_line = false;
+
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "screen.c.generated.h"
#endif
@@ -508,12 +508,12 @@ int update_screen(int type)
}
buf_T *buf = wp->w_buffer;
- if (buf->b_luahl && buf->b_luahl_window != LUA_NOREF) {
+ if (luahl_active && luahl_start != LUA_NOREF) {
Error err = ERROR_INIT;
FIXED_TEMP_ARRAY(args, 2);
args.items[0] = BUFFER_OBJ(buf->handle);
args.items[1] = INTEGER_OBJ(display_tick);
- nlua_call_ref(buf->b_luahl_start, "start", args, false, &err);
+ nlua_call_ref(luahl_start, "start", args, false, &err);
if (ERROR_SET(&err)) {
ELOG("error in luahl start: %s", err.msg);
api_clear_error(&err);
@@ -639,10 +639,11 @@ bool decorations_active = false;
void decorations_add_luahl_attr(int attr_id,
int start_row, int start_col,
- int end_row, int end_col)
+ int end_row, int end_col, VirtText *virt_text)
{
kv_push(decorations.active,
- ((HlRange){ start_row, start_col, end_row, end_col, attr_id, NULL }));
+ ((HlRange){ start_row, start_col,
+ end_row, end_col, attr_id, virt_text, true }));
}
/*
@@ -697,9 +698,10 @@ static void win_update(win_T *wp)
int didline = FALSE; /* if TRUE, we finished the last line */
int i;
long j;
- static int recursive = FALSE; /* being called recursively */
- int old_botline = wp->w_botline;
- long fold_count;
+ static bool recursive = false; // being called recursively
+ const linenr_T old_botline = wp->w_botline;
+ const int old_wrow = wp->w_wrow;
+ const int old_wcol = wp->w_wcol;
// Remember what happened to the previous line.
#define DID_NONE 1 // didn't update a line
#define DID_LINE 2 // updated a normal line
@@ -710,6 +712,7 @@ static void win_update(win_T *wp)
linenr_T mod_bot = 0;
int save_got_int;
+
// If we can compute a change in the automatic sizing of the sign column
// under 'signcolumn=auto:X' and signs currently placed in the buffer, better
// figuring it out here so we can redraw the entire screen for it.
@@ -898,11 +901,12 @@ static void win_update(win_T *wp)
|| type == INVERTED || type == INVERTED_ALL)
&& !wp->w_botfill && !wp->w_old_botfill
) {
- if (mod_top != 0 && wp->w_topline == mod_top) {
- /*
- * w_topline is the first changed line, the scrolling will be done
- * further down.
- */
+ if (mod_top != 0
+ && wp->w_topline == mod_top
+ && (!wp->w_lines[0].wl_valid
+ || wp->w_topline <= wp->w_lines[0].wl_lnum)) {
+ // w_topline is the first changed line and window is not scrolled,
+ // the scrolling from changed lines will be done further down.
} else if (wp->w_lines[0].wl_valid
&& (wp->w_topline < wp->w_lines[0].wl_lnum
|| (wp->w_topline == wp->w_lines[0].wl_lnum
@@ -1226,7 +1230,6 @@ static void win_update(win_T *wp)
// Set the time limit to 'redrawtime'.
proftime_T syntax_tm = profile_setlimit(p_rdt);
syn_set_timeout(&syntax_tm);
- win_foldinfo.fi_level = 0;
/*
* Update all the window rows.
@@ -1238,7 +1241,9 @@ static void win_update(win_T *wp)
decorations_active = decorations_redraw_reset(buf, &decorations);
- if (buf->b_luahl && buf->b_luahl_window != LUA_NOREF) {
+ do_luahl_line = false;
+
+ if (luahl_win != LUA_NOREF) {
Error err = ERROR_INIT;
FIXED_TEMP_ARRAY(args, 4);
linenr_T knownmax = ((wp->w_valid & VALID_BOTLINE)
@@ -1251,7 +1256,13 @@ static void win_update(win_T *wp)
args.items[3] = INTEGER_OBJ(knownmax);
// TODO(bfredl): we could allow this callback to change mod_top, mod_bot.
// For now the "start" callback is expected to use nvim__buf_redraw_range.
- nlua_call_ref(buf->b_luahl_window, "window", args, false, &err);
+ Object ret = nlua_call_ref(luahl_win, "win", args, true, &err);
+
+ if (!ERROR_SET(&err) && api_is_truthy(ret, "luahl_window retval", &err)) {
+ do_luahl_line = true;
+ decorations_active = true;
+ }
+
if (ERROR_SET(&err)) {
ELOG("error in luahl window: %s", err.msg);
api_clear_error(&err);
@@ -1448,24 +1459,19 @@ static void win_update(win_T *wp)
* Otherwise, display normally (can be several display lines when
* 'wrap' is on).
*/
- fold_count = foldedCount(wp, lnum, &win_foldinfo);
- if (fold_count != 0) {
- fold_line(wp, fold_count, &win_foldinfo, lnum, row);
- ++row;
- --fold_count;
- wp->w_lines[idx].wl_folded = TRUE;
- wp->w_lines[idx].wl_lastlnum = lnum + fold_count;
- did_update = DID_FOLD;
- } else if (idx < wp->w_lines_valid
- && wp->w_lines[idx].wl_valid
- && wp->w_lines[idx].wl_lnum == lnum
- && lnum > wp->w_topline
- && !(dy_flags & (DY_LASTLINE | DY_TRUNCATE))
- && srow + wp->w_lines[idx].wl_size > wp->w_grid.Rows
- && diff_check_fill(wp, lnum) == 0
- ) {
- /* This line is not going to fit. Don't draw anything here,
- * will draw "@ " lines below. */
+ foldinfo_T foldinfo = fold_info(wp, lnum);
+
+ if (foldinfo.fi_lines == 0
+ && idx < wp->w_lines_valid
+ && wp->w_lines[idx].wl_valid
+ && wp->w_lines[idx].wl_lnum == lnum
+ && lnum > wp->w_topline
+ && !(dy_flags & (DY_LASTLINE | DY_TRUNCATE))
+ && srow + wp->w_lines[idx].wl_size > wp->w_grid.Rows
+ && diff_check_fill(wp, lnum) == 0
+ ) {
+ // This line is not going to fit. Don't draw anything here,
+ // will draw "@ " lines below.
row = wp->w_grid.Rows + 1;
} else {
prepare_search_hl(wp, lnum);
@@ -1474,14 +1480,21 @@ static void win_update(win_T *wp)
&& syntax_present(wp))
syntax_end_parsing(syntax_last_parsed + 1);
- /*
- * Display one line.
- */
- row = win_line(wp, lnum, srow, wp->w_grid.Rows, mod_top == 0, false);
+ // Display one line
+ row = win_line(wp, lnum, srow,
+ foldinfo.fi_lines ? srow : wp->w_grid.Rows,
+ mod_top == 0, false, foldinfo);
- wp->w_lines[idx].wl_folded = FALSE;
+ wp->w_lines[idx].wl_folded = foldinfo.fi_lines != 0;
wp->w_lines[idx].wl_lastlnum = lnum;
did_update = DID_LINE;
+
+ if (foldinfo.fi_lines > 0) {
+ did_update = DID_FOLD;
+ foldinfo.fi_lines--;
+ wp->w_lines[idx].wl_lastlnum = lnum + foldinfo.fi_lines;
+ }
+
syntax_last_parsed = lnum;
}
@@ -1496,20 +1509,17 @@ static void win_update(win_T *wp)
idx++;
break;
}
- if (dollar_vcol == -1)
+ if (dollar_vcol == -1) {
wp->w_lines[idx].wl_size = row - srow;
- ++idx;
- lnum += fold_count + 1;
+ }
+ idx++;
+ lnum += foldinfo.fi_lines + 1;
} else {
if (wp->w_p_rnu) {
// 'relativenumber' set: The text doesn't need to be drawn, but
// the number column nearly always does.
- fold_count = foldedCount(wp, lnum, &win_foldinfo);
- if (fold_count != 0) {
- fold_line(wp, fold_count, &win_foldinfo, lnum, row);
- } else {
- (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true);
- }
+ foldinfo_T info = fold_info(wp, lnum);
+ (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true, info);
}
// This line does not need to be drawn, advance to the next one.
@@ -1631,18 +1641,51 @@ static void win_update(win_T *wp)
wp->w_valid |= VALID_BOTLINE;
wp->w_viewport_invalid = true;
if (wp == curwin && wp->w_botline != old_botline && !recursive) {
- recursive = TRUE;
+ const linenr_T old_topline = wp->w_topline;
+ const int new_wcol = wp->w_wcol;
+ recursive = true;
curwin->w_valid &= ~VALID_TOPLINE;
- update_topline(); /* may invalidate w_botline again */
- if (must_redraw != 0) {
- /* Don't update for changes in buffer again. */
+ update_topline(); // may invalidate w_botline again
+
+ if (old_wcol != new_wcol
+ && (wp->w_valid & (VALID_WCOL|VALID_WROW))
+ != (VALID_WCOL|VALID_WROW)) {
+ // A win_line() call applied a fix to screen cursor column to
+ // accomodate concealment of cursor line, but in this call to
+ // update_topline() the cursor's row or column got invalidated.
+ // If they are left invalid, setcursor() will recompute them
+ // but there won't be any further win_line() call to re-fix the
+ // column and the cursor will end up misplaced. So we call
+ // cursor validation now and reapply the fix again (or call
+ // win_line() to do it for us).
+ validate_cursor();
+ if (wp->w_wcol == old_wcol
+ && wp->w_wrow == old_wrow
+ && old_topline == wp->w_topline) {
+ wp->w_wcol = new_wcol;
+ } else {
+ redrawWinline(wp, wp->w_cursor.lnum);
+ }
+ }
+ // New redraw either due to updated topline or due to wcol fix.
+ if (wp->w_redr_type != 0) {
+ // Don't update for changes in buffer again.
i = curbuf->b_mod_set;
curbuf->b_mod_set = false;
+ j = curbuf->b_mod_xlines;
+ curbuf->b_mod_xlines = 0;
win_update(curwin);
- must_redraw = 0;
curbuf->b_mod_set = i;
+ curbuf->b_mod_xlines = j;
+ }
+ // Other windows might have w_redr_type raised in update_topline().
+ must_redraw = 0;
+ FOR_ALL_WINDOWS_IN_TAB(wwp, curtab) {
+ if (wwp->w_redr_type > must_redraw) {
+ must_redraw = wwp->w_redr_type;
+ }
}
- recursive = FALSE;
+ recursive = false;
}
}
@@ -1741,31 +1784,6 @@ static int advance_color_col(int vcol, int **color_cols)
return **color_cols >= 0;
}
-// Returns the next grid column.
-static int text_to_screenline(win_T *wp, char_u *text, int col, int off)
- FUNC_ATTR_NONNULL_ALL
-{
- int idx = wp->w_p_rl ? off : off + col;
- LineState s = LINE_STATE(text);
-
- while (*s.p != NUL) {
- // TODO(bfredl): cargo-culted from the old Vim code:
- // if(col + cells > wp->w_width - (wp->w_p_rl ? col : 0)) { break; }
- // This is obvious wrong. If Vim ever fixes this, solve for "cells" again
- // in the correct condition.
- const int maxcells = wp->w_grid.Columns - col - (wp->w_p_rl ? col : 0);
- const int cells = line_putchar(&s, &linebuf_char[idx], maxcells,
- wp->w_p_rl);
- if (cells == -1) {
- break;
- }
- col += cells;
- idx += cells;
- }
-
- return col;
-}
-
// Compute the width of the foldcolumn. Based on 'foldcolumn' and how much
// space is available for window "wp", minus "col".
static int compute_foldcolumn(win_T *wp, int col)
@@ -1830,271 +1848,6 @@ static int line_putchar(LineState *s, schar_T *dest, int maxcells, bool rl)
return cells;
}
-/*
- * Display one folded line.
- */
-static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T lnum, int row)
-{
- char_u buf[FOLD_TEXT_LEN];
- pos_T *top, *bot;
- linenr_T lnume = lnum + fold_count - 1;
- int len;
- char_u *text;
- int fdc;
- int col;
- int txtcol;
- int off;
-
- /* Build the fold line:
- * 1. Add the cmdwin_type for the command-line window
- * 2. Add the 'foldcolumn'
- * 3. Add the 'number' or 'relativenumber' column
- * 4. Compose the text
- * 5. Add the text
- * 6. set highlighting for the Visual area an other text
- */
- col = 0;
- off = 0;
-
- /*
- * 1. Add the cmdwin_type for the command-line window
- * Ignores 'rightleft', this window is never right-left.
- */
- if (cmdwin_type != 0 && wp == curwin) {
- schar_from_ascii(linebuf_char[off], cmdwin_type);
- linebuf_attr[off] = win_hl_attr(wp, HLF_AT);
- col++;
- }
-
-# define RL_MEMSET(p, v, l) \
- do { \
- if (wp->w_p_rl) { \
- for (int ri = 0; ri < l; ri++) { \
- linebuf_attr[off + (wp->w_grid.Columns - (p) - (l)) + ri] = v; \
- } \
- } else { \
- for (int ri = 0; ri < l; ri++) { \
- linebuf_attr[off + (p) + ri] = v; \
- } \
- } \
- } while (0)
-
- // 2. Add the 'foldcolumn'
- // Reduce the width when there is not enough space.
- fdc = compute_foldcolumn(wp, col);
- if (fdc > 0) {
- fill_foldcolumn(buf, wp, true, lnum);
- const char_u *it = &buf[0];
- for (int i = 0; i < fdc; i++) {
- int mb_c = mb_ptr2char_adv(&it);
- if (wp->w_p_rl) {
- schar_from_char(linebuf_char[off + wp->w_grid.Columns - i - 1 - col],
- mb_c);
- } else {
- schar_from_char(linebuf_char[off + col + i], mb_c);
- }
- }
- RL_MEMSET(col, win_hl_attr(wp, HLF_FC), fdc);
- col += fdc;
- }
-
- /* Set all attributes of the 'number' or 'relativenumber' column and the
- * text */
- RL_MEMSET(col, win_hl_attr(wp, HLF_FL), wp->w_grid.Columns - col);
-
- // If signs are being displayed, add spaces.
- if (win_signcol_count(wp) > 0) {
- len = wp->w_grid.Columns - col;
- if (len > 0) {
- int len_max = win_signcol_width(wp) * win_signcol_count(wp);
- if (len > len_max) {
- len = len_max;
- }
- char_u space_buf[18] = " ";
- assert((size_t)len_max <= sizeof(space_buf));
- copy_text_attr(off + col, space_buf, len,
- win_hl_attr(wp, HLF_FL));
- col += len;
- }
- }
-
- /*
- * 3. Add the 'number' or 'relativenumber' column
- */
- if (wp->w_p_nu || wp->w_p_rnu) {
- len = wp->w_grid.Columns - col;
- if (len > 0) {
- int w = number_width(wp);
- long num;
- char *fmt = "%*ld ";
-
- if (len > w + 1)
- len = w + 1;
-
- if (wp->w_p_nu && !wp->w_p_rnu)
- /* 'number' + 'norelativenumber' */
- num = (long)lnum;
- else {
- /* 'relativenumber', don't use negative numbers */
- num = labs((long)get_cursor_rel_lnum(wp, lnum));
- if (num == 0 && wp->w_p_nu && wp->w_p_rnu) {
- /* 'number' + 'relativenumber': cursor line shows absolute
- * line number */
- num = lnum;
- fmt = "%-*ld ";
- }
- }
-
- snprintf((char *)buf, FOLD_TEXT_LEN, fmt, w, num);
- if (wp->w_p_rl) {
- // the line number isn't reversed
- copy_text_attr(off + wp->w_grid.Columns - len - col, buf, len,
- win_hl_attr(wp, HLF_FL));
- } else {
- copy_text_attr(off + col, buf, len, win_hl_attr(wp, HLF_FL));
- }
- col += len;
- }
- }
-
- /*
- * 4. Compose the folded-line string with 'foldtext', if set.
- */
- text = get_foldtext(wp, lnum, lnume, foldinfo, buf);
-
- txtcol = col; /* remember where text starts */
-
- // 5. move the text to linebuf_char[off]. Fill up with "fold".
- // Right-left text is put in columns 0 - number-col, normal text is put
- // in columns number-col - window-width.
- col = text_to_screenline(wp, text, col, off);
-
- /* Fill the rest of the line with the fold filler */
- if (wp->w_p_rl)
- col -= txtcol;
-
- schar_T sc;
- schar_from_char(sc, wp->w_p_fcs_chars.fold);
- while (col < wp->w_grid.Columns
- - (wp->w_p_rl ? txtcol : 0)
- ) {
- schar_copy(linebuf_char[off+col++], sc);
- }
-
- if (text != buf)
- xfree(text);
-
- /*
- * 6. set highlighting for the Visual area an other text.
- * If all folded lines are in the Visual area, highlight the line.
- */
- if (VIsual_active && wp->w_buffer == curwin->w_buffer) {
- if (ltoreq(curwin->w_cursor, VIsual)) {
- /* Visual is after curwin->w_cursor */
- top = &curwin->w_cursor;
- bot = &VIsual;
- } else {
- /* Visual is before curwin->w_cursor */
- top = &VIsual;
- bot = &curwin->w_cursor;
- }
- if (lnum >= top->lnum
- && lnume <= bot->lnum
- && (VIsual_mode != 'v'
- || ((lnum > top->lnum
- || (lnum == top->lnum
- && top->col == 0))
- && (lnume < bot->lnum
- || (lnume == bot->lnum
- && (bot->col - (*p_sel == 'e'))
- >= (colnr_T)STRLEN(ml_get_buf(wp->w_buffer, lnume,
- FALSE))))))) {
- if (VIsual_mode == Ctrl_V) {
- // Visual block mode: highlight the chars part of the block
- if (wp->w_old_cursor_fcol + txtcol < (colnr_T)wp->w_grid.Columns) {
- if (wp->w_old_cursor_lcol != MAXCOL
- && wp->w_old_cursor_lcol + txtcol
- < (colnr_T)wp->w_grid.Columns) {
- len = wp->w_old_cursor_lcol;
- } else {
- len = wp->w_grid.Columns - txtcol;
- }
- RL_MEMSET(wp->w_old_cursor_fcol + txtcol, win_hl_attr(wp, HLF_V),
- len - (int)wp->w_old_cursor_fcol);
- }
- } else {
- // Set all attributes of the text
- RL_MEMSET(txtcol, win_hl_attr(wp, HLF_V), wp->w_grid.Columns - txtcol);
- }
- }
- }
-
- // Show colorcolumn in the fold line, but let cursorcolumn override it.
- if (wp->w_p_cc_cols) {
- int i = 0;
- int j = wp->w_p_cc_cols[i];
- int old_txtcol = txtcol;
-
- while (j > -1) {
- txtcol += j;
- if (wp->w_p_wrap) {
- txtcol -= wp->w_skipcol;
- } else {
- txtcol -= wp->w_leftcol;
- }
- if (txtcol >= 0 && txtcol < wp->w_grid.Columns) {
- linebuf_attr[off + txtcol] =
- hl_combine_attr(linebuf_attr[off + txtcol], win_hl_attr(wp, HLF_MC));
- }
- txtcol = old_txtcol;
- j = wp->w_p_cc_cols[++i];
- }
- }
-
- /* Show 'cursorcolumn' in the fold line. */
- if (wp->w_p_cuc) {
- txtcol += wp->w_virtcol;
- if (wp->w_p_wrap)
- txtcol -= wp->w_skipcol;
- else
- txtcol -= wp->w_leftcol;
- if (txtcol >= 0 && txtcol < wp->w_grid.Columns) {
- linebuf_attr[off + txtcol] = hl_combine_attr(
- linebuf_attr[off + txtcol], win_hl_attr(wp, HLF_CUC));
- }
- }
-
- grid_put_linebuf(&wp->w_grid, row, 0, wp->w_grid.Columns, wp->w_grid.Columns,
- false, wp, wp->w_hl_attr_normal, false);
-
- /*
- * Update w_cline_height and w_cline_folded if the cursor line was
- * updated (saves a call to plines() later).
- */
- if (wp == curwin
- && lnum <= curwin->w_cursor.lnum
- && lnume >= curwin->w_cursor.lnum) {
- curwin->w_cline_row = row;
- curwin->w_cline_height = 1;
- curwin->w_cline_folded = true;
- curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW);
- conceal_cursor_used = conceal_cursor_line(curwin);
- }
-}
-
-
-/// Copy "buf[len]" to linebuf_char["off"] and set attributes to "attr".
-///
-/// Only works for ASCII text!
-static void copy_text_attr(int off, char_u *buf, int len, int attr)
-{
- int i;
-
- for (i = 0; i < len; i++) {
- schar_from_ascii(linebuf_char[off + i], buf[i]);
- linebuf_attr[off + i] = attr;
- }
-}
/// Fills the foldcolumn at "p" for window "wp".
/// Only to be called when 'foldcolumn' > 0.
@@ -2109,7 +1862,7 @@ static size_t
fill_foldcolumn(
char_u *p,
win_T *wp,
- int closed,
+ foldinfo_T foldinfo,
linenr_T lnum
)
{
@@ -2120,10 +1873,11 @@ fill_foldcolumn(
size_t char_counter = 0;
int symbol = 0;
int len = 0;
+ bool closed = foldinfo.fi_lines > 0;
// Init to all spaces.
memset(p, ' ', MAX_MCO * fdc + 1);
- level = win_foldinfo.fi_level;
+ level = foldinfo.fi_level;
// If the column is too narrow, we start at the lowest level that
// fits and use numbers to indicated the depth.
@@ -2133,8 +1887,8 @@ fill_foldcolumn(
}
for (i = 0; i < MIN(fdc, level); i++) {
- if (win_foldinfo.fi_lnum == lnum
- && first_level + i >= win_foldinfo.fi_low_level) {
+ if (foldinfo.fi_lnum == lnum
+ && first_level + i >= foldinfo.fi_low_level) {
symbol = wp->w_p_fcs_chars.foldopen;
} else if (first_level == 1) {
symbol = wp->w_p_fcs_chars.foldsep;
@@ -2165,21 +1919,27 @@ fill_foldcolumn(
return MAX(char_counter + (fdc-i), (size_t)fdc);
}
-/*
- * Display line "lnum" of window 'wp' on the screen.
- * Start at row "startrow", stop when "endrow" is reached.
- * wp->w_virtcol needs to be valid.
- *
- * Return the number of last row the line occupies.
- */
+
+/// Display line "lnum" of window 'wp' on the screen.
+/// Start at row "startrow", stop when "endrow" is reached.
+/// wp->w_virtcol needs to be valid.
+///
+/// @param lnum line to display
+/// @param endrow stop drawing once reaching this row
+/// @param nochange not updating for changed text
+/// @param number_only only update the number column
+/// @param foldinfo fold info for this line
+///
+/// @return the number of last row the line occupies.
static int
win_line (
win_T *wp,
linenr_T lnum,
int startrow,
int endrow,
- bool nochange, // not updating for changed text
- bool number_only // only update the number column
+ bool nochange,
+ bool number_only,
+ foldinfo_T foldinfo
)
{
int c = 0; // init for GCC
@@ -2284,6 +2044,8 @@ win_line (
bool has_decorations = false; // this buffer has decorations
bool do_virttext = false; // draw virtual text for this line
+ char_u buf_fold[FOLD_TEXT_LEN + 1]; // Hold value returned by get_foldtext
+
/* draw_state: items that are drawn in sequence: */
#define WL_START 0 /* nothing done yet */
# define WL_CMDLINE WL_START + 1 /* cmdline window column */
@@ -2348,7 +2110,7 @@ win_line (
}
if (decorations_active) {
- if (buf->b_luahl && buf->b_luahl_line != LUA_NOREF) {
+ if (do_luahl_line && luahl_line != LUA_NOREF) {
Error err = ERROR_INIT;
FIXED_TEMP_ARRAY(args, 3);
args.items[0] = WINDOW_OBJ(wp->handle);
@@ -2356,14 +2118,10 @@ win_line (
args.items[2] = INTEGER_OBJ(lnum-1);
lua_attr_active = true;
extra_check = true;
- Object o = nlua_call_ref(buf->b_luahl_line, "line", args, true, &err);
+ nlua_call_ref(luahl_line, "line", args, false, &err);
lua_attr_active = false;
- if (o.type == kObjectTypeString) {
- // TODO(bfredl): this is a bit of a hack. A final API should use an
- // "unified" interface where luahl can add both bufhl and virttext
- luatext = o.data.string.data;
- do_virttext = true;
- } else if (ERROR_SET(&err)) {
+
+ if (ERROR_SET(&err)) {
ELOG("error in luahl line: %s", err.msg);
luatext = err.msg;
do_virttext = true;
@@ -2839,7 +2597,7 @@ win_line (
// already be in use.
xfree(p_extra_free);
p_extra_free = xmalloc(MAX_MCO * fdc + 1);
- n_extra = fill_foldcolumn(p_extra_free, wp, false, lnum);
+ n_extra = fill_foldcolumn(p_extra_free, wp, foldinfo, lnum);
p_extra_free[n_extra] = NUL;
p_extra = p_extra_free;
c_extra = NUL;
@@ -3065,6 +2823,51 @@ win_line (
break;
}
+ if (draw_state == WL_LINE
+ && foldinfo.fi_level != 0
+ && foldinfo.fi_lines > 0
+ && vcol == 0
+ && n_extra == 0
+ && row == startrow) {
+ char_attr = win_hl_attr(wp, HLF_FL);
+
+ linenr_T lnume = lnum + foldinfo.fi_lines - 1;
+ memset(buf_fold, ' ', FOLD_TEXT_LEN);
+ p_extra = get_foldtext(wp, lnum, lnume, foldinfo, buf_fold);
+ n_extra = STRLEN(p_extra);
+
+ if (p_extra != buf_fold) {
+ xfree(p_extra_free);
+ p_extra_free = p_extra;
+ }
+ c_extra = NUL;
+ c_final = NUL;
+ p_extra[n_extra] = NUL;
+ }
+
+ if (draw_state == WL_LINE
+ && foldinfo.fi_level != 0
+ && foldinfo.fi_lines > 0
+ && col < grid->Columns
+ && n_extra == 0
+ && row == startrow) {
+ // fill rest of line with 'fold'
+ c_extra = wp->w_p_fcs_chars.fold;
+ c_final = NUL;
+
+ n_extra = wp->w_p_rl ? (col + 1) : (grid->Columns - col);
+ }
+
+ if (draw_state == WL_LINE
+ && foldinfo.fi_level != 0
+ && foldinfo.fi_lines > 0
+ && col >= grid->Columns
+ && n_extra != 0
+ && row == startrow) {
+ // Truncate the folding.
+ n_extra = 0;
+ }
+
if (draw_state == WL_LINE && (area_highlighting || has_spell)) {
// handle Visual or match highlighting in this line
if (vcol == fromcol
@@ -3293,6 +3096,10 @@ win_line (
p_extra++;
}
n_extra--;
+ } else if (foldinfo.fi_lines > 0) {
+ // skip writing the buffer line itself
+ c = NUL;
+ XFREE_CLEAR(p_extra_free);
} else {
int c0;
@@ -3861,7 +3668,7 @@ win_line (
// not showing the '>', put pointer back to avoid getting stuck
ptr++;
}
- }
+ } // end of printing from buffer content
/* In the cursor line and we may be concealing characters: correct
* the cursor column when we reach its position. */
@@ -3918,7 +3725,7 @@ win_line (
}
// At end of the text line or just after the last character.
- if (c == NUL) {
+ if (c == NUL && eol_hl_off == 0) {
long prevcol = (long)(ptr - line) - 1;
// we're not really at that column when skipping some text
@@ -4171,11 +3978,10 @@ win_line (
if (wp == curwin && lnum == curwin->w_cursor.lnum) {
curwin->w_cline_row = startrow;
curwin->w_cline_height = row - startrow;
- curwin->w_cline_folded = false;
+ curwin->w_cline_folded = foldinfo.fi_lines > 0;
curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW);
conceal_cursor_used = conceal_cursor_line(curwin);
}
-
break;
}
@@ -4364,6 +4170,7 @@ win_line (
* so far. If there is no more to display it is caught above.
*/
if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns))
+ && foldinfo.fi_lines == 0
&& (*ptr != NUL
|| filler_todo > 0
|| (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 23d84038d6..ea2107c5c7 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -96,12 +96,8 @@ static int lastc_bytelen = 1; // >1 for multi-byte char
// copy of spats[], for keeping the search patterns while executing autocmds
static struct spat saved_spats[2];
-// copy of spats[RE_SEARCH], for keeping the search patterns while incremental
-// searching
-static struct spat saved_last_search_spat;
-static int did_save_last_search_spat = 0;
-static int saved_last_idx = 0;
-static bool saved_no_hlsearch = false;
+static int saved_spats_last_idx = 0;
+static bool saved_spats_no_hlsearch = false;
static char_u *mr_pattern = NULL; // pattern used by search_regcomp()
static int mr_pattern_alloced = false; // mr_pattern was allocated
@@ -268,8 +264,8 @@ void save_search_patterns(void)
saved_spats[1] = spats[1];
if (spats[1].pat != NULL)
saved_spats[1].pat = vim_strsave(spats[1].pat);
- saved_last_idx = last_idx;
- saved_no_hlsearch = no_hlsearch;
+ saved_spats_last_idx = last_idx;
+ saved_spats_no_hlsearch = no_hlsearch;
}
}
@@ -281,8 +277,8 @@ void restore_search_patterns(void)
set_vv_searchforward();
free_spat(&spats[1]);
spats[1] = saved_spats[1];
- last_idx = saved_last_idx;
- set_no_hlsearch(saved_no_hlsearch);
+ last_idx = saved_spats_last_idx;
+ set_no_hlsearch(saved_spats_no_hlsearch);
}
}
@@ -309,6 +305,13 @@ void free_search_patterns(void)
#endif
+// copy of spats[RE_SEARCH], for keeping the search patterns while incremental
+// searching
+static struct spat saved_last_search_spat;
+static int did_save_last_search_spat = 0;
+static int saved_last_idx = 0;
+static bool saved_no_hlsearch = false;
+
/// Save and restore the search pattern for incremental highlight search
/// feature.
///
@@ -317,10 +320,9 @@ void free_search_patterns(void)
/// cancelling incremental searching even if it's called inside user functions.
void save_last_search_pattern(void)
{
- if (did_save_last_search_spat != 0) {
- IEMSG("did_save_last_search_spat is not zero");
- } else {
- did_save_last_search_spat++;
+ if (++did_save_last_search_spat != 1) {
+ // nested call, nothing to do
+ return;
}
saved_last_search_spat = spats[RE_SEARCH];
@@ -333,11 +335,15 @@ void save_last_search_pattern(void)
void restore_last_search_pattern(void)
{
- if (did_save_last_search_spat != 1) {
- IEMSG("did_save_last_search_spat is not one");
+ if (--did_save_last_search_spat > 0) {
+ // nested call, nothing to do
+ return;
+ }
+ if (did_save_last_search_spat != 0) {
+ iemsg("restore_last_search_pattern() called more often than"
+ " save_last_search_pattern()");
return;
}
- did_save_last_search_spat--;
xfree(spats[RE_SEARCH].pat);
spats[RE_SEARCH] = saved_last_search_spat;
@@ -488,7 +494,7 @@ void set_last_search_pat(const char_u *s, int idx, int magic, int setlast)
saved_spats[idx].pat = NULL;
else
saved_spats[idx].pat = vim_strsave(spats[idx].pat);
- saved_last_idx = last_idx;
+ saved_spats_last_idx = last_idx;
}
/* If 'hlsearch' set and search pat changed: need redraw. */
if (p_hls && idx == last_idx && !no_hlsearch)
@@ -645,6 +651,10 @@ int searchit(
colnr_T col = at_first_line && (options & SEARCH_COL) ? pos->col : 0;
nmatched = vim_regexec_multi(&regmatch, win, buf,
lnum, col, tm, timed_out);
+ // vim_regexec_multi() may clear "regprog"
+ if (regmatch.regprog == NULL) {
+ break;
+ }
// Abort searching on an error (e.g., out of stack).
if (called_emsg || (timed_out != NULL && *timed_out)) {
break;
@@ -716,6 +726,10 @@ int searchit(
match_ok = false;
break;
}
+ // vim_regexec_multi() may clear "regprog"
+ if (regmatch.regprog == NULL) {
+ break;
+ }
matchpos = regmatch.startpos[0];
endpos = regmatch.endpos[0];
submatch = first_submatch(&regmatch);
@@ -805,10 +819,13 @@ int searchit(
}
break;
}
-
- /* Need to get the line pointer again, a
- * multi-line search may have made it invalid. */
- ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE);
+ // vim_regexec_multi() may clear "regprog"
+ if (regmatch.regprog == NULL) {
+ break;
+ }
+ // Need to get the line pointer again, a
+ // multi-line search may have made it invalid.
+ ptr = ml_get_buf(buf, lnum + matchpos.lnum, false);
}
/*
@@ -885,6 +902,11 @@ int searchit(
}
at_first_line = FALSE;
+ // vim_regexec_multi() may clear "regprog"
+ if (regmatch.regprog == NULL) {
+ break;
+ }
+
// Stop the search if wrapscan isn't set, "stop_lnum" is
// specified, after an interrupt, after a match and after looping
// twice.
@@ -1149,8 +1171,8 @@ int do_search(
pat = p; /* put pat after search command */
}
- if ((options & SEARCH_ECHO) && messaging()
- && !cmd_silent && msg_silent == 0) {
+ if ((options & SEARCH_ECHO) && messaging() && !msg_silent
+ && (!cmd_silent || !shortmess(SHM_SEARCHCOUNT))) {
char_u *trunc;
char_u off_buf[40];
size_t off_len = 0;
@@ -1159,7 +1181,8 @@ int do_search(
msg_start();
// Get the offset, so we know how long it is.
- if (spats[0].off.line || spats[0].off.end || spats[0].off.off) {
+ if (!cmd_silent
+ && (spats[0].off.line || spats[0].off.end || spats[0].off.off)) {
p = off_buf; // -V507
*p++ = dirc;
if (spats[0].off.end) {
@@ -1179,19 +1202,19 @@ int do_search(
}
if (*searchstr == NUL) {
- p = spats[last_idx].pat;
+ p = spats[0].pat;
} else {
p = searchstr;
}
- if (!shortmess(SHM_SEARCHCOUNT)) {
+ if (!shortmess(SHM_SEARCHCOUNT) || cmd_silent) {
// Reserve enough space for the search pattern + offset +
// search stat. Use all the space available, so that the
// search state is right aligned. If there is not enough space
// msg_strtrunc() will shorten in the middle.
if (ui_has(kUIMessages)) {
len = 0; // adjusted below
- } else if (msg_scrolled != 0) {
+ } else if (msg_scrolled != 0 && !cmd_silent) {
// Use all the columns.
len = (Rows - msg_row) * Columns - 1;
} else {
@@ -1208,11 +1231,13 @@ int do_search(
xfree(msgbuf);
msgbuf = xmalloc(len);
- {
- memset(msgbuf, ' ', len);
- msgbuf[0] = dirc;
- msgbuf[len - 1] = NUL;
+ memset(msgbuf, ' ', len);
+ msgbuf[len - 1] = NUL;
+ // do not fill the msgbuf buffer, if cmd_silent is set, leave it
+ // empty for the search_stat feature.
+ if (!cmd_silent) {
+ msgbuf[0] = dirc;
if (utf_iscomposing(utf_ptr2char(p))) {
// Use a space to draw the composing char on.
msgbuf[1] = ' ';
@@ -1356,12 +1381,15 @@ int do_search(
// Show [1/15] if 'S' is not in 'shortmess'.
if ((options & SEARCH_ECHO)
&& messaging()
- && !(cmd_silent + msg_silent)
+ && !msg_silent
&& c != FAIL
&& !shortmess(SHM_SEARCHCOUNT)
&& msgbuf != NULL) {
search_stat(dirc, &pos, show_top_bot_msg, msgbuf,
- (count != 1 || has_offset));
+ (count != 1
+ || has_offset
+ || (!(fdo_flags & FDO_SEARCH)
+ && hasFolding(curwin->w_cursor.lnum, NULL, NULL))));
}
// The search command can be followed by a ';' to do another search.
@@ -4231,7 +4259,8 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, Direction direction)
if (nmatched != 0) {
break;
}
- } while (direction == FORWARD
+ } while (regmatch.regprog != NULL
+ && direction == FORWARD
? regmatch.startpos[0].col < pos.col
: regmatch.startpos[0].col > pos.col);
@@ -4350,7 +4379,9 @@ static void search_stat(int dirc, pos_T *pos,
len = STRLEN(t);
if (show_top_bot_msg && len + 2 < SEARCH_STAT_BUF_LEN) {
- STRCPY(t + len, " W");
+ memmove(t + 2, t, len);
+ t[0] = 'W';
+ t[1] = ' ';
len += 2;
}
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index dc1bfe25b4..f036d7fe04 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -362,6 +362,8 @@ size_t spell_check(
size_t wrongcaplen = 0;
int lpi;
bool count_word = docount;
+ bool use_camel_case = *wp->w_s->b_p_spo != NUL;
+ bool camel_case = false;
// A word never starts at a space or a control character. Return quickly
// then, skipping over the character.
@@ -394,9 +396,24 @@ size_t spell_check(
mi.mi_word = ptr;
mi.mi_fend = ptr;
if (spell_iswordp(mi.mi_fend, wp)) {
+ int prev_upper;
+ int this_upper;
+
+ if (use_camel_case) {
+ c = PTR2CHAR(mi.mi_fend);
+ this_upper = SPELL_ISUPPER(c);
+ }
+
do {
MB_PTR_ADV(mi.mi_fend);
- } while (*mi.mi_fend != NUL && spell_iswordp(mi.mi_fend, wp));
+ if (use_camel_case) {
+ prev_upper = this_upper;
+ c = PTR2CHAR(mi.mi_fend);
+ this_upper = SPELL_ISUPPER(c);
+ camel_case = !prev_upper && this_upper;
+ }
+ } while (*mi.mi_fend != NUL && spell_iswordp(mi.mi_fend, wp)
+ && !camel_case);
if (capcol != NULL && *capcol == 0 && wp->w_s->b_cap_prog != NULL) {
// Check word starting with capital letter.
@@ -428,6 +445,11 @@ size_t spell_check(
(void)spell_casefold(ptr, (int)(mi.mi_fend - ptr), mi.mi_fword, MAXWLEN + 1);
mi.mi_fwordlen = (int)STRLEN(mi.mi_fword);
+ if (camel_case) {
+ // introduce a fake word end space into the folded word.
+ mi.mi_fword[mi.mi_fwordlen - 1] = ' ';
+ }
+
// The word is bad unless we recognize it.
mi.mi_result = SP_BAD;
mi.mi_result2 = SP_BAD;
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 4aa7c21ce4..9a9cc45c6b 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -5588,9 +5588,11 @@ void ex_ownsyntax(exarg_T *eap)
hash_init(&curwin->w_s->b_keywtab_ic);
// TODO: Keep the spell checking as it was. NOLINT(readability/todo)
curwin->w_p_spell = false; // No spell checking
+ // make sure option values are "empty_option" instead of NULL
clear_string_option(&curwin->w_s->b_p_spc);
clear_string_option(&curwin->w_s->b_p_spf);
clear_string_option(&curwin->w_s->b_p_spl);
+ clear_string_option(&curwin->w_s->b_p_spo);
clear_string_option(&curwin->w_s->b_syn_isk);
}
diff --git a/src/nvim/testdir/check.vim b/src/nvim/testdir/check.vim
index 073873bcb0..7f6b7dcfec 100644
--- a/src/nvim/testdir/check.vim
+++ b/src/nvim/testdir/check.vim
@@ -25,6 +25,14 @@ func CheckFunction(name)
endif
endfunc
+" Command to check for the presence of python. Argument should have been
+" obtained with PythonProg()
+func CheckPython(name)
+ if a:name == ''
+ throw 'Skipped: python command not available'
+ endif
+endfunc
+
" Command to check for running on MS-Windows
command CheckMSWindows call CheckMSWindows()
func CheckMSWindows()
@@ -65,3 +73,27 @@ func CheckCanRunGui()
throw 'Skipped: cannot start the GUI'
endif
endfunc
+
+" Command to check that not currently using the GUI
+command CheckNotGui call CheckNotGui()
+func CheckNotGui()
+ if has('gui_running')
+ throw 'Skipped: only works in the terminal'
+ endif
+endfunc
+
+" Command to check that the current language is English
+command CheckEnglish call CheckEnglish()
+func CheckEnglish()
+ if v:lang != "C" && v:lang !~ '^[Ee]n'
+ throw 'Skipped: only works in English language environment'
+ endif
+endfunc
+
+" Command to check for NOT running on MS-Windows
+command CheckNotMSWindows call CheckNotMSWindows()
+func CheckNotMSWindows()
+ if has('win32')
+ throw 'Skipped: does not work on MS-Windows'
+ endif
+endfunc
diff --git a/src/nvim/testdir/shared.vim b/src/nvim/testdir/shared.vim
index 6180d542ff..9bc037a59f 100644
--- a/src/nvim/testdir/shared.vim
+++ b/src/nvim/testdir/shared.vim
@@ -294,6 +294,13 @@ func GetVimCommandClean()
return cmd
endfunc
+" Get the command to run Vim, with --clean, and force to run in terminal so it
+" won't start a new GUI.
+func GetVimCommandCleanTerm()
+ " Add -v to have gvim run in the terminal (if possible)
+ return GetVimCommandClean() .. ' -v '
+endfunc
+
" Run Vim, using the "vimcmd" file and "-u NORC".
" "before" is a list of Vim commands to be executed before loading plugins.
" "after" is a list of Vim commands to be executed after loading plugins.
@@ -329,3 +336,17 @@ func RunVimPiped(before, after, arguments, pipecmd)
endif
return 1
endfunc
+
+" Get all messages but drop the maintainer entry.
+func GetMessages()
+ redir => result
+ redraw | messages
+ redir END
+ let msg_list = split(result, "\n")
+ " if msg_list->len() > 0 && msg_list[0] =~ 'Messages maintainer:'
+ " return msg_list[1:]
+ " endif
+ return msg_list
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim
index 3dd68873d4..094bb3ebd1 100644
--- a/src/nvim/testdir/test_autocmd.vim
+++ b/src/nvim/testdir/test_autocmd.vim
@@ -1,6 +1,8 @@
" Tests for autocommands
source shared.vim
+source check.vim
+source term_util.vim
func! s:cleanup_buffers() abort
for bnr in range(1, bufnr('$'))
@@ -1735,6 +1737,35 @@ func Test_throw_in_BufWritePre()
au! throwing
endfunc
+func Test_autocmd_CmdWinEnter()
+ CheckRunVimInTerminal
+ " There is not cmdwin switch, so
+ " test for cmdline_hist
+ " (both are available with small builds)
+ CheckFeature cmdline_hist
+ let lines =<< trim END
+ let b:dummy_var = 'This is a dummy'
+ autocmd CmdWinEnter * quit
+ let winnr = winnr('$')
+ END
+ let filename='XCmdWinEnter'
+ call writefile(lines, filename)
+ let buf = RunVimInTerminal('-S '.filename, #{rows: 6})
+
+ call term_sendkeys(buf, "q:")
+ call term_wait(buf)
+ call term_sendkeys(buf, ":echo b:dummy_var\<cr>")
+ call WaitForAssert({-> assert_match('^This is a dummy', term_getline(buf, 6))}, 1000)
+ call term_sendkeys(buf, ":echo &buftype\<cr>")
+ call WaitForAssert({-> assert_notmatch('^nofile', term_getline(buf, 6))}, 1000)
+ call term_sendkeys(buf, ":echo winnr\<cr>")
+ call WaitForAssert({-> assert_match('^1', term_getline(buf, 6))}, 1000)
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete(filename)
+endfunc
+
func Test_FileChangedShell_reload()
if !has('unix')
return
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
index f8d84f1a49..871143699a 100644
--- a/src/nvim/testdir/test_cmdline.vim
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -1,5 +1,8 @@
" Tests for editing the command line.
+source check.vim
+source screendump.vim
+
func Test_complete_tab()
call writefile(['testfile'], 'Xtestfile')
call feedkeys(":e Xtestf\t\r", "tx")
@@ -718,6 +721,27 @@ func Test_verbosefile()
call delete('Xlog')
endfunc
+func Test_verbose_option()
+ " See test/functional/ui/cmdline_spec.lua
+ CheckScreendump
+
+ let lines =<< trim [SCRIPT]
+ command DoSomething echo 'hello' |set ts=4 |let v = '123' |echo v
+ call feedkeys("\r", 't') " for the hit-enter prompt
+ set verbose=20
+ [SCRIPT]
+ call writefile(lines, 'XTest_verbose')
+
+ let buf = RunVimInTerminal('-S XTest_verbose', {'rows': 12})
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, ":DoSomething\<CR>")
+ call VerifyScreenDump(buf, 'Test_verbose_option_1', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('XTest_verbose')
+endfunc
+
func Test_setcmdpos()
func InsertTextAtPos(text, pos)
call assert_equal(0, setcmdpos(a:pos))
diff --git a/src/nvim/testdir/test_display.vim b/src/nvim/testdir/test_display.vim
index 429253a863..e853b046dc 100644
--- a/src/nvim/testdir/test_display.vim
+++ b/src/nvim/testdir/test_display.vim
@@ -184,3 +184,40 @@ func Test_scroll_CursorLineNr_update()
call StopVimInTerminal(buf)
call delete(filename)
endfunc
+
+" Test for scrolling that modifies buffer during visual block
+func Test_visual_block_scroll()
+ " See test/functional/legacy/visual_mode_spec.lua
+ CheckScreendump
+
+ let lines =<< trim END
+ source $VIMRUNTIME/plugin/matchparen.vim
+ set scrolloff=1
+ call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}'])
+ call cursor(5, 1)
+ END
+
+ let filename = 'Xvisualblockmodifiedscroll'
+ call writefile(lines, filename)
+
+ let buf = RunVimInTerminal('-S '.filename, #{rows: 7})
+ call term_sendkeys(buf, "V\<C-D>\<C-D>")
+
+ call VerifyScreenDump(buf, 'Test_display_visual_block_scroll', {})
+
+ call StopVimInTerminal(buf)
+ call delete(filename)
+endfunc
+
+func Test_display_scroll_at_topline()
+ " See test/functional/legacy/display_spec.lua
+ CheckScreendump
+
+ let buf = RunVimInTerminal('', #{cols: 20})
+ call term_sendkeys(buf, ":call setline(1, repeat('a', 21))\<CR>")
+ call term_wait(buf)
+ call term_sendkeys(buf, "O\<Esc>")
+ call VerifyScreenDump(buf, 'Test_display_scroll_at_topline', #{rows: 4})
+
+ call StopVimInTerminal(buf)
+endfunc
diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim
index 12d5d9790e..d4b1c63741 100644
--- a/src/nvim/testdir/test_edit.vim
+++ b/src/nvim/testdir/test_edit.vim
@@ -1,9 +1,11 @@
" Test for edit functions
-"
+
if exists("+t_kD")
let &t_kD="[3;*~"
endif
+source check.vim
+
" Needed for testing basic rightleft: Test_edit_rightleft
source view_util.vim
@@ -733,17 +735,16 @@ func! Test_edit_CTRL_O()
endfunc
func! Test_edit_CTRL_R()
- throw 'skipped: Nvim does not support test_override()'
" Insert Register
new
- call test_override("ALL", 1)
+ " call test_override("ALL", 1)
set showcmd
call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix')
call feedkeys("O\<c-r>.", 'tnix')
call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix')
call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix')
call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$'))
- call test_override("ALL", 0)
+ " call test_override("ALL", 0)
set noshowcmd
bw!
endfunc
@@ -955,7 +956,6 @@ func! Test_edit_DROP()
endfunc
func! Test_edit_CTRL_V()
- throw 'skipped: Nvim does not support test_override()'
if has("ebcdic")
return
endif
@@ -965,7 +965,7 @@ func! Test_edit_CTRL_V()
" force some redraws
set showmode showcmd
"call test_override_char_avail(1)
- call test_override('ALL', 1)
+ " call test_override('ALL', 1)
call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
@@ -978,7 +978,7 @@ func! Test_edit_CTRL_V()
set norl
endif
- call test_override('ALL', 0)
+ " call test_override('ALL', 0)
set noshowmode showcmd
bw!
endfunc
@@ -1514,3 +1514,48 @@ func Test_edit_startinsert()
set backspace&
bwipe!
endfunc
+
+func Test_edit_noesckeys()
+ CheckNotGui
+ new
+
+ " <Left> moves cursor when 'esckeys' is set
+ exe "set t_kl=\<Esc>OD"
+ " set esckeys
+ call feedkeys("axyz\<Esc>ODX", "xt")
+ " call assert_equal("xyXz", getline(1))
+
+ " <Left> exits Insert mode when 'esckeys' is off
+ " set noesckeys
+ call setline(1, '')
+ call feedkeys("axyz\<Esc>ODX", "xt")
+ call assert_equal(["DX", "xyz"], getline(1, 2))
+
+ bwipe!
+ " set esckeys
+endfunc
+
+" Test for editing a directory
+func Test_edit_is_a_directory()
+ CheckEnglish
+ let dirname = getcwd() . "/Xdir"
+ call mkdir(dirname, 'p')
+
+ new
+ redir => msg
+ exe 'edit' dirname
+ redir END
+ call assert_match("is a directory$", split(msg, "\n")[0])
+ bwipe!
+
+ let dirname .= '/'
+
+ new
+ redir => msg
+ exe 'edit' dirname
+ redir END
+ call assert_match("is a directory$", split(msg, "\n")[0])
+ bwipe!
+
+ call delete(dirname, 'rf')
+endfunc
diff --git a/src/nvim/testdir/test_environ.vim b/src/nvim/testdir/test_environ.vim
index 21bb09a690..a25d83753c 100644
--- a/src/nvim/testdir/test_environ.vim
+++ b/src/nvim/testdir/test_environ.vim
@@ -1,5 +1,9 @@
+" Test for environment variables.
+
scriptencoding utf-8
+source check.vim
+
func Test_environ()
unlet! $TESTENV
call assert_equal(0, has_key(environ(), 'TESTENV'))
@@ -42,3 +46,24 @@ func Test_external_env()
endif
call assert_equal('', result)
endfunc
+
+func Test_mac_locale()
+ CheckFeature osxdarwin
+
+ " If $LANG is not set then the system locale will be used.
+ " Run Vim after unsetting all the locale environmental vars, and capture the
+ " output of :lang.
+ let lang_results = system("unset LANG; unset LC_MESSAGES; " ..
+ \ shellescape(v:progpath) ..
+ \ " --clean -esX -c 'redir @a' -c 'lang' -c 'put a' -c 'print' -c 'qa!' ")
+
+ " Check that:
+ " 1. The locale is the form of <locale>.UTF-8.
+ " 2. Check that fourth item (LC_NUMERIC) is properly set to "C".
+ " Example match: "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
+ call assert_match('"\([a-zA-Z_]\+\.UTF-8/\)\{3}C\(/[a-zA-Z_]\+\.UTF-8\)\{2}"',
+ \ lang_results,
+ \ "Default locale should have UTF-8 encoding set, and LC_NUMERIC set to 'C'")
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim
index 617e3dfe41..c7ca682c8c 100644
--- a/src/nvim/testdir/test_filetype.vim
+++ b/src/nvim/testdir/test_filetype.vim
@@ -128,6 +128,7 @@ let s:filename_checks = {
\ 'dart': ['file.dart', 'file.drt'],
\ 'datascript': ['file.ds'],
\ 'dcd': ['file.dcd'],
+ \ 'debchangelog': ['changelog.Debian', 'changelog.dch', 'NEWS.Debian', 'NEWS.dch', '/debian/changelog'],
\ 'debcontrol': ['/debian/control'],
\ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list'],
\ 'def': ['file.def'],
@@ -326,7 +327,7 @@ let s:filename_checks = {
\ 'pamconf': ['/etc/pam.conf'],
\ 'pamenv': ['/etc/security/pam_env.conf', '/home/user/.pam_environment'],
\ 'papp': ['file.papp', 'file.pxml', 'file.pxsl'],
- \ 'pascal': ['file.pas', 'file.dpr'],
+ \ 'pascal': ['file.pas', 'file.pp', 'file.dpr', 'file.lpr'],
\ 'passwd': ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak'],
\ 'pccts': ['file.g'],
\ 'pdf': ['file.pdf'],
@@ -455,7 +456,7 @@ let s:filename_checks = {
\ 'texmf': ['texmf.cnf'],
\ 'text': ['file.text', 'README'],
\ 'tf': ['file.tf', '.tfrc', 'tfrc'],
- \ 'tidy': ['.tidyrc', 'tidyrc'],
+ \ 'tidy': ['.tidyrc', 'tidyrc', 'tidy.conf'],
\ 'tilde': ['file.t.html'],
\ 'tli': ['file.tli'],
\ 'tmux': ['tmuxfile.conf', '.tmuxfile.conf'],
diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim
index 6b45ac61d1..8fa70a5313 100644
--- a/src/nvim/testdir/test_functions.vim
+++ b/src/nvim/testdir/test_functions.vim
@@ -1221,6 +1221,24 @@ func Test_reg_executing_and_recording()
unlet s:reg_stat
endfunc
+func Test_getchar()
+ call feedkeys('a', '')
+ call assert_equal(char2nr('a'), getchar())
+
+ " call test_setmouse(1, 3)
+ " let v:mouse_win = 9
+ " let v:mouse_winid = 9
+ " let v:mouse_lnum = 9
+ " let v:mouse_col = 9
+ " call feedkeys("\<S-LeftMouse>", '')
+ call nvim_input_mouse('left', 'press', 'S', 0, 0, 2)
+ call assert_equal("\<S-LeftMouse>", getchar())
+ call assert_equal(1, v:mouse_win)
+ call assert_equal(win_getid(1), v:mouse_winid)
+ call assert_equal(1, v:mouse_lnum)
+ call assert_equal(3, v:mouse_col)
+endfunc
+
func Test_libcall_libcallnr()
if !has('libcall')
return
@@ -1341,3 +1359,22 @@ func Test_readdir()
call delete('Xdir', 'rf')
endfunc
+
+" Test for the eval() function
+func Test_eval()
+ call assert_fails("call eval('5 a')", 'E488:')
+endfunc
+
+" Test for the nr2char() function
+func Test_nr2char()
+ " set encoding=latin1
+ call assert_equal('@', nr2char(64))
+ set encoding=utf8
+ call assert_equal('a', nr2char(97, 1))
+ call assert_equal('a', nr2char(97, 0))
+
+ call assert_equal("\x80\xfc\b\xf4\x80\xfeX\x80\xfeX\x80\xfeX", eval('"\<M-' .. nr2char(0x100000) .. '>"'))
+ call assert_equal("\x80\xfc\b\xfd\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX\x80\xfeX", eval('"\<M-' .. nr2char(0x40000000) .. '>"'))
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_gf.vim b/src/nvim/testdir/test_gf.vim
index 4a4ffcefa1..ee548037ba 100644
--- a/src/nvim/testdir/test_gf.vim
+++ b/src/nvim/testdir/test_gf.vim
@@ -1,3 +1,4 @@
+" Test for the gf and gF (goto file) commands
" This is a test if a URL is recognized by "gf", with the cursor before and
" after the "://". Also test ":\\".
@@ -109,7 +110,7 @@ func Test_gf()
endfunc
func Test_gf_visual()
- call writefile([], "Xtest_gf_visual")
+ call writefile(['one', 'two', 'three', 'four'], "Xtest_gf_visual")
new
call setline(1, 'XXXtest_gf_visualXXX')
set hidden
@@ -118,6 +119,30 @@ func Test_gf_visual()
norm! ttvtXgf
call assert_equal('Xtest_gf_visual', bufname('%'))
+ " if multiple lines are selected, then gf should fail
+ call setline(1, ["one", "two"])
+ normal VGgf
+ call assert_equal('Xtest_gf_visual', @%)
+
+ " following line number is used for gF
+ bwipe!
+ new
+ call setline(1, 'XXXtest_gf_visual:3XXX')
+ norm! 0ttvt:gF
+ call assert_equal('Xtest_gf_visual', bufname('%'))
+ call assert_equal(3, getcurpos()[1])
+
+ " line number in visual area is used for file name
+ if has('unix')
+ bwipe!
+ call writefile([], "Xtest_gf_visual:3")
+ new
+ call setline(1, 'XXXtest_gf_visual:3XXX')
+ norm! 0ttvtXgF
+ call assert_equal('Xtest_gf_visual:3', bufname('%'))
+ call delete('Xtest_gf_visual:3')
+ endif
+
bwipe!
call delete('Xtest_gf_visual')
set hidden&
diff --git a/src/nvim/testdir/test_highlight.vim b/src/nvim/testdir/test_highlight.vim
index 6aa187b17e..00e42733a7 100644
--- a/src/nvim/testdir/test_highlight.vim
+++ b/src/nvim/testdir/test_highlight.vim
@@ -596,9 +596,17 @@ endfunc
" This test must come before the Test_cursorline test, as it appears this
" defines the Normal highlighting group anyway.
func Test_1_highlight_Normalgroup_exists()
- " MS-Windows GUI sets the font
- if !has('win32') || !has('gui_running')
- let hlNormal = HighlightArgs('Normal')
+ let hlNormal = HighlightArgs('Normal')
+ if !has('gui_running')
call assert_match('hi Normal\s*clear', hlNormal)
+ elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
+ " expect is DEFAULT_FONT of gui_gtk_x11.c
+ call assert_match('hi Normal\s*font=Monospace 10', hlNormal)
+ elseif has('gui_motif') || has('gui_athena')
+ " expect is DEFAULT_FONT of gui_x11.c
+ call assert_match('hi Normal\s*font=7x13', hlNormal)
+ elseif has('win32')
+ " expect any font
+ call assert_match('hi Normal\s*font=.*', hlNormal)
endif
endfunc
diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim
index 1c275d5bd1..1339a9f25d 100644
--- a/src/nvim/testdir/test_ins_complete.vim
+++ b/src/nvim/testdir/test_ins_complete.vim
@@ -1,3 +1,5 @@
+source screendump.vim
+source check.vim
" Test for insert expansion
func Test_ins_complete()
@@ -338,3 +340,27 @@ func Test_compl_in_cmdwin()
delcom GetInput
set wildmenu& wildchar&
endfunc
+
+func Test_pum_with_folds_two_tabs()
+ CheckScreendump
+
+ let lines =<< trim END
+ set fdm=marker
+ call setline(1, ['" x {{{1', '" a some text'])
+ call setline(3, range(&lines)->map({_, val -> '" a' .. val}))
+ norm! zm
+ tab sp
+ call feedkeys('2Gzv', 'xt')
+ call feedkeys("0fa", 'xt')
+ END
+
+ call writefile(lines, 'Xpumscript')
+ let buf = RunVimInTerminal('-S Xpumscript', #{rows: 10})
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, "a\<C-N>")
+ call VerifyScreenDump(buf, 'Test_pum_with_folds_two_tabs', {})
+
+ call term_sendkeys(buf, "\<Esc>")
+ call StopVimInTerminal(buf)
+ call delete('Xpumscript')
+endfunc
diff --git a/src/nvim/testdir/test_lambda.vim b/src/nvim/testdir/test_lambda.vim
index bfbb3e5c5b..f026c8a55f 100644
--- a/src/nvim/testdir/test_lambda.vim
+++ b/src/nvim/testdir/test_lambda.vim
@@ -181,7 +181,7 @@ function! Test_lambda_scope()
let l:D = s:NewCounter2()
call assert_equal(1, l:C())
- call assert_fails(':call l:D()', 'E15:') " E121: then E15:
+ call assert_fails(':call l:D()', 'E121:')
call assert_equal(2, l:C())
endfunction
diff --git a/src/nvim/testdir/test_listdict.vim b/src/nvim/testdir/test_listdict.vim
index bea62cb0ad..31a8b48d37 100644
--- a/src/nvim/testdir/test_listdict.vim
+++ b/src/nvim/testdir/test_listdict.vim
@@ -280,6 +280,14 @@ func Test_dict_func_remove_in_use()
call assert_equal(expected, d.func(string(remove(d, 'func'))))
endfunc
+func Test_dict_literal_keys()
+ call assert_equal({'one': 1, 'two2': 2, '3three': 3, '44': 4}, #{one: 1, two2: 2, 3three: 3, 44: 4},)
+
+ " why *{} cannot be used
+ let blue = 'blue'
+ call assert_equal('6', trim(execute('echo 2 *{blue: 3}.blue')))
+endfunc
+
" Nasty: deepcopy() dict that refers to itself (fails when noref used)
func Test_dict_deepcopy()
let d = {1:1, 2:2}
diff --git a/src/nvim/testdir/test_mapping.vim b/src/nvim/testdir/test_mapping.vim
index 82562339f6..152afb4b9d 100644
--- a/src/nvim/testdir/test_mapping.vim
+++ b/src/nvim/testdir/test_mapping.vim
@@ -391,6 +391,42 @@ func Test_motionforce_omap()
delfunc GetCommand
endfunc
+func Test_error_in_map_expr()
+ if !has('terminal') || (has('win32') && has('gui_running'))
+ throw 'Skipped: cannot run Vim in a terminal window'
+ endif
+
+ let lines =<< trim [CODE]
+ func Func()
+ " fail to create list
+ let x = [
+ endfunc
+ nmap <expr> ! Func()
+ set updatetime=50
+ [CODE]
+ call writefile(lines, 'Xtest.vim')
+
+ let buf = term_start(GetVimCommandCleanTerm() .. ' -S Xtest.vim', {'term_rows': 8})
+ let job = term_getjob(buf)
+ call WaitForAssert({-> assert_notequal('', term_getline(buf, 8))})
+
+ " GC must not run during map-expr processing, which can make Vim crash.
+ call term_sendkeys(buf, '!')
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, "\<CR>")
+ call term_wait(buf, 100)
+ call assert_equal('run', job_status(job))
+
+ call term_sendkeys(buf, ":qall!\<CR>")
+ call WaitFor({-> job_status(job) ==# 'dead'})
+ if has('unix')
+ call assert_equal('', job_info(job).termsig)
+ endif
+
+ call delete('Xtest.vim')
+ exe buf .. 'bwipe!'
+endfunc
+
" Test for mapping errors
func Test_map_error()
call assert_fails('unmap', 'E474:')
diff --git a/src/nvim/testdir/test_matchadd_conceal.vim b/src/nvim/testdir/test_matchadd_conceal.vim
index b918525dbc..393e183ddb 100644
--- a/src/nvim/testdir/test_matchadd_conceal.vim
+++ b/src/nvim/testdir/test_matchadd_conceal.vim
@@ -1,9 +1,11 @@
" Test for matchadd() and conceal feature
-if !has('conceal')
- finish
-endif
+
+source check.vim
+CheckFeature conceal
source shared.vim
+source term_util.vim
+source view_util.vim
function! Test_simple_matchadd()
new
@@ -273,3 +275,70 @@ function! Test_matchadd_and_syn_conceal()
call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
call assert_equal(screenattr(1, 11) , screenattr(1, 32))
endfunction
+
+func Test_cursor_column_in_concealed_line_after_window_scroll()
+ CheckRunVimInTerminal
+
+ " Test for issue #5012 fix.
+ " For a concealed line with cursor, there should be no window's cursor
+ " position invalidation during win_update() after scrolling attempt that is
+ " not successful and no real topline change happens. The invalidation would
+ " cause a window's cursor position recalc outside of win_line() where it's
+ " not possible to take conceal into account.
+ let lines =<< trim END
+ 3split
+ let m = matchadd('Conceal', '=')
+ setl conceallevel=2 concealcursor=nc
+ normal gg
+ "==expr==
+ END
+ call writefile(lines, 'Xcolesearch')
+ let buf = RunVimInTerminal('Xcolesearch', {})
+ call term_wait(buf, 100)
+
+ " Jump to something that is beyond the bottom of the window,
+ " so there's a scroll down.
+ call term_sendkeys(buf, ":so %\<CR>")
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, "/expr\<CR>")
+ call term_wait(buf, 100)
+
+ " Are the concealed parts of the current line really hidden?
+ let cursor_row = term_scrape(buf, '.')->map({_, e -> e.chars})->join('')
+ call assert_equal('"expr', cursor_row)
+
+ " BugFix check: Is the window's cursor column properly updated for hidden
+ " parts of the current line?
+ call assert_equal(2, term_getcursor(buf)[1])
+
+ call StopVimInTerminal(buf)
+ call delete('Xcolesearch')
+endfunc
+
+func Test_cursor_column_in_concealed_line_after_leftcol_change()
+ CheckRunVimInTerminal
+
+ " Test for issue #5214 fix.
+ let lines =<< trim END
+ 0put = 'ab' .. repeat('-', &columns) .. 'c'
+ call matchadd('Conceal', '-')
+ set nowrap ss=0 cole=3 cocu=n
+ END
+ call writefile(lines, 'Xcurs-columns')
+ let buf = RunVimInTerminal('-S Xcurs-columns', {})
+
+ " Go to the end of the line (3 columns beyond the end of the screen).
+ " Horizontal scroll would center the cursor in the screen line, but conceal
+ " makes it go to screen column 1.
+ call term_sendkeys(buf, "$")
+ call term_wait(buf)
+
+ " Are the concealed parts of the current line really hidden?
+ call WaitForAssert({-> assert_equal('c', term_getline(buf, '.'))})
+
+ " BugFix check: Is the window's cursor column properly updated for conceal?
+ call assert_equal(1, term_getcursor(buf)[1])
+
+ call StopVimInTerminal(buf)
+ call delete('Xcurs-columns')
+endfunc
diff --git a/src/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim
index bb0ed6e00c..fb464d95ea 100644
--- a/src/nvim/testdir/test_popup.vim
+++ b/src/nvim/testdir/test_popup.vim
@@ -2,6 +2,7 @@
source shared.vim
source screendump.vim
+source check.vim
let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
let g:setting = ''
@@ -755,6 +756,52 @@ func Test_popup_and_previewwindow_dump()
call delete('Xscript')
endfunc
+func Test_balloon_split()
+ CheckFunction balloon_split
+
+ call assert_equal([
+ \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"',
+ \ ], balloon_split(
+ \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"'))
+ call assert_equal([
+ \ 'one two three four one two three four one two thre',
+ \ 'e four',
+ \ ], balloon_split(
+ \ 'one two three four one two three four one two three four'))
+
+ eval 'struct = {one = 1, two = 2, three = 3}'
+ \ ->balloon_split()
+ \ ->assert_equal([
+ \ 'struct = {',
+ \ ' one = 1,',
+ \ ' two = 2,',
+ \ ' three = 3}',
+ \ ])
+
+ call assert_equal([
+ \ 'struct = {',
+ \ ' one = 1,',
+ \ ' nested = {',
+ \ ' n1 = "yes",',
+ \ ' n2 = "no"}',
+ \ ' two = 2}',
+ \ ], balloon_split(
+ \ 'struct = {one = 1, nested = {n1 = "yes", n2 = "no"} two = 2}'))
+ call assert_equal([
+ \ 'struct = 0x234 {',
+ \ ' long = 2343 "\\"some long string that will be wr',
+ \ 'apped in two\\"",',
+ \ ' next = 123}',
+ \ ], balloon_split(
+ \ 'struct = 0x234 {long = 2343 "\\"some long string that will be wrapped in two\\"", next = 123}'))
+ call assert_equal([
+ \ 'Some comment',
+ \ '',
+ \ 'typedef this that;',
+ \ ], balloon_split(
+ \ "Some comment\n\ntypedef this that;"))
+endfunc
+
func Test_popup_position()
if !CanRunVimInTerminal()
return
diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim
index 0178413a8e..4090db2874 100644
--- a/src/nvim/testdir/test_quickfix.vim
+++ b/src/nvim/testdir/test_quickfix.vim
@@ -95,7 +95,7 @@ func XlistTests(cchar)
" Populate the list and then try
Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
\ 'non-error 2', 'Xtestfile2:2:2:Line2',
- \ 'non-error 3', 'Xtestfile3:3:1:Line3']
+ \ 'non-error| 3', 'Xtestfile3:3:1:Line3']
" List only valid entries
let l = split(execute('Xlist', ''), "\n")
@@ -107,7 +107,7 @@ func XlistTests(cchar)
let l = split(execute('Xlist!', ''), "\n")
call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
\ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
- \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
+ \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
" List a range of errors
let l = split(execute('Xlist 3,6', ''), "\n")
@@ -507,7 +507,7 @@ func Xtest_browse(cchar)
Xexpr ""
call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
call assert_equal(0, g:Xgetlist({'size' : 0}).size)
- Xaddexpr ['foo', 'bar', 'baz', 'quux', 'shmoo']
+ Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
call assert_equal(5, g:Xgetlist({'size' : 0}).size)
Xlast
call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
@@ -1621,6 +1621,24 @@ func Test_long_lines()
call s:long_lines_tests('l')
endfunc
+func Test_cgetfile_on_long_lines()
+ " Problematic values if the line is longer than 4096 bytes. Then 1024 bytes
+ " are read at a time.
+ for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
+ let lines = [
+ \ '/tmp/file1:1:1:aaa',
+ \ '/tmp/file2:1:1:%s',
+ \ '/tmp/file3:1:1:bbb',
+ \ '/tmp/file4:1:1:ccc',
+ \ ]
+ let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
+ call writefile(lines, 'Xcqetfile.txt')
+ cgetfile Xcqetfile.txt
+ call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
+ endfor
+ call delete('Xcqetfile.txt')
+endfunc
+
func s:create_test_file(filename)
let l = []
for i in range(1, 20)
@@ -2474,6 +2492,22 @@ func Test_vimgrep()
call XvimgrepTests('l')
endfunc
+" Test for incsearch highlighting of the :vimgrep pattern
+" This test used to cause "E315: ml_get: invalid lnum" errors.
+func Test_vimgrep_incsearch()
+ throw 'skipped: Nvim does not support test_override()'
+ enew
+ set incsearch
+ call test_override("char_avail", 1)
+
+ call feedkeys(":2vimgrep assert test_quickfix.vim test_cdo.vim\<CR>", "ntx")
+ let l = getqflist()
+ call assert_equal(2, len(l))
+
+ call test_override("ALL", 0)
+ set noincsearch
+endfunc
+
func XfreeTests(cchar)
call s:setup_commands(a:cchar)
@@ -3523,6 +3557,18 @@ func Test_shorten_fname()
" Displaying the quickfix list should simplify the file path
silent! clist
call assert_equal('test_quickfix.vim', bufname('test_quickfix.vim'))
+ " Add a few entries for the same file with different paths and check whether
+ " the buffer name is shortened
+ %bwipe
+ call setqflist([], 'f')
+ call setqflist([{'filename' : 'test_quickfix.vim', 'lnum' : 10},
+ \ {'filename' : '../testdir/test_quickfix.vim', 'lnum' : 20},
+ \ {'filename' : fname, 'lnum' : 30}], ' ')
+ copen
+ call assert_equal(['test_quickfix.vim|10| ',
+ \ 'test_quickfix.vim|20| ',
+ \ 'test_quickfix.vim|30| '], getline(1, '$'))
+ cclose
endfunc
" Quickfix title tests
@@ -4087,4 +4133,46 @@ func Test_qfcmd_abort()
augroup END
endfunc
+" Test for using a file in one of the parent directories.
+func Test_search_in_dirstack()
+ call mkdir('Xtestdir/a/b/c', 'p')
+ let save_cwd = getcwd()
+ call writefile(["X1_L1", "X1_L2"], 'Xtestdir/Xfile1')
+ call writefile(["X2_L1", "X2_L2"], 'Xtestdir/a/Xfile2')
+ call writefile(["X3_L1", "X3_L2"], 'Xtestdir/a/b/Xfile3')
+ call writefile(["X4_L1", "X4_L2"], 'Xtestdir/a/b/c/Xfile4')
+
+ let lines = "Entering dir Xtestdir\n" .
+ \ "Entering dir a\n" .
+ \ "Entering dir b\n" .
+ \ "Xfile2:2:X2_L2\n" .
+ \ "Leaving dir a\n" .
+ \ "Xfile1:2:X1_L2\n" .
+ \ "Xfile3:1:X3_L1\n" .
+ \ "Entering dir c\n" .
+ \ "Xfile4:2:X4_L2\n" .
+ \ "Leaving dir c\n"
+ set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
+ cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
+ call assert_equal(11, getqflist({'size' : 0}).size)
+ call assert_equal(4, getqflist({'idx' : 0}).idx)
+ call assert_equal('X2_L2', getline('.'))
+ call assert_equal(1, next)
+ cnext
+ call assert_equal(6, getqflist({'idx' : 0}).idx)
+ call assert_equal('X1_L2', getline('.'))
+ cnext
+ call assert_equal(7, getqflist({'idx' : 0}).idx)
+ call assert_equal(1, line('$'))
+ call assert_equal('', getline(1))
+ cnext
+ call assert_equal(9, getqflist({'idx' : 0}).idx)
+ call assert_equal(1, line('$'))
+ call assert_equal('', getline(1))
+
+ set efm&
+ exe 'cd ' . save_cwd
+ call delete('Xtestdir', 'rf')
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim
index 767cf99be3..5db23c22a8 100644
--- a/src/nvim/testdir/test_search.vim
+++ b/src/nvim/testdir/test_search.vim
@@ -244,6 +244,10 @@ func Test_search_cmdline2()
" go to previous match (on line 2)
call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<C-T>\<cr>", 'tx')
call assert_equal(' 2 these', getline('.'))
+ 1
+ " go to previous match (on line 2)
+ call feedkeys("/the\<C-G>\<C-R>\<C-W>\<cr>", 'tx')
+ call assert_equal('theother', @/)
" Test 2: keep the view,
" after deleting a character from the search cmd
@@ -255,7 +259,7 @@ func Test_search_cmdline2()
call assert_equal({'lnum': 10, 'leftcol': 0, 'col': 4, 'topfill': 0, 'topline': 6, 'coladd': 0, 'skipcol': 0, 'curswant': 4}, winsaveview())
" remove all history entries
- for i in range(10)
+ for i in range(11)
call histdel('/')
endfor
@@ -489,14 +493,14 @@ func Test_search_cmdline5()
" Do not call test_override("char_avail", 1) so that <C-g> and <C-t> work
" regardless char_avail.
new
- call setline(1, [' 1 the first', ' 2 the second', ' 3 the third'])
+ call setline(1, [' 1 the first', ' 2 the second', ' 3 the third', ''])
set incsearch
1
call feedkeys("/the\<c-g>\<c-g>\<cr>", 'tx')
call assert_equal(' 3 the third', getline('.'))
$
call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
- call assert_equal(' 2 the second', getline('.'))
+ call assert_equal(' 1 the first', getline('.'))
" clean up
set noincsearch
bw!
@@ -704,6 +708,19 @@ func Test_incsearch_substitute_dump()
call VerifyScreenDump(buf, 'Test_incsearch_substitute_12', {})
call term_sendkeys(buf, "\<Esc>")
call VerifyScreenDump(buf, 'Test_incsearch_substitute_13', {})
+ call term_sendkeys(buf, ":%bwipe!\<CR>")
+ call term_sendkeys(buf, ":only!\<CR>")
+
+ " get :'<,'>s command in history
+ call term_sendkeys(buf, ":set cmdheight=2\<CR>")
+ call term_sendkeys(buf, "aasdfasdf\<Esc>")
+ call term_sendkeys(buf, "V:s/a/b/g\<CR>")
+ " Using '<,'> does not give E20
+ call term_sendkeys(buf, ":new\<CR>")
+ call term_sendkeys(buf, "aasdfasdf\<Esc>")
+ call term_sendkeys(buf, ":\<Up>\<Up>")
+ call VerifyScreenDump(buf, 'Test_incsearch_substitute_14', {})
+ call term_sendkeys(buf, "<Esc>")
call StopVimInTerminal(buf)
call delete('Xis_subst_script')
@@ -726,11 +743,14 @@ func Test_incsearch_sort_dump()
" the 'ambiwidth' check.
sleep 100m
- " Need to send one key at a time to force a redraw.
call term_sendkeys(buf, ':sort ni u /on')
call VerifyScreenDump(buf, 'Test_incsearch_sort_01', {})
call term_sendkeys(buf, "\<Esc>")
+ call term_sendkeys(buf, ':sort! /on')
+ call VerifyScreenDump(buf, 'Test_incsearch_sort_02', {})
+ call term_sendkeys(buf, "\<Esc>")
+
call StopVimInTerminal(buf)
call delete('Xis_sort_script')
endfunc
@@ -861,6 +881,21 @@ func Test_incsearch_with_change()
call delete('Xis_change_script')
endfunc
+func Test_incsearch_cmdline_modifier()
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ call test_override("char_avail", 1)
+ new
+ call setline(1, ['foo'])
+ set incsearch
+ " Test that error E14 does not occur in parsing command modifier.
+ call feedkeys("V:tab", 'tx')
+
+ call Incsearch_cleanup()
+endfunc
+
func Test_incsearch_scrolling()
if !CanRunVimInTerminal()
return
@@ -946,6 +981,21 @@ func Test_incsearch_substitute()
call Incsearch_cleanup()
endfunc
+func Test_incsearch_substitute_long_line()
+ throw 'skipped: Nvim does not support test_override()'
+ new
+ call test_override("char_avail", 1)
+ set incsearch
+
+ call repeat('x', 100000)->setline(1)
+ call feedkeys(':s/\%c', 'xt')
+ redraw
+ call feedkeys("\<Esc>", 'xt')
+
+ call Incsearch_cleanup()
+ bwipe!
+endfunc
+
func Test_search_undefined_behaviour()
if !has("terminal")
return
@@ -982,6 +1032,40 @@ func Test_search_sentence()
/
endfunc
+" Test that there is no crash when there is a last search pattern but no last
+" substitute pattern.
+func Test_no_last_substitute_pat()
+ " Use viminfo to set the last search pattern to a string and make the last
+ " substitute pattern the most recent used and make it empty (NULL).
+ call writefile(['~MSle0/bar', '~MSle0~&'], 'Xviminfo')
+ rviminfo! Xviminfo
+ call assert_fails('normal n', 'E35:')
+
+ call delete('Xviminfo')
+endfunc
+
+func Test_search_Ctrl_L_combining()
+ " Make sure, that Ctrl-L works correctly with combining characters.
+ " It uses an artificial example of an 'a' with 4 combining chars:
+ " 'a' U+0061 Dec:97 LATIN SMALL LETTER A &#x61; /\%u61\Z "\u0061"
+ " ' ฬ€' U+0300 Dec:768 COMBINING GRAVE ACCENT &#x300; /\%u300\Z "\u0300"
+ " ' ฬ' U+0301 Dec:769 COMBINING ACUTE ACCENT &#x301; /\%u301\Z "\u0301"
+ " ' ฬ‡' U+0307 Dec:775 COMBINING DOT ABOVE &#x307; /\%u307\Z "\u0307"
+ " ' ฬฃ' U+0323 Dec:803 COMBINING DOT BELOW &#x323; /\%u323 "\u0323"
+ " Those should also appear on the commandline
+ if !has('multi_byte') || !exists('+incsearch')
+ return
+ endif
+ call Cmdline3_prep()
+ 1
+ let bufcontent = ['', 'Miaฬ€ฬฬ‡ฬฃm']
+ call append('$', bufcontent)
+ call feedkeys("/Mi\<c-l>\<c-l>\<cr>", 'tx')
+ call assert_equal(5, line('.'))
+ call assert_equal(bufcontent[1], @/)
+ call Incsearch_cleanup()
+endfunc
+
func Test_large_hex_chars1()
" This used to cause a crash, the character becomes an NFA state.
try
@@ -1019,6 +1103,24 @@ func Test_one_error_msg()
call assert_fails('call search(" \\((\\v[[=P=]]){185}+ ")', 'E871:')
endfunc
+func Test_incsearch_add_char_under_cursor()
+ throw 'skipped: Nvim does not support test_override()'
+ if !exists('+incsearch')
+ return
+ endif
+ set incsearch
+ new
+ call setline(1, ['find match', 'anything'])
+ 1
+ call test_override('char_avail', 1)
+ call feedkeys("fc/m\<C-L>\<C-L>\<C-L>\<C-L>\<C-L>\<CR>", 'tx')
+ call assert_equal('match', @/)
+ call test_override('char_avail', 0)
+
+ set incsearch&
+ bwipe!
+endfunc
+
" Test for the search() function with match at the cursor position
func Test_search_match_at_curpos()
new
diff --git a/src/nvim/testdir/test_search_stat.vim b/src/nvim/testdir/test_search_stat.vim
index cf36f3214a..11c6489ca2 100644
--- a/src/nvim/testdir/test_search_stat.vim
+++ b/src/nvim/testdir/test_search_stat.vim
@@ -1,11 +1,9 @@
" Tests for search_stats, when "S" is not in 'shortmess'
-"
-" This test is fragile, it might not work interactively, but it works when run
-" as test!
-source shared.vim
+source screendump.vim
+source check.vim
-func! Test_search_stat()
+func Test_search_stat()
new
set shortmess-=S
" Append 50 lines with text to search for, "foobar" appears 20 times
@@ -45,7 +43,7 @@ func! Test_search_stat()
call assert_match(pat .. stat, g:a)
call cursor(line('$'), 1)
let g:a = execute(':unsilent :norm! n')
- let stat = '\[1/>99\] W'
+ let stat = 'W \[1/>99\]'
call assert_match(pat .. stat, g:a)
" Many matches
@@ -55,7 +53,7 @@ func! Test_search_stat()
call assert_match(pat .. stat, g:a)
call cursor(1, 1)
let g:a = execute(':unsilent :norm! N')
- let stat = '\[>99/>99\] W'
+ let stat = 'W \[>99/>99\]'
call assert_match(pat .. stat, g:a)
" right-left
@@ -87,7 +85,7 @@ func! Test_search_stat()
call cursor('$',1)
let pat = 'raboof/\s\+'
let g:a = execute(':unsilent :norm! n')
- let stat = '\[20/1\]'
+ let stat = 'W \[20/1\]'
call assert_match(pat .. stat, g:a)
call assert_match('search hit BOTTOM, continuing at TOP', g:a)
set norl
@@ -98,10 +96,10 @@ func! Test_search_stat()
let @/ = 'foobar'
let pat = '?foobar\s\+'
let g:a = execute(':unsilent :norm! N')
- let stat = '\[20/20\]'
+ let stat = 'W \[20/20\]'
call assert_match(pat .. stat, g:a)
call assert_match('search hit TOP, continuing at BOTTOM', g:a)
- call assert_match('\[20/20\] W', Screenline(&lines))
+ call assert_match('W \[20/20\]', Screenline(&lines))
" normal, no match
call cursor(1,1)
@@ -160,7 +158,115 @@ func! Test_search_stat()
let stat = '\[1/2\]'
call assert_notmatch(pat .. stat, g:a)
- " close the window
+ " normal, n comes from a silent mapping
+ " First test a normal mapping, then a silent mapping
+ call cursor(1,1)
+ nnoremap n n
+ let @/ = 'find this'
+ let pat = '/find this\s\+'
+ let g:a = execute(':unsilent :norm n')
+ let g:b = split(g:a, "\n")[-1]
+ let stat = '\[1/2\]'
+ call assert_match(pat .. stat, g:b)
+ nnoremap <silent> n n
+ call cursor(1,1)
+ let g:a = execute(':unsilent :norm n')
+ let g:b = split(g:a, "\n")[-1]
+ let stat = '\[1/2\]'
+ call assert_notmatch(pat .. stat, g:b)
+ call assert_match(stat, g:b)
+ " Test that the message is not truncated
+ " it would insert '...' into the output.
+ call assert_match('^\s\+' .. stat, g:b)
+ unmap n
+
+ " Clean up
set shortmess+=S
+ " close the window
bwipe!
endfunc
+
+func Test_search_stat_foldopen()
+ CheckScreendump
+
+ let lines =<< trim END
+ set shortmess-=S
+ setl foldenable foldmethod=indent foldopen-=search
+ call append(0, ['if', "\tfoo", "\tfoo", 'endif'])
+ let @/ = 'foo'
+ call cursor(1,1)
+ norm n
+ END
+ call writefile(lines, 'Xsearchstat1')
+
+ let buf = RunVimInTerminal('-S Xsearchstat1', #{rows: 10})
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_searchstat_3', {})
+
+ call term_sendkeys(buf, "n")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_searchstat_3', {})
+
+ call term_sendkeys(buf, "n")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_searchstat_3', {})
+
+ call StopVimInTerminal(buf)
+ call delete('Xsearchstat1')
+endfunc
+
+func! Test_search_stat_screendump()
+ CheckScreendump
+
+ let lines =<< trim END
+ set shortmess-=S
+ " Append 50 lines with text to search for, "foobar" appears 20 times
+ call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 20))
+ call setline(2, 'find this')
+ call setline(70, 'find this')
+ nnoremap n n
+ let @/ = 'find this'
+ call cursor(1,1)
+ norm n
+ END
+ call writefile(lines, 'Xsearchstat')
+ let buf = RunVimInTerminal('-S Xsearchstat', #{rows: 10})
+ call term_wait(buf)
+ call VerifyScreenDump(buf, 'Test_searchstat_1', {})
+
+ call term_sendkeys(buf, ":nnoremap <silent> n n\<cr>")
+ call term_sendkeys(buf, "gg0n")
+ call term_wait(buf)
+ call VerifyScreenDump(buf, 'Test_searchstat_2', {})
+
+ call StopVimInTerminal(buf)
+ call delete('Xsearchstat')
+endfunc
+
+func Test_searchcount_in_statusline()
+ CheckScreendump
+
+ let lines =<< trim END
+ set shortmess-=S
+ call append(0, 'this is something')
+ function TestSearchCount() abort
+ let search_count = searchcount()
+ if !empty(search_count)
+ return '[' . search_count.current . '/' . search_count.total . ']'
+ else
+ return ''
+ endif
+ endfunction
+ set hlsearch
+ set laststatus=2 statusline+=%{TestSearchCount()}
+ END
+ call writefile(lines, 'Xsearchstatusline')
+ let buf = RunVimInTerminal('-S Xsearchstatusline', #{rows: 10})
+ call TermWait(buf)
+ call term_sendkeys(buf, "/something")
+ call VerifyScreenDump(buf, 'Test_searchstat_4', {})
+
+ call term_sendkeys(buf, "\<Esc>")
+ call StopVimInTerminal(buf)
+ call delete('Xsearchstatusline')
+endfunc
diff --git a/src/nvim/testdir/test_spell.vim b/src/nvim/testdir/test_spell.vim
index 414c7278eb..ab8a998bb8 100644
--- a/src/nvim/testdir/test_spell.vim
+++ b/src/nvim/testdir/test_spell.vim
@@ -79,6 +79,11 @@ func Test_spellbadword()
call assert_equal(['bycycle', 'bad'], spellbadword('My bycycle.'))
call assert_equal(['another', 'caps'], spellbadword('A sentence. another sentence'))
+ call assert_equal(['TheCamelWord', 'bad'], spellbadword('TheCamelWord asdf'))
+ set spelloptions=camel
+ call assert_equal(['asdf', 'bad'], spellbadword('TheCamelWord asdf'))
+ set spelloptions=
+
set spelllang=en
call assert_equal(['', ''], spellbadword('centre'))
call assert_equal(['', ''], spellbadword('center'))
@@ -113,6 +118,43 @@ foobar/?
set spell&
endfunc
+func Test_spelllang_inv_region()
+ set spell spelllang=en_xx
+ let messages = GetMessages()
+ call assert_equal('Warning: region xx not supported', messages[-1])
+ set spell& spelllang&
+endfunc
+
+func Test_compl_with_CTRL_X_CTRL_K_using_spell()
+ " When spell checking is enabled and 'dictionary' is empty,
+ " CTRL-X CTRL-K in insert mode completes using the spelling dictionary.
+ new
+ set spell spelllang=en dictionary=
+
+ set ignorecase
+ call feedkeys("Senglis\<c-x>\<c-k>\<esc>", 'tnx')
+ call assert_equal(['English'], getline(1, '$'))
+ call feedkeys("SEnglis\<c-x>\<c-k>\<esc>", 'tnx')
+ call assert_equal(['English'], getline(1, '$'))
+
+ set noignorecase
+ call feedkeys("Senglis\<c-x>\<c-k>\<esc>", 'tnx')
+ call assert_equal(['englis'], getline(1, '$'))
+ call feedkeys("SEnglis\<c-x>\<c-k>\<esc>", 'tnx')
+ call assert_equal(['English'], getline(1, '$'))
+
+ set spelllang=en_us
+ call feedkeys("Stheat\<c-x>\<c-k>\<esc>", 'tnx')
+ call assert_equal(['theater'], getline(1, '$'))
+ set spelllang=en_gb
+ call feedkeys("Stheat\<c-x>\<c-k>\<esc>", 'tnx')
+ " FIXME: commented out, expected theatre bug got theater. See issue #7025.
+ " call assert_equal(['theatre'], getline(1, '$'))
+
+ bwipe!
+ set spell& spelllang& dictionary& ignorecase&
+endfunc
+
func Test_spellreall()
new
set spell
diff --git a/src/nvim/testdir/test_startup.vim b/src/nvim/testdir/test_startup.vim
index 9abaca5957..12bec745a8 100644
--- a/src/nvim/testdir/test_startup.vim
+++ b/src/nvim/testdir/test_startup.vim
@@ -369,12 +369,11 @@ func Test_invalid_args()
endfor
if has('clientserver')
- " FIXME: need to add --servername to this list
- " but it causes vim-8.1.1282 to crash!
for opt in ['--remote', '--remote-send', '--remote-silent', '--remote-expr',
\ '--remote-tab', '--remote-tab-wait',
\ '--remote-tab-wait-silent', '--remote-tab-silent',
\ '--remote-wait', '--remote-wait-silent',
+ \ '--servername',
\ ]
let out = split(system(GetVimCommand() .. ' ' .. opt), "\n")
call assert_equal(1, v:shell_error)
@@ -384,14 +383,21 @@ func Test_invalid_args()
endfor
endif
- " FIXME: commented out as this causes vim-8.1.1282 to crash!
- "if has('clipboard')
- " let out = split(system(GetVimCommand() .. ' --display'), "\n")
- " call assert_equal(1, v:shell_error)
- " call assert_match('^VIM - Vi IMproved .* (.*)$', out[0])
- " call assert_equal('Argument missing after: "--display"', out[1])
- " call assert_equal('More info with: "vim -h"', out[2])
- "endif
+ if has('gui_gtk')
+ let out = split(system(GetVimCommand() .. ' --display'), "\n")
+ call assert_equal(1, v:shell_error)
+ call assert_match('^VIM - Vi IMproved .* (.*)$', out[0])
+ call assert_equal('Argument missing after: "--display"', out[1])
+ call assert_equal('More info with: "vim -h"', out[2])
+ endif
+
+ if has('xterm_clipboard')
+ let out = split(system(GetVimCommand() .. ' -display'), "\n")
+ call assert_equal(1, v:shell_error)
+ call assert_match('^VIM - Vi IMproved .* (.*)$', out[0])
+ call assert_equal('Argument missing after: "-display"', out[1])
+ call assert_equal('More info with: "vim -h"', out[2])
+ endif
let out = split(system(GetVimCommand() .. ' -ix'), "\n")
call assert_equal(1, v:shell_error)
diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim
index 8c81ec3431..7efd181d04 100644
--- a/src/nvim/testdir/test_statusline.vim
+++ b/src/nvim/testdir/test_statusline.vim
@@ -412,3 +412,22 @@ func Test_statusline_removed_group()
call StopVimInTerminal(buf)
call delete('XTest_statusline')
endfunc
+
+func Test_statusline_after_split_vsplit()
+ only
+
+ " Make the status line of each window show the window number.
+ set ls=2 stl=%{winnr()}
+
+ split | redraw
+ vsplit | redraw
+
+ " The status line of the third window should read '3' here.
+ call assert_equal('3', nr2char(screenchar(&lines - 1, 1)))
+
+ only
+ set ls& stl&
+endfunc
+
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim
index 85ee42420e..2404f113d9 100644
--- a/src/nvim/testdir/test_syntax.vim
+++ b/src/nvim/testdir/test_syntax.vim
@@ -369,7 +369,11 @@ func Test_ownsyntax()
call setline(1, '#define FOO')
syntax on
set filetype=c
+
ownsyntax perl
+ " this should not crash
+ set
+
call assert_equal('perlComment', synIDattr(synID(line('.'), col('.'), 1), 'name'))
call assert_equal('c', b:current_syntax)
call assert_equal('perl', w:current_syntax)
diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim
index 6abe5b7c89..7057cdefb2 100644
--- a/src/nvim/testdir/test_tagjump.vim
+++ b/src/nvim/testdir/test_tagjump.vim
@@ -1,5 +1,8 @@
" Tests for tagjump (tags and special searches)
+source check.vim
+source screendump.vim
+
" SEGV occurs in older versions. (At least 7.4.1748 or older)
func Test_ptag_with_notagstack()
set notagstack
@@ -551,6 +554,37 @@ func Test_tag_line_toolong()
let &verbose = old_vbs
endfunc
+" Check that using :tselect does not run into the hit-enter prompt.
+" Requires a terminal to trigger that prompt.
+func Test_tselect()
+ CheckScreendump
+
+ call writefile([
+ \ 'main Xtest.h /^void test();$/;" f',
+ \ 'main Xtest.c /^int main()$/;" f',
+ \ 'main Xtest.x /^void test()$/;" f',
+ \ ], 'Xtags')
+ cal writefile([
+ \ 'int main()',
+ \ 'void test()',
+ \ ], 'Xtest.c')
+
+ let lines =<< trim [SCRIPT]
+ set tags=Xtags
+ [SCRIPT]
+ call writefile(lines, 'XTest_tselect')
+ let buf = RunVimInTerminal('-S XTest_tselect', {'rows': 10, 'cols': 50})
+
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, ":tselect main\<CR>2\<CR>")
+ call VerifyScreenDump(buf, 'Test_tselect_1', {})
+
+ call StopVimInTerminal(buf)
+ call delete('Xtags')
+ call delete('Xtest.c')
+ call delete('XTest_tselect')
+endfunc
+
func Test_tagline()
call writefile([
\ 'provision Xtest.py /^ def provision(self, **kwargs):$/;" m line:1 language:Python class:Foo',
diff --git a/src/nvim/testdir/test_timers.vim b/src/nvim/testdir/test_timers.vim
index cffd80ff4f..13971a918d 100644
--- a/src/nvim/testdir/test_timers.vim
+++ b/src/nvim/testdir/test_timers.vim
@@ -233,16 +233,17 @@ func Test_timer_catch_error()
endfunc
func FeedAndPeek(timer)
- call test_feedinput('a')
+ " call test_feedinput('a')
+ call nvim_input('a')
call getchar(1)
endfunc
func Interrupt(timer)
- call test_feedinput("\<C-C>")
+ " call test_feedinput("\<C-C>")
+ call nvim_input("\<C-C>")
endfunc
func Test_peek_and_get_char()
- throw 'skipped: Nvim does not support test_feedinput()'
if !has('unix') && !has('gui_running')
return
endif
@@ -339,6 +340,41 @@ func Test_nocatch_garbage_collect()
delfunc FeedChar
endfunc
+func Test_error_in_timer_callback()
+ if !has('terminal') || (has('win32') && has('gui_running'))
+ throw 'Skipped: cannot run Vim in a terminal window'
+ endif
+
+ let lines =<< trim [CODE]
+ func Func(timer)
+ " fail to create list
+ let x = [
+ endfunc
+ set updatetime=50
+ call timer_start(1, 'Func')
+ [CODE]
+ call writefile(lines, 'Xtest.vim')
+
+ let buf = term_start(GetVimCommandCleanTerm() .. ' -S Xtest.vim', {'term_rows': 8})
+ let job = term_getjob(buf)
+ call WaitForAssert({-> assert_notequal('', term_getline(buf, 8))})
+
+ " GC must not run during timer callback, which can make Vim crash.
+ call term_wait(buf, 100)
+ call term_sendkeys(buf, "\<CR>")
+ call term_wait(buf, 100)
+ call assert_equal('run', job_status(job))
+
+ call term_sendkeys(buf, ":qall!\<CR>")
+ call WaitFor({-> job_status(job) ==# 'dead'})
+ if has('unix')
+ call assert_equal('', job_info(job).termsig)
+ endif
+
+ call delete('Xtest.vim')
+ exe buf .. 'bwipe!'
+endfunc
+
func Test_timer_invalid_callback()
call assert_fails('call timer_start(0, "0")', 'E921')
endfunc
diff --git a/src/nvim/testdir/test_undo.vim b/src/nvim/testdir/test_undo.vim
index adcdcb1cd9..3b66071d6d 100644
--- a/src/nvim/testdir/test_undo.vim
+++ b/src/nvim/testdir/test_undo.vim
@@ -364,6 +364,25 @@ func Test_wundo_errors()
bwipe!
endfunc
+" Check that reading a truncted undo file doesn't hang.
+func Test_undofile_truncated()
+ throw 'skipped: TODO: '
+ new
+ call setline(1, 'hello')
+ set ul=100
+ wundo Xundofile
+ let contents = readfile('Xundofile', 'B')
+
+ " try several sizes
+ for size in range(20, 500, 33)
+ call writefile(contents[0:size], 'Xundofile')
+ call assert_fails('rundo Xundofile', 'E825:')
+ endfor
+
+ bwipe!
+ call delete('Xundofile')
+endfunc
+
func Test_rundo_errors()
call assert_fails('rundo XfileDoesNotExist', 'E822:')
@@ -373,6 +392,26 @@ func Test_rundo_errors()
call delete('Xundofile')
endfunc
+func Test_undofile_next()
+ set undofile
+ new Xfoo.txt
+ execute "norm ix\<c-g>uy\<c-g>uz\<Esc>"
+ write
+ bwipe
+
+ next Xfoo.txt
+ call assert_equal('xyz', getline(1))
+ silent undo
+ call assert_equal('xy', getline(1))
+ silent undo
+ call assert_equal('x', getline(1))
+ bwipe!
+
+ call delete('Xfoo.txt')
+ call delete('.Xfoo.txt.un~')
+ set undofile&
+endfunc
+
" Test for undo working properly when executing commands from a register.
" Also test this in an empty buffer.
func Test_cmd_in_reg_undo()
diff --git a/src/nvim/testdir/test_vimscript.vim b/src/nvim/testdir/test_vimscript.vim
index d2f13ff072..cb81997d39 100644
--- a/src/nvim/testdir/test_vimscript.vim
+++ b/src/nvim/testdir/test_vimscript.vim
@@ -1409,6 +1409,17 @@ func Test_compound_assignment_operators()
let @/ = ''
endfunc
+func Test_funccall_garbage_collect()
+ func Func(x, ...)
+ call add(a:x, a:000)
+ endfunc
+ call Func([], [])
+ " Must not crash cause by invalid freeing
+ call test_garbagecollect_now()
+ call assert_true(v:true)
+ delfunc Func
+endfunc
+
func Test_function_defined_line()
if has('gui_running')
" Can't catch the output of gvim.
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index dde17726fd..2ef9bf5a2e 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -1083,6 +1083,7 @@ static void tui_set_mode(UI *ui, ModeShape mode)
}
} else if (c.id == 0) {
// No cursor color for this mode; reset to default.
+ data->want_invisible = false;
unibi_out_ext(ui, data->unibi_ext.reset_cursor_color);
}
diff --git a/src/nvim/undo.c b/src/nvim/undo.c
index 97018f6c02..6c5a6cdb46 100644
--- a/src/nvim/undo.c
+++ b/src/nvim/undo.c
@@ -878,7 +878,12 @@ static u_header_T *unserialize_uhp(bufinfo_T *bi,
for (;; ) {
int len = undo_read_byte(bi);
- if (len == 0 || len == EOF) {
+ if (len == EOF) {
+ corruption_error("truncated", file_name);
+ u_free_uhp(uhp);
+ return NULL;
+ }
+ if (len == 0) {
break;
}
int what = undo_read_byte(bi);
@@ -3029,8 +3034,6 @@ u_header_T *u_force_get_undo_header(buf_T *buf)
curbuf = buf;
// Args are tricky: this means replace empty range by empty range..
u_savecommon(0, 1, 1, true);
- curbuf = save_curbuf;
-
uhp = buf->b_u_curhead;
if (!uhp) {
uhp = buf->b_u_newhead;
@@ -3038,6 +3041,7 @@ u_header_T *u_force_get_undo_header(buf_T *buf)
abort();
}
}
+ curbuf = save_curbuf;
}
return uhp;
}
diff --git a/src/nvim/window.c b/src/nvim/window.c
index cec0dfd67f..e53570edd8 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -1490,13 +1490,11 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
if (flags & (WSP_TOP | WSP_BOT))
(void)win_comp_pos();
- /*
- * Both windows need redrawing
- */
+ // Both windows need redrawing. Update all status lines, in case they
+ // show something related to the window count or position.
redraw_win_later(wp, NOT_VALID);
- wp->w_redr_status = TRUE;
redraw_win_later(oldwin, NOT_VALID);
- oldwin->w_redr_status = TRUE;
+ status_redraw_all();
if (need_status) {
msg_row = Rows - 1;
@@ -6019,6 +6017,12 @@ char_u *grab_file_name(long count, linenr_T *file_lnum)
char_u *ptr;
if (get_visual_text(NULL, &ptr, &len) == FAIL)
return NULL;
+ // Only recognize ":123" here
+ if (file_lnum != NULL && ptr[len] == ':' && isdigit(ptr[len + 1])) {
+ char_u *p = ptr + len + 1;
+
+ *file_lnum = getdigits_long(&p, false, 0);
+ }
return find_file_name_in_path(ptr, len, options, count, curbuf->b_ffname);
}
return file_name_at_cursor(options | FNAME_HYP, count, file_lnum);
diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua
index a2a188d036..ab913ba4a4 100644
--- a/test/functional/api/extmark_spec.lua
+++ b/test/functional/api/extmark_spec.lua
@@ -100,6 +100,15 @@ describe('API/extmarks', function()
ns2 = request('nvim_create_namespace', "my-fancy-plugin2")
end)
+ it("can end extranges past final newline using end_col = 0", function()
+ set_extmark(ns, marks[1], 0, 0, {
+ end_col = 0,
+ end_line = 1
+ })
+ eq("end_col value outside range",
+ pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_line = 1 }))
+ end)
+
it('adds, updates and deletes marks', function()
local rv = set_extmark(ns, marks[1], positions[1][1], positions[1][2])
eq(marks[1], rv)
diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua
index a9d4c72d31..daf20c006c 100644
--- a/test/functional/api/highlight_spec.lua
+++ b/test/functional/api/highlight_spec.lua
@@ -7,6 +7,7 @@ local meths = helpers.meths
local funcs = helpers.funcs
local pcall_err = helpers.pcall_err
local ok = helpers.ok
+local assert_alive = helpers.assert_alive
describe('API: highlight',function()
local expected_rgb = {
@@ -145,4 +146,15 @@ describe('API: highlight',function()
eq({foreground=tonumber("0x888888"), background=tonumber("0x888888")},
meths.get_hl_by_name("Shrubbery", true))
end)
+
+ it("nvim_buf_add_highlight to other buffer doesn't crash if undo is disabled #12873", function()
+ command('vsplit file')
+ local err, _ = pcall(meths.buf_set_option, 1, 'undofile', false)
+ eq(true, err)
+ err, _ = pcall(meths.buf_set_option, 1, 'undolevels', -1)
+ eq(true, err)
+ err, _ = pcall(meths.buf_add_highlight, 1, -1, 'Question', 0, 0, -1)
+ eq(true, err)
+ assert_alive()
+ end)
end)
diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua
index 57e6f4fd63..1155f12ffc 100644
--- a/test/functional/core/job_spec.lua
+++ b/test/functional/core/job_spec.lua
@@ -93,6 +93,7 @@ describe('jobs', function()
{'notification', 'stdout', {0, {'hello world %VAR%', ''}}}
})
else
+ nvim('command', "set shell=/bin/sh")
nvim('command', [[call jobstart('echo $TOTO $VAR', g:job_opts)]])
expect_msg_seq({
{'notification', 'stdout', {0, {'hello world', ''}}}
diff --git a/test/functional/legacy/display_spec.lua b/test/functional/legacy/display_spec.lua
new file mode 100644
index 0000000000..aafcda67dc
--- /dev/null
+++ b/test/functional/legacy/display_spec.lua
@@ -0,0 +1,31 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local Screen = require('test.functional.ui.screen')
+local clear = helpers.clear
+local wait = helpers.wait
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+
+describe('display', function()
+ local screen
+
+ it('scroll when modified at topline', function()
+ clear()
+ screen = Screen.new(20, 4)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true},
+ })
+
+ feed_command([[call setline(1, repeat('a', 21))]])
+ wait()
+ feed('O')
+ screen:expect([[
+ ^ |
+ aaaaaaaaaaaaaaaaaaaa|
+ a |
+ {1:-- INSERT --} |
+ ]])
+ end)
+end)
+
diff --git a/test/functional/legacy/visual_mode_spec.lua b/test/functional/legacy/visual_mode_spec.lua
new file mode 100644
index 0000000000..c8e83ed649
--- /dev/null
+++ b/test/functional/legacy/visual_mode_spec.lua
@@ -0,0 +1,42 @@
+-- Test visual line mode selection redraw after scrolling
+
+local helpers = require('test.functional.helpers')(after_each)
+
+local Screen = require('test.functional.ui.screen')
+local call = helpers.call
+local clear = helpers.clear
+local feed = helpers.feed
+local feed_command = helpers.feed_command
+local funcs = helpers.funcs
+local meths = helpers.meths
+local eq = helpers.eq
+
+describe('visual line mode', function()
+ local screen
+
+ it('redraws properly after scrolling with matchparen loaded and scrolloff=1', function()
+ clear{args={'-u', 'NORC'}}
+ screen = Screen.new(30, 7)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold = true},
+ [2] = {background = Screen.colors.LightGrey},
+ })
+
+ eq(1, meths.get_var('loaded_matchparen'))
+ feed_command('set scrolloff=1')
+ funcs.setline(1, {'a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}'})
+ call('cursor', 5, 1)
+
+ feed('V<c-d><c-d>')
+ screen:expect([[
+ {2:{} |
+ {2:}} |
+ {2:{} |
+ {2:f} |
+ ^g |
+ } |
+ {1:-- VISUAL LINE --} |
+ ]])
+ end)
+end)
diff --git a/test/functional/lua/buffer_updates_spec.lua b/test/functional/lua/buffer_updates_spec.lua
index 5be47070a7..fa31880782 100644
--- a/test/functional/lua/buffer_updates_spec.lua
+++ b/test/functional/lua/buffer_updates_spec.lua
@@ -5,6 +5,7 @@ local inspect = require'vim.inspect'
local command = helpers.command
local meths = helpers.meths
+local funcs = helpers.funcs
local clear = helpers.clear
local eq = helpers.eq
local fail = helpers.fail
@@ -244,6 +245,31 @@ describe('lua buffer event callbacks: on_lines', function()
helpers.assert_alive()
end)
+ it('#12718 lnume', function()
+ meths.buf_set_lines(0, 0, -1, true, {'1', '2', '3'})
+ exec_lua([[
+ vim.api.nvim_buf_attach(0, false, {
+ on_lines = function(...)
+ vim.api.nvim_set_var('linesev', { ... })
+ end,
+ })
+ ]])
+ feed('1G0')
+ feed('y<C-v>2j')
+ feed('G0')
+ feed('p')
+ -- Is the last arg old_byte_size correct? Doesn't matter for this PR
+ eq(meths.get_var('linesev'), { "lines", 1, 4, 2, 3, 5, 4 })
+
+ feed('2G0')
+ feed('p')
+ eq(meths.get_var('linesev'), { "lines", 1, 5, 1, 4, 4, 8 })
+
+ feed('1G0')
+ feed('P')
+ eq(meths.get_var('linesev'), { "lines", 1, 6, 0, 3, 3, 9 })
+
+ end)
end)
describe('lua: nvim_buf_attach on_bytes', function()
@@ -256,9 +282,9 @@ describe('lua: nvim_buf_attach on_bytes', function()
-- assert the wrong thing), but masks errors with unflushed lines (as
-- nvim_buf_get_offset forces a flush of the memline). To be safe run the
-- test both ways.
- local function setup_eventcheck(verify)
- meths.buf_set_lines(0, 0, -1, true, origlines)
- local shadow = deepcopy(origlines)
+ local function setup_eventcheck(verify, start_txt)
+ meths.buf_set_lines(0, 0, -1, true, start_txt)
+ local shadow = deepcopy(start_txt)
local shadowbytes = table.concat(shadow, '\n') .. '\n'
-- TODO: while we are brewing the real strong coffe,
-- verify should check buf_get_offset after every check_events
@@ -273,7 +299,7 @@ describe('lua: nvim_buf_attach on_bytes', function()
local events = exec_lua("return get_events(...)" )
if not pcall(eq, expected, events) then
- local msg = 'unexpected byte updates received.\n\nBABBLA MER \n\n'
+ local msg = 'unexpected byte updates received.\n\n'
msg = msg .. 'received events:\n'
for _, e in ipairs(events) do
@@ -286,26 +312,36 @@ describe('lua: nvim_buf_attach on_bytes', function()
fail(msg)
end
- if verify then
- for _, event in ipairs(events) do
- if event[1] == verify_name and event[2] == "bytes" then
- local _, _, _, _, _, _, start_byte, _, _, old_byte, _, _, new_byte = unpack(event)
- local before = string.sub(shadowbytes, 1, start_byte)
- -- no text in the tests will contain 0xff bytes (invalid UTF-8)
- -- so we can use it as marker for unknown bytes
- local unknown = string.rep('\255', new_byte)
- local after = string.sub(shadowbytes, start_byte + old_byte + 1)
- shadowbytes = before .. unknown .. after
+ if not verify then
+ return
+ end
+
+ for _, event in ipairs(events) do
+ for _, elem in ipairs(event) do
+ if type(elem) == "number" and elem < 0 then
+ fail(string.format("Received event has negative values"))
end
end
- local text = meths.buf_get_lines(0, 0, -1, true)
- local bytes = table.concat(text, '\n') .. '\n'
- eq(string.len(bytes), string.len(shadowbytes), shadowbytes)
- for i = 1, string.len(shadowbytes) do
- local shadowbyte = string.sub(shadowbytes, i, i)
- if shadowbyte ~= '\255' then
- eq(string.sub(bytes, i, i), shadowbyte, i)
- end
+
+ if event[1] == verify_name and event[2] == "bytes" then
+ local _, _, _, _, _, _, start_byte, _, _, old_byte, _, _, new_byte = unpack(event)
+ local before = string.sub(shadowbytes, 1, start_byte)
+ -- no text in the tests will contain 0xff bytes (invalid UTF-8)
+ -- so we can use it as marker for unknown bytes
+ local unknown = string.rep('\255', new_byte)
+ local after = string.sub(shadowbytes, start_byte + old_byte + 1)
+ shadowbytes = before .. unknown .. after
+ end
+ end
+
+ local text = meths.buf_get_lines(0, 0, -1, true)
+ local bytes = table.concat(text, '\n') .. '\n'
+
+ eq(string.len(bytes), string.len(shadowbytes), '\non_bytes: total bytecount of buffer is wrong')
+ for i = 1, string.len(shadowbytes) do
+ local shadowbyte = string.sub(shadowbytes, i, i)
+ if shadowbyte ~= '\255' then
+ eq(string.sub(bytes, i, i), shadowbyte, i)
end
end
end
@@ -316,7 +352,7 @@ describe('lua: nvim_buf_attach on_bytes', function()
-- Yes, we can do both
local function do_both(verify)
it('single and multiple join', function()
- local check_events = setup_eventcheck(verify)
+ local check_events = setup_eventcheck(verify, origlines)
feed 'ggJ'
check_events {
{'test1', 'bytes', 1, 3, 0, 15, 15, 1, 0, 1, 0, 1, 1};
@@ -330,7 +366,7 @@ describe('lua: nvim_buf_attach on_bytes', function()
end)
it('opening lines', function()
- local check_events = setup_eventcheck(verify)
+ local check_events = setup_eventcheck(verify, origlines)
-- meths.buf_set_option(0, 'autoindent', true)
feed 'Go'
check_events {
@@ -343,7 +379,7 @@ describe('lua: nvim_buf_attach on_bytes', function()
end)
it('opening lines with autoindent', function()
- local check_events = setup_eventcheck(verify)
+ local check_events = setup_eventcheck(verify, origlines)
meths.buf_set_option(0, 'autoindent', true)
feed 'Go'
check_events {
@@ -355,6 +391,122 @@ describe('lua: nvim_buf_attach on_bytes', function()
{ "test1", "bytes", 1, 5, 7, 4, 118, 0, 0, 0, 1, 4, 5 };
}
end)
+
+ it('setline(num, line)', function()
+ local check_events = setup_eventcheck(verify, origlines)
+ funcs.setline(2, "babla")
+ check_events {
+ { "test1", "bytes", 1, 3, 1, 0, 16, 0, 15, 15, 0, 5, 5 };
+ }
+
+ funcs.setline(2, {"foo", "bar"})
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 0, 16, 0, 5, 5, 0, 3, 3 };
+ { "test1", "bytes", 1, 5, 2, 0, 20, 0, 15, 15, 0, 3, 3 };
+ }
+
+ local buf_len = meths.buf_line_count(0)
+ funcs.setline(buf_len + 1, "baz")
+ check_events {
+ { "test1", "bytes", 1, 6, 7, 0, 90, 0, 0, 0, 1, 0, 4 };
+ }
+ end)
+
+ it('continuing comments with fo=or', function()
+ local check_events = setup_eventcheck(verify, {'// Comment'})
+ meths.buf_set_option(0, 'formatoptions', 'ro')
+ meths.buf_set_option(0, 'filetype', 'c')
+ feed 'A<CR>'
+ check_events {
+ { "test1", "bytes", 1, 4, 0, 10, 10, 0, 0, 0, 1, 3, 4 };
+ }
+
+ feed '<ESC>'
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 2, 13, 0, 1, 1, 0, 0, 0 };
+ }
+
+ feed 'ggo' -- goto first line to continue testing
+ check_events {
+ { "test1", "bytes", 1, 6, 1, 0, 11, 0, 0, 0, 1, 0, 4 };
+ }
+
+ feed '<CR>'
+ check_events {
+ { "test1", "bytes", 1, 6, 2, 2, 16, 0, 1, 1, 0, 0, 0 };
+ { "test1", "bytes", 1, 7, 1, 3, 14, 0, 0, 0, 1, 3, 4 };
+ }
+ end)
+
+ it('editing empty buffers', function()
+ local check_events = setup_eventcheck(verify, {})
+
+ feed 'ia'
+ check_events {
+ { "test1", "bytes", 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
+ }
+ end)
+
+ it("changing lines", function()
+ local check_events = setup_eventcheck(verify, origlines)
+
+ feed "cc"
+ check_events {
+ { "test1", "bytes", 1, 4, 0, 0, 0, 0, 15, 15, 0, 0, 0 };
+ }
+
+ feed "<ESC>"
+ check_events {}
+
+ feed "c3j"
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 0, 1, 3, 0, 48, 0, 0, 0 };
+ }
+ end)
+
+ it("visual charwise paste", function()
+ local check_events = setup_eventcheck(verify, {'1234567890'})
+ funcs.setreg('a', '___')
+
+ feed '1G1|vll'
+ check_events {}
+
+ feed '"ap'
+ check_events {
+ { "test1", "bytes", 1, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0 };
+ { "test1", "bytes", 1, 5, 0, 0, 0, 0, 0, 0, 0, 3, 3 };
+ }
+ end)
+
+ it('blockwise paste', function()
+ local check_events = setup_eventcheck(verify, {'1', '2', '3'})
+ feed('1G0')
+ feed('y<C-v>2j')
+ feed('G0')
+ feed('p')
+ check_events {
+ { "test1", "bytes", 1, 3, 2, 1, 5, 0, 0, 0, 0, 1, 1 };
+ { "test1", "bytes", 1, 3, 3, 0, 7, 0, 0, 0, 0, 3, 3 };
+ { "test1", "bytes", 1, 3, 4, 0, 10, 0, 0, 0, 0, 3, 3 };
+ }
+
+ feed('2G0')
+ feed('p')
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 1, 3, 0, 0, 0, 0, 1, 1 };
+ { "test1", "bytes", 1, 4, 2, 1, 6, 0, 0, 0, 0, 1, 1 };
+ { "test1", "bytes", 1, 4, 3, 1, 10, 0, 0, 0, 0, 1, 1 };
+ }
+
+ feed('1G0')
+ feed('P')
+ check_events {
+ { "test1", "bytes", 1, 5, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
+ { "test1", "bytes", 1, 5, 1, 0, 3, 0, 0, 0, 0, 1, 1 };
+ { "test1", "bytes", 1, 5, 2, 0, 7, 0, 0, 0, 0, 1, 1 };
+ }
+
+ end)
end
describe('(with verify) handles', function()
diff --git a/test/functional/lua/treesitter_spec.lua b/test/functional/lua/treesitter_spec.lua
index 2c9107a65a..74ae6cde2b 100644
--- a/test/functional/lua/treesitter_spec.lua
+++ b/test/functional/lua/treesitter_spec.lua
@@ -446,10 +446,7 @@ static int nlua_schedule(lua_State *const lstate)
]]}
feed("5Goc<esc>dd")
- if true == true then
- pending('reenable this check in luahl PR')
- return
- end
+
screen:expect{grid=[[
{2:/// Schedule Lua callback on main loop's event queue} |
{3:static} {3:int} {11:nlua_schedule}({3:lua_State} *{3:const} lstate) |
@@ -480,7 +477,7 @@ static int nlua_schedule(lua_State *const lstate)
|| {6:lstate} != {6:lstate}) { |
{11:lua_pushliteral}(lstate, {5:"vim.schedule: expected function"}); |
{4:return} {11:lua_error}(lstate); |
- *^/ |
+ {8:*^/} |
} |
|
{7:LuaRef} cb = {11:nlua_ref}(lstate, {5:1}); |
@@ -663,4 +660,35 @@ static int nlua_schedule(lua_State *const lstate)
{ 10, 5, 10, 20 },
{ 14, 9, 14, 27 } }, res)
end)
+
+ it("allows to create string parsers", function()
+ local ret = exec_lua [[
+ local parser = vim.treesitter.get_string_parser("int foo = 42;", "c")
+ return { parser:parse():root():range() }
+ ]]
+
+ eq({ 0, 0, 0, 13 }, ret)
+ end)
+
+ it("allows to run queries with string parsers", function()
+ local txt = [[
+ int foo = 42;
+ int bar = 13;
+ ]]
+
+ local ret = exec_lua([[
+ local str = ...
+ local parser = vim.treesitter.get_string_parser(str, "c")
+
+ local nodes = {}
+ local query = vim.treesitter.parse_query("c", '((identifier) @id (eq? @id "foo"))')
+
+ for _, node in query:iter_captures(parser:parse():root(), str, 0, 2) do
+ table.insert(nodes, { node:range() })
+ end
+
+ return nodes]], txt)
+
+ eq({ {0, 10, 0, 13} }, ret)
+ end)
end)
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index a9e8ca9686..63e48a18ca 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -1214,6 +1214,23 @@ describe('lua stdlib', function()
]])
end)
+ it('should not process non-fast events when commanded', function()
+ eq({wait_result = false}, exec_lua[[
+ start_time = get_time()
+
+ vim.g.timer_result = false
+ timer = vim.loop.new_timer()
+ timer:start(100, 0, vim.schedule_wrap(function()
+ vim.g.timer_result = true
+ end))
+
+ wait_result = vim.wait(300, function() return vim.g.timer_result end, nil, true)
+
+ return {
+ wait_result = wait_result,
+ }
+ ]])
+ end)
it('should work with vim.defer_fn', function()
eq({time = true, wait_result = true}, exec_lua[[
start_time = get_time()
@@ -1228,22 +1245,38 @@ describe('lua stdlib', function()
]])
end)
- it('should require functions to be passed', function()
+ it('should not crash when callback errors', function()
local pcall_result = exec_lua [[
- return {pcall(function() vim.wait(1000, 13) end)}
+ return {pcall(function() vim.wait(1000, function() error("As Expected") end) end)}
]]
eq(pcall_result[1], false)
- matches('condition must be a function', pcall_result[2])
+ matches('As Expected', pcall_result[2])
end)
- it('should not crash when callback errors', function()
+ it('if callback is passed, it must be a function', function()
local pcall_result = exec_lua [[
- return {pcall(function() vim.wait(1000, function() error("As Expected") end) end)}
+ return {pcall(function() vim.wait(1000, 13) end)}
]]
eq(pcall_result[1], false)
- matches('As Expected', pcall_result[2])
+ matches('if passed, condition must be a function', pcall_result[2])
+ end)
+
+ it('should allow waiting with no callback, explicit', function()
+ eq(true, exec_lua [[
+ local start_time = vim.loop.hrtime()
+ vim.wait(50, nil)
+ return vim.loop.hrtime() - start_time > 25000
+ ]])
+ end)
+
+ it('should allow waiting with no callback, implicit', function()
+ eq(true, exec_lua [[
+ local start_time = vim.loop.hrtime()
+ vim.wait(50)
+ return vim.loop.hrtime() - start_time > 25000
+ ]])
end)
it('should call callbacks exactly once if they return true immediately', function()
@@ -1330,4 +1363,29 @@ describe('lua stdlib', function()
eq(false, pcall_result)
end)
end)
+
+ describe('vim.api.nvim_buf_call', function()
+ it('can access buf options', function()
+ local buf1 = meths.get_current_buf()
+ local buf2 = exec_lua [[
+ buf2 = vim.api.nvim_create_buf(false, true)
+ return buf2
+ ]]
+
+ eq(false, meths.buf_get_option(buf1, 'autoindent'))
+ eq(false, meths.buf_get_option(buf2, 'autoindent'))
+
+ local val = exec_lua [[
+ return vim.api.nvim_buf_call(buf2, function()
+ vim.cmd "set autoindent"
+ return vim.api.nvim_get_current_buf()
+ end)
+ ]]
+
+ eq(false, meths.buf_get_option(buf1, 'autoindent'))
+ eq(true, meths.buf_get_option(buf2, 'autoindent'))
+ eq(buf1, meths.get_current_buf())
+ eq(buf2, val)
+ end)
+ end)
end)
diff --git a/test/functional/normal/meta_key_spec.lua b/test/functional/normal/meta_key_spec.lua
new file mode 100644
index 0000000000..9f9fad67d2
--- /dev/null
+++ b/test/functional/normal/meta_key_spec.lua
@@ -0,0 +1,22 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
+local command = helpers.command
+local expect = helpers.expect
+
+describe('meta-keys-in-normal-mode', function()
+ before_each(function()
+ clear()
+ end)
+
+ it('ALT/META', function()
+ -- Unmapped ALT-chords behave as Esc+c
+ insert('hello')
+ feed('0<A-x><M-x>')
+ expect('llo')
+ -- Mapped ALT-chord behaves as mapped.
+ command('nnoremap <M-l> Ameta-l<Esc>')
+ command('nnoremap <A-j> Aalt-j<Esc>')
+ feed('<A-j><M-l>')
+ expect('lloalt-jmeta-l')
+ end)
+end)
diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua
index 21c01b3458..01f0d8a4d7 100644
--- a/test/functional/ui/cmdline_spec.lua
+++ b/test/functional/ui/cmdline_spec.lua
@@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen')
local clear, feed = helpers.clear, helpers.feed
local source = helpers.source
local command = helpers.command
+local feed_command = helpers.feed_command
local function new_screen(opt)
local screen = Screen.new(25, 5)
@@ -842,3 +843,34 @@ describe('cmdline redraw', function()
]], unchanged=true}
end)
end)
+
+describe('cmdline', function()
+ before_each(function()
+ clear()
+ end)
+
+ it('prints every executed Ex command if verbose >= 16', function()
+ local screen = Screen.new(50, 12)
+ screen:attach()
+ source([[
+ command DoSomething echo 'hello' |set ts=4 |let v = '123' |echo v
+ call feedkeys("\r", 't') " for the hit-enter prompt
+ set verbose=20
+ ]])
+ feed_command('DoSomething')
+ screen:expect([[
+ |
+ ~ |
+ |
+ Executing: DoSomething |
+ Executing: echo 'hello' |set ts=4 |let v = '123' ||
+ echo v |
+ hello |
+ Executing: set ts=4 |let v = '123' |echo v |
+ Executing: let v = '123' |echo v |
+ Executing: echo v |
+ 123 |
+ Press ENTER or type command to continue^ |
+ ]])
+ end)
+end)
diff --git a/test/functional/ui/cursor_spec.lua b/test/functional/ui/cursor_spec.lua
index 6c913124ac..e1a72ced05 100644
--- a/test/functional/ui/cursor_spec.lua
+++ b/test/functional/ui/cursor_spec.lua
@@ -286,6 +286,21 @@ describe('ui/cursor', function()
eq(173, named.normal.blinkon)
eq(42, named.showmatch.cell_percentage)
end)
+
+ -- If there is no setting for guicursor, it becomes the default setting.
+ meths.set_option('guicursor', 'n:ver35-blinkwait171-blinkoff172-blinkon173-Cursor/lCursor')
+ screen:expect(function()
+ for _,m in ipairs(screen._mode_info) do
+ if m.name ~= 'normal' then
+ eq('block', m.cursor_shape or 'block')
+ eq(0, m.blinkon or 0)
+ eq(0, m.blinkoff or 0)
+ eq(0, m.blinkwait or 0)
+ eq(0, m.hl_id or 0)
+ eq(0, m.id_lm or 0)
+ end
+ end
+ end)
end)
it("empty 'guicursor' sets cursor_shape=block in all modes", function()
@@ -297,6 +312,8 @@ describe('ui/cursor', function()
if m['cursor_shape'] ~= nil then
eq('block', m.cursor_shape)
eq(0, m.blinkon)
+ eq(0, m.hl_id)
+ eq(0, m.id_lm)
end
end
end)
diff --git a/test/functional/ui/fold_spec.lua b/test/functional/ui/fold_spec.lua
index 6ec45064da..9877f30206 100644
--- a/test/functional/ui/fold_spec.lua
+++ b/test/functional/ui/fold_spec.lua
@@ -6,6 +6,8 @@ local feed_command = helpers.feed_command
local insert = helpers.insert
local funcs = helpers.funcs
local meths = helpers.meths
+local source = helpers.source
+local assert_alive = helpers.assert_alive
describe("folded lines", function()
local screen
@@ -21,6 +23,8 @@ describe("folded lines", function()
[5] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey},
[6] = {background = Screen.colors.Yellow},
[7] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.WebGray},
+ [8] = {foreground = Screen.colors.Brown },
+ [9] = {bold = true, foreground = Screen.colors.Brown}
})
end)
@@ -29,7 +33,7 @@ describe("folded lines", function()
feed("i<cr><esc>")
feed("vkzf")
screen:expect([[
- {5: ^+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {7: }{5:^+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยท}|
{1:~ }|
{1:~ }|
{1:~ }|
@@ -49,8 +53,8 @@ describe("folded lines", function()
funcs.setline(4, 'line 2')
feed("j")
screen:expect([[
- {7:+ }{5: 1 +-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
- {7:+ }{5: 0 ^+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {7:+ }{8: 1 }{5:+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ {7:+ }{9: 0 }{5:^+-- 2 lines: ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
{1:~ }|
{1:~ }|
{1:~ }|
@@ -130,8 +134,8 @@ describe("folded lines", function()
]])
feed('vkzf')
- screen:expect([[
- {5:^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ๏บŽ๏ป ๏ป‹ูŽ๏บฎูŽ๏บ’ู๏ปณูŽู‘๏บ“ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
+ screen:expect{grid=[[
+ {5:^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท}|
{1:~ }|
{1:~ }|
{1:~ }|
@@ -139,7 +143,7 @@ describe("folded lines", function()
{1:~ }|
{1:~ }|
|
- ]])
+ ]]}
feed_command("set noarabicshape")
screen:expect([[
@@ -155,7 +159,7 @@ describe("folded lines", function()
feed_command("set number foldcolumn=2")
screen:expect([[
- {7:+ }{5: 1 ^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉยทยทยทยทยทยทยทยทยทยทยท}|
+ {7:+ }{8: 1 }{5:^+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ุนูŽุฑูŽุจููŠูŽู‘ุฉยทยทยทยทยทยทยทยทยทยทยท}|
{1:~ }|
{1:~ }|
{1:~ }|
@@ -168,7 +172,7 @@ describe("folded lines", function()
-- Note: too much of the folded line gets cut off.This is a vim bug.
feed_command("set rightleft")
screen:expect([[
- {5:+-- 2 lines: รฅ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท^ยท 1 }{7: +}|
+ {5:ยทยทยทยทยทยทยทยทยทยทยทุฉูŠูŽู‘ุจูุฑูŽุนูŽู„ุง xฬŽอ‚อ€ฬ‚อ›อ› ่ฏญ รฅ :senil 2 --^+}{8: 1 }{7: +}|
{1: ~}|
{1: ~}|
{1: ~}|
@@ -180,7 +184,7 @@ describe("folded lines", function()
feed_command("set nonumber foldcolumn=0")
screen:expect([[
- {5:+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ุงู„ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท^ยท}|
+ {5:ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทุฉูŠูŽู‘ุจูุฑูŽุนูŽู„ุง xฬŽอ‚อ€ฬ‚อ›อ› ่ฏญ รฅ :senil 2 --^+}|
{1: ~}|
{1: ~}|
{1: ~}|
@@ -192,7 +196,7 @@ describe("folded lines", function()
feed_command("set arabicshape")
screen:expect([[
- {5:+-- 2 lines: รฅ ่ฏญ xฬŽอ‚อ€ฬ‚อ›อ› ๏บ๏ปŸยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท^ยท}|
+ {5:ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทุฉูŠูŽู‘ุจูุฑูŽุนูŽู„ุง xฬŽอ‚อ€ฬ‚อ›อ› ่ฏญ รฅ :senil 2 --^+}|
{1: ~}|
{1: ~}|
{1: ~}|
@@ -355,4 +359,26 @@ describe("folded lines", function()
|
]]}
end)
+
+ it('does not crash when foldtext is longer than columns #12988', function()
+ source([[
+ function! MyFoldText() abort
+ return repeat('-', &columns + 100)
+ endfunction
+ ]])
+ command('set foldtext=MyFoldText()')
+ feed("i<cr><esc>")
+ feed("vkzf")
+ screen:expect{grid=[[
+ {5:^---------------------------------------------}|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ |
+ ]]}
+ assert_alive()
+ end)
end)
diff --git a/test/functional/ui/inccommand_spec.lua b/test/functional/ui/inccommand_spec.lua
index 74e85212c8..16c5477ee4 100644
--- a/test/functional/ui/inccommand_spec.lua
+++ b/test/functional/ui/inccommand_spec.lua
@@ -2750,6 +2750,26 @@ it(':substitute with inccommand, timer-induced :redraw #9777', function()
]])
end)
+it(":substitute doesn't crash with inccommand, if undo is empty #12932", function()
+ local screen = Screen.new(10,5)
+ clear()
+ command('set undolevels=-1')
+ common_setup(screen, 'split', 'test')
+ feed(':%s/test')
+ sleep(100)
+ feed('/')
+ sleep(100)
+ feed('f')
+ screen:expect([[
+ {12:f} |
+ {15:~ }|
+ {15:~ }|
+ {15:~ }|
+ :%s/test/f^ |
+ ]])
+ assert_alive()
+end)
+
it('long :%s/ with inccommand does not collapse cmdline', function()
local screen = Screen.new(10,5)
clear()
diff --git a/test/functional/ui/messages_spec.lua b/test/functional/ui/messages_spec.lua
index efc02db159..5df4a1d533 100644
--- a/test/functional/ui/messages_spec.lua
+++ b/test/functional/ui/messages_spec.lua
@@ -323,7 +323,7 @@ describe('ui/ext_messages', function()
{1:~ }|
{1:~ }|
]], messages={
- {content = {{"/line [1/2] W"}}, kind = "search_count"}
+ {content = {{"/line W [1/2]"}}, kind = "search_count"}
}}
feed('n')
diff --git a/test/functional/visual/meta_key_spec.lua b/test/functional/visual/meta_key_spec.lua
new file mode 100644
index 0000000000..11f7203da0
--- /dev/null
+++ b/test/functional/visual/meta_key_spec.lua
@@ -0,0 +1,22 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
+local command = helpers.command
+local expect = helpers.expect
+
+describe('meta-keys-in-visual-mode', function()
+ before_each(function()
+ clear()
+ end)
+
+ it('ALT/META', function()
+ -- Unmapped ALT-chords behave as Esc+c
+ insert('peaches')
+ feed('viw<A-x>viw<M-x>')
+ expect('peach')
+ -- Mapped ALT-chord behaves as mapped.
+ command('vnoremap <M-l> Ameta-l<Esc>')
+ command('vnoremap <A-j> Aalt-j<Esc>')
+ feed('viw<A-j>viw<M-l>')
+ expect('peachalt-jmeta-l')
+ end)
+end)
diff --git a/test/helpers.lua b/test/helpers.lua
index 2e0258afed..5acd2ea0bd 100644
--- a/test/helpers.lua
+++ b/test/helpers.lua
@@ -345,7 +345,7 @@ function module.check_cores(app, force)
exc_re = { os.getenv('NVIM_TEST_CORE_EXC_RE'), local_tmpdir }
db_cmd = os.getenv('NVIM_TEST_CORE_DB_CMD') or gdb_db_cmd
random_skip = os.getenv('NVIM_TEST_CORE_RANDOM_SKIP')
- elseif os.getenv('TRAVIS_OS_NAME') == 'osx' then
+ elseif 'darwin' == module.uname() then
initial_path = '/cores'
re = nil
exc_re = { local_tmpdir }
diff --git a/unicode/CaseFolding.txt b/unicode/CaseFolding.txt
index 7eeb915abf..033788b253 100644
--- a/unicode/CaseFolding.txt
+++ b/unicode/CaseFolding.txt
@@ -1,5 +1,5 @@
-# CaseFolding-12.1.0.txt
-# Date: 2019-03-10, 10:53:00 GMT
+# CaseFolding-13.0.0.txt
+# Date: 2019-09-08, 23:30:59 GMT
# ยฉ 2019 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
@@ -1234,6 +1234,9 @@ A7C2; C; A7C3; # LATIN CAPITAL LETTER ANGLICANA W
A7C4; C; A794; # LATIN CAPITAL LETTER C WITH PALATAL HOOK
A7C5; C; 0282; # LATIN CAPITAL LETTER S WITH HOOK
A7C6; C; 1D8E; # LATIN CAPITAL LETTER Z WITH PALATAL HOOK
+A7C7; C; A7C8; # LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
+A7C9; C; A7CA; # LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
+A7F5; C; A7F6; # LATIN CAPITAL LETTER REVERSED HALF H
AB70; C; 13A0; # CHEROKEE SMALL LETTER A
AB71; C; 13A1; # CHEROKEE SMALL LETTER E
AB72; C; 13A2; # CHEROKEE SMALL LETTER I
diff --git a/unicode/EastAsianWidth.txt b/unicode/EastAsianWidth.txt
index 94d55d6654..b43aec9273 100644
--- a/unicode/EastAsianWidth.txt
+++ b/unicode/EastAsianWidth.txt
@@ -1,6 +1,6 @@
-# EastAsianWidth-12.1.0.txt
-# Date: 2019-03-31, 22:01:58 GMT [KW, LI]
-# ยฉ 2019 Unicodeยฎ, Inc.
+# EastAsianWidth-13.0.0.txt
+# Date: 2029-01-21, 18:14:00 GMT [KW, LI]
+# ยฉ 2020 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -9,7 +9,7 @@
#
# East_Asian_Width Property
#
-# This file is an informative contributory data file in the
+# This file is a normative contributory data file in the
# Unicode Character Database.
#
# The format is two fields separated by a semicolon.
@@ -332,7 +332,7 @@
085E;N # Po MANDAIC PUNCTUATION
0860..086A;N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA
08A0..08B4;N # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW
-08B6..08BD;N # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
+08B6..08C7;N # Lo [18] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE
08D3..08E1;N # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA
08E2;N # Cf ARABIC DISPUTED END OF AYAH
08E3..08FF;N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA
@@ -450,7 +450,7 @@
0B47..0B48;N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
0B4B..0B4C;N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
0B4D;N # Mn ORIYA SIGN VIRAMA
-0B56;N # Mn ORIYA AI LENGTH MARK
+0B55..0B56;N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK
0B57;N # Mc ORIYA AU LENGTH MARK
0B5C..0B5D;N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
0B5F..0B61;N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
@@ -529,7 +529,7 @@
0CF1..0CF2;N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
0D00..0D01;N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
0D02..0D03;N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
-0D05..0D0C;N # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D04..0D0C;N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L
0D0E..0D10;N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
0D12..0D3A;N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA
0D3B..0D3C;N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
@@ -550,6 +550,7 @@
0D70..0D78;N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS
0D79;N # So MALAYALAM DATE MARK
0D7A..0D7F;N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+0D81;N # Mn SINHALA SIGN CANDRABINDU
0D82..0D83;N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
0D85..0D96;N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
0D9A..0DB1;N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
@@ -795,6 +796,7 @@
1AA8..1AAD;N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG
1AB0..1ABD;N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
1ABE;N # Me COMBINING PARENTHESES OVERLAY
+1ABF..1AC0;N # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW
1B00..1B03;N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
1B04;N # Mc BALINESE SIGN BISAH
1B05..1B33;N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA
@@ -1335,7 +1337,7 @@
2B56..2B59;A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE
2B5A..2B73;N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR
2B76..2B95;N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
-2B98..2BFF;N # So [104] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..HELLSCHREIBER PAUSE SYMBOL
+2B97..2BFF;N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL
2C00..2C2E;N # Lu [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
2C30..2C5E;N # Ll [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
2C60..2C7B;N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E
@@ -1404,6 +1406,8 @@
2E41;N # Po REVERSED COMMA
2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
2E43..2E4F;N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER
+2E50..2E51;N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR
+2E52;N # Po TIRONIAN SIGN CAPITAL ET
2E80..2E99;W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP
2E9B..2EF3;W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
2F00..2FD5;W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
@@ -1464,7 +1468,7 @@
3190..3191;W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
3192..3195;W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
3196..319F;W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
-31A0..31BA;W # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY
+31A0..31BF;W # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH
31C0..31E3;W # So [36] CJK STROKE T..CJK STROKE Q
31F0..31FF;W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
3200..321E;W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
@@ -1479,11 +1483,10 @@
32B1..32BF;W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
32C0..32FF;W # So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA
3300..33FF;W # So [256] SQUARE APAATO..SQUARE GAL
-3400..4DB5;W # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
-4DB6..4DBF;W # Cn [10] <reserved-4DB6>..<reserved-4DBF>
+3400..4DBF;W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF
4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
-4E00..9FEF;W # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
-9FF0..9FFF;W # Cn [16] <reserved-9FF0>..<reserved-9FFF>
+4E00..9FFC;W # Lo [20989] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFC
+9FFD..9FFF;W # Cn [3] <reserved-9FFD>..<reserved-9FFF>
A000..A014;W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E
A015;W # Lm YI SYLLABLE WU
A016..A48C;W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
@@ -1523,7 +1526,8 @@ A789..A78A;N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUAL
A78B..A78E;N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT
A78F;N # Lo LATIN LETTER SINOLOGICAL DOT
A790..A7BF;N # L& [48] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER GLOTTAL U
-A7C2..A7C6;N # L& [5] LATIN CAPITAL LETTER ANGLICANA W..LATIN CAPITAL LETTER Z WITH PALATAL HOOK
+A7C2..A7CA;N # L& [9] LATIN CAPITAL LETTER ANGLICANA W..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
+A7F5..A7F6;N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H
A7F7;N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
A7F8..A7F9;N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
A7FA;N # Ll LATIN LETTER SMALL CAPITAL TURNED M
@@ -1539,6 +1543,7 @@ A823..A824;N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN
A825..A826;N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
A827;N # Mc SYLOTI NAGRI VOWEL SIGN OO
A828..A82B;N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+A82C;N # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA
A830..A835;N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS
A836..A837;N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK
A838;N # Sc NORTH INDIC RUPEE MARK
@@ -1639,7 +1644,9 @@ AB28..AB2E;N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO
AB30..AB5A;N # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG
AB5B;N # Sk MODIFIER BREVE WITH INVERTED BREVE
AB5C..AB5F;N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
-AB60..AB67;N # Ll [8] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK
+AB60..AB68;N # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE
+AB69;N # Lm MODIFIER LETTER SMALL TURNED W
+AB6A..AB6B;N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK
AB70..ABBF;N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA
ABC0..ABE2;N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM
ABE3..ABE4;N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
@@ -1800,7 +1807,7 @@ FFFD;A # So REPLACEMENT CHARACTER
10179..10189;N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
1018A..1018B;N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN
1018C..1018E;N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN
-10190..1019B;N # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+10190..1019C;N # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL
101A0;N # So GREEK SYMBOL TAU RHO
101D0..101FC;N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
101FD;N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
@@ -1902,6 +1909,10 @@ FFFD;A # So REPLACEMENT CHARACTER
10D24..10D27;N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
10D30..10D39;N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE
10E60..10E7E;N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS
+10E80..10EA9;N # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET
+10EAB..10EAC;N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EAD;N # Pd YEZIDI HYPHENATION MARK
+10EB0..10EB1;N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
10F00..10F1C;N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
10F1D..10F26;N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
10F27;N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -1909,6 +1920,8 @@ FFFD;A # So REPLACEMENT CHARACTER
10F46..10F50;N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
10F51..10F54;N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED
10F55..10F59;N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
+10FB0..10FC4;N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW
+10FC5..10FCB;N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED
10FE0..10FF6;N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH
11000;N # Mc BRAHMI SIGN CANDRABINDU
11001;N # Mn BRAHMI SIGN ANUSVARA
@@ -1941,6 +1954,7 @@ FFFD;A # So REPLACEMENT CHARACTER
11140..11143;N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK
11144;N # Lo CHAKMA LETTER LHAA
11145..11146;N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
+11147;N # Lo CHAKMA LETTER VAA
11150..11172;N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA
11173;N # Mn MAHAJANI SIGN NUKTA
11174..11175;N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK
@@ -1955,6 +1969,8 @@ FFFD;A # So REPLACEMENT CHARACTER
111C5..111C8;N # Po [4] SHARADA DANDA..SHARADA SEPARATOR
111C9..111CC;N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
111CD;N # Po SHARADA SUTRA MARK
+111CE;N # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E
+111CF;N # Mn SHARADA SIGN INVERTED CANDRABINDU
111D0..111D9;N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
111DA;N # Lo SHARADA EKAM
111DB;N # Po SHARADA SIGN SIDDHAM
@@ -2013,10 +2029,10 @@ FFFD;A # So REPLACEMENT CHARACTER
11447..1144A;N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI
1144B..1144F;N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN
11450..11459;N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
-1145B;N # Po NEWA PLACEHOLDER MARK
+1145A..1145B;N # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK
1145D;N # Po NEWA INSERTION SIGN
1145E;N # Mn NEWA SANDHI MARK
-1145F;N # Lo NEWA LETTER VEDIC ANUSVARA
+1145F..11461;N # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA
11480..114AF;N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA
114B0..114B2;N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II
114B3..114B8;N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
@@ -2081,6 +2097,23 @@ FFFD;A # So REPLACEMENT CHARACTER
118E0..118E9;N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE
118EA..118F2;N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY
118FF;N # Lo WARANG CITI OM
+11900..11906;N # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E
+11909;N # Lo DIVES AKURU LETTER O
+1190C..11913;N # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA
+11915..11916;N # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA
+11918..1192F;N # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA
+11930..11935;N # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E
+11937..11938;N # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O
+1193B..1193C;N # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU
+1193D;N # Mc DIVES AKURU SIGN HALANTA
+1193E;N # Mn DIVES AKURU VIRAMA
+1193F;N # Lo DIVES AKURU PREFIXED NASAL SIGN
+11940;N # Mc DIVES AKURU MEDIAL YA
+11941;N # Lo DIVES AKURU INITIAL RA
+11942;N # Mc DIVES AKURU MEDIAL RA
+11943;N # Mn DIVES AKURU SIGN NUKTA
+11944..11946;N # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK
+11950..11959;N # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE
119A0..119A7;N # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR
119AA..119D0;N # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA
119D1..119D3;N # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II
@@ -2158,6 +2191,7 @@ FFFD;A # So REPLACEMENT CHARACTER
11EF3..11EF4;N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
11EF5..11EF6;N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
11EF7..11EF8;N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
+11FB0;N # Lo LISU LETTER YHA
11FC0..11FD4;N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH
11FD5..11FDC;N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI
11FDD..11FE0;N # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN
@@ -2200,8 +2234,12 @@ FFFD;A # So REPLACEMENT CHARACTER
16FE0..16FE1;W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK
16FE2;W # Po OLD CHINESE HOOK MARK
16FE3;W # Lm OLD CHINESE ITERATION MARK
+16FE4;W # Mn KHITAN SMALL SCRIPT FILLER
+16FF0..16FF1;W # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
17000..187F7;W # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7
-18800..18AF2;W # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
+18800..18AFF;W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768
+18B00..18CD5;W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5
+18D00..18D08;W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08
1B000..1B0FF;W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2
1B100..1B11E;W # Lo [31] HENTAIGANA LETTER RE-3..HENTAIGANA LETTER N-MU-MO-2
1B150..1B152;W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO
@@ -2364,15 +2402,17 @@ FFFD;A # So REPLACEMENT CHARACTER
1F0D1..1F0F5;N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21
1F100..1F10A;A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA
1F10B..1F10C;N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
+1F10D..1F10F;N # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
1F110..1F12D;A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD
1F12E..1F12F;N # So [2] CIRCLED WZ..COPYLEFT SYMBOL
1F130..1F169;A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
-1F16A..1F16C;N # So [3] RAISED MC SIGN..RAISED MR SIGN
+1F16A..1F16F;N # So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE
1F170..1F18D;A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA
1F18E;W # So NEGATIVE SQUARED AB
1F18F..1F190;A # So [2] NEGATIVE SQUARED WC..SQUARE DJ
1F191..1F19A;W # So [10] SQUARED CL..SQUARED VS
1F19B..1F1AC;A # So [18] SQUARED THREE D..SQUARED VOD
+1F1AD;N # So MASK WORK SYMBOL
1F1E6..1F1FF;N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F200..1F202;W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA
1F210..1F23B;W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D
@@ -2424,11 +2464,11 @@ FFFD;A # So REPLACEMENT CHARACTER
1F6CD..1F6CF;N # So [3] SHOPPING BAGS..BED
1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY
1F6D3..1F6D4;N # So [2] STUPA..PAGODA
-1F6D5;W # So HINDU TEMPLE
+1F6D5..1F6D7;W # So [3] HINDU TEMPLE..ELEVATOR
1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE
1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING
1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP
-1F6F4..1F6FA;W # So [7] SCOOTER..AUTO RICKSHAW
+1F6F4..1F6FC;W # So [9] SCOOTER..ROLLER SKATE
1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
1F780..1F7D8;N # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
1F7E0..1F7EB;W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE
@@ -2437,21 +2477,29 @@ FFFD;A # So REPLACEMENT CHARACTER
1F850..1F859;N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
1F860..1F887;N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW
1F890..1F8AD;N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
+1F8B0..1F8B1;N # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
1F900..1F90B;N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
-1F90D..1F971;W # So [101] WHITE HEART..YAWNING FACE
-1F973..1F976;W # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
-1F97A..1F9A2;W # So [41] FACE WITH PLEADING EYES..SWAN
-1F9A5..1F9AA;W # So [6] SLOTH..OYSTER
-1F9AE..1F9CA;W # So [29] GUIDE DOG..ICE CUBE
+1F90C..1F93A;W # So [47] PINCHED FINGERS..FENCER
+1F93B;N # So MODERN PENTATHLON
+1F93C..1F945;W # So [10] WRESTLERS..GOAL NET
+1F946;N # So RIFLE
+1F947..1F978;W # So [50] FIRST PLACE MEDAL..DISGUISED FACE
+1F97A..1F9CB;W # So [82] FACE WITH PLEADING EYES..BUBBLE TEA
1F9CD..1F9FF;W # So [51] STANDING PERSON..NAZAR AMULET
1FA00..1FA53;N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP
1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA70..1FA73;W # So [4] BALLET SHOES..SHORTS
+1FA70..1FA74;W # So [5] BALLET SHOES..THONG SANDAL
1FA78..1FA7A;W # So [3] DROP OF BLOOD..STETHOSCOPE
-1FA80..1FA82;W # So [3] YO-YO..PARACHUTE
-1FA90..1FA95;W # So [6] RINGED PLANET..BANJO
-20000..2A6D6;W # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
-2A6D7..2A6FF;W # Cn [41] <reserved-2A6D7>..<reserved-2A6FF>
+1FA80..1FA86;W # So [7] YO-YO..NESTING DOLLS
+1FA90..1FAA8;W # So [25] RINGED PLANET..ROCK
+1FAB0..1FAB6;W # So [7] FLY..FEATHER
+1FAC0..1FAC2;W # So [3] ANATOMICAL HEART..PEOPLE HUGGING
+1FAD0..1FAD6;W # So [7] BLUEBERRIES..TEAPOT
+1FB00..1FB92;N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
+1FB94..1FBCA;N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON
+1FBF0..1FBF9;N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE
+20000..2A6DD;W # Lo [42718] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DD
+2A6DE..2A6FF;W # Cn [34] <reserved-2A6DE>..<reserved-2A6FF>
2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
2B735..2B73F;W # Cn [11] <reserved-2B735>..<reserved-2B73F>
2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
@@ -2463,7 +2511,8 @@ FFFD;A # So REPLACEMENT CHARACTER
2F800..2FA1D;W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
2FA1E..2FA1F;W # Cn [2] <reserved-2FA1E>..<reserved-2FA1F>
2FA20..2FFFD;W # Cn [1502] <reserved-2FA20>..<reserved-2FFFD>
-30000..3FFFD;W # Cn [65534] <reserved-30000>..<reserved-3FFFD>
+30000..3134A;W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
+3134B..3FFFD;W # Cn [60595] <reserved-3134B>..<reserved-3FFFD>
E0001;N # Cf LANGUAGE TAG
E0020..E007F;N # Cf [96] TAG SPACE..CANCEL TAG
E0100..E01EF;A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt
index e65aec52f7..e22f967bba 100644
--- a/unicode/UnicodeData.txt
+++ b/unicode/UnicodeData.txt
@@ -2118,6 +2118,16 @@
08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;;
08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;;
08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;;
+08BE;ARABIC LETTER PEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+08BF;ARABIC LETTER TEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+08C0;ARABIC LETTER TTEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+08C1;ARABIC LETTER TCHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+08C2;ARABIC LETTER KEHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+08C3;ARABIC LETTER GHAIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08C4;ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08C5;ARABIC LETTER JEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+08C6;ARABIC LETTER JEEM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+08C7;ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;;
08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;;
08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;;
@@ -2621,6 +2631,7 @@
0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;;
0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;;
0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+0B55;ORIYA SIGN OVERLINE;Mn;0;NSM;;;;;N;;;;;
0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;;
0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;;
@@ -2911,6 +2922,7 @@
0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0D04;MALAYALAM LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;;
0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;;
0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;;
@@ -3024,6 +3036,7 @@
0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;;
0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;;
0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;;
+0D81;SINHALA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;;
0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;;
0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;;
@@ -6044,6 +6057,8 @@
1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;;
1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;;
1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;;
+1ABF;COMBINING LATIN SMALL LETTER W BELOW;Mn;220;NSM;;;;;N;;;;;
+1AC0;COMBINING LATIN SMALL LETTER TURNED W BELOW;Mn;220;NSM;;;;;N;;;;;
1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;;
1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;;
1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;;
@@ -10133,6 +10148,7 @@
2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;;
2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;;
2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B97;SYMBOL FOR TYPE A ELECTRONICS;So;0;ON;;;;;N;;;;;
2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;;
@@ -10776,6 +10792,9 @@
2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;;
2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;;
2E4F;CORNISH VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2E50;CROSS PATTY WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;;
+2E51;CROSS PATTY WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;;
+2E52;TIRONIAN SIGN CAPITAL ET;Po;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -11550,6 +11569,11 @@
31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;;
31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;;
31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;;
+31BB;BOPOMOFO FINAL LETTER G;Lo;0;L;;;;;N;;;;;
+31BC;BOPOMOFO LETTER GW;Lo;0;L;;;;;N;;;;;
+31BD;BOPOMOFO LETTER KW;Lo;0;L;;;;;N;;;;;
+31BE;BOPOMOFO LETTER OE;Lo;0;L;;;;;N;;;;;
+31BF;BOPOMOFO LETTER AH;Lo;0;L;;;;;N;;;;;
31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
@@ -12114,7 +12138,7 @@
33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
-4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DBF;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
@@ -12180,7 +12204,7 @@
4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
-9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+9FFC;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
@@ -14130,6 +14154,12 @@ A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2
A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794;
A7C5;LATIN CAPITAL LETTER S WITH HOOK;Lu;0;L;;;;;N;;;;0282;
A7C6;LATIN CAPITAL LETTER Z WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;1D8E;
+A7C7;LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7C8;
+A7C8;LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C7;;A7C7
+A7C9;LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7CA;
+A7CA;LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C9;;A7C9
+A7F5;LATIN CAPITAL LETTER REVERSED HALF H;Lu;0;L;;;;;N;;;;A7F6;
+A7F6;LATIN SMALL LETTER REVERSED HALF H;Ll;0;L;;;;;N;;;A7F5;;A7F5
A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;;
A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L;<super> 0126;;;;N;;;;;
A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L;<super> 0153;;;;N;;;;;
@@ -14183,6 +14213,7 @@ A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A82C;SYLOTI NAGRI SIGN ALTERNATE HASANTA;Mn;9;NSM;;;;;N;;;;;
A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;;
A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;;
A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;;
@@ -14897,6 +14928,10 @@ AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;;
AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;;
AB66;LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
AB67;LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+AB68;LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+AB69;MODIFIER LETTER SMALL TURNED W;Lm;0;L;<super> 028D;;;;N;;;;;
+AB6A;MODIFIER LETTER LEFT TACK;Sk;0;ON;;;;;N;;;;;
+AB6B;MODIFIER LETTER RIGHT TACK;Sk;0;ON;;;;;N;;;;;
AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0
AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1
AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2
@@ -17086,6 +17121,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;;
1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;;
1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;;
+1019C;ASCIA SYMBOL;So;0;ON;;;;;N;;;;;
101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;;
101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;;
101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;;
@@ -19057,6 +19093,53 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;;
10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;;
10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;;
+10E80;YEZIDI LETTER ELIF;Lo;0;R;;;;;N;;;;;
+10E81;YEZIDI LETTER BE;Lo;0;R;;;;;N;;;;;
+10E82;YEZIDI LETTER PE;Lo;0;R;;;;;N;;;;;
+10E83;YEZIDI LETTER PHE;Lo;0;R;;;;;N;;;;;
+10E84;YEZIDI LETTER THE;Lo;0;R;;;;;N;;;;;
+10E85;YEZIDI LETTER SE;Lo;0;R;;;;;N;;;;;
+10E86;YEZIDI LETTER CIM;Lo;0;R;;;;;N;;;;;
+10E87;YEZIDI LETTER CHIM;Lo;0;R;;;;;N;;;;;
+10E88;YEZIDI LETTER CHHIM;Lo;0;R;;;;;N;;;;;
+10E89;YEZIDI LETTER HHA;Lo;0;R;;;;;N;;;;;
+10E8A;YEZIDI LETTER XA;Lo;0;R;;;;;N;;;;;
+10E8B;YEZIDI LETTER DAL;Lo;0;R;;;;;N;;;;;
+10E8C;YEZIDI LETTER ZAL;Lo;0;R;;;;;N;;;;;
+10E8D;YEZIDI LETTER RA;Lo;0;R;;;;;N;;;;;
+10E8E;YEZIDI LETTER RHA;Lo;0;R;;;;;N;;;;;
+10E8F;YEZIDI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10E90;YEZIDI LETTER JA;Lo;0;R;;;;;N;;;;;
+10E91;YEZIDI LETTER SIN;Lo;0;R;;;;;N;;;;;
+10E92;YEZIDI LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10E93;YEZIDI LETTER SAD;Lo;0;R;;;;;N;;;;;
+10E94;YEZIDI LETTER DAD;Lo;0;R;;;;;N;;;;;
+10E95;YEZIDI LETTER TA;Lo;0;R;;;;;N;;;;;
+10E96;YEZIDI LETTER ZE;Lo;0;R;;;;;N;;;;;
+10E97;YEZIDI LETTER EYN;Lo;0;R;;;;;N;;;;;
+10E98;YEZIDI LETTER XHEYN;Lo;0;R;;;;;N;;;;;
+10E99;YEZIDI LETTER FA;Lo;0;R;;;;;N;;;;;
+10E9A;YEZIDI LETTER VA;Lo;0;R;;;;;N;;;;;
+10E9B;YEZIDI LETTER VA ALTERNATE FORM;Lo;0;R;;;;;N;;;;;
+10E9C;YEZIDI LETTER QAF;Lo;0;R;;;;;N;;;;;
+10E9D;YEZIDI LETTER KAF;Lo;0;R;;;;;N;;;;;
+10E9E;YEZIDI LETTER KHAF;Lo;0;R;;;;;N;;;;;
+10E9F;YEZIDI LETTER GAF;Lo;0;R;;;;;N;;;;;
+10EA0;YEZIDI LETTER LAM;Lo;0;R;;;;;N;;;;;
+10EA1;YEZIDI LETTER MIM;Lo;0;R;;;;;N;;;;;
+10EA2;YEZIDI LETTER NUN;Lo;0;R;;;;;N;;;;;
+10EA3;YEZIDI LETTER UM;Lo;0;R;;;;;N;;;;;
+10EA4;YEZIDI LETTER WAW;Lo;0;R;;;;;N;;;;;
+10EA5;YEZIDI LETTER OW;Lo;0;R;;;;;N;;;;;
+10EA6;YEZIDI LETTER EW;Lo;0;R;;;;;N;;;;;
+10EA7;YEZIDI LETTER HAY;Lo;0;R;;;;;N;;;;;
+10EA8;YEZIDI LETTER YOT;Lo;0;R;;;;;N;;;;;
+10EA9;YEZIDI LETTER ET;Lo;0;R;;;;;N;;;;;
+10EAB;YEZIDI COMBINING HAMZA MARK;Mn;230;NSM;;;;;N;;;;;
+10EAC;YEZIDI COMBINING MADDA MARK;Mn;230;NSM;;;;;N;;;;;
+10EAD;YEZIDI HYPHENATION MARK;Pd;0;R;;;;;N;;;;;
+10EB0;YEZIDI LETTER LAM WITH DOT ABOVE;Lo;0;R;;;;;N;;;;;
+10EB1;YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE;Lo;0;R;;;;;N;;;;;
10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;;
10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
@@ -19139,6 +19222,34 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;;
10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
+10FB0;CHORASMIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10FB1;CHORASMIAN LETTER SMALL ALEPH;Lo;0;R;;;;;N;;;;;
+10FB2;CHORASMIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
+10FB3;CHORASMIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;;
+10FB4;CHORASMIAN LETTER DALETH;Lo;0;R;;;;;N;;;;;
+10FB5;CHORASMIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10FB6;CHORASMIAN LETTER WAW;Lo;0;R;;;;;N;;;;;
+10FB7;CHORASMIAN LETTER CURLED WAW;Lo;0;R;;;;;N;;;;;
+10FB8;CHORASMIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10FB9;CHORASMIAN LETTER HETH;Lo;0;R;;;;;N;;;;;
+10FBA;CHORASMIAN LETTER YODH;Lo;0;R;;;;;N;;;;;
+10FBB;CHORASMIAN LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10FBC;CHORASMIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10FBD;CHORASMIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+10FBE;CHORASMIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+10FBF;CHORASMIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10FC0;CHORASMIAN LETTER AYIN;Lo;0;R;;;;;N;;;;;
+10FC1;CHORASMIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10FC2;CHORASMIAN LETTER RESH;Lo;0;R;;;;;N;;;;;
+10FC3;CHORASMIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10FC4;CHORASMIAN LETTER TAW;Lo;0;R;;;;;N;;;;;
+10FC5;CHORASMIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10FC6;CHORASMIAN NUMBER TWO;No;0;R;;;;2;N;;;;;
+10FC7;CHORASMIAN NUMBER THREE;No;0;R;;;;3;N;;;;;
+10FC8;CHORASMIAN NUMBER FOUR;No;0;R;;;;4;N;;;;;
+10FC9;CHORASMIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10FCA;CHORASMIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10FCB;CHORASMIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
10FE0;ELYMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;;
10FE1;ELYMAIC LETTER BETH;Lo;0;R;;;;;N;;;;;
10FE2;ELYMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;;
@@ -19443,6 +19554,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;;
11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;;
+11147;CHAKMA LETTER VAA;Lo;0;L;;;;;N;;;;;
11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;;
11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;;
11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;;
@@ -19560,6 +19672,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;;
111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;;
111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;;
+111CE;SHARADA VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;;
+111CF;SHARADA SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -19941,10 +20055,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11457;NEWA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
11458;NEWA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1145A;NEWA DOUBLE COMMA;Po;0;L;;;;;N;;;;;
1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;;
1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;;
1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;;
1145F;NEWA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;;
+11460;NEWA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;;
+11461;NEWA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;;
11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;;
11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;;
11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;;
@@ -20480,6 +20597,78 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;;
118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;;
+11900;DIVES AKURU LETTER A;Lo;0;L;;;;;N;;;;;
+11901;DIVES AKURU LETTER AA;Lo;0;L;;;;;N;;;;;
+11902;DIVES AKURU LETTER I;Lo;0;L;;;;;N;;;;;
+11903;DIVES AKURU LETTER II;Lo;0;L;;;;;N;;;;;
+11904;DIVES AKURU LETTER U;Lo;0;L;;;;;N;;;;;
+11905;DIVES AKURU LETTER UU;Lo;0;L;;;;;N;;;;;
+11906;DIVES AKURU LETTER E;Lo;0;L;;;;;N;;;;;
+11909;DIVES AKURU LETTER O;Lo;0;L;;;;;N;;;;;
+1190C;DIVES AKURU LETTER KA;Lo;0;L;;;;;N;;;;;
+1190D;DIVES AKURU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1190E;DIVES AKURU LETTER GA;Lo;0;L;;;;;N;;;;;
+1190F;DIVES AKURU LETTER GHA;Lo;0;L;;;;;N;;;;;
+11910;DIVES AKURU LETTER NGA;Lo;0;L;;;;;N;;;;;
+11911;DIVES AKURU LETTER CA;Lo;0;L;;;;;N;;;;;
+11912;DIVES AKURU LETTER CHA;Lo;0;L;;;;;N;;;;;
+11913;DIVES AKURU LETTER JA;Lo;0;L;;;;;N;;;;;
+11915;DIVES AKURU LETTER NYA;Lo;0;L;;;;;N;;;;;
+11916;DIVES AKURU LETTER TTA;Lo;0;L;;;;;N;;;;;
+11918;DIVES AKURU LETTER DDA;Lo;0;L;;;;;N;;;;;
+11919;DIVES AKURU LETTER DDHA;Lo;0;L;;;;;N;;;;;
+1191A;DIVES AKURU LETTER NNA;Lo;0;L;;;;;N;;;;;
+1191B;DIVES AKURU LETTER TA;Lo;0;L;;;;;N;;;;;
+1191C;DIVES AKURU LETTER THA;Lo;0;L;;;;;N;;;;;
+1191D;DIVES AKURU LETTER DA;Lo;0;L;;;;;N;;;;;
+1191E;DIVES AKURU LETTER DHA;Lo;0;L;;;;;N;;;;;
+1191F;DIVES AKURU LETTER NA;Lo;0;L;;;;;N;;;;;
+11920;DIVES AKURU LETTER PA;Lo;0;L;;;;;N;;;;;
+11921;DIVES AKURU LETTER PHA;Lo;0;L;;;;;N;;;;;
+11922;DIVES AKURU LETTER BA;Lo;0;L;;;;;N;;;;;
+11923;DIVES AKURU LETTER BHA;Lo;0;L;;;;;N;;;;;
+11924;DIVES AKURU LETTER MA;Lo;0;L;;;;;N;;;;;
+11925;DIVES AKURU LETTER YA;Lo;0;L;;;;;N;;;;;
+11926;DIVES AKURU LETTER YYA;Lo;0;L;;;;;N;;;;;
+11927;DIVES AKURU LETTER RA;Lo;0;L;;;;;N;;;;;
+11928;DIVES AKURU LETTER LA;Lo;0;L;;;;;N;;;;;
+11929;DIVES AKURU LETTER VA;Lo;0;L;;;;;N;;;;;
+1192A;DIVES AKURU LETTER SHA;Lo;0;L;;;;;N;;;;;
+1192B;DIVES AKURU LETTER SSA;Lo;0;L;;;;;N;;;;;
+1192C;DIVES AKURU LETTER SA;Lo;0;L;;;;;N;;;;;
+1192D;DIVES AKURU LETTER HA;Lo;0;L;;;;;N;;;;;
+1192E;DIVES AKURU LETTER LLA;Lo;0;L;;;;;N;;;;;
+1192F;DIVES AKURU LETTER ZA;Lo;0;L;;;;;N;;;;;
+11930;DIVES AKURU VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+11931;DIVES AKURU VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+11932;DIVES AKURU VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+11933;DIVES AKURU VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+11934;DIVES AKURU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+11935;DIVES AKURU VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+11937;DIVES AKURU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+11938;DIVES AKURU VOWEL SIGN O;Mc;0;L;11935 11930;;;;N;;;;;
+1193B;DIVES AKURU SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1193C;DIVES AKURU SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
+1193D;DIVES AKURU SIGN HALANTA;Mc;9;L;;;;;N;;;;;
+1193E;DIVES AKURU VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1193F;DIVES AKURU PREFIXED NASAL SIGN;Lo;0;L;;;;;N;;;;;
+11940;DIVES AKURU MEDIAL YA;Mc;0;L;;;;;N;;;;;
+11941;DIVES AKURU INITIAL RA;Lo;0;L;;;;;N;;;;;
+11942;DIVES AKURU MEDIAL RA;Mc;0;L;;;;;N;;;;;
+11943;DIVES AKURU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+11944;DIVES AKURU DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+11945;DIVES AKURU GAP FILLER;Po;0;L;;;;;N;;;;;
+11946;DIVES AKURU END OF TEXT MARK;Po;0;L;;;;;N;;;;;
+11950;DIVES AKURU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+11951;DIVES AKURU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+11952;DIVES AKURU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+11953;DIVES AKURU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+11954;DIVES AKURU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+11955;DIVES AKURU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+11956;DIVES AKURU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+11957;DIVES AKURU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+11958;DIVES AKURU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+11959;DIVES AKURU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
119A0;NANDINAGARI LETTER A;Lo;0;L;;;;;N;;;;;
119A1;NANDINAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
119A2;NANDINAGARI LETTER I;Lo;0;L;;;;;N;;;;;
@@ -21085,6 +21274,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;;
11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;;
+11FB0;LISU LETTER YHA;Lo;0;L;;;;;N;;;;;
11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;;
11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;;
11FC2;TAMIL FRACTION ONE EIGHTIETH;No;0;L;;;;1/80;N;;;;;
@@ -25052,6 +25242,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;;
16FE2;OLD CHINESE HOOK MARK;Po;0;ON;;;;;N;;;;;
16FE3;OLD CHINESE ITERATION MARK;Lm;0;L;;;;;N;;;;;
+16FE4;KHITAN SMALL SCRIPT FILLER;Mn;0;NSM;;;;;N;;;;;
+16FF0;VIETNAMESE ALTERNATE READING MARK CA;Mc;6;L;;;;;N;;;;;
+16FF1;VIETNAMESE ALTERNATE READING MARK NHAY;Mc;6;L;;;;;N;;;;;
17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;;
187F7;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;;
18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;;
@@ -25809,6 +26002,491 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
18AF0;TANGUT COMPONENT-753;Lo;0;L;;;;;N;;;;;
18AF1;TANGUT COMPONENT-754;Lo;0;L;;;;;N;;;;;
18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;;
+18AF3;TANGUT COMPONENT-756;Lo;0;L;;;;;N;;;;;
+18AF4;TANGUT COMPONENT-757;Lo;0;L;;;;;N;;;;;
+18AF5;TANGUT COMPONENT-758;Lo;0;L;;;;;N;;;;;
+18AF6;TANGUT COMPONENT-759;Lo;0;L;;;;;N;;;;;
+18AF7;TANGUT COMPONENT-760;Lo;0;L;;;;;N;;;;;
+18AF8;TANGUT COMPONENT-761;Lo;0;L;;;;;N;;;;;
+18AF9;TANGUT COMPONENT-762;Lo;0;L;;;;;N;;;;;
+18AFA;TANGUT COMPONENT-763;Lo;0;L;;;;;N;;;;;
+18AFB;TANGUT COMPONENT-764;Lo;0;L;;;;;N;;;;;
+18AFC;TANGUT COMPONENT-765;Lo;0;L;;;;;N;;;;;
+18AFD;TANGUT COMPONENT-766;Lo;0;L;;;;;N;;;;;
+18AFE;TANGUT COMPONENT-767;Lo;0;L;;;;;N;;;;;
+18AFF;TANGUT COMPONENT-768;Lo;0;L;;;;;N;;;;;
+18B00;KHITAN SMALL SCRIPT CHARACTER-18B00;Lo;0;L;;;;;N;;;;;
+18B01;KHITAN SMALL SCRIPT CHARACTER-18B01;Lo;0;L;;;;;N;;;;;
+18B02;KHITAN SMALL SCRIPT CHARACTER-18B02;Lo;0;L;;;;;N;;;;;
+18B03;KHITAN SMALL SCRIPT CHARACTER-18B03;Lo;0;L;;;;;N;;;;;
+18B04;KHITAN SMALL SCRIPT CHARACTER-18B04;Lo;0;L;;;;;N;;;;;
+18B05;KHITAN SMALL SCRIPT CHARACTER-18B05;Lo;0;L;;;;;N;;;;;
+18B06;KHITAN SMALL SCRIPT CHARACTER-18B06;Lo;0;L;;;;;N;;;;;
+18B07;KHITAN SMALL SCRIPT CHARACTER-18B07;Lo;0;L;;;;;N;;;;;
+18B08;KHITAN SMALL SCRIPT CHARACTER-18B08;Lo;0;L;;;;;N;;;;;
+18B09;KHITAN SMALL SCRIPT CHARACTER-18B09;Lo;0;L;;;;;N;;;;;
+18B0A;KHITAN SMALL SCRIPT CHARACTER-18B0A;Lo;0;L;;;;;N;;;;;
+18B0B;KHITAN SMALL SCRIPT CHARACTER-18B0B;Lo;0;L;;;;;N;;;;;
+18B0C;KHITAN SMALL SCRIPT CHARACTER-18B0C;Lo;0;L;;;;;N;;;;;
+18B0D;KHITAN SMALL SCRIPT CHARACTER-18B0D;Lo;0;L;;;;;N;;;;;
+18B0E;KHITAN SMALL SCRIPT CHARACTER-18B0E;Lo;0;L;;;;;N;;;;;
+18B0F;KHITAN SMALL SCRIPT CHARACTER-18B0F;Lo;0;L;;;;;N;;;;;
+18B10;KHITAN SMALL SCRIPT CHARACTER-18B10;Lo;0;L;;;;;N;;;;;
+18B11;KHITAN SMALL SCRIPT CHARACTER-18B11;Lo;0;L;;;;;N;;;;;
+18B12;KHITAN SMALL SCRIPT CHARACTER-18B12;Lo;0;L;;;;;N;;;;;
+18B13;KHITAN SMALL SCRIPT CHARACTER-18B13;Lo;0;L;;;;;N;;;;;
+18B14;KHITAN SMALL SCRIPT CHARACTER-18B14;Lo;0;L;;;;;N;;;;;
+18B15;KHITAN SMALL SCRIPT CHARACTER-18B15;Lo;0;L;;;;;N;;;;;
+18B16;KHITAN SMALL SCRIPT CHARACTER-18B16;Lo;0;L;;;;;N;;;;;
+18B17;KHITAN SMALL SCRIPT CHARACTER-18B17;Lo;0;L;;;;;N;;;;;
+18B18;KHITAN SMALL SCRIPT CHARACTER-18B18;Lo;0;L;;;;;N;;;;;
+18B19;KHITAN SMALL SCRIPT CHARACTER-18B19;Lo;0;L;;;;;N;;;;;
+18B1A;KHITAN SMALL SCRIPT CHARACTER-18B1A;Lo;0;L;;;;;N;;;;;
+18B1B;KHITAN SMALL SCRIPT CHARACTER-18B1B;Lo;0;L;;;;;N;;;;;
+18B1C;KHITAN SMALL SCRIPT CHARACTER-18B1C;Lo;0;L;;;;;N;;;;;
+18B1D;KHITAN SMALL SCRIPT CHARACTER-18B1D;Lo;0;L;;;;;N;;;;;
+18B1E;KHITAN SMALL SCRIPT CHARACTER-18B1E;Lo;0;L;;;;;N;;;;;
+18B1F;KHITAN SMALL SCRIPT CHARACTER-18B1F;Lo;0;L;;;;;N;;;;;
+18B20;KHITAN SMALL SCRIPT CHARACTER-18B20;Lo;0;L;;;;;N;;;;;
+18B21;KHITAN SMALL SCRIPT CHARACTER-18B21;Lo;0;L;;;;;N;;;;;
+18B22;KHITAN SMALL SCRIPT CHARACTER-18B22;Lo;0;L;;;;;N;;;;;
+18B23;KHITAN SMALL SCRIPT CHARACTER-18B23;Lo;0;L;;;;;N;;;;;
+18B24;KHITAN SMALL SCRIPT CHARACTER-18B24;Lo;0;L;;;;;N;;;;;
+18B25;KHITAN SMALL SCRIPT CHARACTER-18B25;Lo;0;L;;;;;N;;;;;
+18B26;KHITAN SMALL SCRIPT CHARACTER-18B26;Lo;0;L;;;;;N;;;;;
+18B27;KHITAN SMALL SCRIPT CHARACTER-18B27;Lo;0;L;;;;;N;;;;;
+18B28;KHITAN SMALL SCRIPT CHARACTER-18B28;Lo;0;L;;;;;N;;;;;
+18B29;KHITAN SMALL SCRIPT CHARACTER-18B29;Lo;0;L;;;;;N;;;;;
+18B2A;KHITAN SMALL SCRIPT CHARACTER-18B2A;Lo;0;L;;;;;N;;;;;
+18B2B;KHITAN SMALL SCRIPT CHARACTER-18B2B;Lo;0;L;;;;;N;;;;;
+18B2C;KHITAN SMALL SCRIPT CHARACTER-18B2C;Lo;0;L;;;;;N;;;;;
+18B2D;KHITAN SMALL SCRIPT CHARACTER-18B2D;Lo;0;L;;;;;N;;;;;
+18B2E;KHITAN SMALL SCRIPT CHARACTER-18B2E;Lo;0;L;;;;;N;;;;;
+18B2F;KHITAN SMALL SCRIPT CHARACTER-18B2F;Lo;0;L;;;;;N;;;;;
+18B30;KHITAN SMALL SCRIPT CHARACTER-18B30;Lo;0;L;;;;;N;;;;;
+18B31;KHITAN SMALL SCRIPT CHARACTER-18B31;Lo;0;L;;;;;N;;;;;
+18B32;KHITAN SMALL SCRIPT CHARACTER-18B32;Lo;0;L;;;;;N;;;;;
+18B33;KHITAN SMALL SCRIPT CHARACTER-18B33;Lo;0;L;;;;;N;;;;;
+18B34;KHITAN SMALL SCRIPT CHARACTER-18B34;Lo;0;L;;;;;N;;;;;
+18B35;KHITAN SMALL SCRIPT CHARACTER-18B35;Lo;0;L;;;;;N;;;;;
+18B36;KHITAN SMALL SCRIPT CHARACTER-18B36;Lo;0;L;;;;;N;;;;;
+18B37;KHITAN SMALL SCRIPT CHARACTER-18B37;Lo;0;L;;;;;N;;;;;
+18B38;KHITAN SMALL SCRIPT CHARACTER-18B38;Lo;0;L;;;;;N;;;;;
+18B39;KHITAN SMALL SCRIPT CHARACTER-18B39;Lo;0;L;;;;;N;;;;;
+18B3A;KHITAN SMALL SCRIPT CHARACTER-18B3A;Lo;0;L;;;;;N;;;;;
+18B3B;KHITAN SMALL SCRIPT CHARACTER-18B3B;Lo;0;L;;;;;N;;;;;
+18B3C;KHITAN SMALL SCRIPT CHARACTER-18B3C;Lo;0;L;;;;;N;;;;;
+18B3D;KHITAN SMALL SCRIPT CHARACTER-18B3D;Lo;0;L;;;;;N;;;;;
+18B3E;KHITAN SMALL SCRIPT CHARACTER-18B3E;Lo;0;L;;;;;N;;;;;
+18B3F;KHITAN SMALL SCRIPT CHARACTER-18B3F;Lo;0;L;;;;;N;;;;;
+18B40;KHITAN SMALL SCRIPT CHARACTER-18B40;Lo;0;L;;;;;N;;;;;
+18B41;KHITAN SMALL SCRIPT CHARACTER-18B41;Lo;0;L;;;;;N;;;;;
+18B42;KHITAN SMALL SCRIPT CHARACTER-18B42;Lo;0;L;;;;;N;;;;;
+18B43;KHITAN SMALL SCRIPT CHARACTER-18B43;Lo;0;L;;;;;N;;;;;
+18B44;KHITAN SMALL SCRIPT CHARACTER-18B44;Lo;0;L;;;;;N;;;;;
+18B45;KHITAN SMALL SCRIPT CHARACTER-18B45;Lo;0;L;;;;;N;;;;;
+18B46;KHITAN SMALL SCRIPT CHARACTER-18B46;Lo;0;L;;;;;N;;;;;
+18B47;KHITAN SMALL SCRIPT CHARACTER-18B47;Lo;0;L;;;;;N;;;;;
+18B48;KHITAN SMALL SCRIPT CHARACTER-18B48;Lo;0;L;;;;;N;;;;;
+18B49;KHITAN SMALL SCRIPT CHARACTER-18B49;Lo;0;L;;;;;N;;;;;
+18B4A;KHITAN SMALL SCRIPT CHARACTER-18B4A;Lo;0;L;;;;;N;;;;;
+18B4B;KHITAN SMALL SCRIPT CHARACTER-18B4B;Lo;0;L;;;;;N;;;;;
+18B4C;KHITAN SMALL SCRIPT CHARACTER-18B4C;Lo;0;L;;;;;N;;;;;
+18B4D;KHITAN SMALL SCRIPT CHARACTER-18B4D;Lo;0;L;;;;;N;;;;;
+18B4E;KHITAN SMALL SCRIPT CHARACTER-18B4E;Lo;0;L;;;;;N;;;;;
+18B4F;KHITAN SMALL SCRIPT CHARACTER-18B4F;Lo;0;L;;;;;N;;;;;
+18B50;KHITAN SMALL SCRIPT CHARACTER-18B50;Lo;0;L;;;;;N;;;;;
+18B51;KHITAN SMALL SCRIPT CHARACTER-18B51;Lo;0;L;;;;;N;;;;;
+18B52;KHITAN SMALL SCRIPT CHARACTER-18B52;Lo;0;L;;;;;N;;;;;
+18B53;KHITAN SMALL SCRIPT CHARACTER-18B53;Lo;0;L;;;;;N;;;;;
+18B54;KHITAN SMALL SCRIPT CHARACTER-18B54;Lo;0;L;;;;;N;;;;;
+18B55;KHITAN SMALL SCRIPT CHARACTER-18B55;Lo;0;L;;;;;N;;;;;
+18B56;KHITAN SMALL SCRIPT CHARACTER-18B56;Lo;0;L;;;;;N;;;;;
+18B57;KHITAN SMALL SCRIPT CHARACTER-18B57;Lo;0;L;;;;;N;;;;;
+18B58;KHITAN SMALL SCRIPT CHARACTER-18B58;Lo;0;L;;;;;N;;;;;
+18B59;KHITAN SMALL SCRIPT CHARACTER-18B59;Lo;0;L;;;;;N;;;;;
+18B5A;KHITAN SMALL SCRIPT CHARACTER-18B5A;Lo;0;L;;;;;N;;;;;
+18B5B;KHITAN SMALL SCRIPT CHARACTER-18B5B;Lo;0;L;;;;;N;;;;;
+18B5C;KHITAN SMALL SCRIPT CHARACTER-18B5C;Lo;0;L;;;;;N;;;;;
+18B5D;KHITAN SMALL SCRIPT CHARACTER-18B5D;Lo;0;L;;;;;N;;;;;
+18B5E;KHITAN SMALL SCRIPT CHARACTER-18B5E;Lo;0;L;;;;;N;;;;;
+18B5F;KHITAN SMALL SCRIPT CHARACTER-18B5F;Lo;0;L;;;;;N;;;;;
+18B60;KHITAN SMALL SCRIPT CHARACTER-18B60;Lo;0;L;;;;;N;;;;;
+18B61;KHITAN SMALL SCRIPT CHARACTER-18B61;Lo;0;L;;;;;N;;;;;
+18B62;KHITAN SMALL SCRIPT CHARACTER-18B62;Lo;0;L;;;;;N;;;;;
+18B63;KHITAN SMALL SCRIPT CHARACTER-18B63;Lo;0;L;;;;;N;;;;;
+18B64;KHITAN SMALL SCRIPT CHARACTER-18B64;Lo;0;L;;;;;N;;;;;
+18B65;KHITAN SMALL SCRIPT CHARACTER-18B65;Lo;0;L;;;;;N;;;;;
+18B66;KHITAN SMALL SCRIPT CHARACTER-18B66;Lo;0;L;;;;;N;;;;;
+18B67;KHITAN SMALL SCRIPT CHARACTER-18B67;Lo;0;L;;;;;N;;;;;
+18B68;KHITAN SMALL SCRIPT CHARACTER-18B68;Lo;0;L;;;;;N;;;;;
+18B69;KHITAN SMALL SCRIPT CHARACTER-18B69;Lo;0;L;;;;;N;;;;;
+18B6A;KHITAN SMALL SCRIPT CHARACTER-18B6A;Lo;0;L;;;;;N;;;;;
+18B6B;KHITAN SMALL SCRIPT CHARACTER-18B6B;Lo;0;L;;;;;N;;;;;
+18B6C;KHITAN SMALL SCRIPT CHARACTER-18B6C;Lo;0;L;;;;;N;;;;;
+18B6D;KHITAN SMALL SCRIPT CHARACTER-18B6D;Lo;0;L;;;;;N;;;;;
+18B6E;KHITAN SMALL SCRIPT CHARACTER-18B6E;Lo;0;L;;;;;N;;;;;
+18B6F;KHITAN SMALL SCRIPT CHARACTER-18B6F;Lo;0;L;;;;;N;;;;;
+18B70;KHITAN SMALL SCRIPT CHARACTER-18B70;Lo;0;L;;;;;N;;;;;
+18B71;KHITAN SMALL SCRIPT CHARACTER-18B71;Lo;0;L;;;;;N;;;;;
+18B72;KHITAN SMALL SCRIPT CHARACTER-18B72;Lo;0;L;;;;;N;;;;;
+18B73;KHITAN SMALL SCRIPT CHARACTER-18B73;Lo;0;L;;;;;N;;;;;
+18B74;KHITAN SMALL SCRIPT CHARACTER-18B74;Lo;0;L;;;;;N;;;;;
+18B75;KHITAN SMALL SCRIPT CHARACTER-18B75;Lo;0;L;;;;;N;;;;;
+18B76;KHITAN SMALL SCRIPT CHARACTER-18B76;Lo;0;L;;;;;N;;;;;
+18B77;KHITAN SMALL SCRIPT CHARACTER-18B77;Lo;0;L;;;;;N;;;;;
+18B78;KHITAN SMALL SCRIPT CHARACTER-18B78;Lo;0;L;;;;;N;;;;;
+18B79;KHITAN SMALL SCRIPT CHARACTER-18B79;Lo;0;L;;;;;N;;;;;
+18B7A;KHITAN SMALL SCRIPT CHARACTER-18B7A;Lo;0;L;;;;;N;;;;;
+18B7B;KHITAN SMALL SCRIPT CHARACTER-18B7B;Lo;0;L;;;;;N;;;;;
+18B7C;KHITAN SMALL SCRIPT CHARACTER-18B7C;Lo;0;L;;;;;N;;;;;
+18B7D;KHITAN SMALL SCRIPT CHARACTER-18B7D;Lo;0;L;;;;;N;;;;;
+18B7E;KHITAN SMALL SCRIPT CHARACTER-18B7E;Lo;0;L;;;;;N;;;;;
+18B7F;KHITAN SMALL SCRIPT CHARACTER-18B7F;Lo;0;L;;;;;N;;;;;
+18B80;KHITAN SMALL SCRIPT CHARACTER-18B80;Lo;0;L;;;;;N;;;;;
+18B81;KHITAN SMALL SCRIPT CHARACTER-18B81;Lo;0;L;;;;;N;;;;;
+18B82;KHITAN SMALL SCRIPT CHARACTER-18B82;Lo;0;L;;;;;N;;;;;
+18B83;KHITAN SMALL SCRIPT CHARACTER-18B83;Lo;0;L;;;;;N;;;;;
+18B84;KHITAN SMALL SCRIPT CHARACTER-18B84;Lo;0;L;;;;;N;;;;;
+18B85;KHITAN SMALL SCRIPT CHARACTER-18B85;Lo;0;L;;;;;N;;;;;
+18B86;KHITAN SMALL SCRIPT CHARACTER-18B86;Lo;0;L;;;;;N;;;;;
+18B87;KHITAN SMALL SCRIPT CHARACTER-18B87;Lo;0;L;;;;;N;;;;;
+18B88;KHITAN SMALL SCRIPT CHARACTER-18B88;Lo;0;L;;;;;N;;;;;
+18B89;KHITAN SMALL SCRIPT CHARACTER-18B89;Lo;0;L;;;;;N;;;;;
+18B8A;KHITAN SMALL SCRIPT CHARACTER-18B8A;Lo;0;L;;;;;N;;;;;
+18B8B;KHITAN SMALL SCRIPT CHARACTER-18B8B;Lo;0;L;;;;;N;;;;;
+18B8C;KHITAN SMALL SCRIPT CHARACTER-18B8C;Lo;0;L;;;;;N;;;;;
+18B8D;KHITAN SMALL SCRIPT CHARACTER-18B8D;Lo;0;L;;;;;N;;;;;
+18B8E;KHITAN SMALL SCRIPT CHARACTER-18B8E;Lo;0;L;;;;;N;;;;;
+18B8F;KHITAN SMALL SCRIPT CHARACTER-18B8F;Lo;0;L;;;;;N;;;;;
+18B90;KHITAN SMALL SCRIPT CHARACTER-18B90;Lo;0;L;;;;;N;;;;;
+18B91;KHITAN SMALL SCRIPT CHARACTER-18B91;Lo;0;L;;;;;N;;;;;
+18B92;KHITAN SMALL SCRIPT CHARACTER-18B92;Lo;0;L;;;;;N;;;;;
+18B93;KHITAN SMALL SCRIPT CHARACTER-18B93;Lo;0;L;;;;;N;;;;;
+18B94;KHITAN SMALL SCRIPT CHARACTER-18B94;Lo;0;L;;;;;N;;;;;
+18B95;KHITAN SMALL SCRIPT CHARACTER-18B95;Lo;0;L;;;;;N;;;;;
+18B96;KHITAN SMALL SCRIPT CHARACTER-18B96;Lo;0;L;;;;;N;;;;;
+18B97;KHITAN SMALL SCRIPT CHARACTER-18B97;Lo;0;L;;;;;N;;;;;
+18B98;KHITAN SMALL SCRIPT CHARACTER-18B98;Lo;0;L;;;;;N;;;;;
+18B99;KHITAN SMALL SCRIPT CHARACTER-18B99;Lo;0;L;;;;;N;;;;;
+18B9A;KHITAN SMALL SCRIPT CHARACTER-18B9A;Lo;0;L;;;;;N;;;;;
+18B9B;KHITAN SMALL SCRIPT CHARACTER-18B9B;Lo;0;L;;;;;N;;;;;
+18B9C;KHITAN SMALL SCRIPT CHARACTER-18B9C;Lo;0;L;;;;;N;;;;;
+18B9D;KHITAN SMALL SCRIPT CHARACTER-18B9D;Lo;0;L;;;;;N;;;;;
+18B9E;KHITAN SMALL SCRIPT CHARACTER-18B9E;Lo;0;L;;;;;N;;;;;
+18B9F;KHITAN SMALL SCRIPT CHARACTER-18B9F;Lo;0;L;;;;;N;;;;;
+18BA0;KHITAN SMALL SCRIPT CHARACTER-18BA0;Lo;0;L;;;;;N;;;;;
+18BA1;KHITAN SMALL SCRIPT CHARACTER-18BA1;Lo;0;L;;;;;N;;;;;
+18BA2;KHITAN SMALL SCRIPT CHARACTER-18BA2;Lo;0;L;;;;;N;;;;;
+18BA3;KHITAN SMALL SCRIPT CHARACTER-18BA3;Lo;0;L;;;;;N;;;;;
+18BA4;KHITAN SMALL SCRIPT CHARACTER-18BA4;Lo;0;L;;;;;N;;;;;
+18BA5;KHITAN SMALL SCRIPT CHARACTER-18BA5;Lo;0;L;;;;;N;;;;;
+18BA6;KHITAN SMALL SCRIPT CHARACTER-18BA6;Lo;0;L;;;;;N;;;;;
+18BA7;KHITAN SMALL SCRIPT CHARACTER-18BA7;Lo;0;L;;;;;N;;;;;
+18BA8;KHITAN SMALL SCRIPT CHARACTER-18BA8;Lo;0;L;;;;;N;;;;;
+18BA9;KHITAN SMALL SCRIPT CHARACTER-18BA9;Lo;0;L;;;;;N;;;;;
+18BAA;KHITAN SMALL SCRIPT CHARACTER-18BAA;Lo;0;L;;;;;N;;;;;
+18BAB;KHITAN SMALL SCRIPT CHARACTER-18BAB;Lo;0;L;;;;;N;;;;;
+18BAC;KHITAN SMALL SCRIPT CHARACTER-18BAC;Lo;0;L;;;;;N;;;;;
+18BAD;KHITAN SMALL SCRIPT CHARACTER-18BAD;Lo;0;L;;;;;N;;;;;
+18BAE;KHITAN SMALL SCRIPT CHARACTER-18BAE;Lo;0;L;;;;;N;;;;;
+18BAF;KHITAN SMALL SCRIPT CHARACTER-18BAF;Lo;0;L;;;;;N;;;;;
+18BB0;KHITAN SMALL SCRIPT CHARACTER-18BB0;Lo;0;L;;;;;N;;;;;
+18BB1;KHITAN SMALL SCRIPT CHARACTER-18BB1;Lo;0;L;;;;;N;;;;;
+18BB2;KHITAN SMALL SCRIPT CHARACTER-18BB2;Lo;0;L;;;;;N;;;;;
+18BB3;KHITAN SMALL SCRIPT CHARACTER-18BB3;Lo;0;L;;;;;N;;;;;
+18BB4;KHITAN SMALL SCRIPT CHARACTER-18BB4;Lo;0;L;;;;;N;;;;;
+18BB5;KHITAN SMALL SCRIPT CHARACTER-18BB5;Lo;0;L;;;;;N;;;;;
+18BB6;KHITAN SMALL SCRIPT CHARACTER-18BB6;Lo;0;L;;;;;N;;;;;
+18BB7;KHITAN SMALL SCRIPT CHARACTER-18BB7;Lo;0;L;;;;;N;;;;;
+18BB8;KHITAN SMALL SCRIPT CHARACTER-18BB8;Lo;0;L;;;;;N;;;;;
+18BB9;KHITAN SMALL SCRIPT CHARACTER-18BB9;Lo;0;L;;;;;N;;;;;
+18BBA;KHITAN SMALL SCRIPT CHARACTER-18BBA;Lo;0;L;;;;;N;;;;;
+18BBB;KHITAN SMALL SCRIPT CHARACTER-18BBB;Lo;0;L;;;;;N;;;;;
+18BBC;KHITAN SMALL SCRIPT CHARACTER-18BBC;Lo;0;L;;;;;N;;;;;
+18BBD;KHITAN SMALL SCRIPT CHARACTER-18BBD;Lo;0;L;;;;;N;;;;;
+18BBE;KHITAN SMALL SCRIPT CHARACTER-18BBE;Lo;0;L;;;;;N;;;;;
+18BBF;KHITAN SMALL SCRIPT CHARACTER-18BBF;Lo;0;L;;;;;N;;;;;
+18BC0;KHITAN SMALL SCRIPT CHARACTER-18BC0;Lo;0;L;;;;;N;;;;;
+18BC1;KHITAN SMALL SCRIPT CHARACTER-18BC1;Lo;0;L;;;;;N;;;;;
+18BC2;KHITAN SMALL SCRIPT CHARACTER-18BC2;Lo;0;L;;;;;N;;;;;
+18BC3;KHITAN SMALL SCRIPT CHARACTER-18BC3;Lo;0;L;;;;;N;;;;;
+18BC4;KHITAN SMALL SCRIPT CHARACTER-18BC4;Lo;0;L;;;;;N;;;;;
+18BC5;KHITAN SMALL SCRIPT CHARACTER-18BC5;Lo;0;L;;;;;N;;;;;
+18BC6;KHITAN SMALL SCRIPT CHARACTER-18BC6;Lo;0;L;;;;;N;;;;;
+18BC7;KHITAN SMALL SCRIPT CHARACTER-18BC7;Lo;0;L;;;;;N;;;;;
+18BC8;KHITAN SMALL SCRIPT CHARACTER-18BC8;Lo;0;L;;;;;N;;;;;
+18BC9;KHITAN SMALL SCRIPT CHARACTER-18BC9;Lo;0;L;;;;;N;;;;;
+18BCA;KHITAN SMALL SCRIPT CHARACTER-18BCA;Lo;0;L;;;;;N;;;;;
+18BCB;KHITAN SMALL SCRIPT CHARACTER-18BCB;Lo;0;L;;;;;N;;;;;
+18BCC;KHITAN SMALL SCRIPT CHARACTER-18BCC;Lo;0;L;;;;;N;;;;;
+18BCD;KHITAN SMALL SCRIPT CHARACTER-18BCD;Lo;0;L;;;;;N;;;;;
+18BCE;KHITAN SMALL SCRIPT CHARACTER-18BCE;Lo;0;L;;;;;N;;;;;
+18BCF;KHITAN SMALL SCRIPT CHARACTER-18BCF;Lo;0;L;;;;;N;;;;;
+18BD0;KHITAN SMALL SCRIPT CHARACTER-18BD0;Lo;0;L;;;;;N;;;;;
+18BD1;KHITAN SMALL SCRIPT CHARACTER-18BD1;Lo;0;L;;;;;N;;;;;
+18BD2;KHITAN SMALL SCRIPT CHARACTER-18BD2;Lo;0;L;;;;;N;;;;;
+18BD3;KHITAN SMALL SCRIPT CHARACTER-18BD3;Lo;0;L;;;;;N;;;;;
+18BD4;KHITAN SMALL SCRIPT CHARACTER-18BD4;Lo;0;L;;;;;N;;;;;
+18BD5;KHITAN SMALL SCRIPT CHARACTER-18BD5;Lo;0;L;;;;;N;;;;;
+18BD6;KHITAN SMALL SCRIPT CHARACTER-18BD6;Lo;0;L;;;;;N;;;;;
+18BD7;KHITAN SMALL SCRIPT CHARACTER-18BD7;Lo;0;L;;;;;N;;;;;
+18BD8;KHITAN SMALL SCRIPT CHARACTER-18BD8;Lo;0;L;;;;;N;;;;;
+18BD9;KHITAN SMALL SCRIPT CHARACTER-18BD9;Lo;0;L;;;;;N;;;;;
+18BDA;KHITAN SMALL SCRIPT CHARACTER-18BDA;Lo;0;L;;;;;N;;;;;
+18BDB;KHITAN SMALL SCRIPT CHARACTER-18BDB;Lo;0;L;;;;;N;;;;;
+18BDC;KHITAN SMALL SCRIPT CHARACTER-18BDC;Lo;0;L;;;;;N;;;;;
+18BDD;KHITAN SMALL SCRIPT CHARACTER-18BDD;Lo;0;L;;;;;N;;;;;
+18BDE;KHITAN SMALL SCRIPT CHARACTER-18BDE;Lo;0;L;;;;;N;;;;;
+18BDF;KHITAN SMALL SCRIPT CHARACTER-18BDF;Lo;0;L;;;;;N;;;;;
+18BE0;KHITAN SMALL SCRIPT CHARACTER-18BE0;Lo;0;L;;;;;N;;;;;
+18BE1;KHITAN SMALL SCRIPT CHARACTER-18BE1;Lo;0;L;;;;;N;;;;;
+18BE2;KHITAN SMALL SCRIPT CHARACTER-18BE2;Lo;0;L;;;;;N;;;;;
+18BE3;KHITAN SMALL SCRIPT CHARACTER-18BE3;Lo;0;L;;;;;N;;;;;
+18BE4;KHITAN SMALL SCRIPT CHARACTER-18BE4;Lo;0;L;;;;;N;;;;;
+18BE5;KHITAN SMALL SCRIPT CHARACTER-18BE5;Lo;0;L;;;;;N;;;;;
+18BE6;KHITAN SMALL SCRIPT CHARACTER-18BE6;Lo;0;L;;;;;N;;;;;
+18BE7;KHITAN SMALL SCRIPT CHARACTER-18BE7;Lo;0;L;;;;;N;;;;;
+18BE8;KHITAN SMALL SCRIPT CHARACTER-18BE8;Lo;0;L;;;;;N;;;;;
+18BE9;KHITAN SMALL SCRIPT CHARACTER-18BE9;Lo;0;L;;;;;N;;;;;
+18BEA;KHITAN SMALL SCRIPT CHARACTER-18BEA;Lo;0;L;;;;;N;;;;;
+18BEB;KHITAN SMALL SCRIPT CHARACTER-18BEB;Lo;0;L;;;;;N;;;;;
+18BEC;KHITAN SMALL SCRIPT CHARACTER-18BEC;Lo;0;L;;;;;N;;;;;
+18BED;KHITAN SMALL SCRIPT CHARACTER-18BED;Lo;0;L;;;;;N;;;;;
+18BEE;KHITAN SMALL SCRIPT CHARACTER-18BEE;Lo;0;L;;;;;N;;;;;
+18BEF;KHITAN SMALL SCRIPT CHARACTER-18BEF;Lo;0;L;;;;;N;;;;;
+18BF0;KHITAN SMALL SCRIPT CHARACTER-18BF0;Lo;0;L;;;;;N;;;;;
+18BF1;KHITAN SMALL SCRIPT CHARACTER-18BF1;Lo;0;L;;;;;N;;;;;
+18BF2;KHITAN SMALL SCRIPT CHARACTER-18BF2;Lo;0;L;;;;;N;;;;;
+18BF3;KHITAN SMALL SCRIPT CHARACTER-18BF3;Lo;0;L;;;;;N;;;;;
+18BF4;KHITAN SMALL SCRIPT CHARACTER-18BF4;Lo;0;L;;;;;N;;;;;
+18BF5;KHITAN SMALL SCRIPT CHARACTER-18BF5;Lo;0;L;;;;;N;;;;;
+18BF6;KHITAN SMALL SCRIPT CHARACTER-18BF6;Lo;0;L;;;;;N;;;;;
+18BF7;KHITAN SMALL SCRIPT CHARACTER-18BF7;Lo;0;L;;;;;N;;;;;
+18BF8;KHITAN SMALL SCRIPT CHARACTER-18BF8;Lo;0;L;;;;;N;;;;;
+18BF9;KHITAN SMALL SCRIPT CHARACTER-18BF9;Lo;0;L;;;;;N;;;;;
+18BFA;KHITAN SMALL SCRIPT CHARACTER-18BFA;Lo;0;L;;;;;N;;;;;
+18BFB;KHITAN SMALL SCRIPT CHARACTER-18BFB;Lo;0;L;;;;;N;;;;;
+18BFC;KHITAN SMALL SCRIPT CHARACTER-18BFC;Lo;0;L;;;;;N;;;;;
+18BFD;KHITAN SMALL SCRIPT CHARACTER-18BFD;Lo;0;L;;;;;N;;;;;
+18BFE;KHITAN SMALL SCRIPT CHARACTER-18BFE;Lo;0;L;;;;;N;;;;;
+18BFF;KHITAN SMALL SCRIPT CHARACTER-18BFF;Lo;0;L;;;;;N;;;;;
+18C00;KHITAN SMALL SCRIPT CHARACTER-18C00;Lo;0;L;;;;;N;;;;;
+18C01;KHITAN SMALL SCRIPT CHARACTER-18C01;Lo;0;L;;;;;N;;;;;
+18C02;KHITAN SMALL SCRIPT CHARACTER-18C02;Lo;0;L;;;;;N;;;;;
+18C03;KHITAN SMALL SCRIPT CHARACTER-18C03;Lo;0;L;;;;;N;;;;;
+18C04;KHITAN SMALL SCRIPT CHARACTER-18C04;Lo;0;L;;;;;N;;;;;
+18C05;KHITAN SMALL SCRIPT CHARACTER-18C05;Lo;0;L;;;;;N;;;;;
+18C06;KHITAN SMALL SCRIPT CHARACTER-18C06;Lo;0;L;;;;;N;;;;;
+18C07;KHITAN SMALL SCRIPT CHARACTER-18C07;Lo;0;L;;;;;N;;;;;
+18C08;KHITAN SMALL SCRIPT CHARACTER-18C08;Lo;0;L;;;;;N;;;;;
+18C09;KHITAN SMALL SCRIPT CHARACTER-18C09;Lo;0;L;;;;;N;;;;;
+18C0A;KHITAN SMALL SCRIPT CHARACTER-18C0A;Lo;0;L;;;;;N;;;;;
+18C0B;KHITAN SMALL SCRIPT CHARACTER-18C0B;Lo;0;L;;;;;N;;;;;
+18C0C;KHITAN SMALL SCRIPT CHARACTER-18C0C;Lo;0;L;;;;;N;;;;;
+18C0D;KHITAN SMALL SCRIPT CHARACTER-18C0D;Lo;0;L;;;;;N;;;;;
+18C0E;KHITAN SMALL SCRIPT CHARACTER-18C0E;Lo;0;L;;;;;N;;;;;
+18C0F;KHITAN SMALL SCRIPT CHARACTER-18C0F;Lo;0;L;;;;;N;;;;;
+18C10;KHITAN SMALL SCRIPT CHARACTER-18C10;Lo;0;L;;;;;N;;;;;
+18C11;KHITAN SMALL SCRIPT CHARACTER-18C11;Lo;0;L;;;;;N;;;;;
+18C12;KHITAN SMALL SCRIPT CHARACTER-18C12;Lo;0;L;;;;;N;;;;;
+18C13;KHITAN SMALL SCRIPT CHARACTER-18C13;Lo;0;L;;;;;N;;;;;
+18C14;KHITAN SMALL SCRIPT CHARACTER-18C14;Lo;0;L;;;;;N;;;;;
+18C15;KHITAN SMALL SCRIPT CHARACTER-18C15;Lo;0;L;;;;;N;;;;;
+18C16;KHITAN SMALL SCRIPT CHARACTER-18C16;Lo;0;L;;;;;N;;;;;
+18C17;KHITAN SMALL SCRIPT CHARACTER-18C17;Lo;0;L;;;;;N;;;;;
+18C18;KHITAN SMALL SCRIPT CHARACTER-18C18;Lo;0;L;;;;;N;;;;;
+18C19;KHITAN SMALL SCRIPT CHARACTER-18C19;Lo;0;L;;;;;N;;;;;
+18C1A;KHITAN SMALL SCRIPT CHARACTER-18C1A;Lo;0;L;;;;;N;;;;;
+18C1B;KHITAN SMALL SCRIPT CHARACTER-18C1B;Lo;0;L;;;;;N;;;;;
+18C1C;KHITAN SMALL SCRIPT CHARACTER-18C1C;Lo;0;L;;;;;N;;;;;
+18C1D;KHITAN SMALL SCRIPT CHARACTER-18C1D;Lo;0;L;;;;;N;;;;;
+18C1E;KHITAN SMALL SCRIPT CHARACTER-18C1E;Lo;0;L;;;;;N;;;;;
+18C1F;KHITAN SMALL SCRIPT CHARACTER-18C1F;Lo;0;L;;;;;N;;;;;
+18C20;KHITAN SMALL SCRIPT CHARACTER-18C20;Lo;0;L;;;;;N;;;;;
+18C21;KHITAN SMALL SCRIPT CHARACTER-18C21;Lo;0;L;;;;;N;;;;;
+18C22;KHITAN SMALL SCRIPT CHARACTER-18C22;Lo;0;L;;;;;N;;;;;
+18C23;KHITAN SMALL SCRIPT CHARACTER-18C23;Lo;0;L;;;;;N;;;;;
+18C24;KHITAN SMALL SCRIPT CHARACTER-18C24;Lo;0;L;;;;;N;;;;;
+18C25;KHITAN SMALL SCRIPT CHARACTER-18C25;Lo;0;L;;;;;N;;;;;
+18C26;KHITAN SMALL SCRIPT CHARACTER-18C26;Lo;0;L;;;;;N;;;;;
+18C27;KHITAN SMALL SCRIPT CHARACTER-18C27;Lo;0;L;;;;;N;;;;;
+18C28;KHITAN SMALL SCRIPT CHARACTER-18C28;Lo;0;L;;;;;N;;;;;
+18C29;KHITAN SMALL SCRIPT CHARACTER-18C29;Lo;0;L;;;;;N;;;;;
+18C2A;KHITAN SMALL SCRIPT CHARACTER-18C2A;Lo;0;L;;;;;N;;;;;
+18C2B;KHITAN SMALL SCRIPT CHARACTER-18C2B;Lo;0;L;;;;;N;;;;;
+18C2C;KHITAN SMALL SCRIPT CHARACTER-18C2C;Lo;0;L;;;;;N;;;;;
+18C2D;KHITAN SMALL SCRIPT CHARACTER-18C2D;Lo;0;L;;;;;N;;;;;
+18C2E;KHITAN SMALL SCRIPT CHARACTER-18C2E;Lo;0;L;;;;;N;;;;;
+18C2F;KHITAN SMALL SCRIPT CHARACTER-18C2F;Lo;0;L;;;;;N;;;;;
+18C30;KHITAN SMALL SCRIPT CHARACTER-18C30;Lo;0;L;;;;;N;;;;;
+18C31;KHITAN SMALL SCRIPT CHARACTER-18C31;Lo;0;L;;;;;N;;;;;
+18C32;KHITAN SMALL SCRIPT CHARACTER-18C32;Lo;0;L;;;;;N;;;;;
+18C33;KHITAN SMALL SCRIPT CHARACTER-18C33;Lo;0;L;;;;;N;;;;;
+18C34;KHITAN SMALL SCRIPT CHARACTER-18C34;Lo;0;L;;;;;N;;;;;
+18C35;KHITAN SMALL SCRIPT CHARACTER-18C35;Lo;0;L;;;;;N;;;;;
+18C36;KHITAN SMALL SCRIPT CHARACTER-18C36;Lo;0;L;;;;;N;;;;;
+18C37;KHITAN SMALL SCRIPT CHARACTER-18C37;Lo;0;L;;;;;N;;;;;
+18C38;KHITAN SMALL SCRIPT CHARACTER-18C38;Lo;0;L;;;;;N;;;;;
+18C39;KHITAN SMALL SCRIPT CHARACTER-18C39;Lo;0;L;;;;;N;;;;;
+18C3A;KHITAN SMALL SCRIPT CHARACTER-18C3A;Lo;0;L;;;;;N;;;;;
+18C3B;KHITAN SMALL SCRIPT CHARACTER-18C3B;Lo;0;L;;;;;N;;;;;
+18C3C;KHITAN SMALL SCRIPT CHARACTER-18C3C;Lo;0;L;;;;;N;;;;;
+18C3D;KHITAN SMALL SCRIPT CHARACTER-18C3D;Lo;0;L;;;;;N;;;;;
+18C3E;KHITAN SMALL SCRIPT CHARACTER-18C3E;Lo;0;L;;;;;N;;;;;
+18C3F;KHITAN SMALL SCRIPT CHARACTER-18C3F;Lo;0;L;;;;;N;;;;;
+18C40;KHITAN SMALL SCRIPT CHARACTER-18C40;Lo;0;L;;;;;N;;;;;
+18C41;KHITAN SMALL SCRIPT CHARACTER-18C41;Lo;0;L;;;;;N;;;;;
+18C42;KHITAN SMALL SCRIPT CHARACTER-18C42;Lo;0;L;;;;;N;;;;;
+18C43;KHITAN SMALL SCRIPT CHARACTER-18C43;Lo;0;L;;;;;N;;;;;
+18C44;KHITAN SMALL SCRIPT CHARACTER-18C44;Lo;0;L;;;;;N;;;;;
+18C45;KHITAN SMALL SCRIPT CHARACTER-18C45;Lo;0;L;;;;;N;;;;;
+18C46;KHITAN SMALL SCRIPT CHARACTER-18C46;Lo;0;L;;;;;N;;;;;
+18C47;KHITAN SMALL SCRIPT CHARACTER-18C47;Lo;0;L;;;;;N;;;;;
+18C48;KHITAN SMALL SCRIPT CHARACTER-18C48;Lo;0;L;;;;;N;;;;;
+18C49;KHITAN SMALL SCRIPT CHARACTER-18C49;Lo;0;L;;;;;N;;;;;
+18C4A;KHITAN SMALL SCRIPT CHARACTER-18C4A;Lo;0;L;;;;;N;;;;;
+18C4B;KHITAN SMALL SCRIPT CHARACTER-18C4B;Lo;0;L;;;;;N;;;;;
+18C4C;KHITAN SMALL SCRIPT CHARACTER-18C4C;Lo;0;L;;;;;N;;;;;
+18C4D;KHITAN SMALL SCRIPT CHARACTER-18C4D;Lo;0;L;;;;;N;;;;;
+18C4E;KHITAN SMALL SCRIPT CHARACTER-18C4E;Lo;0;L;;;;;N;;;;;
+18C4F;KHITAN SMALL SCRIPT CHARACTER-18C4F;Lo;0;L;;;;;N;;;;;
+18C50;KHITAN SMALL SCRIPT CHARACTER-18C50;Lo;0;L;;;;;N;;;;;
+18C51;KHITAN SMALL SCRIPT CHARACTER-18C51;Lo;0;L;;;;;N;;;;;
+18C52;KHITAN SMALL SCRIPT CHARACTER-18C52;Lo;0;L;;;;;N;;;;;
+18C53;KHITAN SMALL SCRIPT CHARACTER-18C53;Lo;0;L;;;;;N;;;;;
+18C54;KHITAN SMALL SCRIPT CHARACTER-18C54;Lo;0;L;;;;;N;;;;;
+18C55;KHITAN SMALL SCRIPT CHARACTER-18C55;Lo;0;L;;;;;N;;;;;
+18C56;KHITAN SMALL SCRIPT CHARACTER-18C56;Lo;0;L;;;;;N;;;;;
+18C57;KHITAN SMALL SCRIPT CHARACTER-18C57;Lo;0;L;;;;;N;;;;;
+18C58;KHITAN SMALL SCRIPT CHARACTER-18C58;Lo;0;L;;;;;N;;;;;
+18C59;KHITAN SMALL SCRIPT CHARACTER-18C59;Lo;0;L;;;;;N;;;;;
+18C5A;KHITAN SMALL SCRIPT CHARACTER-18C5A;Lo;0;L;;;;;N;;;;;
+18C5B;KHITAN SMALL SCRIPT CHARACTER-18C5B;Lo;0;L;;;;;N;;;;;
+18C5C;KHITAN SMALL SCRIPT CHARACTER-18C5C;Lo;0;L;;;;;N;;;;;
+18C5D;KHITAN SMALL SCRIPT CHARACTER-18C5D;Lo;0;L;;;;;N;;;;;
+18C5E;KHITAN SMALL SCRIPT CHARACTER-18C5E;Lo;0;L;;;;;N;;;;;
+18C5F;KHITAN SMALL SCRIPT CHARACTER-18C5F;Lo;0;L;;;;;N;;;;;
+18C60;KHITAN SMALL SCRIPT CHARACTER-18C60;Lo;0;L;;;;;N;;;;;
+18C61;KHITAN SMALL SCRIPT CHARACTER-18C61;Lo;0;L;;;;;N;;;;;
+18C62;KHITAN SMALL SCRIPT CHARACTER-18C62;Lo;0;L;;;;;N;;;;;
+18C63;KHITAN SMALL SCRIPT CHARACTER-18C63;Lo;0;L;;;;;N;;;;;
+18C64;KHITAN SMALL SCRIPT CHARACTER-18C64;Lo;0;L;;;;;N;;;;;
+18C65;KHITAN SMALL SCRIPT CHARACTER-18C65;Lo;0;L;;;;;N;;;;;
+18C66;KHITAN SMALL SCRIPT CHARACTER-18C66;Lo;0;L;;;;;N;;;;;
+18C67;KHITAN SMALL SCRIPT CHARACTER-18C67;Lo;0;L;;;;;N;;;;;
+18C68;KHITAN SMALL SCRIPT CHARACTER-18C68;Lo;0;L;;;;;N;;;;;
+18C69;KHITAN SMALL SCRIPT CHARACTER-18C69;Lo;0;L;;;;;N;;;;;
+18C6A;KHITAN SMALL SCRIPT CHARACTER-18C6A;Lo;0;L;;;;;N;;;;;
+18C6B;KHITAN SMALL SCRIPT CHARACTER-18C6B;Lo;0;L;;;;;N;;;;;
+18C6C;KHITAN SMALL SCRIPT CHARACTER-18C6C;Lo;0;L;;;;;N;;;;;
+18C6D;KHITAN SMALL SCRIPT CHARACTER-18C6D;Lo;0;L;;;;;N;;;;;
+18C6E;KHITAN SMALL SCRIPT CHARACTER-18C6E;Lo;0;L;;;;;N;;;;;
+18C6F;KHITAN SMALL SCRIPT CHARACTER-18C6F;Lo;0;L;;;;;N;;;;;
+18C70;KHITAN SMALL SCRIPT CHARACTER-18C70;Lo;0;L;;;;;N;;;;;
+18C71;KHITAN SMALL SCRIPT CHARACTER-18C71;Lo;0;L;;;;;N;;;;;
+18C72;KHITAN SMALL SCRIPT CHARACTER-18C72;Lo;0;L;;;;;N;;;;;
+18C73;KHITAN SMALL SCRIPT CHARACTER-18C73;Lo;0;L;;;;;N;;;;;
+18C74;KHITAN SMALL SCRIPT CHARACTER-18C74;Lo;0;L;;;;;N;;;;;
+18C75;KHITAN SMALL SCRIPT CHARACTER-18C75;Lo;0;L;;;;;N;;;;;
+18C76;KHITAN SMALL SCRIPT CHARACTER-18C76;Lo;0;L;;;;;N;;;;;
+18C77;KHITAN SMALL SCRIPT CHARACTER-18C77;Lo;0;L;;;;;N;;;;;
+18C78;KHITAN SMALL SCRIPT CHARACTER-18C78;Lo;0;L;;;;;N;;;;;
+18C79;KHITAN SMALL SCRIPT CHARACTER-18C79;Lo;0;L;;;;;N;;;;;
+18C7A;KHITAN SMALL SCRIPT CHARACTER-18C7A;Lo;0;L;;;;;N;;;;;
+18C7B;KHITAN SMALL SCRIPT CHARACTER-18C7B;Lo;0;L;;;;;N;;;;;
+18C7C;KHITAN SMALL SCRIPT CHARACTER-18C7C;Lo;0;L;;;;;N;;;;;
+18C7D;KHITAN SMALL SCRIPT CHARACTER-18C7D;Lo;0;L;;;;;N;;;;;
+18C7E;KHITAN SMALL SCRIPT CHARACTER-18C7E;Lo;0;L;;;;;N;;;;;
+18C7F;KHITAN SMALL SCRIPT CHARACTER-18C7F;Lo;0;L;;;;;N;;;;;
+18C80;KHITAN SMALL SCRIPT CHARACTER-18C80;Lo;0;L;;;;;N;;;;;
+18C81;KHITAN SMALL SCRIPT CHARACTER-18C81;Lo;0;L;;;;;N;;;;;
+18C82;KHITAN SMALL SCRIPT CHARACTER-18C82;Lo;0;L;;;;;N;;;;;
+18C83;KHITAN SMALL SCRIPT CHARACTER-18C83;Lo;0;L;;;;;N;;;;;
+18C84;KHITAN SMALL SCRIPT CHARACTER-18C84;Lo;0;L;;;;;N;;;;;
+18C85;KHITAN SMALL SCRIPT CHARACTER-18C85;Lo;0;L;;;;;N;;;;;
+18C86;KHITAN SMALL SCRIPT CHARACTER-18C86;Lo;0;L;;;;;N;;;;;
+18C87;KHITAN SMALL SCRIPT CHARACTER-18C87;Lo;0;L;;;;;N;;;;;
+18C88;KHITAN SMALL SCRIPT CHARACTER-18C88;Lo;0;L;;;;;N;;;;;
+18C89;KHITAN SMALL SCRIPT CHARACTER-18C89;Lo;0;L;;;;;N;;;;;
+18C8A;KHITAN SMALL SCRIPT CHARACTER-18C8A;Lo;0;L;;;;;N;;;;;
+18C8B;KHITAN SMALL SCRIPT CHARACTER-18C8B;Lo;0;L;;;;;N;;;;;
+18C8C;KHITAN SMALL SCRIPT CHARACTER-18C8C;Lo;0;L;;;;;N;;;;;
+18C8D;KHITAN SMALL SCRIPT CHARACTER-18C8D;Lo;0;L;;;;;N;;;;;
+18C8E;KHITAN SMALL SCRIPT CHARACTER-18C8E;Lo;0;L;;;;;N;;;;;
+18C8F;KHITAN SMALL SCRIPT CHARACTER-18C8F;Lo;0;L;;;;;N;;;;;
+18C90;KHITAN SMALL SCRIPT CHARACTER-18C90;Lo;0;L;;;;;N;;;;;
+18C91;KHITAN SMALL SCRIPT CHARACTER-18C91;Lo;0;L;;;;;N;;;;;
+18C92;KHITAN SMALL SCRIPT CHARACTER-18C92;Lo;0;L;;;;;N;;;;;
+18C93;KHITAN SMALL SCRIPT CHARACTER-18C93;Lo;0;L;;;;;N;;;;;
+18C94;KHITAN SMALL SCRIPT CHARACTER-18C94;Lo;0;L;;;;;N;;;;;
+18C95;KHITAN SMALL SCRIPT CHARACTER-18C95;Lo;0;L;;;;;N;;;;;
+18C96;KHITAN SMALL SCRIPT CHARACTER-18C96;Lo;0;L;;;;;N;;;;;
+18C97;KHITAN SMALL SCRIPT CHARACTER-18C97;Lo;0;L;;;;;N;;;;;
+18C98;KHITAN SMALL SCRIPT CHARACTER-18C98;Lo;0;L;;;;;N;;;;;
+18C99;KHITAN SMALL SCRIPT CHARACTER-18C99;Lo;0;L;;;;;N;;;;;
+18C9A;KHITAN SMALL SCRIPT CHARACTER-18C9A;Lo;0;L;;;;;N;;;;;
+18C9B;KHITAN SMALL SCRIPT CHARACTER-18C9B;Lo;0;L;;;;;N;;;;;
+18C9C;KHITAN SMALL SCRIPT CHARACTER-18C9C;Lo;0;L;;;;;N;;;;;
+18C9D;KHITAN SMALL SCRIPT CHARACTER-18C9D;Lo;0;L;;;;;N;;;;;
+18C9E;KHITAN SMALL SCRIPT CHARACTER-18C9E;Lo;0;L;;;;;N;;;;;
+18C9F;KHITAN SMALL SCRIPT CHARACTER-18C9F;Lo;0;L;;;;;N;;;;;
+18CA0;KHITAN SMALL SCRIPT CHARACTER-18CA0;Lo;0;L;;;;;N;;;;;
+18CA1;KHITAN SMALL SCRIPT CHARACTER-18CA1;Lo;0;L;;;;;N;;;;;
+18CA2;KHITAN SMALL SCRIPT CHARACTER-18CA2;Lo;0;L;;;;;N;;;;;
+18CA3;KHITAN SMALL SCRIPT CHARACTER-18CA3;Lo;0;L;;;;;N;;;;;
+18CA4;KHITAN SMALL SCRIPT CHARACTER-18CA4;Lo;0;L;;;;;N;;;;;
+18CA5;KHITAN SMALL SCRIPT CHARACTER-18CA5;Lo;0;L;;;;;N;;;;;
+18CA6;KHITAN SMALL SCRIPT CHARACTER-18CA6;Lo;0;L;;;;;N;;;;;
+18CA7;KHITAN SMALL SCRIPT CHARACTER-18CA7;Lo;0;L;;;;;N;;;;;
+18CA8;KHITAN SMALL SCRIPT CHARACTER-18CA8;Lo;0;L;;;;;N;;;;;
+18CA9;KHITAN SMALL SCRIPT CHARACTER-18CA9;Lo;0;L;;;;;N;;;;;
+18CAA;KHITAN SMALL SCRIPT CHARACTER-18CAA;Lo;0;L;;;;;N;;;;;
+18CAB;KHITAN SMALL SCRIPT CHARACTER-18CAB;Lo;0;L;;;;;N;;;;;
+18CAC;KHITAN SMALL SCRIPT CHARACTER-18CAC;Lo;0;L;;;;;N;;;;;
+18CAD;KHITAN SMALL SCRIPT CHARACTER-18CAD;Lo;0;L;;;;;N;;;;;
+18CAE;KHITAN SMALL SCRIPT CHARACTER-18CAE;Lo;0;L;;;;;N;;;;;
+18CAF;KHITAN SMALL SCRIPT CHARACTER-18CAF;Lo;0;L;;;;;N;;;;;
+18CB0;KHITAN SMALL SCRIPT CHARACTER-18CB0;Lo;0;L;;;;;N;;;;;
+18CB1;KHITAN SMALL SCRIPT CHARACTER-18CB1;Lo;0;L;;;;;N;;;;;
+18CB2;KHITAN SMALL SCRIPT CHARACTER-18CB2;Lo;0;L;;;;;N;;;;;
+18CB3;KHITAN SMALL SCRIPT CHARACTER-18CB3;Lo;0;L;;;;;N;;;;;
+18CB4;KHITAN SMALL SCRIPT CHARACTER-18CB4;Lo;0;L;;;;;N;;;;;
+18CB5;KHITAN SMALL SCRIPT CHARACTER-18CB5;Lo;0;L;;;;;N;;;;;
+18CB6;KHITAN SMALL SCRIPT CHARACTER-18CB6;Lo;0;L;;;;;N;;;;;
+18CB7;KHITAN SMALL SCRIPT CHARACTER-18CB7;Lo;0;L;;;;;N;;;;;
+18CB8;KHITAN SMALL SCRIPT CHARACTER-18CB8;Lo;0;L;;;;;N;;;;;
+18CB9;KHITAN SMALL SCRIPT CHARACTER-18CB9;Lo;0;L;;;;;N;;;;;
+18CBA;KHITAN SMALL SCRIPT CHARACTER-18CBA;Lo;0;L;;;;;N;;;;;
+18CBB;KHITAN SMALL SCRIPT CHARACTER-18CBB;Lo;0;L;;;;;N;;;;;
+18CBC;KHITAN SMALL SCRIPT CHARACTER-18CBC;Lo;0;L;;;;;N;;;;;
+18CBD;KHITAN SMALL SCRIPT CHARACTER-18CBD;Lo;0;L;;;;;N;;;;;
+18CBE;KHITAN SMALL SCRIPT CHARACTER-18CBE;Lo;0;L;;;;;N;;;;;
+18CBF;KHITAN SMALL SCRIPT CHARACTER-18CBF;Lo;0;L;;;;;N;;;;;
+18CC0;KHITAN SMALL SCRIPT CHARACTER-18CC0;Lo;0;L;;;;;N;;;;;
+18CC1;KHITAN SMALL SCRIPT CHARACTER-18CC1;Lo;0;L;;;;;N;;;;;
+18CC2;KHITAN SMALL SCRIPT CHARACTER-18CC2;Lo;0;L;;;;;N;;;;;
+18CC3;KHITAN SMALL SCRIPT CHARACTER-18CC3;Lo;0;L;;;;;N;;;;;
+18CC4;KHITAN SMALL SCRIPT CHARACTER-18CC4;Lo;0;L;;;;;N;;;;;
+18CC5;KHITAN SMALL SCRIPT CHARACTER-18CC5;Lo;0;L;;;;;N;;;;;
+18CC6;KHITAN SMALL SCRIPT CHARACTER-18CC6;Lo;0;L;;;;;N;;;;;
+18CC7;KHITAN SMALL SCRIPT CHARACTER-18CC7;Lo;0;L;;;;;N;;;;;
+18CC8;KHITAN SMALL SCRIPT CHARACTER-18CC8;Lo;0;L;;;;;N;;;;;
+18CC9;KHITAN SMALL SCRIPT CHARACTER-18CC9;Lo;0;L;;;;;N;;;;;
+18CCA;KHITAN SMALL SCRIPT CHARACTER-18CCA;Lo;0;L;;;;;N;;;;;
+18CCB;KHITAN SMALL SCRIPT CHARACTER-18CCB;Lo;0;L;;;;;N;;;;;
+18CCC;KHITAN SMALL SCRIPT CHARACTER-18CCC;Lo;0;L;;;;;N;;;;;
+18CCD;KHITAN SMALL SCRIPT CHARACTER-18CCD;Lo;0;L;;;;;N;;;;;
+18CCE;KHITAN SMALL SCRIPT CHARACTER-18CCE;Lo;0;L;;;;;N;;;;;
+18CCF;KHITAN SMALL SCRIPT CHARACTER-18CCF;Lo;0;L;;;;;N;;;;;
+18CD0;KHITAN SMALL SCRIPT CHARACTER-18CD0;Lo;0;L;;;;;N;;;;;
+18CD1;KHITAN SMALL SCRIPT CHARACTER-18CD1;Lo;0;L;;;;;N;;;;;
+18CD2;KHITAN SMALL SCRIPT CHARACTER-18CD2;Lo;0;L;;;;;N;;;;;
+18CD3;KHITAN SMALL SCRIPT CHARACTER-18CD3;Lo;0;L;;;;;N;;;;;
+18CD4;KHITAN SMALL SCRIPT CHARACTER-18CD4;Lo;0;L;;;;;N;;;;;
+18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;;
+18D00;<Tangut Ideograph Supplement, First>;Lo;0;L;;;;;N;;;;;
+18D08;<Tangut Ideograph Supplement, Last>;Lo;0;L;;;;;N;;;;;
1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;;
1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;;
1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;;
@@ -29973,6 +30651,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F10A;DIGIT NINE COMMA;No;0;EN;<compat> 0039 002C;;9;9;N;;;;;
1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;;
1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;;
+1F10D;CIRCLED ZERO WITH SLASH;So;0;ON;;;;;N;;;;;
+1F10E;CIRCLED ANTICLOCKWISE ARROW;So;0;ON;;;;;N;;;;;
+1F10F;CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;;
1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L;<compat> 0028 0041 0029;;;;N;;;;;
1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L;<compat> 0028 0042 0029;;;;N;;;;;
1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L;<compat> 0028 0043 0029;;;;N;;;;;
@@ -30066,6 +30747,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;;
1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;N;;;;;
1F16C;RAISED MR SIGN;So;0;ON;<super> 004D 0052;;;;N;;;;;
+1F16D;CIRCLED CC;So;0;ON;;;;;N;;;;;
+1F16E;CIRCLED C WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;;
+1F16F;CIRCLED HUMAN FIGURE;So;0;ON;;;;;N;;;;;
1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;;
1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;;
1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;;
@@ -30127,6 +30811,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;;
1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;;
1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;;
+1F1AD;MASK WORK SYMBOL;So;0;ON;;;;;N;;;;;
1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;;
1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;;
1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;;
@@ -31199,6 +31884,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6D3;STUPA;So;0;ON;;;;;N;;;;;
1F6D4;PAGODA;So;0;ON;;;;;N;;;;;
1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;;
+1F6D6;HUT;So;0;ON;;;;;N;;;;;
+1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;;
1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;;
1F6E1;SHIELD;So;0;ON;;;;;N;;;;;
1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;;
@@ -31223,6 +31910,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;;
1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;;
1F6FA;AUTO RICKSHAW;So;0;ON;;;;;N;;;;;
+1F6FB;PICKUP TRUCK;So;0;ON;;;;;N;;;;;
+1F6FC;ROLLER SKATE;So;0;ON;;;;;N;;;;;
1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;;
1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;;
1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;;
@@ -31588,6 +32277,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;;
1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;;
1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;;
+1F8B0;ARROW POINTING UPWARDS THEN NORTH WEST;So;0;ON;;;;;N;;;;;
+1F8B1;ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST;So;0;ON;;;;;N;;;;;
1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;;
1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;;
@@ -31600,6 +32291,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;;
1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;;
1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;;
+1F90C;PINCHED FINGERS;So;0;ON;;;;;N;;;;;
1F90D;WHITE HEART;So;0;ON;;;;;N;;;;;
1F90E;BROWN HEART;So;0;ON;;;;;N;;;;;
1F90F;PINCHING HAND;So;0;ON;;;;;N;;;;;
@@ -31701,10 +32393,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F96F;BAGEL;So;0;ON;;;;;N;;;;;
1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;;
1F971;YAWNING FACE;So;0;ON;;;;;N;;;;;
+1F972;SMILING FACE WITH TEAR;So;0;ON;;;;;N;;;;;
1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;;
1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;;
1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;;
1F976;FREEZING FACE;So;0;ON;;;;;N;;;;;
+1F977;NINJA;So;0;ON;;;;;N;;;;;
+1F978;DISGUISED FACE;So;0;ON;;;;;N;;;;;
1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;;
1F97B;SARI;So;0;ON;;;;;N;;;;;
1F97C;LAB COAT;So;0;ON;;;;;N;;;;;
@@ -31746,12 +32441,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9A0;MICROBE;So;0;ON;;;;;N;;;;;
1F9A1;BADGER;So;0;ON;;;;;N;;;;;
1F9A2;SWAN;So;0;ON;;;;;N;;;;;
+1F9A3;MAMMOTH;So;0;ON;;;;;N;;;;;
+1F9A4;DODO;So;0;ON;;;;;N;;;;;
1F9A5;SLOTH;So;0;ON;;;;;N;;;;;
1F9A6;OTTER;So;0;ON;;;;;N;;;;;
1F9A7;ORANGUTAN;So;0;ON;;;;;N;;;;;
1F9A8;SKUNK;So;0;ON;;;;;N;;;;;
1F9A9;FLAMINGO;So;0;ON;;;;;N;;;;;
1F9AA;OYSTER;So;0;ON;;;;;N;;;;;
+1F9AB;BEAVER;So;0;ON;;;;;N;;;;;
+1F9AC;BISON;So;0;ON;;;;;N;;;;;
+1F9AD;SEAL;So;0;ON;;;;;N;;;;;
1F9AE;GUIDE DOG;So;0;ON;;;;;N;;;;;
1F9AF;PROBING CANE;So;0;ON;;;;;N;;;;;
1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;;
@@ -31781,6 +32481,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9C8;BUTTER;So;0;ON;;;;;N;;;;;
1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;;
1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;;
+1F9CB;BUBBLE TEA;So;0;ON;;;;;N;;;;;
1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;;
1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;;
1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;;
@@ -31934,20 +32635,273 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FA71;ONE-PIECE SWIMSUIT;So;0;ON;;;;;N;;;;;
1FA72;BRIEFS;So;0;ON;;;;;N;;;;;
1FA73;SHORTS;So;0;ON;;;;;N;;;;;
+1FA74;THONG SANDAL;So;0;ON;;;;;N;;;;;
1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;;
1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;;
1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;;
1FA80;YO-YO;So;0;ON;;;;;N;;;;;
1FA81;KITE;So;0;ON;;;;;N;;;;;
1FA82;PARACHUTE;So;0;ON;;;;;N;;;;;
+1FA83;BOOMERANG;So;0;ON;;;;;N;;;;;
+1FA84;MAGIC WAND;So;0;ON;;;;;N;;;;;
+1FA85;PINATA;So;0;ON;;;;;N;;;;;
+1FA86;NESTING DOLLS;So;0;ON;;;;;N;;;;;
1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;;
1FA91;CHAIR;So;0;ON;;;;;N;;;;;
1FA92;RAZOR;So;0;ON;;;;;N;;;;;
1FA93;AXE;So;0;ON;;;;;N;;;;;
1FA94;DIYA LAMP;So;0;ON;;;;;N;;;;;
1FA95;BANJO;So;0;ON;;;;;N;;;;;
+1FA96;MILITARY HELMET;So;0;ON;;;;;N;;;;;
+1FA97;ACCORDION;So;0;ON;;;;;N;;;;;
+1FA98;LONG DRUM;So;0;ON;;;;;N;;;;;
+1FA99;COIN;So;0;ON;;;;;N;;;;;
+1FA9A;CARPENTRY SAW;So;0;ON;;;;;N;;;;;
+1FA9B;SCREWDRIVER;So;0;ON;;;;;N;;;;;
+1FA9C;LADDER;So;0;ON;;;;;N;;;;;
+1FA9D;HOOK;So;0;ON;;;;;N;;;;;
+1FA9E;MIRROR;So;0;ON;;;;;N;;;;;
+1FA9F;WINDOW;So;0;ON;;;;;N;;;;;
+1FAA0;PLUNGER;So;0;ON;;;;;N;;;;;
+1FAA1;SEWING NEEDLE;So;0;ON;;;;;N;;;;;
+1FAA2;KNOT;So;0;ON;;;;;N;;;;;
+1FAA3;BUCKET;So;0;ON;;;;;N;;;;;
+1FAA4;MOUSE TRAP;So;0;ON;;;;;N;;;;;
+1FAA5;TOOTHBRUSH;So;0;ON;;;;;N;;;;;
+1FAA6;HEADSTONE;So;0;ON;;;;;N;;;;;
+1FAA7;PLACARD;So;0;ON;;;;;N;;;;;
+1FAA8;ROCK;So;0;ON;;;;;N;;;;;
+1FAB0;FLY;So;0;ON;;;;;N;;;;;
+1FAB1;WORM;So;0;ON;;;;;N;;;;;
+1FAB2;BEETLE;So;0;ON;;;;;N;;;;;
+1FAB3;COCKROACH;So;0;ON;;;;;N;;;;;
+1FAB4;POTTED PLANT;So;0;ON;;;;;N;;;;;
+1FAB5;WOOD;So;0;ON;;;;;N;;;;;
+1FAB6;FEATHER;So;0;ON;;;;;N;;;;;
+1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;;
+1FAC1;LUNGS;So;0;ON;;;;;N;;;;;
+1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;;
+1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;;
+1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;;
+1FAD2;OLIVE;So;0;ON;;;;;N;;;;;
+1FAD3;FLATBREAD;So;0;ON;;;;;N;;;;;
+1FAD4;TAMALE;So;0;ON;;;;;N;;;;;
+1FAD5;FONDUE;So;0;ON;;;;;N;;;;;
+1FAD6;TEAPOT;So;0;ON;;;;;N;;;;;
+1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;;
+1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;;
+1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;;
+1FB03;BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;;
+1FB04;BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;;
+1FB05;BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;;
+1FB06;BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;;
+1FB07;BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;;
+1FB08;BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;;
+1FB09;BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;;
+1FB0A;BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;;
+1FB0B;BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;;
+1FB0C;BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;;
+1FB0D;BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;;
+1FB0E;BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;;
+1FB0F;BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;;
+1FB10;BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;;
+1FB11;BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;;
+1FB12;BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;;
+1FB13;BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;;
+1FB14;BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;;
+1FB15;BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;;
+1FB16;BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;;
+1FB17;BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;;
+1FB18;BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;;
+1FB19;BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;;
+1FB1A;BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;;
+1FB1B;BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;;
+1FB1C;BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;;
+1FB1D;BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;;
+1FB1E;BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;;
+1FB1F;BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;;
+1FB20;BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;;
+1FB21;BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;;
+1FB22;BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;;
+1FB23;BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;;
+1FB24;BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;;
+1FB25;BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;;
+1FB26;BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;;
+1FB27;BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;;
+1FB28;BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;;
+1FB29;BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;;
+1FB2A;BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;;
+1FB2B;BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;;
+1FB2C;BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;;
+1FB2D;BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;;
+1FB2E;BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;;
+1FB2F;BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;;
+1FB30;BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;;
+1FB31;BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;;
+1FB32;BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;;
+1FB33;BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;;
+1FB34;BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;;
+1FB35;BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;;
+1FB36;BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;;
+1FB37;BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;;
+1FB38;BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;;
+1FB39;BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;;
+1FB3A;BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;;
+1FB3B;BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;;
+1FB3C;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB3D;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB3E;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB3F;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB40;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB41;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB42;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB43;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB44;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB45;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB46;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB47;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB48;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB49;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB4A;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB4B;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB4C;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB4D;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB4E;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB4F;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB50;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB51;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB52;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB53;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB54;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB55;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB56;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FB57;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB58;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB59;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB5A;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB5B;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;;
+1FB5C;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB5D;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB5E;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB5F;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB60;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB61;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;;
+1FB62;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB63;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB64;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB65;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB66;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;;
+1FB67;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FB68;UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB69;LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB6A;UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB6B;LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB6C;LEFT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB6D;UPPER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB6E;RIGHT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB6F;LOWER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB70;VERTICAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;;
+1FB71;VERTICAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;;
+1FB72;VERTICAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;;
+1FB73;VERTICAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;;
+1FB74;VERTICAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;;
+1FB75;VERTICAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;;
+1FB76;HORIZONTAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;;
+1FB77;HORIZONTAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;;
+1FB78;HORIZONTAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;;
+1FB79;HORIZONTAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;;
+1FB7A;HORIZONTAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;;
+1FB7B;HORIZONTAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;;
+1FB7C;LEFT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FB7D;LEFT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FB7E;RIGHT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FB7F;RIGHT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FB80;UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FB81;HORIZONTAL ONE EIGHTH BLOCK-1358;So;0;ON;;;;;N;;;;;
+1FB82;UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB83;UPPER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB84;UPPER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB85;UPPER THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB86;UPPER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB87;RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;;
+1FB88;RIGHT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB89;RIGHT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB8A;RIGHT THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;;
+1FB8B;RIGHT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;;
+1FB8C;LEFT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB8D;RIGHT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB8E;UPPER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB8F;LOWER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB90;INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB91;UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB92;UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK;So;0;ON;;;;;N;;;;;
+1FB94;LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;;
+1FB95;CHECKER BOARD FILL;So;0;ON;;;;;N;;;;;
+1FB96;INVERSE CHECKER BOARD FILL;So;0;ON;;;;;N;;;;;
+1FB97;HEAVY HORIZONTAL FILL;So;0;ON;;;;;N;;;;;
+1FB98;UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;;
+1FB99;UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;;
+1FB9A;UPPER AND LOWER TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;;
+1FB9B;LEFT AND RIGHT TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;;
+1FB9C;UPPER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB9D;UPPER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB9E;LOWER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FB9F;LOWER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;;
+1FBA0;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;;
+1FBA1;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FBA2;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBA3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBA4;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBA5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBA6;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FBA7;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FBA8;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBA9;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBAA;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;;
+1FBAB;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;;
+1FBAC;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBAD;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBAE;BOX DRAWINGS LIGHT DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;;
+1FBAF;BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE;So;0;ON;;;;;N;;;;;
+1FBB0;ARROWHEAD-SHAPED POINTER;So;0;ON;;;;;N;;;;;
+1FBB1;INVERSE CHECK MARK;So;0;ON;;;;;N;;;;;
+1FBB2;LEFT HALF RUNNING MAN;So;0;ON;;;;;N;;;;;
+1FBB3;RIGHT HALF RUNNING MAN;So;0;ON;;;;;N;;;;;
+1FBB4;INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;;;;;
+1FBB5;LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FBB6;RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FBB7;DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FBB8;UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;;
+1FBB9;LEFT HALF FOLDER;So;0;ON;;;;;N;;;;;
+1FBBA;RIGHT HALF FOLDER;So;0;ON;;;;;N;;;;;
+1FBBB;VOIDED GREEK CROSS;So;0;ON;;;;;N;;;;;
+1FBBC;RIGHT OPEN SQUARED DOT;So;0;ON;;;;;N;;;;;
+1FBBD;NEGATIVE DIAGONAL CROSS;So;0;ON;;;;;N;;;;;
+1FBBE;NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;;
+1FBBF;NEGATIVE DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;;
+1FBC0;WHITE HEAVY SALTIRE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;;
+1FBC1;LEFT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1FBC2;MIDDLE THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1FBC3;RIGHT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;;
+1FBC4;NEGATIVE SQUARED QUESTION MARK;So;0;ON;;;;;N;;;;;
+1FBC5;STICK FIGURE;So;0;ON;;;;;N;;;;;
+1FBC6;STICK FIGURE WITH ARMS RAISED;So;0;ON;;;;;N;;;;;
+1FBC7;STICK FIGURE LEANING LEFT;So;0;ON;;;;;N;;;;;
+1FBC8;STICK FIGURE LEANING RIGHT;So;0;ON;;;;;N;;;;;
+1FBC9;STICK FIGURE WITH DRESS;So;0;ON;;;;;N;;;;;
+1FBCA;WHITE UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;;
+1FBF0;SEGMENTED DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1FBF1;SEGMENTED DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1FBF2;SEGMENTED DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1FBF3;SEGMENTED DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1FBF4;SEGMENTED DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1FBF5;SEGMENTED DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1FBF6;SEGMENTED DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1FBF7;SEGMENTED DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1FBF8;SEGMENTED DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1FBF9;SEGMENTED DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
-2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2A6DD;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
2B734;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;N;;;;;
@@ -32498,6 +33452,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+30000;<CJK Ideograph Extension G, First>;Lo;0;L;;;;;N;;;;;
+3134A;<CJK Ideograph Extension G, Last>;Lo;0;L;;;;;N;;;;;
E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
diff --git a/unicode/emoji-data.txt b/unicode/emoji-data.txt
index 2fb5c3ff68..5d7dc1b156 100644
--- a/unicode/emoji-data.txt
+++ b/unicode/emoji-data.txt
@@ -1,11 +1,11 @@
# emoji-data.txt
-# Date: 2019-01-15, 12:10:05 GMT
-# ยฉ 2019 Unicodeยฎ, Inc.
+# Date: 2020-01-28, 20:52:38 GMT
+# ยฉ 2020 Unicodeยฎ, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Emoji Data for UTS #51
-# Version: 12.0
+# Version: 13.0
#
# For documentation and usage, see http://www.unicode.org/reports/tr51
#
@@ -22,414 +22,667 @@
# All omitted code points have Emoji=No
# @missing: 0000..10FFFF ; Emoji ; No
-0023 ; Emoji # 1.1 [1] (#๏ธ) number sign
-002A ; Emoji # 1.1 [1] (*๏ธ) asterisk
-0030..0039 ; Emoji # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine
-00A9 ; Emoji # 1.1 [1] (ยฉ๏ธ) copyright
-00AE ; Emoji # 1.1 [1] (ยฎ๏ธ) registered
-203C ; Emoji # 1.1 [1] (โ€ผ๏ธ) double exclamation mark
-2049 ; Emoji # 3.0 [1] (โ‰๏ธ) exclamation question mark
-2122 ; Emoji # 1.1 [1] (โ„ข๏ธ) trade mark
-2139 ; Emoji # 3.0 [1] (โ„น๏ธ) information
-2194..2199 ; Emoji # 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
-21A9..21AA ; Emoji # 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
-231A..231B ; Emoji # 1.1 [2] (โŒš..โŒ›) watch..hourglass done
-2328 ; Emoji # 1.1 [1] (โŒจ๏ธ) keyboard
-23CF ; Emoji # 4.0 [1] (โ๏ธ) eject button
-23E9..23F3 ; Emoji # 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done
-23F8..23FA ; Emoji # 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
-24C2 ; Emoji # 1.1 [1] (โ“‚๏ธ) circled M
-25AA..25AB ; Emoji # 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
-25B6 ; Emoji # 1.1 [1] (โ–ถ๏ธ) play button
-25C0 ; Emoji # 1.1 [1] (โ—€๏ธ) reverse button
-25FB..25FE ; Emoji # 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
-2600..2604 ; Emoji # 1.1 [5] (โ˜€๏ธ..โ˜„๏ธ) sun..comet
-260E ; Emoji # 1.1 [1] (โ˜Ž๏ธ) telephone
-2611 ; Emoji # 1.1 [1] (โ˜‘๏ธ) check box with check
-2614..2615 ; Emoji # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
-2618 ; Emoji # 4.1 [1] (โ˜˜๏ธ) shamrock
-261D ; Emoji # 1.1 [1] (โ˜๏ธ) index pointing up
-2620 ; Emoji # 1.1 [1] (โ˜ ๏ธ) skull and crossbones
-2622..2623 ; Emoji # 1.1 [2] (โ˜ข๏ธ..โ˜ฃ๏ธ) radioactive..biohazard
-2626 ; Emoji # 1.1 [1] (โ˜ฆ๏ธ) orthodox cross
-262A ; Emoji # 1.1 [1] (โ˜ช๏ธ) star and crescent
-262E..262F ; Emoji # 1.1 [2] (โ˜ฎ๏ธ..โ˜ฏ๏ธ) peace symbol..yin yang
-2638..263A ; Emoji # 1.1 [3] (โ˜ธ๏ธ..โ˜บ๏ธ) wheel of dharma..smiling face
-2640 ; Emoji # 1.1 [1] (โ™€๏ธ) female sign
-2642 ; Emoji # 1.1 [1] (โ™‚๏ธ) male sign
-2648..2653 ; Emoji # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces
-265F..2660 ; Emoji # 1.1 [2] (โ™Ÿ๏ธ..โ™ ๏ธ) chess pawn..spade suit
-2663 ; Emoji # 1.1 [1] (โ™ฃ๏ธ) club suit
-2665..2666 ; Emoji # 1.1 [2] (โ™ฅ๏ธ..โ™ฆ๏ธ) heart suit..diamond suit
-2668 ; Emoji # 1.1 [1] (โ™จ๏ธ) hot springs
-267B ; Emoji # 3.2 [1] (โ™ป๏ธ) recycling symbol
-267E..267F ; Emoji # 4.1 [2] (โ™พ๏ธ..โ™ฟ) infinity..wheelchair symbol
-2692..2697 ; Emoji # 4.1 [6] (โš’๏ธ..โš—๏ธ) hammer and pick..alembic
-2699 ; Emoji # 4.1 [1] (โš™๏ธ) gear
-269B..269C ; Emoji # 4.1 [2] (โš›๏ธ..โšœ๏ธ) atom symbol..fleur-de-lis
-26A0..26A1 ; Emoji # 4.0 [2] (โš ๏ธ..โšก) warning..high voltage
-26AA..26AB ; Emoji # 4.1 [2] (โšช..โšซ) white circle..black circle
-26B0..26B1 ; Emoji # 4.1 [2] (โšฐ๏ธ..โšฑ๏ธ) coffin..funeral urn
-26BD..26BE ; Emoji # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball
-26C4..26C5 ; Emoji # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
-26C8 ; Emoji # 5.2 [1] (โ›ˆ๏ธ) cloud with lightning and rain
-26CE ; Emoji # 6.0 [1] (โ›Ž) Ophiuchus
-26CF ; Emoji # 5.2 [1] (โ›๏ธ) pick
-26D1 ; Emoji # 5.2 [1] (โ›‘๏ธ) rescue workerโ€™s helmet
-26D3..26D4 ; Emoji # 5.2 [2] (โ›“๏ธ..โ›”) chains..no entry
-26E9..26EA ; Emoji # 5.2 [2] (โ›ฉ๏ธ..โ›ช) shinto shrine..church
-26F0..26F5 ; Emoji # 5.2 [6] (โ›ฐ๏ธ..โ›ต) mountain..sailboat
-26F7..26FA ; Emoji # 5.2 [4] (โ›ท๏ธ..โ›บ) skier..tent
-26FD ; Emoji # 5.2 [1] (โ›ฝ) fuel pump
-2702 ; Emoji # 1.1 [1] (โœ‚๏ธ) scissors
-2705 ; Emoji # 6.0 [1] (โœ…) check mark button
-2708..2709 ; Emoji # 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope
-270A..270B ; Emoji # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
-270C..270D ; Emoji # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand
-270F ; Emoji # 1.1 [1] (โœ๏ธ) pencil
-2712 ; Emoji # 1.1 [1] (โœ’๏ธ) black nib
-2714 ; Emoji # 1.1 [1] (โœ”๏ธ) check mark
-2716 ; Emoji # 1.1 [1] (โœ–๏ธ) multiplication sign
-271D ; Emoji # 1.1 [1] (โœ๏ธ) latin cross
-2721 ; Emoji # 1.1 [1] (โœก๏ธ) star of David
-2728 ; Emoji # 6.0 [1] (โœจ) sparkles
-2733..2734 ; Emoji # 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
-2744 ; Emoji # 1.1 [1] (โ„๏ธ) snowflake
-2747 ; Emoji # 1.1 [1] (โ‡๏ธ) sparkle
-274C ; Emoji # 6.0 [1] (โŒ) cross mark
-274E ; Emoji # 6.0 [1] (โŽ) cross mark button
-2753..2755 ; Emoji # 6.0 [3] (โ“..โ•) question mark..white exclamation mark
-2757 ; Emoji # 5.2 [1] (โ—) exclamation mark
-2763..2764 ; Emoji # 1.1 [2] (โฃ๏ธ..โค๏ธ) heart exclamation..red heart
-2795..2797 ; Emoji # 6.0 [3] (โž•..โž—) plus sign..division sign
-27A1 ; Emoji # 1.1 [1] (โžก๏ธ) right arrow
-27B0 ; Emoji # 6.0 [1] (โžฐ) curly loop
-27BF ; Emoji # 6.0 [1] (โžฟ) double curly loop
-2934..2935 ; Emoji # 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
-2B05..2B07 ; Emoji # 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
-2B1B..2B1C ; Emoji # 5.1 [2] (โฌ›..โฌœ) black large square..white large square
-2B50 ; Emoji # 5.1 [1] (โญ) star
-2B55 ; Emoji # 5.2 [1] (โญ•) hollow red circle
-3030 ; Emoji # 1.1 [1] (ใ€ฐ๏ธ) wavy dash
-303D ; Emoji # 3.2 [1] (ใ€ฝ๏ธ) part alternation mark
-3297 ; Emoji # 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
-3299 ; Emoji # 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
-1F004 ; Emoji # 5.1 [1] (๐Ÿ€„) mahjong red dragon
-1F0CF ; Emoji # 6.0 [1] (๐Ÿƒ) joker
-1F170..1F171 ; Emoji # 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
-1F17E ; Emoji # 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type)
-1F17F ; Emoji # 5.2 [1] (๐Ÿ…ฟ๏ธ) P button
-1F18E ; Emoji # 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
-1F191..1F19A ; Emoji # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
-1F1E6..1F1FF ; Emoji # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
-1F201..1F202 ; Emoji # 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
-1F21A ; Emoji # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
-1F22F ; Emoji # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
-1F232..1F23A ; Emoji # 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
-1F250..1F251 ; Emoji # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
-1F300..1F320 ; Emoji # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
-1F321 ; Emoji # 7.0 [1] (๐ŸŒก๏ธ) thermometer
-1F324..1F32C ; Emoji # 7.0 [9] (๐ŸŒค๏ธ..๐ŸŒฌ๏ธ) sun behind small cloud..wind face
-1F32D..1F32F ; Emoji # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
-1F330..1F335 ; Emoji # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
-1F336 ; Emoji # 7.0 [1] (๐ŸŒถ๏ธ) hot pepper
-1F337..1F37C ; Emoji # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
-1F37D ; Emoji # 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate
-1F37E..1F37F ; Emoji # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
-1F380..1F393 ; Emoji # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
-1F396..1F397 ; Emoji # 7.0 [2] (๐ŸŽ–๏ธ..๐ŸŽ—๏ธ) military medal..reminder ribbon
-1F399..1F39B ; Emoji # 7.0 [3] (๐ŸŽ™๏ธ..๐ŸŽ›๏ธ) studio microphone..control knobs
-1F39E..1F39F ; Emoji # 7.0 [2] (๐ŸŽž๏ธ..๐ŸŽŸ๏ธ) film frames..admission tickets
-1F3A0..1F3C4 ; Emoji # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
-1F3C5 ; Emoji # 7.0 [1] (๐Ÿ…) sports medal
-1F3C6..1F3CA ; Emoji # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
-1F3CB..1F3CE ; Emoji # 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
-1F3CF..1F3D3 ; Emoji # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
-1F3D4..1F3DF ; Emoji # 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
-1F3E0..1F3F0 ; Emoji # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
-1F3F3..1F3F5 ; Emoji # 7.0 [3] (๐Ÿณ๏ธ..๐Ÿต๏ธ) white flag..rosette
-1F3F7 ; Emoji # 7.0 [1] (๐Ÿท๏ธ) label
-1F3F8..1F3FF ; Emoji # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone
-1F400..1F43E ; Emoji # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
-1F43F ; Emoji # 7.0 [1] (๐Ÿฟ๏ธ) chipmunk
-1F440 ; Emoji # 6.0 [1] (๐Ÿ‘€) eyes
-1F441 ; Emoji # 7.0 [1] (๐Ÿ‘๏ธ) eye
-1F442..1F4F7 ; Emoji # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
-1F4F8 ; Emoji # 7.0 [1] (๐Ÿ“ธ) camera with flash
-1F4F9..1F4FC ; Emoji # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
-1F4FD ; Emoji # 7.0 [1] (๐Ÿ“ฝ๏ธ) film projector
-1F4FF ; Emoji # 8.0 [1] (๐Ÿ“ฟ) prayer beads
-1F500..1F53D ; Emoji # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
-1F549..1F54A ; Emoji # 7.0 [2] (๐Ÿ•‰๏ธ..๐Ÿ•Š๏ธ) om..dove
-1F54B..1F54E ; Emoji # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
-1F550..1F567 ; Emoji # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
-1F56F..1F570 ; Emoji # 7.0 [2] (๐Ÿ•ฏ๏ธ..๐Ÿ•ฐ๏ธ) candle..mantelpiece clock
-1F573..1F579 ; Emoji # 7.0 [7] (๐Ÿ•ณ๏ธ..๐Ÿ•น๏ธ) hole..joystick
-1F57A ; Emoji # 9.0 [1] (๐Ÿ•บ) man dancing
-1F587 ; Emoji # 7.0 [1] (๐Ÿ–‡๏ธ) linked paperclips
-1F58A..1F58D ; Emoji # 7.0 [4] (๐Ÿ–Š๏ธ..๐Ÿ–๏ธ) pen..crayon
-1F590 ; Emoji # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed
-1F595..1F596 ; Emoji # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
-1F5A4 ; Emoji # 9.0 [1] (๐Ÿ–ค) black heart
-1F5A5 ; Emoji # 7.0 [1] (๐Ÿ–ฅ๏ธ) desktop computer
-1F5A8 ; Emoji # 7.0 [1] (๐Ÿ–จ๏ธ) printer
-1F5B1..1F5B2 ; Emoji # 7.0 [2] (๐Ÿ–ฑ๏ธ..๐Ÿ–ฒ๏ธ) computer mouse..trackball
-1F5BC ; Emoji # 7.0 [1] (๐Ÿ–ผ๏ธ) framed picture
-1F5C2..1F5C4 ; Emoji # 7.0 [3] (๐Ÿ—‚๏ธ..๐Ÿ—„๏ธ) card index dividers..file cabinet
-1F5D1..1F5D3 ; Emoji # 7.0 [3] (๐Ÿ—‘๏ธ..๐Ÿ—“๏ธ) wastebasket..spiral calendar
-1F5DC..1F5DE ; Emoji # 7.0 [3] (๐Ÿ—œ๏ธ..๐Ÿ—ž๏ธ) clamp..rolled-up newspaper
-1F5E1 ; Emoji # 7.0 [1] (๐Ÿ—ก๏ธ) dagger
-1F5E3 ; Emoji # 7.0 [1] (๐Ÿ—ฃ๏ธ) speaking head
-1F5E8 ; Emoji # 7.0 [1] (๐Ÿ—จ๏ธ) left speech bubble
-1F5EF ; Emoji # 7.0 [1] (๐Ÿ—ฏ๏ธ) right anger bubble
-1F5F3 ; Emoji # 7.0 [1] (๐Ÿ—ณ๏ธ) ballot box with ballot
-1F5FA ; Emoji # 7.0 [1] (๐Ÿ—บ๏ธ) world map
-1F5FB..1F5FF ; Emoji # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
-1F600 ; Emoji # 6.1 [1] (๐Ÿ˜€) grinning face
-1F601..1F610 ; Emoji # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
-1F611 ; Emoji # 6.1 [1] (๐Ÿ˜‘) expressionless face
-1F612..1F614 ; Emoji # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
-1F615 ; Emoji # 6.1 [1] (๐Ÿ˜•) confused face
-1F616 ; Emoji # 6.0 [1] (๐Ÿ˜–) confounded face
-1F617 ; Emoji # 6.1 [1] (๐Ÿ˜—) kissing face
-1F618 ; Emoji # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
-1F619 ; Emoji # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
-1F61A ; Emoji # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
-1F61B ; Emoji # 6.1 [1] (๐Ÿ˜›) face with tongue
-1F61C..1F61E ; Emoji # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
-1F61F ; Emoji # 6.1 [1] (๐Ÿ˜Ÿ) worried face
-1F620..1F625 ; Emoji # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
-1F626..1F627 ; Emoji # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
-1F628..1F62B ; Emoji # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
-1F62C ; Emoji # 6.1 [1] (๐Ÿ˜ฌ) grimacing face
-1F62D ; Emoji # 6.0 [1] (๐Ÿ˜ญ) loudly crying face
-1F62E..1F62F ; Emoji # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
-1F630..1F633 ; Emoji # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
-1F634 ; Emoji # 6.1 [1] (๐Ÿ˜ด) sleeping face
-1F635..1F640 ; Emoji # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat
-1F641..1F642 ; Emoji # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
-1F643..1F644 ; Emoji # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
-1F645..1F64F ; Emoji # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
-1F680..1F6C5 ; Emoji # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
-1F6CB..1F6CF ; Emoji # 7.0 [5] (๐Ÿ›‹๏ธ..๐Ÿ›๏ธ) couch and lamp..bed
-1F6D0 ; Emoji # 8.0 [1] (๐Ÿ›) place of worship
-1F6D1..1F6D2 ; Emoji # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
-1F6D5 ; Emoji # 12.0 [1] (๐Ÿ›•) hindu temple
-1F6E0..1F6E5 ; Emoji # 7.0 [6] (๐Ÿ› ๏ธ..๐Ÿ›ฅ๏ธ) hammer and wrench..motor boat
-1F6E9 ; Emoji # 7.0 [1] (๐Ÿ›ฉ๏ธ) small airplane
-1F6EB..1F6EC ; Emoji # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
-1F6F0 ; Emoji # 7.0 [1] (๐Ÿ›ฐ๏ธ) satellite
-1F6F3 ; Emoji # 7.0 [1] (๐Ÿ›ณ๏ธ) passenger ship
-1F6F4..1F6F6 ; Emoji # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
-1F6F7..1F6F8 ; Emoji # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
-1F6F9 ; Emoji # 11.0 [1] (๐Ÿ›น) skateboard
-1F6FA ; Emoji # 12.0 [1] (๐Ÿ›บ) auto rickshaw
-1F7E0..1F7EB ; Emoji # 12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
-1F90D..1F90F ; Emoji # 12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
-1F910..1F918 ; Emoji # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
-1F919..1F91E ; Emoji # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
-1F91F ; Emoji # 10.0 [1] (๐ŸคŸ) love-you gesture
-1F920..1F927 ; Emoji # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
-1F928..1F92F ; Emoji # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
-1F930 ; Emoji # 9.0 [1] (๐Ÿคฐ) pregnant woman
-1F931..1F932 ; Emoji # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
-1F933..1F93A ; Emoji # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
-1F93C..1F93E ; Emoji # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
-1F93F ; Emoji # 12.0 [1] (๐Ÿคฟ) diving mask
-1F940..1F945 ; Emoji # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
-1F947..1F94B ; Emoji # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
-1F94C ; Emoji # 10.0 [1] (๐ŸฅŒ) curling stone
-1F94D..1F94F ; Emoji # 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
-1F950..1F95E ; Emoji # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
-1F95F..1F96B ; Emoji # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
-1F96C..1F970 ; Emoji # 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
-1F971 ; Emoji # 12.0 [1] (๐Ÿฅฑ) yawning face
-1F973..1F976 ; Emoji # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
-1F97A ; Emoji # 11.0 [1] (๐Ÿฅบ) pleading face
-1F97B ; Emoji # 12.0 [1] (๐Ÿฅป) sari
-1F97C..1F97F ; Emoji # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
-1F980..1F984 ; Emoji # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
-1F985..1F991 ; Emoji # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
-1F992..1F997 ; Emoji # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
-1F998..1F9A2 ; Emoji # 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
-1F9A5..1F9AA ; Emoji # 12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
-1F9AE..1F9AF ; Emoji # 12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..probing cane
-1F9B0..1F9B9 ; Emoji # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
-1F9BA..1F9BF ; Emoji # 12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
-1F9C0 ; Emoji # 8.0 [1] (๐Ÿง€) cheese wedge
-1F9C1..1F9C2 ; Emoji # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
-1F9C3..1F9CA ; Emoji # 12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice cube
-1F9CD..1F9CF ; Emoji # 12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
-1F9D0..1F9E6 ; Emoji # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
-1F9E7..1F9FF ; Emoji # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
-1FA70..1FA73 ; Emoji # 12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
-1FA78..1FA7A ; Emoji # 12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
-1FA80..1FA82 ; Emoji # 12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
-1FA90..1FA95 ; Emoji # 12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
+0023 ; Emoji # E0.0 [1] (#๏ธ) number sign
+002A ; Emoji # E0.0 [1] (*๏ธ) asterisk
+0030..0039 ; Emoji # E0.0 [10] (0๏ธ..9๏ธ) digit zero..digit nine
+00A9 ; Emoji # E0.6 [1] (ยฉ๏ธ) copyright
+00AE ; Emoji # E0.6 [1] (ยฎ๏ธ) registered
+203C ; Emoji # E0.6 [1] (โ€ผ๏ธ) double exclamation mark
+2049 ; Emoji # E0.6 [1] (โ‰๏ธ) exclamation question mark
+2122 ; Emoji # E0.6 [1] (โ„ข๏ธ) trade mark
+2139 ; Emoji # E0.6 [1] (โ„น๏ธ) information
+2194..2199 ; Emoji # E0.6 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
+21A9..21AA ; Emoji # E0.6 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
+231A..231B ; Emoji # E0.6 [2] (โŒš..โŒ›) watch..hourglass done
+2328 ; Emoji # E1.0 [1] (โŒจ๏ธ) keyboard
+23CF ; Emoji # E1.0 [1] (โ๏ธ) eject button
+23E9..23EC ; Emoji # E0.6 [4] (โฉ..โฌ) fast-forward button..fast down button
+23ED..23EE ; Emoji # E0.7 [2] (โญ๏ธ..โฎ๏ธ) next track button..last track button
+23EF ; Emoji # E1.0 [1] (โฏ๏ธ) play or pause button
+23F0 ; Emoji # E0.6 [1] (โฐ) alarm clock
+23F1..23F2 ; Emoji # E1.0 [2] (โฑ๏ธ..โฒ๏ธ) stopwatch..timer clock
+23F3 ; Emoji # E0.6 [1] (โณ) hourglass not done
+23F8..23FA ; Emoji # E0.7 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
+24C2 ; Emoji # E0.6 [1] (โ“‚๏ธ) circled M
+25AA..25AB ; Emoji # E0.6 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
+25B6 ; Emoji # E0.6 [1] (โ–ถ๏ธ) play button
+25C0 ; Emoji # E0.6 [1] (โ—€๏ธ) reverse button
+25FB..25FE ; Emoji # E0.6 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
+2600..2601 ; Emoji # E0.6 [2] (โ˜€๏ธ..โ˜๏ธ) sun..cloud
+2602..2603 ; Emoji # E0.7 [2] (โ˜‚๏ธ..โ˜ƒ๏ธ) umbrella..snowman
+2604 ; Emoji # E1.0 [1] (โ˜„๏ธ) comet
+260E ; Emoji # E0.6 [1] (โ˜Ž๏ธ) telephone
+2611 ; Emoji # E0.6 [1] (โ˜‘๏ธ) check box with check
+2614..2615 ; Emoji # E0.6 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2618 ; Emoji # E1.0 [1] (โ˜˜๏ธ) shamrock
+261D ; Emoji # E0.6 [1] (โ˜๏ธ) index pointing up
+2620 ; Emoji # E1.0 [1] (โ˜ ๏ธ) skull and crossbones
+2622..2623 ; Emoji # E1.0 [2] (โ˜ข๏ธ..โ˜ฃ๏ธ) radioactive..biohazard
+2626 ; Emoji # E1.0 [1] (โ˜ฆ๏ธ) orthodox cross
+262A ; Emoji # E0.7 [1] (โ˜ช๏ธ) star and crescent
+262E ; Emoji # E1.0 [1] (โ˜ฎ๏ธ) peace symbol
+262F ; Emoji # E0.7 [1] (โ˜ฏ๏ธ) yin yang
+2638..2639 ; Emoji # E0.7 [2] (โ˜ธ๏ธ..โ˜น๏ธ) wheel of dharma..frowning face
+263A ; Emoji # E0.6 [1] (โ˜บ๏ธ) smiling face
+2640 ; Emoji # E4.0 [1] (โ™€๏ธ) female sign
+2642 ; Emoji # E4.0 [1] (โ™‚๏ธ) male sign
+2648..2653 ; Emoji # E0.6 [12] (โ™ˆ..โ™“) Aries..Pisces
+265F ; Emoji # E11.0 [1] (โ™Ÿ๏ธ) chess pawn
+2660 ; Emoji # E0.6 [1] (โ™ ๏ธ) spade suit
+2663 ; Emoji # E0.6 [1] (โ™ฃ๏ธ) club suit
+2665..2666 ; Emoji # E0.6 [2] (โ™ฅ๏ธ..โ™ฆ๏ธ) heart suit..diamond suit
+2668 ; Emoji # E0.6 [1] (โ™จ๏ธ) hot springs
+267B ; Emoji # E0.6 [1] (โ™ป๏ธ) recycling symbol
+267E ; Emoji # E11.0 [1] (โ™พ๏ธ) infinity
+267F ; Emoji # E0.6 [1] (โ™ฟ) wheelchair symbol
+2692 ; Emoji # E1.0 [1] (โš’๏ธ) hammer and pick
+2693 ; Emoji # E0.6 [1] (โš“) anchor
+2694 ; Emoji # E1.0 [1] (โš”๏ธ) crossed swords
+2695 ; Emoji # E4.0 [1] (โš•๏ธ) medical symbol
+2696..2697 ; Emoji # E1.0 [2] (โš–๏ธ..โš—๏ธ) balance scale..alembic
+2699 ; Emoji # E1.0 [1] (โš™๏ธ) gear
+269B..269C ; Emoji # E1.0 [2] (โš›๏ธ..โšœ๏ธ) atom symbol..fleur-de-lis
+26A0..26A1 ; Emoji # E0.6 [2] (โš ๏ธ..โšก) warning..high voltage
+26A7 ; Emoji # E13.0 [1] (โšง๏ธ) transgender symbol
+26AA..26AB ; Emoji # E0.6 [2] (โšช..โšซ) white circle..black circle
+26B0..26B1 ; Emoji # E1.0 [2] (โšฐ๏ธ..โšฑ๏ธ) coffin..funeral urn
+26BD..26BE ; Emoji # E0.6 [2] (โšฝ..โšพ) soccer ball..baseball
+26C4..26C5 ; Emoji # E0.6 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
+26C8 ; Emoji # E0.7 [1] (โ›ˆ๏ธ) cloud with lightning and rain
+26CE ; Emoji # E0.6 [1] (โ›Ž) Ophiuchus
+26CF ; Emoji # E0.7 [1] (โ›๏ธ) pick
+26D1 ; Emoji # E0.7 [1] (โ›‘๏ธ) rescue workerโ€™s helmet
+26D3 ; Emoji # E0.7 [1] (โ›“๏ธ) chains
+26D4 ; Emoji # E0.6 [1] (โ›”) no entry
+26E9 ; Emoji # E0.7 [1] (โ›ฉ๏ธ) shinto shrine
+26EA ; Emoji # E0.6 [1] (โ›ช) church
+26F0..26F1 ; Emoji # E0.7 [2] (โ›ฐ๏ธ..โ›ฑ๏ธ) mountain..umbrella on ground
+26F2..26F3 ; Emoji # E0.6 [2] (โ›ฒ..โ›ณ) fountain..flag in hole
+26F4 ; Emoji # E0.7 [1] (โ›ด๏ธ) ferry
+26F5 ; Emoji # E0.6 [1] (โ›ต) sailboat
+26F7..26F9 ; Emoji # E0.7 [3] (โ›ท๏ธ..โ›น๏ธ) skier..person bouncing ball
+26FA ; Emoji # E0.6 [1] (โ›บ) tent
+26FD ; Emoji # E0.6 [1] (โ›ฝ) fuel pump
+2702 ; Emoji # E0.6 [1] (โœ‚๏ธ) scissors
+2705 ; Emoji # E0.6 [1] (โœ…) check mark button
+2708..270C ; Emoji # E0.6 [5] (โœˆ๏ธ..โœŒ๏ธ) airplane..victory hand
+270D ; Emoji # E0.7 [1] (โœ๏ธ) writing hand
+270F ; Emoji # E0.6 [1] (โœ๏ธ) pencil
+2712 ; Emoji # E0.6 [1] (โœ’๏ธ) black nib
+2714 ; Emoji # E0.6 [1] (โœ”๏ธ) check mark
+2716 ; Emoji # E0.6 [1] (โœ–๏ธ) multiply
+271D ; Emoji # E0.7 [1] (โœ๏ธ) latin cross
+2721 ; Emoji # E0.7 [1] (โœก๏ธ) star of David
+2728 ; Emoji # E0.6 [1] (โœจ) sparkles
+2733..2734 ; Emoji # E0.6 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
+2744 ; Emoji # E0.6 [1] (โ„๏ธ) snowflake
+2747 ; Emoji # E0.6 [1] (โ‡๏ธ) sparkle
+274C ; Emoji # E0.6 [1] (โŒ) cross mark
+274E ; Emoji # E0.6 [1] (โŽ) cross mark button
+2753..2755 ; Emoji # E0.6 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Emoji # E0.6 [1] (โ—) exclamation mark
+2763 ; Emoji # E1.0 [1] (โฃ๏ธ) heart exclamation
+2764 ; Emoji # E0.6 [1] (โค๏ธ) red heart
+2795..2797 ; Emoji # E0.6 [3] (โž•..โž—) plus..divide
+27A1 ; Emoji # E0.6 [1] (โžก๏ธ) right arrow
+27B0 ; Emoji # E0.6 [1] (โžฐ) curly loop
+27BF ; Emoji # E1.0 [1] (โžฟ) double curly loop
+2934..2935 ; Emoji # E0.6 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
+2B05..2B07 ; Emoji # E0.6 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
+2B1B..2B1C ; Emoji # E0.6 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Emoji # E0.6 [1] (โญ) star
+2B55 ; Emoji # E0.6 [1] (โญ•) hollow red circle
+3030 ; Emoji # E0.6 [1] (ใ€ฐ๏ธ) wavy dash
+303D ; Emoji # E0.6 [1] (ใ€ฝ๏ธ) part alternation mark
+3297 ; Emoji # E0.6 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
+3299 ; Emoji # E0.6 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
+1F004 ; Emoji # E0.6 [1] (๐Ÿ€„) mahjong red dragon
+1F0CF ; Emoji # E0.6 [1] (๐Ÿƒ) joker
+1F170..1F171 ; Emoji # E0.6 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Emoji # E0.6 [2] (๐Ÿ…พ๏ธ..๐Ÿ…ฟ๏ธ) O button (blood type)..P button
+1F18E ; Emoji # E0.6 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Emoji # E0.6 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1E6..1F1FF ; Emoji # E0.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F201..1F202 ; Emoji # E0.6 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
+1F21A ; Emoji # E0.6 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Emoji # E0.6 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F23A ; Emoji # E0.6 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
+1F250..1F251 ; Emoji # E0.6 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F300..1F30C ; Emoji # E0.6 [13] (๐ŸŒ€..๐ŸŒŒ) cyclone..milky way
+1F30D..1F30E ; Emoji # E0.7 [2] (๐ŸŒ..๐ŸŒŽ) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji # E0.6 [1] (๐ŸŒ) globe showing Asia-Australia
+1F310 ; Emoji # E1.0 [1] (๐ŸŒ) globe with meridians
+1F311 ; Emoji # E0.6 [1] (๐ŸŒ‘) new moon
+1F312 ; Emoji # E1.0 [1] (๐ŸŒ’) waxing crescent moon
+1F313..1F315 ; Emoji # E0.6 [3] (๐ŸŒ“..๐ŸŒ•) first quarter moon..full moon
+1F316..1F318 ; Emoji # E1.0 [3] (๐ŸŒ–..๐ŸŒ˜) waning gibbous moon..waning crescent moon
+1F319 ; Emoji # E0.6 [1] (๐ŸŒ™) crescent moon
+1F31A ; Emoji # E1.0 [1] (๐ŸŒš) new moon face
+1F31B ; Emoji # E0.6 [1] (๐ŸŒ›) first quarter moon face
+1F31C ; Emoji # E0.7 [1] (๐ŸŒœ) last quarter moon face
+1F31D..1F31E ; Emoji # E1.0 [2] (๐ŸŒ..๐ŸŒž) full moon face..sun with face
+1F31F..1F320 ; Emoji # E0.6 [2] (๐ŸŒŸ..๐ŸŒ ) glowing star..shooting star
+1F321 ; Emoji # E0.7 [1] (๐ŸŒก๏ธ) thermometer
+1F324..1F32C ; Emoji # E0.7 [9] (๐ŸŒค๏ธ..๐ŸŒฌ๏ธ) sun behind small cloud..wind face
+1F32D..1F32F ; Emoji # E1.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F331 ; Emoji # E0.6 [2] (๐ŸŒฐ..๐ŸŒฑ) chestnut..seedling
+1F332..1F333 ; Emoji # E1.0 [2] (๐ŸŒฒ..๐ŸŒณ) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji # E0.6 [2] (๐ŸŒด..๐ŸŒต) palm tree..cactus
+1F336 ; Emoji # E0.7 [1] (๐ŸŒถ๏ธ) hot pepper
+1F337..1F34A ; Emoji # E0.6 [20] (๐ŸŒท..๐ŸŠ) tulip..tangerine
+1F34B ; Emoji # E1.0 [1] (๐Ÿ‹) lemon
+1F34C..1F34F ; Emoji # E0.6 [4] (๐ŸŒ..๐Ÿ) banana..green apple
+1F350 ; Emoji # E1.0 [1] (๐Ÿ) pear
+1F351..1F37B ; Emoji # E0.6 [43] (๐Ÿ‘..๐Ÿป) peach..clinking beer mugs
+1F37C ; Emoji # E1.0 [1] (๐Ÿผ) baby bottle
+1F37D ; Emoji # E0.7 [1] (๐Ÿฝ๏ธ) fork and knife with plate
+1F37E..1F37F ; Emoji # E1.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji # E0.6 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F396..1F397 ; Emoji # E0.7 [2] (๐ŸŽ–๏ธ..๐ŸŽ—๏ธ) military medal..reminder ribbon
+1F399..1F39B ; Emoji # E0.7 [3] (๐ŸŽ™๏ธ..๐ŸŽ›๏ธ) studio microphone..control knobs
+1F39E..1F39F ; Emoji # E0.7 [2] (๐ŸŽž๏ธ..๐ŸŽŸ๏ธ) film frames..admission tickets
+1F3A0..1F3C4 ; Emoji # E0.6 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Emoji # E1.0 [1] (๐Ÿ…) sports medal
+1F3C6 ; Emoji # E0.6 [1] (๐Ÿ†) trophy
+1F3C7 ; Emoji # E1.0 [1] (๐Ÿ‡) horse racing
+1F3C8 ; Emoji # E0.6 [1] (๐Ÿˆ) american football
+1F3C9 ; Emoji # E1.0 [1] (๐Ÿ‰) rugby football
+1F3CA ; Emoji # E0.6 [1] (๐ŸŠ) person swimming
+1F3CB..1F3CE ; Emoji # E0.7 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
+1F3CF..1F3D3 ; Emoji # E1.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3D4..1F3DF ; Emoji # E0.7 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Emoji # E0.6 [4] (๐Ÿ ..๐Ÿฃ) house..Japanese post office
+1F3E4 ; Emoji # E1.0 [1] (๐Ÿค) post office
+1F3E5..1F3F0 ; Emoji # E0.6 [12] (๐Ÿฅ..๐Ÿฐ) hospital..castle
+1F3F3 ; Emoji # E0.7 [1] (๐Ÿณ๏ธ) white flag
+1F3F4 ; Emoji # E1.0 [1] (๐Ÿด) black flag
+1F3F5 ; Emoji # E0.7 [1] (๐Ÿต๏ธ) rosette
+1F3F7 ; Emoji # E0.7 [1] (๐Ÿท๏ธ) label
+1F3F8..1F407 ; Emoji # E1.0 [16] (๐Ÿธ..๐Ÿ‡) badminton..rabbit
+1F408 ; Emoji # E0.7 [1] (๐Ÿˆ) cat
+1F409..1F40B ; Emoji # E1.0 [3] (๐Ÿ‰..๐Ÿ‹) dragon..whale
+1F40C..1F40E ; Emoji # E0.6 [3] (๐ŸŒ..๐ŸŽ) snail..horse
+1F40F..1F410 ; Emoji # E1.0 [2] (๐Ÿ..๐Ÿ) ram..goat
+1F411..1F412 ; Emoji # E0.6 [2] (๐Ÿ‘..๐Ÿ’) ewe..monkey
+1F413 ; Emoji # E1.0 [1] (๐Ÿ“) rooster
+1F414 ; Emoji # E0.6 [1] (๐Ÿ”) chicken
+1F415 ; Emoji # E0.7 [1] (๐Ÿ•) dog
+1F416 ; Emoji # E1.0 [1] (๐Ÿ–) pig
+1F417..1F429 ; Emoji # E0.6 [19] (๐Ÿ—..๐Ÿฉ) boar..poodle
+1F42A ; Emoji # E1.0 [1] (๐Ÿช) camel
+1F42B..1F43E ; Emoji # E0.6 [20] (๐Ÿซ..๐Ÿพ) two-hump camel..paw prints
+1F43F ; Emoji # E0.7 [1] (๐Ÿฟ๏ธ) chipmunk
+1F440 ; Emoji # E0.6 [1] (๐Ÿ‘€) eyes
+1F441 ; Emoji # E0.7 [1] (๐Ÿ‘๏ธ) eye
+1F442..1F464 ; Emoji # E0.6 [35] (๐Ÿ‘‚..๐Ÿ‘ค) ear..bust in silhouette
+1F465 ; Emoji # E1.0 [1] (๐Ÿ‘ฅ) busts in silhouette
+1F466..1F46B ; Emoji # E0.6 [6] (๐Ÿ‘ฆ..๐Ÿ‘ซ) boy..woman and man holding hands
+1F46C..1F46D ; Emoji # E1.0 [2] (๐Ÿ‘ฌ..๐Ÿ‘ญ) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji # E0.6 [63] (๐Ÿ‘ฎ..๐Ÿ’ฌ) police officer..speech balloon
+1F4AD ; Emoji # E1.0 [1] (๐Ÿ’ญ) thought balloon
+1F4AE..1F4B5 ; Emoji # E0.6 [8] (๐Ÿ’ฎ..๐Ÿ’ต) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji # E1.0 [2] (๐Ÿ’ถ..๐Ÿ’ท) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji # E0.6 [52] (๐Ÿ’ธ..๐Ÿ“ซ) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji # E0.7 [2] (๐Ÿ“ฌ..๐Ÿ“ญ) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji # E0.6 [1] (๐Ÿ“ฎ) postbox
+1F4EF ; Emoji # E1.0 [1] (๐Ÿ“ฏ) postal horn
+1F4F0..1F4F4 ; Emoji # E0.6 [5] (๐Ÿ“ฐ..๐Ÿ“ด) newspaper..mobile phone off
+1F4F5 ; Emoji # E1.0 [1] (๐Ÿ“ต) no mobile phones
+1F4F6..1F4F7 ; Emoji # E0.6 [2] (๐Ÿ“ถ..๐Ÿ“ท) antenna bars..camera
+1F4F8 ; Emoji # E1.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Emoji # E0.6 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FD ; Emoji # E0.7 [1] (๐Ÿ“ฝ๏ธ) film projector
+1F4FF..1F502 ; Emoji # E1.0 [4] (๐Ÿ“ฟ..๐Ÿ”‚) prayer beads..repeat single button
+1F503 ; Emoji # E0.6 [1] (๐Ÿ”ƒ) clockwise vertical arrows
+1F504..1F507 ; Emoji # E1.0 [4] (๐Ÿ”„..๐Ÿ”‡) counterclockwise arrows button..muted speaker
+1F508 ; Emoji # E0.7 [1] (๐Ÿ”ˆ) speaker low volume
+1F509 ; Emoji # E1.0 [1] (๐Ÿ”‰) speaker medium volume
+1F50A..1F514 ; Emoji # E0.6 [11] (๐Ÿ”Š..๐Ÿ””) speaker high volume..bell
+1F515 ; Emoji # E1.0 [1] (๐Ÿ”•) bell with slash
+1F516..1F52B ; Emoji # E0.6 [22] (๐Ÿ”–..๐Ÿ”ซ) bookmark..pistol
+1F52C..1F52D ; Emoji # E1.0 [2] (๐Ÿ”ฌ..๐Ÿ”ญ) microscope..telescope
+1F52E..1F53D ; Emoji # E0.6 [16] (๐Ÿ”ฎ..๐Ÿ”ฝ) crystal ball..downwards button
+1F549..1F54A ; Emoji # E0.7 [2] (๐Ÿ•‰๏ธ..๐Ÿ•Š๏ธ) om..dove
+1F54B..1F54E ; Emoji # E1.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
+1F550..1F55B ; Emoji # E0.6 [12] (๐Ÿ•..๐Ÿ•›) one oโ€™clock..twelve oโ€™clock
+1F55C..1F567 ; Emoji # E0.7 [12] (๐Ÿ•œ..๐Ÿ•ง) one-thirty..twelve-thirty
+1F56F..1F570 ; Emoji # E0.7 [2] (๐Ÿ•ฏ๏ธ..๐Ÿ•ฐ๏ธ) candle..mantelpiece clock
+1F573..1F579 ; Emoji # E0.7 [7] (๐Ÿ•ณ๏ธ..๐Ÿ•น๏ธ) hole..joystick
+1F57A ; Emoji # E3.0 [1] (๐Ÿ•บ) man dancing
+1F587 ; Emoji # E0.7 [1] (๐Ÿ–‡๏ธ) linked paperclips
+1F58A..1F58D ; Emoji # E0.7 [4] (๐Ÿ–Š๏ธ..๐Ÿ–๏ธ) pen..crayon
+1F590 ; Emoji # E0.7 [1] (๐Ÿ–๏ธ) hand with fingers splayed
+1F595..1F596 ; Emoji # E1.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F5A4 ; Emoji # E3.0 [1] (๐Ÿ–ค) black heart
+1F5A5 ; Emoji # E0.7 [1] (๐Ÿ–ฅ๏ธ) desktop computer
+1F5A8 ; Emoji # E0.7 [1] (๐Ÿ–จ๏ธ) printer
+1F5B1..1F5B2 ; Emoji # E0.7 [2] (๐Ÿ–ฑ๏ธ..๐Ÿ–ฒ๏ธ) computer mouse..trackball
+1F5BC ; Emoji # E0.7 [1] (๐Ÿ–ผ๏ธ) framed picture
+1F5C2..1F5C4 ; Emoji # E0.7 [3] (๐Ÿ—‚๏ธ..๐Ÿ—„๏ธ) card index dividers..file cabinet
+1F5D1..1F5D3 ; Emoji # E0.7 [3] (๐Ÿ—‘๏ธ..๐Ÿ—“๏ธ) wastebasket..spiral calendar
+1F5DC..1F5DE ; Emoji # E0.7 [3] (๐Ÿ—œ๏ธ..๐Ÿ—ž๏ธ) clamp..rolled-up newspaper
+1F5E1 ; Emoji # E0.7 [1] (๐Ÿ—ก๏ธ) dagger
+1F5E3 ; Emoji # E0.7 [1] (๐Ÿ—ฃ๏ธ) speaking head
+1F5E8 ; Emoji # E2.0 [1] (๐Ÿ—จ๏ธ) left speech bubble
+1F5EF ; Emoji # E0.7 [1] (๐Ÿ—ฏ๏ธ) right anger bubble
+1F5F3 ; Emoji # E0.7 [1] (๐Ÿ—ณ๏ธ) ballot box with ballot
+1F5FA ; Emoji # E0.7 [1] (๐Ÿ—บ๏ธ) world map
+1F5FB..1F5FF ; Emoji # E0.6 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Emoji # E1.0 [1] (๐Ÿ˜€) grinning face
+1F601..1F606 ; Emoji # E0.6 [6] (๐Ÿ˜..๐Ÿ˜†) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji # E1.0 [2] (๐Ÿ˜‡..๐Ÿ˜ˆ) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji # E0.6 [5] (๐Ÿ˜‰..๐Ÿ˜) winking face..smiling face with heart-eyes
+1F60E ; Emoji # E1.0 [1] (๐Ÿ˜Ž) smiling face with sunglasses
+1F60F ; Emoji # E0.6 [1] (๐Ÿ˜) smirking face
+1F610 ; Emoji # E0.7 [1] (๐Ÿ˜) neutral face
+1F611 ; Emoji # E1.0 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Emoji # E0.6 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Emoji # E1.0 [1] (๐Ÿ˜•) confused face
+1F616 ; Emoji # E0.6 [1] (๐Ÿ˜–) confounded face
+1F617 ; Emoji # E1.0 [1] (๐Ÿ˜—) kissing face
+1F618 ; Emoji # E0.6 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Emoji # E1.0 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Emoji # E0.6 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Emoji # E1.0 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Emoji # E0.6 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Emoji # E1.0 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Emoji # E0.6 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Emoji # E1.0 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji # E0.6 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Emoji # E1.0 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Emoji # E0.6 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Emoji # E1.0 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Emoji # E0.6 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Emoji # E1.0 [1] (๐Ÿ˜ด) sleeping face
+1F635 ; Emoji # E0.6 [1] (๐Ÿ˜ต) dizzy face
+1F636 ; Emoji # E1.0 [1] (๐Ÿ˜ถ) face without mouth
+1F637..1F640 ; Emoji # E0.6 [10] (๐Ÿ˜ท..๐Ÿ™€) face with medical mask..weary cat
+1F641..1F644 ; Emoji # E1.0 [4] (๐Ÿ™..๐Ÿ™„) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji # E0.6 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680 ; Emoji # E0.6 [1] (๐Ÿš€) rocket
+1F681..1F682 ; Emoji # E1.0 [2] (๐Ÿš..๐Ÿš‚) helicopter..locomotive
+1F683..1F685 ; Emoji # E0.6 [3] (๐Ÿšƒ..๐Ÿš…) railway car..bullet train
+1F686 ; Emoji # E1.0 [1] (๐Ÿš†) train
+1F687 ; Emoji # E0.6 [1] (๐Ÿš‡) metro
+1F688 ; Emoji # E1.0 [1] (๐Ÿšˆ) light rail
+1F689 ; Emoji # E0.6 [1] (๐Ÿš‰) station
+1F68A..1F68B ; Emoji # E1.0 [2] (๐ŸšŠ..๐Ÿš‹) tram..tram car
+1F68C ; Emoji # E0.6 [1] (๐ŸšŒ) bus
+1F68D ; Emoji # E0.7 [1] (๐Ÿš) oncoming bus
+1F68E ; Emoji # E1.0 [1] (๐ŸšŽ) trolleybus
+1F68F ; Emoji # E0.6 [1] (๐Ÿš) bus stop
+1F690 ; Emoji # E1.0 [1] (๐Ÿš) minibus
+1F691..1F693 ; Emoji # E0.6 [3] (๐Ÿš‘..๐Ÿš“) ambulance..police car
+1F694 ; Emoji # E0.7 [1] (๐Ÿš”) oncoming police car
+1F695 ; Emoji # E0.6 [1] (๐Ÿš•) taxi
+1F696 ; Emoji # E1.0 [1] (๐Ÿš–) oncoming taxi
+1F697 ; Emoji # E0.6 [1] (๐Ÿš—) automobile
+1F698 ; Emoji # E0.7 [1] (๐Ÿš˜) oncoming automobile
+1F699..1F69A ; Emoji # E0.6 [2] (๐Ÿš™..๐Ÿšš) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji # E1.0 [7] (๐Ÿš›..๐Ÿšก) articulated lorry..aerial tramway
+1F6A2 ; Emoji # E0.6 [1] (๐Ÿšข) ship
+1F6A3 ; Emoji # E1.0 [1] (๐Ÿšฃ) person rowing boat
+1F6A4..1F6A5 ; Emoji # E0.6 [2] (๐Ÿšค..๐Ÿšฅ) speedboat..horizontal traffic light
+1F6A6 ; Emoji # E1.0 [1] (๐Ÿšฆ) vertical traffic light
+1F6A7..1F6AD ; Emoji # E0.6 [7] (๐Ÿšง..๐Ÿšญ) construction..no smoking
+1F6AE..1F6B1 ; Emoji # E1.0 [4] (๐Ÿšฎ..๐Ÿšฑ) litter in bin sign..non-potable water
+1F6B2 ; Emoji # E0.6 [1] (๐Ÿšฒ) bicycle
+1F6B3..1F6B5 ; Emoji # E1.0 [3] (๐Ÿšณ..๐Ÿšต) no bicycles..person mountain biking
+1F6B6 ; Emoji # E0.6 [1] (๐Ÿšถ) person walking
+1F6B7..1F6B8 ; Emoji # E1.0 [2] (๐Ÿšท..๐Ÿšธ) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji # E0.6 [6] (๐Ÿšน..๐Ÿšพ) menโ€™s room..water closet
+1F6BF ; Emoji # E1.0 [1] (๐Ÿšฟ) shower
+1F6C0 ; Emoji # E0.6 [1] (๐Ÿ›€) person taking bath
+1F6C1..1F6C5 ; Emoji # E1.0 [5] (๐Ÿ›..๐Ÿ›…) bathtub..left luggage
+1F6CB ; Emoji # E0.7 [1] (๐Ÿ›‹๏ธ) couch and lamp
+1F6CC ; Emoji # E1.0 [1] (๐Ÿ›Œ) person in bed
+1F6CD..1F6CF ; Emoji # E0.7 [3] (๐Ÿ›๏ธ..๐Ÿ›๏ธ) shopping bags..bed
+1F6D0 ; Emoji # E1.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Emoji # E3.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6D5 ; Emoji # E12.0 [1] (๐Ÿ›•) hindu temple
+1F6D6..1F6D7 ; Emoji # E13.0 [2] (๐Ÿ›–..๐Ÿ›—) hut..elevator
+1F6E0..1F6E5 ; Emoji # E0.7 [6] (๐Ÿ› ๏ธ..๐Ÿ›ฅ๏ธ) hammer and wrench..motor boat
+1F6E9 ; Emoji # E0.7 [1] (๐Ÿ›ฉ๏ธ) small airplane
+1F6EB..1F6EC ; Emoji # E1.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
+1F6F0 ; Emoji # E0.7 [1] (๐Ÿ›ฐ๏ธ) satellite
+1F6F3 ; Emoji # E0.7 [1] (๐Ÿ›ณ๏ธ) passenger ship
+1F6F4..1F6F6 ; Emoji # E3.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji # E5.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Emoji # E11.0 [1] (๐Ÿ›น) skateboard
+1F6FA ; Emoji # E12.0 [1] (๐Ÿ›บ) auto rickshaw
+1F6FB..1F6FC ; Emoji # E13.0 [2] (๐Ÿ›ป..๐Ÿ›ผ) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji # E12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
+1F90C ; Emoji # E13.0 [1] (๐ŸคŒ) pinched fingers
+1F90D..1F90F ; Emoji # E12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
+1F910..1F918 ; Emoji # E1.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji # E3.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Emoji # E5.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Emoji # E3.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji # E5.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Emoji # E3.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji # E5.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Emoji # E3.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Emoji # E3.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F93F ; Emoji # E12.0 [1] (๐Ÿคฟ) diving mask
+1F940..1F945 ; Emoji # E3.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Emoji # E3.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Emoji # E5.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Emoji # E11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Emoji # E3.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Emoji # E5.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Emoji # E11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
+1F971 ; Emoji # E12.0 [1] (๐Ÿฅฑ) yawning face
+1F972 ; Emoji # E13.0 [1] (๐Ÿฅฒ) smiling face with tear
+1F973..1F976 ; Emoji # E11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F977..1F978 ; Emoji # E13.0 [2] (๐Ÿฅท..๐Ÿฅธ) ninja..disguised face
+1F97A ; Emoji # E11.0 [1] (๐Ÿฅบ) pleading face
+1F97B ; Emoji # E12.0 [1] (๐Ÿฅป) sari
+1F97C..1F97F ; Emoji # E11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
+1F980..1F984 ; Emoji # E1.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
+1F985..1F991 ; Emoji # E3.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Emoji # E5.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Emoji # E11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9A3..1F9A4 ; Emoji # E13.0 [2] (๐Ÿฆฃ..๐Ÿฆค) mammoth..dodo
+1F9A5..1F9AA ; Emoji # E12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
+1F9AB..1F9AD ; Emoji # E13.0 [3] (๐Ÿฆซ..๐Ÿฆญ) beaver..seal
+1F9AE..1F9AF ; Emoji # E12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..white cane
+1F9B0..1F9B9 ; Emoji # E11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
+1F9BA..1F9BF ; Emoji # E12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
+1F9C0 ; Emoji # E1.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji # E11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9C3..1F9CA ; Emoji # E12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice
+1F9CB ; Emoji # E13.0 [1] (๐Ÿง‹) bubble tea
+1F9CD..1F9CF ; Emoji # E12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
+1F9D0..1F9E6 ; Emoji # E5.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji # E11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji # E12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
+1FA74 ; Emoji # E13.0 [1] (๐Ÿฉด) thong sandal
+1FA78..1FA7A ; Emoji # E12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
+1FA80..1FA82 ; Emoji # E12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
+1FA83..1FA86 ; Emoji # E13.0 [4] (๐Ÿชƒ..๐Ÿช†) boomerang..nesting dolls
+1FA90..1FA95 ; Emoji # E12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
+1FA96..1FAA8 ; Emoji # E13.0 [19] (๐Ÿช–..๐Ÿชจ) military helmet..rock
+1FAB0..1FAB6 ; Emoji # E13.0 [7] (๐Ÿชฐ..๐Ÿชถ) fly..feather
+1FAC0..1FAC2 ; Emoji # E13.0 [3] (๐Ÿซ€..๐Ÿซ‚) anatomical heart..people hugging
+1FAD0..1FAD6 ; Emoji # E13.0 [7] (๐Ÿซ..๐Ÿซ–) blueberries..teapot
-# Total elements: 1311
+# Total elements: 1367
# ================================================
# All omitted code points have Emoji_Presentation=No
# @missing: 0000..10FFFF ; Emoji_Presentation ; No
-231A..231B ; Emoji_Presentation # 1.1 [2] (โŒš..โŒ›) watch..hourglass done
-23E9..23EC ; Emoji_Presentation # 6.0 [4] (โฉ..โฌ) fast-forward button..fast down button
-23F0 ; Emoji_Presentation # 6.0 [1] (โฐ) alarm clock
-23F3 ; Emoji_Presentation # 6.0 [1] (โณ) hourglass not done
-25FD..25FE ; Emoji_Presentation # 3.2 [2] (โ—ฝ..โ—พ) white medium-small square..black medium-small square
-2614..2615 ; Emoji_Presentation # 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
-2648..2653 ; Emoji_Presentation # 1.1 [12] (โ™ˆ..โ™“) Aries..Pisces
-267F ; Emoji_Presentation # 4.1 [1] (โ™ฟ) wheelchair symbol
-2693 ; Emoji_Presentation # 4.1 [1] (โš“) anchor
-26A1 ; Emoji_Presentation # 4.0 [1] (โšก) high voltage
-26AA..26AB ; Emoji_Presentation # 4.1 [2] (โšช..โšซ) white circle..black circle
-26BD..26BE ; Emoji_Presentation # 5.2 [2] (โšฝ..โšพ) soccer ball..baseball
-26C4..26C5 ; Emoji_Presentation # 5.2 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
-26CE ; Emoji_Presentation # 6.0 [1] (โ›Ž) Ophiuchus
-26D4 ; Emoji_Presentation # 5.2 [1] (โ›”) no entry
-26EA ; Emoji_Presentation # 5.2 [1] (โ›ช) church
-26F2..26F3 ; Emoji_Presentation # 5.2 [2] (โ›ฒ..โ›ณ) fountain..flag in hole
-26F5 ; Emoji_Presentation # 5.2 [1] (โ›ต) sailboat
-26FA ; Emoji_Presentation # 5.2 [1] (โ›บ) tent
-26FD ; Emoji_Presentation # 5.2 [1] (โ›ฝ) fuel pump
-2705 ; Emoji_Presentation # 6.0 [1] (โœ…) check mark button
-270A..270B ; Emoji_Presentation # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
-2728 ; Emoji_Presentation # 6.0 [1] (โœจ) sparkles
-274C ; Emoji_Presentation # 6.0 [1] (โŒ) cross mark
-274E ; Emoji_Presentation # 6.0 [1] (โŽ) cross mark button
-2753..2755 ; Emoji_Presentation # 6.0 [3] (โ“..โ•) question mark..white exclamation mark
-2757 ; Emoji_Presentation # 5.2 [1] (โ—) exclamation mark
-2795..2797 ; Emoji_Presentation # 6.0 [3] (โž•..โž—) plus sign..division sign
-27B0 ; Emoji_Presentation # 6.0 [1] (โžฐ) curly loop
-27BF ; Emoji_Presentation # 6.0 [1] (โžฟ) double curly loop
-2B1B..2B1C ; Emoji_Presentation # 5.1 [2] (โฌ›..โฌœ) black large square..white large square
-2B50 ; Emoji_Presentation # 5.1 [1] (โญ) star
-2B55 ; Emoji_Presentation # 5.2 [1] (โญ•) hollow red circle
-1F004 ; Emoji_Presentation # 5.1 [1] (๐Ÿ€„) mahjong red dragon
-1F0CF ; Emoji_Presentation # 6.0 [1] (๐Ÿƒ) joker
-1F18E ; Emoji_Presentation # 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
-1F191..1F19A ; Emoji_Presentation # 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
-1F1E6..1F1FF ; Emoji_Presentation # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
-1F201 ; Emoji_Presentation # 6.0 [1] (๐Ÿˆ) Japanese โ€œhereโ€ button
-1F21A ; Emoji_Presentation # 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
-1F22F ; Emoji_Presentation # 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
-1F232..1F236 ; Emoji_Presentation # 6.0 [5] (๐Ÿˆฒ..๐Ÿˆถ) Japanese โ€œprohibitedโ€ button..Japanese โ€œnot free of chargeโ€ button
-1F238..1F23A ; Emoji_Presentation # 6.0 [3] (๐Ÿˆธ..๐Ÿˆบ) Japanese โ€œapplicationโ€ button..Japanese โ€œopen for businessโ€ button
-1F250..1F251 ; Emoji_Presentation # 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
-1F300..1F320 ; Emoji_Presentation # 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
-1F32D..1F32F ; Emoji_Presentation # 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
-1F330..1F335 ; Emoji_Presentation # 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
-1F337..1F37C ; Emoji_Presentation # 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
-1F37E..1F37F ; Emoji_Presentation # 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
-1F380..1F393 ; Emoji_Presentation # 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
-1F3A0..1F3C4 ; Emoji_Presentation # 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
-1F3C5 ; Emoji_Presentation # 7.0 [1] (๐Ÿ…) sports medal
-1F3C6..1F3CA ; Emoji_Presentation # 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
-1F3CF..1F3D3 ; Emoji_Presentation # 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
-1F3E0..1F3F0 ; Emoji_Presentation # 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
-1F3F4 ; Emoji_Presentation # 7.0 [1] (๐Ÿด) black flag
-1F3F8..1F3FF ; Emoji_Presentation # 8.0 [8] (๐Ÿธ..๐Ÿฟ) badminton..dark skin tone
-1F400..1F43E ; Emoji_Presentation # 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
-1F440 ; Emoji_Presentation # 6.0 [1] (๐Ÿ‘€) eyes
-1F442..1F4F7 ; Emoji_Presentation # 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
-1F4F8 ; Emoji_Presentation # 7.0 [1] (๐Ÿ“ธ) camera with flash
-1F4F9..1F4FC ; Emoji_Presentation # 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
-1F4FF ; Emoji_Presentation # 8.0 [1] (๐Ÿ“ฟ) prayer beads
-1F500..1F53D ; Emoji_Presentation # 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
-1F54B..1F54E ; Emoji_Presentation # 8.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
-1F550..1F567 ; Emoji_Presentation # 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
-1F57A ; Emoji_Presentation # 9.0 [1] (๐Ÿ•บ) man dancing
-1F595..1F596 ; Emoji_Presentation # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
-1F5A4 ; Emoji_Presentation # 9.0 [1] (๐Ÿ–ค) black heart
-1F5FB..1F5FF ; Emoji_Presentation # 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
-1F600 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜€) grinning face
-1F601..1F610 ; Emoji_Presentation # 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
-1F611 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜‘) expressionless face
-1F612..1F614 ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
-1F615 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜•) confused face
-1F616 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜–) confounded face
-1F617 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜—) kissing face
-1F618 ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
-1F619 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
-1F61A ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
-1F61B ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜›) face with tongue
-1F61C..1F61E ; Emoji_Presentation # 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
-1F61F ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜Ÿ) worried face
-1F620..1F625 ; Emoji_Presentation # 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
-1F626..1F627 ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
-1F628..1F62B ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
-1F62C ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ฌ) grimacing face
-1F62D ; Emoji_Presentation # 6.0 [1] (๐Ÿ˜ญ) loudly crying face
-1F62E..1F62F ; Emoji_Presentation # 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
-1F630..1F633 ; Emoji_Presentation # 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
-1F634 ; Emoji_Presentation # 6.1 [1] (๐Ÿ˜ด) sleeping face
-1F635..1F640 ; Emoji_Presentation # 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat
-1F641..1F642 ; Emoji_Presentation # 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
-1F643..1F644 ; Emoji_Presentation # 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
-1F645..1F64F ; Emoji_Presentation # 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
-1F680..1F6C5 ; Emoji_Presentation # 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
-1F6CC ; Emoji_Presentation # 7.0 [1] (๐Ÿ›Œ) person in bed
-1F6D0 ; Emoji_Presentation # 8.0 [1] (๐Ÿ›) place of worship
-1F6D1..1F6D2 ; Emoji_Presentation # 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
-1F6D5 ; Emoji_Presentation # 12.0 [1] (๐Ÿ›•) hindu temple
-1F6EB..1F6EC ; Emoji_Presentation # 7.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
-1F6F4..1F6F6 ; Emoji_Presentation # 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
-1F6F7..1F6F8 ; Emoji_Presentation # 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
-1F6F9 ; Emoji_Presentation # 11.0 [1] (๐Ÿ›น) skateboard
-1F6FA ; Emoji_Presentation # 12.0 [1] (๐Ÿ›บ) auto rickshaw
-1F7E0..1F7EB ; Emoji_Presentation # 12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
-1F90D..1F90F ; Emoji_Presentation # 12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
-1F910..1F918 ; Emoji_Presentation # 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
-1F919..1F91E ; Emoji_Presentation # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
-1F91F ; Emoji_Presentation # 10.0 [1] (๐ŸคŸ) love-you gesture
-1F920..1F927 ; Emoji_Presentation # 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
-1F928..1F92F ; Emoji_Presentation # 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
-1F930 ; Emoji_Presentation # 9.0 [1] (๐Ÿคฐ) pregnant woman
-1F931..1F932 ; Emoji_Presentation # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
-1F933..1F93A ; Emoji_Presentation # 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
-1F93C..1F93E ; Emoji_Presentation # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
-1F93F ; Emoji_Presentation # 12.0 [1] (๐Ÿคฟ) diving mask
-1F940..1F945 ; Emoji_Presentation # 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
-1F947..1F94B ; Emoji_Presentation # 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
-1F94C ; Emoji_Presentation # 10.0 [1] (๐ŸฅŒ) curling stone
-1F94D..1F94F ; Emoji_Presentation # 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
-1F950..1F95E ; Emoji_Presentation # 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
-1F95F..1F96B ; Emoji_Presentation # 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
-1F96C..1F970 ; Emoji_Presentation # 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
-1F971 ; Emoji_Presentation # 12.0 [1] (๐Ÿฅฑ) yawning face
-1F973..1F976 ; Emoji_Presentation # 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
-1F97A ; Emoji_Presentation # 11.0 [1] (๐Ÿฅบ) pleading face
-1F97B ; Emoji_Presentation # 12.0 [1] (๐Ÿฅป) sari
-1F97C..1F97F ; Emoji_Presentation # 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
-1F980..1F984 ; Emoji_Presentation # 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
-1F985..1F991 ; Emoji_Presentation # 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
-1F992..1F997 ; Emoji_Presentation # 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
-1F998..1F9A2 ; Emoji_Presentation # 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
-1F9A5..1F9AA ; Emoji_Presentation # 12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
-1F9AE..1F9AF ; Emoji_Presentation # 12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..probing cane
-1F9B0..1F9B9 ; Emoji_Presentation # 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
-1F9BA..1F9BF ; Emoji_Presentation # 12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
-1F9C0 ; Emoji_Presentation # 8.0 [1] (๐Ÿง€) cheese wedge
-1F9C1..1F9C2 ; Emoji_Presentation # 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
-1F9C3..1F9CA ; Emoji_Presentation # 12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice cube
-1F9CD..1F9CF ; Emoji_Presentation # 12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
-1F9D0..1F9E6 ; Emoji_Presentation # 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
-1F9E7..1F9FF ; Emoji_Presentation # 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
-1FA70..1FA73 ; Emoji_Presentation # 12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
-1FA78..1FA7A ; Emoji_Presentation # 12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
-1FA80..1FA82 ; Emoji_Presentation # 12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
-1FA90..1FA95 ; Emoji_Presentation # 12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
+231A..231B ; Emoji_Presentation # E0.6 [2] (โŒš..โŒ›) watch..hourglass done
+23E9..23EC ; Emoji_Presentation # E0.6 [4] (โฉ..โฌ) fast-forward button..fast down button
+23F0 ; Emoji_Presentation # E0.6 [1] (โฐ) alarm clock
+23F3 ; Emoji_Presentation # E0.6 [1] (โณ) hourglass not done
+25FD..25FE ; Emoji_Presentation # E0.6 [2] (โ—ฝ..โ—พ) white medium-small square..black medium-small square
+2614..2615 ; Emoji_Presentation # E0.6 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2648..2653 ; Emoji_Presentation # E0.6 [12] (โ™ˆ..โ™“) Aries..Pisces
+267F ; Emoji_Presentation # E0.6 [1] (โ™ฟ) wheelchair symbol
+2693 ; Emoji_Presentation # E0.6 [1] (โš“) anchor
+26A1 ; Emoji_Presentation # E0.6 [1] (โšก) high voltage
+26AA..26AB ; Emoji_Presentation # E0.6 [2] (โšช..โšซ) white circle..black circle
+26BD..26BE ; Emoji_Presentation # E0.6 [2] (โšฝ..โšพ) soccer ball..baseball
+26C4..26C5 ; Emoji_Presentation # E0.6 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
+26CE ; Emoji_Presentation # E0.6 [1] (โ›Ž) Ophiuchus
+26D4 ; Emoji_Presentation # E0.6 [1] (โ›”) no entry
+26EA ; Emoji_Presentation # E0.6 [1] (โ›ช) church
+26F2..26F3 ; Emoji_Presentation # E0.6 [2] (โ›ฒ..โ›ณ) fountain..flag in hole
+26F5 ; Emoji_Presentation # E0.6 [1] (โ›ต) sailboat
+26FA ; Emoji_Presentation # E0.6 [1] (โ›บ) tent
+26FD ; Emoji_Presentation # E0.6 [1] (โ›ฝ) fuel pump
+2705 ; Emoji_Presentation # E0.6 [1] (โœ…) check mark button
+270A..270B ; Emoji_Presentation # E0.6 [2] (โœŠ..โœ‹) raised fist..raised hand
+2728 ; Emoji_Presentation # E0.6 [1] (โœจ) sparkles
+274C ; Emoji_Presentation # E0.6 [1] (โŒ) cross mark
+274E ; Emoji_Presentation # E0.6 [1] (โŽ) cross mark button
+2753..2755 ; Emoji_Presentation # E0.6 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Emoji_Presentation # E0.6 [1] (โ—) exclamation mark
+2795..2797 ; Emoji_Presentation # E0.6 [3] (โž•..โž—) plus..divide
+27B0 ; Emoji_Presentation # E0.6 [1] (โžฐ) curly loop
+27BF ; Emoji_Presentation # E1.0 [1] (โžฟ) double curly loop
+2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Emoji_Presentation # E0.6 [1] (โญ) star
+2B55 ; Emoji_Presentation # E0.6 [1] (โญ•) hollow red circle
+1F004 ; Emoji_Presentation # E0.6 [1] (๐Ÿ€„) mahjong red dragon
+1F0CF ; Emoji_Presentation # E0.6 [1] (๐Ÿƒ) joker
+1F18E ; Emoji_Presentation # E0.6 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Emoji_Presentation # E0.6 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F201 ; Emoji_Presentation # E0.6 [1] (๐Ÿˆ) Japanese โ€œhereโ€ button
+1F21A ; Emoji_Presentation # E0.6 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Emoji_Presentation # E0.6 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F236 ; Emoji_Presentation # E0.6 [5] (๐Ÿˆฒ..๐Ÿˆถ) Japanese โ€œprohibitedโ€ button..Japanese โ€œnot free of chargeโ€ button
+1F238..1F23A ; Emoji_Presentation # E0.6 [3] (๐Ÿˆธ..๐Ÿˆบ) Japanese โ€œapplicationโ€ button..Japanese โ€œopen for businessโ€ button
+1F250..1F251 ; Emoji_Presentation # E0.6 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F300..1F30C ; Emoji_Presentation # E0.6 [13] (๐ŸŒ€..๐ŸŒŒ) cyclone..milky way
+1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (๐ŸŒ..๐ŸŒŽ) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji_Presentation # E0.6 [1] (๐ŸŒ) globe showing Asia-Australia
+1F310 ; Emoji_Presentation # E1.0 [1] (๐ŸŒ) globe with meridians
+1F311 ; Emoji_Presentation # E0.6 [1] (๐ŸŒ‘) new moon
+1F312 ; Emoji_Presentation # E1.0 [1] (๐ŸŒ’) waxing crescent moon
+1F313..1F315 ; Emoji_Presentation # E0.6 [3] (๐ŸŒ“..๐ŸŒ•) first quarter moon..full moon
+1F316..1F318 ; Emoji_Presentation # E1.0 [3] (๐ŸŒ–..๐ŸŒ˜) waning gibbous moon..waning crescent moon
+1F319 ; Emoji_Presentation # E0.6 [1] (๐ŸŒ™) crescent moon
+1F31A ; Emoji_Presentation # E1.0 [1] (๐ŸŒš) new moon face
+1F31B ; Emoji_Presentation # E0.6 [1] (๐ŸŒ›) first quarter moon face
+1F31C ; Emoji_Presentation # E0.7 [1] (๐ŸŒœ) last quarter moon face
+1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (๐ŸŒ..๐ŸŒž) full moon face..sun with face
+1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (๐ŸŒŸ..๐ŸŒ ) glowing star..shooting star
+1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F331 ; Emoji_Presentation # E0.6 [2] (๐ŸŒฐ..๐ŸŒฑ) chestnut..seedling
+1F332..1F333 ; Emoji_Presentation # E1.0 [2] (๐ŸŒฒ..๐ŸŒณ) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji_Presentation # E0.6 [2] (๐ŸŒด..๐ŸŒต) palm tree..cactus
+1F337..1F34A ; Emoji_Presentation # E0.6 [20] (๐ŸŒท..๐ŸŠ) tulip..tangerine
+1F34B ; Emoji_Presentation # E1.0 [1] (๐Ÿ‹) lemon
+1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (๐ŸŒ..๐Ÿ) banana..green apple
+1F350 ; Emoji_Presentation # E1.0 [1] (๐Ÿ) pear
+1F351..1F37B ; Emoji_Presentation # E0.6 [43] (๐Ÿ‘..๐Ÿป) peach..clinking beer mugs
+1F37C ; Emoji_Presentation # E1.0 [1] (๐Ÿผ) baby bottle
+1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji_Presentation # E0.6 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Emoji_Presentation # E1.0 [1] (๐Ÿ…) sports medal
+1F3C6 ; Emoji_Presentation # E0.6 [1] (๐Ÿ†) trophy
+1F3C7 ; Emoji_Presentation # E1.0 [1] (๐Ÿ‡) horse racing
+1F3C8 ; Emoji_Presentation # E0.6 [1] (๐Ÿˆ) american football
+1F3C9 ; Emoji_Presentation # E1.0 [1] (๐Ÿ‰) rugby football
+1F3CA ; Emoji_Presentation # E0.6 [1] (๐ŸŠ) person swimming
+1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (๐Ÿ ..๐Ÿฃ) house..Japanese post office
+1F3E4 ; Emoji_Presentation # E1.0 [1] (๐Ÿค) post office
+1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (๐Ÿฅ..๐Ÿฐ) hospital..castle
+1F3F4 ; Emoji_Presentation # E1.0 [1] (๐Ÿด) black flag
+1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (๐Ÿธ..๐Ÿ‡) badminton..rabbit
+1F408 ; Emoji_Presentation # E0.7 [1] (๐Ÿˆ) cat
+1F409..1F40B ; Emoji_Presentation # E1.0 [3] (๐Ÿ‰..๐Ÿ‹) dragon..whale
+1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (๐ŸŒ..๐ŸŽ) snail..horse
+1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (๐Ÿ..๐Ÿ) ram..goat
+1F411..1F412 ; Emoji_Presentation # E0.6 [2] (๐Ÿ‘..๐Ÿ’) ewe..monkey
+1F413 ; Emoji_Presentation # E1.0 [1] (๐Ÿ“) rooster
+1F414 ; Emoji_Presentation # E0.6 [1] (๐Ÿ”) chicken
+1F415 ; Emoji_Presentation # E0.7 [1] (๐Ÿ•) dog
+1F416 ; Emoji_Presentation # E1.0 [1] (๐Ÿ–) pig
+1F417..1F429 ; Emoji_Presentation # E0.6 [19] (๐Ÿ—..๐Ÿฉ) boar..poodle
+1F42A ; Emoji_Presentation # E1.0 [1] (๐Ÿช) camel
+1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (๐Ÿซ..๐Ÿพ) two-hump camel..paw prints
+1F440 ; Emoji_Presentation # E0.6 [1] (๐Ÿ‘€) eyes
+1F442..1F464 ; Emoji_Presentation # E0.6 [35] (๐Ÿ‘‚..๐Ÿ‘ค) ear..bust in silhouette
+1F465 ; Emoji_Presentation # E1.0 [1] (๐Ÿ‘ฅ) busts in silhouette
+1F466..1F46B ; Emoji_Presentation # E0.6 [6] (๐Ÿ‘ฆ..๐Ÿ‘ซ) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (๐Ÿ‘ฌ..๐Ÿ‘ญ) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (๐Ÿ‘ฎ..๐Ÿ’ฌ) police officer..speech balloon
+1F4AD ; Emoji_Presentation # E1.0 [1] (๐Ÿ’ญ) thought balloon
+1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (๐Ÿ’ฎ..๐Ÿ’ต) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (๐Ÿ’ถ..๐Ÿ’ท) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (๐Ÿ’ธ..๐Ÿ“ซ) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (๐Ÿ“ฌ..๐Ÿ“ญ) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji_Presentation # E0.6 [1] (๐Ÿ“ฎ) postbox
+1F4EF ; Emoji_Presentation # E1.0 [1] (๐Ÿ“ฏ) postal horn
+1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (๐Ÿ“ฐ..๐Ÿ“ด) newspaper..mobile phone off
+1F4F5 ; Emoji_Presentation # E1.0 [1] (๐Ÿ“ต) no mobile phones
+1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (๐Ÿ“ถ..๐Ÿ“ท) antenna bars..camera
+1F4F8 ; Emoji_Presentation # E1.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (๐Ÿ“ฟ..๐Ÿ”‚) prayer beads..repeat single button
+1F503 ; Emoji_Presentation # E0.6 [1] (๐Ÿ”ƒ) clockwise vertical arrows
+1F504..1F507 ; Emoji_Presentation # E1.0 [4] (๐Ÿ”„..๐Ÿ”‡) counterclockwise arrows button..muted speaker
+1F508 ; Emoji_Presentation # E0.7 [1] (๐Ÿ”ˆ) speaker low volume
+1F509 ; Emoji_Presentation # E1.0 [1] (๐Ÿ”‰) speaker medium volume
+1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (๐Ÿ”Š..๐Ÿ””) speaker high volume..bell
+1F515 ; Emoji_Presentation # E1.0 [1] (๐Ÿ”•) bell with slash
+1F516..1F52B ; Emoji_Presentation # E0.6 [22] (๐Ÿ”–..๐Ÿ”ซ) bookmark..pistol
+1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (๐Ÿ”ฌ..๐Ÿ”ญ) microscope..telescope
+1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (๐Ÿ”ฎ..๐Ÿ”ฝ) crystal ball..downwards button
+1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
+1F550..1F55B ; Emoji_Presentation # E0.6 [12] (๐Ÿ•..๐Ÿ•›) one oโ€™clock..twelve oโ€™clock
+1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (๐Ÿ•œ..๐Ÿ•ง) one-thirty..twelve-thirty
+1F57A ; Emoji_Presentation # E3.0 [1] (๐Ÿ•บ) man dancing
+1F595..1F596 ; Emoji_Presentation # E1.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F5A4 ; Emoji_Presentation # E3.0 [1] (๐Ÿ–ค) black heart
+1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜€) grinning face
+1F601..1F606 ; Emoji_Presentation # E0.6 [6] (๐Ÿ˜..๐Ÿ˜†) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji_Presentation # E1.0 [2] (๐Ÿ˜‡..๐Ÿ˜ˆ) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji_Presentation # E0.6 [5] (๐Ÿ˜‰..๐Ÿ˜) winking face..smiling face with heart-eyes
+1F60E ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜Ž) smiling face with sunglasses
+1F60F ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜) smirking face
+1F610 ; Emoji_Presentation # E0.7 [1] (๐Ÿ˜) neutral face
+1F611 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Emoji_Presentation # E0.6 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜•) confused face
+1F616 ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜–) confounded face
+1F617 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜—) kissing face
+1F618 ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Emoji_Presentation # E0.6 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Emoji_Presentation # E1.0 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji_Presentation # E0.6 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Emoji_Presentation # E0.6 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜ด) sleeping face
+1F635 ; Emoji_Presentation # E0.6 [1] (๐Ÿ˜ต) dizzy face
+1F636 ; Emoji_Presentation # E1.0 [1] (๐Ÿ˜ถ) face without mouth
+1F637..1F640 ; Emoji_Presentation # E0.6 [10] (๐Ÿ˜ท..๐Ÿ™€) face with medical mask..weary cat
+1F641..1F644 ; Emoji_Presentation # E1.0 [4] (๐Ÿ™..๐Ÿ™„) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji_Presentation # E0.6 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680 ; Emoji_Presentation # E0.6 [1] (๐Ÿš€) rocket
+1F681..1F682 ; Emoji_Presentation # E1.0 [2] (๐Ÿš..๐Ÿš‚) helicopter..locomotive
+1F683..1F685 ; Emoji_Presentation # E0.6 [3] (๐Ÿšƒ..๐Ÿš…) railway car..bullet train
+1F686 ; Emoji_Presentation # E1.0 [1] (๐Ÿš†) train
+1F687 ; Emoji_Presentation # E0.6 [1] (๐Ÿš‡) metro
+1F688 ; Emoji_Presentation # E1.0 [1] (๐Ÿšˆ) light rail
+1F689 ; Emoji_Presentation # E0.6 [1] (๐Ÿš‰) station
+1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (๐ŸšŠ..๐Ÿš‹) tram..tram car
+1F68C ; Emoji_Presentation # E0.6 [1] (๐ŸšŒ) bus
+1F68D ; Emoji_Presentation # E0.7 [1] (๐Ÿš) oncoming bus
+1F68E ; Emoji_Presentation # E1.0 [1] (๐ŸšŽ) trolleybus
+1F68F ; Emoji_Presentation # E0.6 [1] (๐Ÿš) bus stop
+1F690 ; Emoji_Presentation # E1.0 [1] (๐Ÿš) minibus
+1F691..1F693 ; Emoji_Presentation # E0.6 [3] (๐Ÿš‘..๐Ÿš“) ambulance..police car
+1F694 ; Emoji_Presentation # E0.7 [1] (๐Ÿš”) oncoming police car
+1F695 ; Emoji_Presentation # E0.6 [1] (๐Ÿš•) taxi
+1F696 ; Emoji_Presentation # E1.0 [1] (๐Ÿš–) oncoming taxi
+1F697 ; Emoji_Presentation # E0.6 [1] (๐Ÿš—) automobile
+1F698 ; Emoji_Presentation # E0.7 [1] (๐Ÿš˜) oncoming automobile
+1F699..1F69A ; Emoji_Presentation # E0.6 [2] (๐Ÿš™..๐Ÿšš) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (๐Ÿš›..๐Ÿšก) articulated lorry..aerial tramway
+1F6A2 ; Emoji_Presentation # E0.6 [1] (๐Ÿšข) ship
+1F6A3 ; Emoji_Presentation # E1.0 [1] (๐Ÿšฃ) person rowing boat
+1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (๐Ÿšค..๐Ÿšฅ) speedboat..horizontal traffic light
+1F6A6 ; Emoji_Presentation # E1.0 [1] (๐Ÿšฆ) vertical traffic light
+1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (๐Ÿšง..๐Ÿšญ) construction..no smoking
+1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (๐Ÿšฎ..๐Ÿšฑ) litter in bin sign..non-potable water
+1F6B2 ; Emoji_Presentation # E0.6 [1] (๐Ÿšฒ) bicycle
+1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (๐Ÿšณ..๐Ÿšต) no bicycles..person mountain biking
+1F6B6 ; Emoji_Presentation # E0.6 [1] (๐Ÿšถ) person walking
+1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (๐Ÿšท..๐Ÿšธ) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (๐Ÿšน..๐Ÿšพ) menโ€™s room..water closet
+1F6BF ; Emoji_Presentation # E1.0 [1] (๐Ÿšฟ) shower
+1F6C0 ; Emoji_Presentation # E0.6 [1] (๐Ÿ›€) person taking bath
+1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (๐Ÿ›..๐Ÿ›…) bathtub..left luggage
+1F6CC ; Emoji_Presentation # E1.0 [1] (๐Ÿ›Œ) person in bed
+1F6D0 ; Emoji_Presentation # E1.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6D5 ; Emoji_Presentation # E12.0 [1] (๐Ÿ›•) hindu temple
+1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (๐Ÿ›–..๐Ÿ›—) hut..elevator
+1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
+1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Emoji_Presentation # E11.0 [1] (๐Ÿ›น) skateboard
+1F6FA ; Emoji_Presentation # E12.0 [1] (๐Ÿ›บ) auto rickshaw
+1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (๐Ÿ›ป..๐Ÿ›ผ) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
+1F90C ; Emoji_Presentation # E13.0 [1] (๐ŸคŒ) pinched fingers
+1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
+1F910..1F918 ; Emoji_Presentation # E1.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji_Presentation # E3.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Emoji_Presentation # E5.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Emoji_Presentation # E3.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji_Presentation # E5.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Emoji_Presentation # E3.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji_Presentation # E5.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Emoji_Presentation # E3.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F93F ; Emoji_Presentation # E12.0 [1] (๐Ÿคฟ) diving mask
+1F940..1F945 ; Emoji_Presentation # E3.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Emoji_Presentation # E3.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Emoji_Presentation # E5.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Emoji_Presentation # E3.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
+1F971 ; Emoji_Presentation # E12.0 [1] (๐Ÿฅฑ) yawning face
+1F972 ; Emoji_Presentation # E13.0 [1] (๐Ÿฅฒ) smiling face with tear
+1F973..1F976 ; Emoji_Presentation # E11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F977..1F978 ; Emoji_Presentation # E13.0 [2] (๐Ÿฅท..๐Ÿฅธ) ninja..disguised face
+1F97A ; Emoji_Presentation # E11.0 [1] (๐Ÿฅบ) pleading face
+1F97B ; Emoji_Presentation # E12.0 [1] (๐Ÿฅป) sari
+1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
+1F980..1F984 ; Emoji_Presentation # E1.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
+1F985..1F991 ; Emoji_Presentation # E3.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Emoji_Presentation # E5.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (๐Ÿฆฃ..๐Ÿฆค) mammoth..dodo
+1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
+1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (๐Ÿฆซ..๐Ÿฆญ) beaver..seal
+1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..white cane
+1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
+1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
+1F9C0 ; Emoji_Presentation # E1.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice
+1F9CB ; Emoji_Presentation # E13.0 [1] (๐Ÿง‹) bubble tea
+1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
+1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
+1FA74 ; Emoji_Presentation # E13.0 [1] (๐Ÿฉด) thong sandal
+1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
+1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
+1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (๐Ÿชƒ..๐Ÿช†) boomerang..nesting dolls
+1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
+1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (๐Ÿช–..๐Ÿชจ) military helmet..rock
+1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (๐Ÿชฐ..๐Ÿชถ) fly..feather
+1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (๐Ÿซ€..๐Ÿซ‚) anatomical heart..people hugging
+1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (๐Ÿซ..๐Ÿซ–) blueberries..teapot
-# Total elements: 1093
+# Total elements: 1148
# ================================================
# All omitted code points have Emoji_Modifier=No
# @missing: 0000..10FFFF ; Emoji_Modifier ; No
-1F3FB..1F3FF ; Emoji_Modifier # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
+1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
# Total elements: 5
@@ -438,66 +691,71 @@
# All omitted code points have Emoji_Modifier_Base=No
# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No
-261D ; Emoji_Modifier_Base # 1.1 [1] (โ˜๏ธ) index pointing up
-26F9 ; Emoji_Modifier_Base # 5.2 [1] (โ›น๏ธ) person bouncing ball
-270A..270B ; Emoji_Modifier_Base # 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
-270C..270D ; Emoji_Modifier_Base # 1.1 [2] (โœŒ๏ธ..โœ๏ธ) victory hand..writing hand
-1F385 ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŽ…) Santa Claus
-1F3C2..1F3C4 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ‚..๐Ÿ„) snowboarder..person surfing
-1F3C7 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‡) horse racing
-1F3CA ; Emoji_Modifier_Base # 6.0 [1] (๐ŸŠ) person swimming
-1F3CB..1F3CC ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ‹๏ธ..๐ŸŒ๏ธ) person lifting weights..person golfing
-1F442..1F443 ; Emoji_Modifier_Base # 6.0 [2] (๐Ÿ‘‚..๐Ÿ‘ƒ) ear..nose
-1F446..1F450 ; Emoji_Modifier_Base # 6.0 [11] (๐Ÿ‘†..๐Ÿ‘) backhand index pointing up..open hands
-1F466..1F478 ; Emoji_Modifier_Base # 6.0 [19] (๐Ÿ‘ฆ..๐Ÿ‘ธ) boy..princess
-1F47C ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ‘ผ) baby angel
-1F481..1F483 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’..๐Ÿ’ƒ) person tipping hand..woman dancing
-1F485..1F487 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ’…..๐Ÿ’‡) nail polish..person getting haircut
-1F48F ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ’) kiss
-1F491 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ’‘) couple with heart
-1F4AA ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ’ช) flexed biceps
-1F574..1F575 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ•ด๏ธ..๐Ÿ•ต๏ธ) man in suit levitating..detective
-1F57A ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿ•บ) man dancing
-1F590 ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ–๏ธ) hand with fingers splayed
-1F595..1F596 ; Emoji_Modifier_Base # 7.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
-1F645..1F647 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿ™…..๐Ÿ™‡) person gesturing NO..person bowing
-1F64B..1F64F ; Emoji_Modifier_Base # 6.0 [5] (๐Ÿ™‹..๐Ÿ™) person raising hand..folded hands
-1F6A3 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿšฃ) person rowing boat
-1F6B4..1F6B6 ; Emoji_Modifier_Base # 6.0 [3] (๐Ÿšด..๐Ÿšถ) person biking..person walking
-1F6C0 ; Emoji_Modifier_Base # 6.0 [1] (๐Ÿ›€) person taking bath
-1F6CC ; Emoji_Modifier_Base # 7.0 [1] (๐Ÿ›Œ) person in bed
-1F90F ; Emoji_Modifier_Base # 12.0 [1] (๐Ÿค) pinching hand
-1F918 ; Emoji_Modifier_Base # 8.0 [1] (๐Ÿค˜) sign of the horns
-1F919..1F91E ; Emoji_Modifier_Base # 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
-1F91F ; Emoji_Modifier_Base # 10.0 [1] (๐ŸคŸ) love-you gesture
-1F926 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฆ) person facepalming
-1F930 ; Emoji_Modifier_Base # 9.0 [1] (๐Ÿคฐ) pregnant woman
-1F931..1F932 ; Emoji_Modifier_Base # 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
-1F933..1F939 ; Emoji_Modifier_Base # 9.0 [7] (๐Ÿคณ..๐Ÿคน) selfie..person juggling
-1F93C..1F93E ; Emoji_Modifier_Base # 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
-1F9B5..1F9B6 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆต..๐Ÿฆถ) leg..foot
-1F9B8..1F9B9 ; Emoji_Modifier_Base # 11.0 [2] (๐Ÿฆธ..๐Ÿฆน) superhero..supervillain
-1F9BB ; Emoji_Modifier_Base # 12.0 [1] (๐Ÿฆป) ear with hearing aid
-1F9CD..1F9CF ; Emoji_Modifier_Base # 12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
-1F9D1..1F9DD ; Emoji_Modifier_Base # 10.0 [13] (๐Ÿง‘..๐Ÿง) person..elf
+261D ; Emoji_Modifier_Base # E0.6 [1] (โ˜๏ธ) index pointing up
+26F9 ; Emoji_Modifier_Base # E0.7 [1] (โ›น๏ธ) person bouncing ball
+270A..270C ; Emoji_Modifier_Base # E0.6 [3] (โœŠ..โœŒ๏ธ) raised fist..victory hand
+270D ; Emoji_Modifier_Base # E0.7 [1] (โœ๏ธ) writing hand
+1F385 ; Emoji_Modifier_Base # E0.6 [1] (๐ŸŽ…) Santa Claus
+1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (๐Ÿ‚..๐Ÿ„) snowboarder..person surfing
+1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (๐Ÿ‡) horse racing
+1F3CA ; Emoji_Modifier_Base # E0.6 [1] (๐ŸŠ) person swimming
+1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (๐Ÿ‹๏ธ..๐ŸŒ๏ธ) person lifting weights..person golfing
+1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (๐Ÿ‘‚..๐Ÿ‘ƒ) ear..nose
+1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (๐Ÿ‘†..๐Ÿ‘) backhand index pointing up..open hands
+1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (๐Ÿ‘ฆ..๐Ÿ‘ซ) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (๐Ÿ‘ฌ..๐Ÿ‘ญ) men holding hands..women holding hands
+1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (๐Ÿ‘ฎ..๐Ÿ‘ธ) police officer..princess
+1F47C ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿ‘ผ) baby angel
+1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (๐Ÿ’..๐Ÿ’ƒ) person tipping hand..woman dancing
+1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (๐Ÿ’…..๐Ÿ’‡) nail polish..person getting haircut
+1F48F ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿ’) kiss
+1F491 ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿ’‘) couple with heart
+1F4AA ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿ’ช) flexed biceps
+1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (๐Ÿ•ด๏ธ..๐Ÿ•ต๏ธ) person in suit levitating..detective
+1F57A ; Emoji_Modifier_Base # E3.0 [1] (๐Ÿ•บ) man dancing
+1F590 ; Emoji_Modifier_Base # E0.7 [1] (๐Ÿ–๏ธ) hand with fingers splayed
+1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (๐Ÿ™…..๐Ÿ™‡) person gesturing NO..person bowing
+1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (๐Ÿ™‹..๐Ÿ™) person raising hand..folded hands
+1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (๐Ÿšฃ) person rowing boat
+1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (๐Ÿšด..๐Ÿšต) person biking..person mountain biking
+1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿšถ) person walking
+1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (๐Ÿ›€) person taking bath
+1F6CC ; Emoji_Modifier_Base # E1.0 [1] (๐Ÿ›Œ) person in bed
+1F90C ; Emoji_Modifier_Base # E13.0 [1] (๐ŸคŒ) pinched fingers
+1F90F ; Emoji_Modifier_Base # E12.0 [1] (๐Ÿค) pinching hand
+1F918 ; Emoji_Modifier_Base # E1.0 [1] (๐Ÿค˜) sign of the horns
+1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Emoji_Modifier_Base # E5.0 [1] (๐ŸคŸ) love-you gesture
+1F926 ; Emoji_Modifier_Base # E3.0 [1] (๐Ÿคฆ) person facepalming
+1F930 ; Emoji_Modifier_Base # E3.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (๐Ÿคณ..๐Ÿคน) selfie..person juggling
+1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F977 ; Emoji_Modifier_Base # E13.0 [1] (๐Ÿฅท) ninja
+1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (๐Ÿฆต..๐Ÿฆถ) leg..foot
+1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (๐Ÿฆธ..๐Ÿฆน) superhero..supervillain
+1F9BB ; Emoji_Modifier_Base # E12.0 [1] (๐Ÿฆป) ear with hearing aid
+1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
+1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (๐Ÿง‘..๐Ÿง) person..elf
-# Total elements: 120
+# Total elements: 122
# ================================================
# All omitted code points have Emoji_Component=No
# @missing: 0000..10FFFF ; Emoji_Component ; No
-0023 ; Emoji_Component # 1.1 [1] (#๏ธ) number sign
-002A ; Emoji_Component # 1.1 [1] (*๏ธ) asterisk
-0030..0039 ; Emoji_Component # 1.1 [10] (0๏ธ..9๏ธ) digit zero..digit nine
-200D ; Emoji_Component # 1.1 [1] (โ€) zero width joiner
-20E3 ; Emoji_Component # 3.0 [1] (โƒฃ) combining enclosing keycap
-FE0F ; Emoji_Component # 3.2 [1] () VARIATION SELECTOR-16
-1F1E6..1F1FF ; Emoji_Component # 6.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
-1F3FB..1F3FF ; Emoji_Component # 8.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
-1F9B0..1F9B3 ; Emoji_Component # 11.0 [4] (๐Ÿฆฐ..๐Ÿฆณ) red hair..white hair
-E0020..E007F ; Emoji_Component # 3.1 [96] (๓ € ..๓ ฟ) tag space..cancel tag
+0023 ; Emoji_Component # E0.0 [1] (#๏ธ) number sign
+002A ; Emoji_Component # E0.0 [1] (*๏ธ) asterisk
+0030..0039 ; Emoji_Component # E0.0 [10] (0๏ธ..9๏ธ) digit zero..digit nine
+200D ; Emoji_Component # E0.0 [1] (โ€) zero width joiner
+20E3 ; Emoji_Component # E0.0 [1] (โƒฃ) combining enclosing keycap
+FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16
+1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (๐Ÿ‡ฆ..๐Ÿ‡ฟ) regional indicator symbol letter a..regional indicator symbol letter z
+1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (๐Ÿป..๐Ÿฟ) light skin tone..dark skin tone
+1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (๐Ÿฆฐ..๐Ÿฆณ) red hair..white hair
+E0020..E007F ; Emoji_Component # E0.0 [96] (๓ € ..๓ ฟ) tag space..cancel tag
# Total elements: 146
@@ -506,264 +764,498 @@ E0020..E007F ; Emoji_Component # 3.1 [96] (๓ € ..๓ ฟ) tag space..ca
# All omitted code points have Extended_Pictographic=No
# @missing: 0000..10FFFF ; Extended_Pictographic ; No
-00A9 ; Extended_Pictographic# 1.1 [1] (ยฉ๏ธ) copyright
-00AE ; Extended_Pictographic# 1.1 [1] (ยฎ๏ธ) registered
-203C ; Extended_Pictographic# 1.1 [1] (โ€ผ๏ธ) double exclamation mark
-2049 ; Extended_Pictographic# 3.0 [1] (โ‰๏ธ) exclamation question mark
-2122 ; Extended_Pictographic# 1.1 [1] (โ„ข๏ธ) trade mark
-2139 ; Extended_Pictographic# 3.0 [1] (โ„น๏ธ) information
-2194..2199 ; Extended_Pictographic# 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
-21A9..21AA ; Extended_Pictographic# 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
-231A..231B ; Extended_Pictographic# 1.1 [2] (โŒš..โŒ›) watch..hourglass done
-2328 ; Extended_Pictographic# 1.1 [1] (โŒจ๏ธ) keyboard
-2388 ; Extended_Pictographic# 3.0 [1] (โŽˆ) HELM SYMBOL
-23CF ; Extended_Pictographic# 4.0 [1] (โ๏ธ) eject button
-23E9..23F3 ; Extended_Pictographic# 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done
-23F8..23FA ; Extended_Pictographic# 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
-24C2 ; Extended_Pictographic# 1.1 [1] (โ“‚๏ธ) circled M
-25AA..25AB ; Extended_Pictographic# 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
-25B6 ; Extended_Pictographic# 1.1 [1] (โ–ถ๏ธ) play button
-25C0 ; Extended_Pictographic# 1.1 [1] (โ—€๏ธ) reverse button
-25FB..25FE ; Extended_Pictographic# 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
-2600..2605 ; Extended_Pictographic# 1.1 [6] (โ˜€๏ธ..โ˜…) sun..BLACK STAR
-2607..2612 ; Extended_Pictographic# 1.1 [12] (โ˜‡..โ˜’) LIGHTNING..BALLOT BOX WITH X
-2614..2615 ; Extended_Pictographic# 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
-2616..2617 ; Extended_Pictographic# 3.2 [2] (โ˜–..โ˜—) WHITE SHOGI PIECE..BLACK SHOGI PIECE
-2618 ; Extended_Pictographic# 4.1 [1] (โ˜˜๏ธ) shamrock
-2619 ; Extended_Pictographic# 3.0 [1] (โ˜™) REVERSED ROTATED FLORAL HEART BULLET
-261A..266F ; Extended_Pictographic# 1.1 [86] (โ˜š..โ™ฏ) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN
-2670..2671 ; Extended_Pictographic# 3.0 [2] (โ™ฐ..โ™ฑ) WEST SYRIAC CROSS..EAST SYRIAC CROSS
-2672..267D ; Extended_Pictographic# 3.2 [12] (โ™ฒ..โ™ฝ) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
-267E..267F ; Extended_Pictographic# 4.1 [2] (โ™พ๏ธ..โ™ฟ) infinity..wheelchair symbol
-2680..2685 ; Extended_Pictographic# 3.2 [6] (โš€..โš…) DIE FACE-1..DIE FACE-6
-2690..2691 ; Extended_Pictographic# 4.0 [2] (โš..โš‘) WHITE FLAG..BLACK FLAG
-2692..269C ; Extended_Pictographic# 4.1 [11] (โš’๏ธ..โšœ๏ธ) hammer and pick..fleur-de-lis
-269D ; Extended_Pictographic# 5.1 [1] (โš) OUTLINED WHITE STAR
-269E..269F ; Extended_Pictographic# 5.2 [2] (โšž..โšŸ) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT
-26A0..26A1 ; Extended_Pictographic# 4.0 [2] (โš ๏ธ..โšก) warning..high voltage
-26A2..26B1 ; Extended_Pictographic# 4.1 [16] (โšข..โšฑ๏ธ) DOUBLED FEMALE SIGN..funeral urn
-26B2 ; Extended_Pictographic# 5.0 [1] (โšฒ) NEUTER
-26B3..26BC ; Extended_Pictographic# 5.1 [10] (โšณ..โšผ) CERES..SESQUIQUADRATE
-26BD..26BF ; Extended_Pictographic# 5.2 [3] (โšฝ..โšฟ) soccer ball..SQUARED KEY
-26C0..26C3 ; Extended_Pictographic# 5.1 [4] (โ›€..โ›ƒ) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
-26C4..26CD ; Extended_Pictographic# 5.2 [10] (โ›„..โ›) snowman without snow..DISABLED CAR
-26CE ; Extended_Pictographic# 6.0 [1] (โ›Ž) Ophiuchus
-26CF..26E1 ; Extended_Pictographic# 5.2 [19] (โ›๏ธ..โ›ก) pick..RESTRICTED LEFT ENTRY-2
-26E2 ; Extended_Pictographic# 6.0 [1] (โ›ข) ASTRONOMICAL SYMBOL FOR URANUS
-26E3 ; Extended_Pictographic# 5.2 [1] (โ›ฃ) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
-26E4..26E7 ; Extended_Pictographic# 6.0 [4] (โ›ค..โ›ง) PENTAGRAM..INVERTED PENTAGRAM
-26E8..26FF ; Extended_Pictographic# 5.2 [24] (โ›จ..โ›ฟ) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
-2700 ; Extended_Pictographic# 7.0 [1] (โœ€) BLACK SAFETY SCISSORS
-2701..2704 ; Extended_Pictographic# 1.1 [4] (โœ..โœ„) UPPER BLADE SCISSORS..WHITE SCISSORS
-2705 ; Extended_Pictographic# 6.0 [1] (โœ…) check mark button
-2708..2709 ; Extended_Pictographic# 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope
-270A..270B ; Extended_Pictographic# 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand
-270C..2712 ; Extended_Pictographic# 1.1 [7] (โœŒ๏ธ..โœ’๏ธ) victory hand..black nib
-2714 ; Extended_Pictographic# 1.1 [1] (โœ”๏ธ) check mark
-2716 ; Extended_Pictographic# 1.1 [1] (โœ–๏ธ) multiplication sign
-271D ; Extended_Pictographic# 1.1 [1] (โœ๏ธ) latin cross
-2721 ; Extended_Pictographic# 1.1 [1] (โœก๏ธ) star of David
-2728 ; Extended_Pictographic# 6.0 [1] (โœจ) sparkles
-2733..2734 ; Extended_Pictographic# 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
-2744 ; Extended_Pictographic# 1.1 [1] (โ„๏ธ) snowflake
-2747 ; Extended_Pictographic# 1.1 [1] (โ‡๏ธ) sparkle
-274C ; Extended_Pictographic# 6.0 [1] (โŒ) cross mark
-274E ; Extended_Pictographic# 6.0 [1] (โŽ) cross mark button
-2753..2755 ; Extended_Pictographic# 6.0 [3] (โ“..โ•) question mark..white exclamation mark
-2757 ; Extended_Pictographic# 5.2 [1] (โ—) exclamation mark
-2763..2767 ; Extended_Pictographic# 1.1 [5] (โฃ๏ธ..โง) heart exclamation..ROTATED FLORAL HEART BULLET
-2795..2797 ; Extended_Pictographic# 6.0 [3] (โž•..โž—) plus sign..division sign
-27A1 ; Extended_Pictographic# 1.1 [1] (โžก๏ธ) right arrow
-27B0 ; Extended_Pictographic# 6.0 [1] (โžฐ) curly loop
-27BF ; Extended_Pictographic# 6.0 [1] (โžฟ) double curly loop
-2934..2935 ; Extended_Pictographic# 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
-2B05..2B07 ; Extended_Pictographic# 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
-2B1B..2B1C ; Extended_Pictographic# 5.1 [2] (โฌ›..โฌœ) black large square..white large square
-2B50 ; Extended_Pictographic# 5.1 [1] (โญ) star
-2B55 ; Extended_Pictographic# 5.2 [1] (โญ•) hollow red circle
-3030 ; Extended_Pictographic# 1.1 [1] (ใ€ฐ๏ธ) wavy dash
-303D ; Extended_Pictographic# 3.2 [1] (ใ€ฝ๏ธ) part alternation mark
-3297 ; Extended_Pictographic# 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
-3299 ; Extended_Pictographic# 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
-1F000..1F02B ; Extended_Pictographic# 5.1 [44] (๐Ÿ€€..๐Ÿ€ซ) MAHJONG TILE EAST WIND..MAHJONG TILE BACK
-1F02C..1F02F ; Extended_Pictographic# NA [4] (๐Ÿ€ฌ..๐Ÿ€ฏ) <reserved-1F02C>..<reserved-1F02F>
-1F030..1F093 ; Extended_Pictographic# 5.1[100] (๐Ÿ€ฐ..๐Ÿ‚“) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
-1F094..1F09F ; Extended_Pictographic# NA [12] (๐Ÿ‚”..๐Ÿ‚Ÿ) <reserved-1F094>..<reserved-1F09F>
-1F0A0..1F0AE ; Extended_Pictographic# 6.0 [15] (๐Ÿ‚ ..๐Ÿ‚ฎ) PLAYING CARD BACK..PLAYING CARD KING OF SPADES
-1F0AF..1F0B0 ; Extended_Pictographic# NA [2] (๐Ÿ‚ฏ..๐Ÿ‚ฐ) <reserved-1F0AF>..<reserved-1F0B0>
-1F0B1..1F0BE ; Extended_Pictographic# 6.0 [14] (๐Ÿ‚ฑ..๐Ÿ‚พ) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS
-1F0BF ; Extended_Pictographic# 7.0 [1] (๐Ÿ‚ฟ) PLAYING CARD RED JOKER
-1F0C0 ; Extended_Pictographic# NA [1] (๐Ÿƒ€) <reserved-1F0C0>
-1F0C1..1F0CF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ..๐Ÿƒ) PLAYING CARD ACE OF DIAMONDS..joker
-1F0D0 ; Extended_Pictographic# NA [1] (๐Ÿƒ) <reserved-1F0D0>
-1F0D1..1F0DF ; Extended_Pictographic# 6.0 [15] (๐Ÿƒ‘..๐ŸƒŸ) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER
-1F0E0..1F0F5 ; Extended_Pictographic# 7.0 [22] (๐Ÿƒ ..๐Ÿƒต) PLAYING CARD FOOL..PLAYING CARD TRUMP-21
-1F0F6..1F0FF ; Extended_Pictographic# NA [10] (๐Ÿƒถ..๐Ÿƒฟ) <reserved-1F0F6>..<reserved-1F0FF>
-1F10D..1F10F ; Extended_Pictographic# NA [3] (๐Ÿ„..๐Ÿ„) <reserved-1F10D>..<reserved-1F10F>
-1F12F ; Extended_Pictographic# 11.0 [1] (๐Ÿ„ฏ) COPYLEFT SYMBOL
-1F16C ; Extended_Pictographic# 12.0 [1] (๐Ÿ…ฌ) RAISED MR SIGN
-1F16D..1F16F ; Extended_Pictographic# NA [3] (๐Ÿ…ญ..๐Ÿ…ฏ) <reserved-1F16D>..<reserved-1F16F>
-1F170..1F171 ; Extended_Pictographic# 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
-1F17E ; Extended_Pictographic# 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type)
-1F17F ; Extended_Pictographic# 5.2 [1] (๐Ÿ…ฟ๏ธ) P button
-1F18E ; Extended_Pictographic# 6.0 [1] (๐Ÿ†Ž) AB button (blood type)
-1F191..1F19A ; Extended_Pictographic# 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
-1F1AD..1F1E5 ; Extended_Pictographic# NA [57] (๐Ÿ†ญ..๐Ÿ‡ฅ) <reserved-1F1AD>..<reserved-1F1E5>
-1F201..1F202 ; Extended_Pictographic# 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
-1F203..1F20F ; Extended_Pictographic# NA [13] (๐Ÿˆƒ..๐Ÿˆ) <reserved-1F203>..<reserved-1F20F>
-1F21A ; Extended_Pictographic# 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
-1F22F ; Extended_Pictographic# 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
-1F232..1F23A ; Extended_Pictographic# 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
-1F23C..1F23F ; Extended_Pictographic# NA [4] (๐Ÿˆผ..๐Ÿˆฟ) <reserved-1F23C>..<reserved-1F23F>
-1F249..1F24F ; Extended_Pictographic# NA [7] (๐Ÿ‰‰..๐Ÿ‰) <reserved-1F249>..<reserved-1F24F>
-1F250..1F251 ; Extended_Pictographic# 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
-1F252..1F25F ; Extended_Pictographic# NA [14] (๐Ÿ‰’..๐Ÿ‰Ÿ) <reserved-1F252>..<reserved-1F25F>
-1F260..1F265 ; Extended_Pictographic# 10.0 [6] (๐Ÿ‰ ..๐Ÿ‰ฅ) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
-1F266..1F2FF ; Extended_Pictographic# NA[154] (๐Ÿ‰ฆ..๐Ÿ‹ฟ) <reserved-1F266>..<reserved-1F2FF>
-1F300..1F320 ; Extended_Pictographic# 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star
-1F321..1F32C ; Extended_Pictographic# 7.0 [12] (๐ŸŒก๏ธ..๐ŸŒฌ๏ธ) thermometer..wind face
-1F32D..1F32F ; Extended_Pictographic# 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
-1F330..1F335 ; Extended_Pictographic# 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus
-1F336 ; Extended_Pictographic# 7.0 [1] (๐ŸŒถ๏ธ) hot pepper
-1F337..1F37C ; Extended_Pictographic# 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle
-1F37D ; Extended_Pictographic# 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate
-1F37E..1F37F ; Extended_Pictographic# 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
-1F380..1F393 ; Extended_Pictographic# 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
-1F394..1F39F ; Extended_Pictographic# 7.0 [12] (๐ŸŽ”..๐ŸŽŸ๏ธ) HEART WITH TIP ON THE LEFT..admission tickets
-1F3A0..1F3C4 ; Extended_Pictographic# 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
-1F3C5 ; Extended_Pictographic# 7.0 [1] (๐Ÿ…) sports medal
-1F3C6..1F3CA ; Extended_Pictographic# 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming
-1F3CB..1F3CE ; Extended_Pictographic# 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
-1F3CF..1F3D3 ; Extended_Pictographic# 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
-1F3D4..1F3DF ; Extended_Pictographic# 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
-1F3E0..1F3F0 ; Extended_Pictographic# 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle
-1F3F1..1F3F7 ; Extended_Pictographic# 7.0 [7] (๐Ÿฑ..๐Ÿท๏ธ) WHITE PENNANT..label
-1F3F8..1F3FA ; Extended_Pictographic# 8.0 [3] (๐Ÿธ..๐Ÿบ) badminton..amphora
-1F400..1F43E ; Extended_Pictographic# 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints
-1F43F ; Extended_Pictographic# 7.0 [1] (๐Ÿฟ๏ธ) chipmunk
-1F440 ; Extended_Pictographic# 6.0 [1] (๐Ÿ‘€) eyes
-1F441 ; Extended_Pictographic# 7.0 [1] (๐Ÿ‘๏ธ) eye
-1F442..1F4F7 ; Extended_Pictographic# 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera
-1F4F8 ; Extended_Pictographic# 7.0 [1] (๐Ÿ“ธ) camera with flash
-1F4F9..1F4FC ; Extended_Pictographic# 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
-1F4FD..1F4FE ; Extended_Pictographic# 7.0 [2] (๐Ÿ“ฝ๏ธ..๐Ÿ“พ) film projector..PORTABLE STEREO
-1F4FF ; Extended_Pictographic# 8.0 [1] (๐Ÿ“ฟ) prayer beads
-1F500..1F53D ; Extended_Pictographic# 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button
-1F546..1F54A ; Extended_Pictographic# 7.0 [5] (๐Ÿ•†..๐Ÿ•Š๏ธ) WHITE LATIN CROSS..dove
-1F54B..1F54F ; Extended_Pictographic# 8.0 [5] (๐Ÿ•‹..๐Ÿ•) kaaba..BOWL OF HYGIEIA
-1F550..1F567 ; Extended_Pictographic# 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty
-1F568..1F579 ; Extended_Pictographic# 7.0 [18] (๐Ÿ•จ..๐Ÿ•น๏ธ) RIGHT SPEAKER..joystick
-1F57A ; Extended_Pictographic# 9.0 [1] (๐Ÿ•บ) man dancing
-1F57B..1F5A3 ; Extended_Pictographic# 7.0 [41] (๐Ÿ•ป..๐Ÿ–ฃ) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX
-1F5A4 ; Extended_Pictographic# 9.0 [1] (๐Ÿ–ค) black heart
-1F5A5..1F5FA ; Extended_Pictographic# 7.0 [86] (๐Ÿ–ฅ๏ธ..๐Ÿ—บ๏ธ) desktop computer..world map
-1F5FB..1F5FF ; Extended_Pictographic# 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
-1F600 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜€) grinning face
-1F601..1F610 ; Extended_Pictographic# 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face
-1F611 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜‘) expressionless face
-1F612..1F614 ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
-1F615 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜•) confused face
-1F616 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜–) confounded face
-1F617 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜—) kissing face
-1F618 ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜˜) face blowing a kiss
-1F619 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes
-1F61A ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes
-1F61B ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜›) face with tongue
-1F61C..1F61E ; Extended_Pictographic# 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
-1F61F ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜Ÿ) worried face
-1F620..1F625 ; Extended_Pictographic# 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
-1F626..1F627 ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
-1F628..1F62B ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
-1F62C ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ฌ) grimacing face
-1F62D ; Extended_Pictographic# 6.0 [1] (๐Ÿ˜ญ) loudly crying face
-1F62E..1F62F ; Extended_Pictographic# 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
-1F630..1F633 ; Extended_Pictographic# 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
-1F634 ; Extended_Pictographic# 6.1 [1] (๐Ÿ˜ด) sleeping face
-1F635..1F640 ; Extended_Pictographic# 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat
-1F641..1F642 ; Extended_Pictographic# 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face
-1F643..1F644 ; Extended_Pictographic# 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes
-1F645..1F64F ; Extended_Pictographic# 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
-1F680..1F6C5 ; Extended_Pictographic# 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage
-1F6C6..1F6CF ; Extended_Pictographic# 7.0 [10] (๐Ÿ›†..๐Ÿ›๏ธ) TRIANGLE WITH ROUNDED CORNERS..bed
-1F6D0 ; Extended_Pictographic# 8.0 [1] (๐Ÿ›) place of worship
-1F6D1..1F6D2 ; Extended_Pictographic# 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
-1F6D3..1F6D4 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›“..๐Ÿ›”) STUPA..PAGODA
-1F6D5 ; Extended_Pictographic# 12.0 [1] (๐Ÿ›•) hindu temple
-1F6D6..1F6DF ; Extended_Pictographic# NA [10] (๐Ÿ›–..๐Ÿ›Ÿ) <reserved-1F6D6>..<reserved-1F6DF>
-1F6E0..1F6EC ; Extended_Pictographic# 7.0 [13] (๐Ÿ› ๏ธ..๐Ÿ›ฌ) hammer and wrench..airplane arrival
-1F6ED..1F6EF ; Extended_Pictographic# NA [3] (๐Ÿ›ญ..๐Ÿ›ฏ) <reserved-1F6ED>..<reserved-1F6EF>
-1F6F0..1F6F3 ; Extended_Pictographic# 7.0 [4] (๐Ÿ›ฐ๏ธ..๐Ÿ›ณ๏ธ) satellite..passenger ship
-1F6F4..1F6F6 ; Extended_Pictographic# 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
-1F6F7..1F6F8 ; Extended_Pictographic# 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
-1F6F9 ; Extended_Pictographic# 11.0 [1] (๐Ÿ›น) skateboard
-1F6FA ; Extended_Pictographic# 12.0 [1] (๐Ÿ›บ) auto rickshaw
-1F6FB..1F6FF ; Extended_Pictographic# NA [5] (๐Ÿ›ป..๐Ÿ›ฟ) <reserved-1F6FB>..<reserved-1F6FF>
-1F774..1F77F ; Extended_Pictographic# NA [12] (๐Ÿด..๐Ÿฟ) <reserved-1F774>..<reserved-1F77F>
-1F7D5..1F7D8 ; Extended_Pictographic# 11.0 [4] (๐ŸŸ•..๐ŸŸ˜) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
-1F7D9..1F7DF ; Extended_Pictographic# NA [7] (๐ŸŸ™..๐ŸŸŸ) <reserved-1F7D9>..<reserved-1F7DF>
-1F7E0..1F7EB ; Extended_Pictographic# 12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
-1F7EC..1F7FF ; Extended_Pictographic# NA [20] (๐ŸŸฌ..๐ŸŸฟ) <reserved-1F7EC>..<reserved-1F7FF>
-1F80C..1F80F ; Extended_Pictographic# NA [4] (๐Ÿ Œ..๐Ÿ ) <reserved-1F80C>..<reserved-1F80F>
-1F848..1F84F ; Extended_Pictographic# NA [8] (๐Ÿกˆ..๐Ÿก) <reserved-1F848>..<reserved-1F84F>
-1F85A..1F85F ; Extended_Pictographic# NA [6] (๐Ÿกš..๐ŸกŸ) <reserved-1F85A>..<reserved-1F85F>
-1F888..1F88F ; Extended_Pictographic# NA [8] (๐Ÿขˆ..๐Ÿข) <reserved-1F888>..<reserved-1F88F>
-1F8AE..1F8FF ; Extended_Pictographic# NA [82] (๐Ÿขฎ..๐Ÿฃฟ) <reserved-1F8AE>..<reserved-1F8FF>
-1F90C ; Extended_Pictographic# NA [1] (๐ŸคŒ) <reserved-1F90C>
-1F90D..1F90F ; Extended_Pictographic# 12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
-1F910..1F918 ; Extended_Pictographic# 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
-1F919..1F91E ; Extended_Pictographic# 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
-1F91F ; Extended_Pictographic# 10.0 [1] (๐ŸคŸ) love-you gesture
-1F920..1F927 ; Extended_Pictographic# 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
-1F928..1F92F ; Extended_Pictographic# 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
-1F930 ; Extended_Pictographic# 9.0 [1] (๐Ÿคฐ) pregnant woman
-1F931..1F932 ; Extended_Pictographic# 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
-1F933..1F93A ; Extended_Pictographic# 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
-1F93C..1F93E ; Extended_Pictographic# 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
-1F93F ; Extended_Pictographic# 12.0 [1] (๐Ÿคฟ) diving mask
-1F940..1F945 ; Extended_Pictographic# 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
-1F947..1F94B ; Extended_Pictographic# 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
-1F94C ; Extended_Pictographic# 10.0 [1] (๐ŸฅŒ) curling stone
-1F94D..1F94F ; Extended_Pictographic# 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
-1F950..1F95E ; Extended_Pictographic# 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
-1F95F..1F96B ; Extended_Pictographic# 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
-1F96C..1F970 ; Extended_Pictographic# 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
-1F971 ; Extended_Pictographic# 12.0 [1] (๐Ÿฅฑ) yawning face
-1F972 ; Extended_Pictographic# NA [1] (๐Ÿฅฒ) <reserved-1F972>
-1F973..1F976 ; Extended_Pictographic# 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
-1F977..1F979 ; Extended_Pictographic# NA [3] (๐Ÿฅท..๐Ÿฅน) <reserved-1F977>..<reserved-1F979>
-1F97A ; Extended_Pictographic# 11.0 [1] (๐Ÿฅบ) pleading face
-1F97B ; Extended_Pictographic# 12.0 [1] (๐Ÿฅป) sari
-1F97C..1F97F ; Extended_Pictographic# 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
-1F980..1F984 ; Extended_Pictographic# 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
-1F985..1F991 ; Extended_Pictographic# 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
-1F992..1F997 ; Extended_Pictographic# 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
-1F998..1F9A2 ; Extended_Pictographic# 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
-1F9A3..1F9A4 ; Extended_Pictographic# NA [2] (๐Ÿฆฃ..๐Ÿฆค) <reserved-1F9A3>..<reserved-1F9A4>
-1F9A5..1F9AA ; Extended_Pictographic# 12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
-1F9AB..1F9AD ; Extended_Pictographic# NA [3] (๐Ÿฆซ..๐Ÿฆญ) <reserved-1F9AB>..<reserved-1F9AD>
-1F9AE..1F9AF ; Extended_Pictographic# 12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..probing cane
-1F9B0..1F9B9 ; Extended_Pictographic# 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
-1F9BA..1F9BF ; Extended_Pictographic# 12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
-1F9C0 ; Extended_Pictographic# 8.0 [1] (๐Ÿง€) cheese wedge
-1F9C1..1F9C2 ; Extended_Pictographic# 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
-1F9C3..1F9CA ; Extended_Pictographic# 12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice cube
-1F9CB..1F9CC ; Extended_Pictographic# NA [2] (๐Ÿง‹..๐ŸงŒ) <reserved-1F9CB>..<reserved-1F9CC>
-1F9CD..1F9CF ; Extended_Pictographic# 12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
-1F9D0..1F9E6 ; Extended_Pictographic# 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
-1F9E7..1F9FF ; Extended_Pictographic# 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
-1FA00..1FA53 ; Extended_Pictographic# 12.0 [84] (๐Ÿจ€..๐Ÿฉ“) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP
-1FA54..1FA5F ; Extended_Pictographic# NA [12] (๐Ÿฉ”..๐ŸฉŸ) <reserved-1FA54>..<reserved-1FA5F>
-1FA60..1FA6D ; Extended_Pictographic# 11.0 [14] (๐Ÿฉ ..๐Ÿฉญ) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
-1FA6E..1FA6F ; Extended_Pictographic# NA [2] (๐Ÿฉฎ..๐Ÿฉฏ) <reserved-1FA6E>..<reserved-1FA6F>
-1FA70..1FA73 ; Extended_Pictographic# 12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
-1FA74..1FA77 ; Extended_Pictographic# NA [4] (๐Ÿฉด..๐Ÿฉท) <reserved-1FA74>..<reserved-1FA77>
-1FA78..1FA7A ; Extended_Pictographic# 12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
-1FA7B..1FA7F ; Extended_Pictographic# NA [5] (๐Ÿฉป..๐Ÿฉฟ) <reserved-1FA7B>..<reserved-1FA7F>
-1FA80..1FA82 ; Extended_Pictographic# 12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
-1FA83..1FA8F ; Extended_Pictographic# NA [13] (๐Ÿชƒ..๐Ÿช) <reserved-1FA83>..<reserved-1FA8F>
-1FA90..1FA95 ; Extended_Pictographic# 12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
-1FA96..1FFFD ; Extended_Pictographic# NA[1384] (๐Ÿช–..๐Ÿฟฝ) <reserved-1FA96>..<reserved-1FFFD>
+00A9 ; Extended_Pictographic# E0.6 [1] (ยฉ๏ธ) copyright
+00AE ; Extended_Pictographic# E0.6 [1] (ยฎ๏ธ) registered
+203C ; Extended_Pictographic# E0.6 [1] (โ€ผ๏ธ) double exclamation mark
+2049 ; Extended_Pictographic# E0.6 [1] (โ‰๏ธ) exclamation question mark
+2122 ; Extended_Pictographic# E0.6 [1] (โ„ข๏ธ) trade mark
+2139 ; Extended_Pictographic# E0.6 [1] (โ„น๏ธ) information
+2194..2199 ; Extended_Pictographic# E0.6 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow
+21A9..21AA ; Extended_Pictographic# E0.6 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right
+231A..231B ; Extended_Pictographic# E0.6 [2] (โŒš..โŒ›) watch..hourglass done
+2328 ; Extended_Pictographic# E1.0 [1] (โŒจ๏ธ) keyboard
+2388 ; Extended_Pictographic# E0.0 [1] (โŽˆ) HELM SYMBOL
+23CF ; Extended_Pictographic# E1.0 [1] (โ๏ธ) eject button
+23E9..23EC ; Extended_Pictographic# E0.6 [4] (โฉ..โฌ) fast-forward button..fast down button
+23ED..23EE ; Extended_Pictographic# E0.7 [2] (โญ๏ธ..โฎ๏ธ) next track button..last track button
+23EF ; Extended_Pictographic# E1.0 [1] (โฏ๏ธ) play or pause button
+23F0 ; Extended_Pictographic# E0.6 [1] (โฐ) alarm clock
+23F1..23F2 ; Extended_Pictographic# E1.0 [2] (โฑ๏ธ..โฒ๏ธ) stopwatch..timer clock
+23F3 ; Extended_Pictographic# E0.6 [1] (โณ) hourglass not done
+23F8..23FA ; Extended_Pictographic# E0.7 [3] (โธ๏ธ..โบ๏ธ) pause button..record button
+24C2 ; Extended_Pictographic# E0.6 [1] (โ“‚๏ธ) circled M
+25AA..25AB ; Extended_Pictographic# E0.6 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square
+25B6 ; Extended_Pictographic# E0.6 [1] (โ–ถ๏ธ) play button
+25C0 ; Extended_Pictographic# E0.6 [1] (โ—€๏ธ) reverse button
+25FB..25FE ; Extended_Pictographic# E0.6 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square
+2600..2601 ; Extended_Pictographic# E0.6 [2] (โ˜€๏ธ..โ˜๏ธ) sun..cloud
+2602..2603 ; Extended_Pictographic# E0.7 [2] (โ˜‚๏ธ..โ˜ƒ๏ธ) umbrella..snowman
+2604 ; Extended_Pictographic# E1.0 [1] (โ˜„๏ธ) comet
+2605 ; Extended_Pictographic# E0.0 [1] (โ˜…) BLACK STAR
+2607..260D ; Extended_Pictographic# E0.0 [7] (โ˜‡..โ˜) LIGHTNING..OPPOSITION
+260E ; Extended_Pictographic# E0.6 [1] (โ˜Ž๏ธ) telephone
+260F..2610 ; Extended_Pictographic# E0.0 [2] (โ˜..โ˜) WHITE TELEPHONE..BALLOT BOX
+2611 ; Extended_Pictographic# E0.6 [1] (โ˜‘๏ธ) check box with check
+2612 ; Extended_Pictographic# E0.0 [1] (โ˜’) BALLOT BOX WITH X
+2614..2615 ; Extended_Pictographic# E0.6 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage
+2616..2617 ; Extended_Pictographic# E0.0 [2] (โ˜–..โ˜—) WHITE SHOGI PIECE..BLACK SHOGI PIECE
+2618 ; Extended_Pictographic# E1.0 [1] (โ˜˜๏ธ) shamrock
+2619..261C ; Extended_Pictographic# E0.0 [4] (โ˜™..โ˜œ) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX
+261D ; Extended_Pictographic# E0.6 [1] (โ˜๏ธ) index pointing up
+261E..261F ; Extended_Pictographic# E0.0 [2] (โ˜ž..โ˜Ÿ) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX
+2620 ; Extended_Pictographic# E1.0 [1] (โ˜ ๏ธ) skull and crossbones
+2621 ; Extended_Pictographic# E0.0 [1] (โ˜ก) CAUTION SIGN
+2622..2623 ; Extended_Pictographic# E1.0 [2] (โ˜ข๏ธ..โ˜ฃ๏ธ) radioactive..biohazard
+2624..2625 ; Extended_Pictographic# E0.0 [2] (โ˜ค..โ˜ฅ) CADUCEUS..ANKH
+2626 ; Extended_Pictographic# E1.0 [1] (โ˜ฆ๏ธ) orthodox cross
+2627..2629 ; Extended_Pictographic# E0.0 [3] (โ˜ง..โ˜ฉ) CHI RHO..CROSS OF JERUSALEM
+262A ; Extended_Pictographic# E0.7 [1] (โ˜ช๏ธ) star and crescent
+262B..262D ; Extended_Pictographic# E0.0 [3] (โ˜ซ..โ˜ญ) FARSI SYMBOL..HAMMER AND SICKLE
+262E ; Extended_Pictographic# E1.0 [1] (โ˜ฎ๏ธ) peace symbol
+262F ; Extended_Pictographic# E0.7 [1] (โ˜ฏ๏ธ) yin yang
+2630..2637 ; Extended_Pictographic# E0.0 [8] (โ˜ฐ..โ˜ท) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH
+2638..2639 ; Extended_Pictographic# E0.7 [2] (โ˜ธ๏ธ..โ˜น๏ธ) wheel of dharma..frowning face
+263A ; Extended_Pictographic# E0.6 [1] (โ˜บ๏ธ) smiling face
+263B..263F ; Extended_Pictographic# E0.0 [5] (โ˜ป..โ˜ฟ) BLACK SMILING FACE..MERCURY
+2640 ; Extended_Pictographic# E4.0 [1] (โ™€๏ธ) female sign
+2641 ; Extended_Pictographic# E0.0 [1] (โ™) EARTH
+2642 ; Extended_Pictographic# E4.0 [1] (โ™‚๏ธ) male sign
+2643..2647 ; Extended_Pictographic# E0.0 [5] (โ™ƒ..โ™‡) JUPITER..PLUTO
+2648..2653 ; Extended_Pictographic# E0.6 [12] (โ™ˆ..โ™“) Aries..Pisces
+2654..265E ; Extended_Pictographic# E0.0 [11] (โ™”..โ™ž) WHITE CHESS KING..BLACK CHESS KNIGHT
+265F ; Extended_Pictographic# E11.0 [1] (โ™Ÿ๏ธ) chess pawn
+2660 ; Extended_Pictographic# E0.6 [1] (โ™ ๏ธ) spade suit
+2661..2662 ; Extended_Pictographic# E0.0 [2] (โ™ก..โ™ข) WHITE HEART SUIT..WHITE DIAMOND SUIT
+2663 ; Extended_Pictographic# E0.6 [1] (โ™ฃ๏ธ) club suit
+2664 ; Extended_Pictographic# E0.0 [1] (โ™ค) WHITE SPADE SUIT
+2665..2666 ; Extended_Pictographic# E0.6 [2] (โ™ฅ๏ธ..โ™ฆ๏ธ) heart suit..diamond suit
+2667 ; Extended_Pictographic# E0.0 [1] (โ™ง) WHITE CLUB SUIT
+2668 ; Extended_Pictographic# E0.6 [1] (โ™จ๏ธ) hot springs
+2669..267A ; Extended_Pictographic# E0.0 [18] (โ™ฉ..โ™บ) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; Extended_Pictographic# E0.6 [1] (โ™ป๏ธ) recycling symbol
+267C..267D ; Extended_Pictographic# E0.0 [2] (โ™ผ..โ™ฝ) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+267E ; Extended_Pictographic# E11.0 [1] (โ™พ๏ธ) infinity
+267F ; Extended_Pictographic# E0.6 [1] (โ™ฟ) wheelchair symbol
+2680..2685 ; Extended_Pictographic# E0.0 [6] (โš€..โš…) DIE FACE-1..DIE FACE-6
+2690..2691 ; Extended_Pictographic# E0.0 [2] (โš..โš‘) WHITE FLAG..BLACK FLAG
+2692 ; Extended_Pictographic# E1.0 [1] (โš’๏ธ) hammer and pick
+2693 ; Extended_Pictographic# E0.6 [1] (โš“) anchor
+2694 ; Extended_Pictographic# E1.0 [1] (โš”๏ธ) crossed swords
+2695 ; Extended_Pictographic# E4.0 [1] (โš•๏ธ) medical symbol
+2696..2697 ; Extended_Pictographic# E1.0 [2] (โš–๏ธ..โš—๏ธ) balance scale..alembic
+2698 ; Extended_Pictographic# E0.0 [1] (โš˜) FLOWER
+2699 ; Extended_Pictographic# E1.0 [1] (โš™๏ธ) gear
+269A ; Extended_Pictographic# E0.0 [1] (โšš) STAFF OF HERMES
+269B..269C ; Extended_Pictographic# E1.0 [2] (โš›๏ธ..โšœ๏ธ) atom symbol..fleur-de-lis
+269D..269F ; Extended_Pictographic# E0.0 [3] (โš..โšŸ) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT
+26A0..26A1 ; Extended_Pictographic# E0.6 [2] (โš ๏ธ..โšก) warning..high voltage
+26A2..26A6 ; Extended_Pictographic# E0.0 [5] (โšข..โšฆ) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN
+26A7 ; Extended_Pictographic# E13.0 [1] (โšง๏ธ) transgender symbol
+26A8..26A9 ; Extended_Pictographic# E0.0 [2] (โšจ..โšฉ) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN
+26AA..26AB ; Extended_Pictographic# E0.6 [2] (โšช..โšซ) white circle..black circle
+26AC..26AF ; Extended_Pictographic# E0.0 [4] (โšฌ..โšฏ) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL
+26B0..26B1 ; Extended_Pictographic# E1.0 [2] (โšฐ๏ธ..โšฑ๏ธ) coffin..funeral urn
+26B2..26BC ; Extended_Pictographic# E0.0 [11] (โšฒ..โšผ) NEUTER..SESQUIQUADRATE
+26BD..26BE ; Extended_Pictographic# E0.6 [2] (โšฝ..โšพ) soccer ball..baseball
+26BF..26C3 ; Extended_Pictographic# E0.0 [5] (โšฟ..โ›ƒ) SQUARED KEY..BLACK DRAUGHTS KING
+26C4..26C5 ; Extended_Pictographic# E0.6 [2] (โ›„..โ›…) snowman without snow..sun behind cloud
+26C6..26C7 ; Extended_Pictographic# E0.0 [2] (โ›†..โ›‡) RAIN..BLACK SNOWMAN
+26C8 ; Extended_Pictographic# E0.7 [1] (โ›ˆ๏ธ) cloud with lightning and rain
+26C9..26CD ; Extended_Pictographic# E0.0 [5] (โ›‰..โ›) TURNED WHITE SHOGI PIECE..DISABLED CAR
+26CE ; Extended_Pictographic# E0.6 [1] (โ›Ž) Ophiuchus
+26CF ; Extended_Pictographic# E0.7 [1] (โ›๏ธ) pick
+26D0 ; Extended_Pictographic# E0.0 [1] (โ›) CAR SLIDING
+26D1 ; Extended_Pictographic# E0.7 [1] (โ›‘๏ธ) rescue workerโ€™s helmet
+26D2 ; Extended_Pictographic# E0.0 [1] (โ›’) CIRCLED CROSSING LANES
+26D3 ; Extended_Pictographic# E0.7 [1] (โ›“๏ธ) chains
+26D4 ; Extended_Pictographic# E0.6 [1] (โ›”) no entry
+26D5..26E8 ; Extended_Pictographic# E0.0 [20] (โ›•..โ›จ) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD
+26E9 ; Extended_Pictographic# E0.7 [1] (โ›ฉ๏ธ) shinto shrine
+26EA ; Extended_Pictographic# E0.6 [1] (โ›ช) church
+26EB..26EF ; Extended_Pictographic# E0.0 [5] (โ›ซ..โ›ฏ) CASTLE..MAP SYMBOL FOR LIGHTHOUSE
+26F0..26F1 ; Extended_Pictographic# E0.7 [2] (โ›ฐ๏ธ..โ›ฑ๏ธ) mountain..umbrella on ground
+26F2..26F3 ; Extended_Pictographic# E0.6 [2] (โ›ฒ..โ›ณ) fountain..flag in hole
+26F4 ; Extended_Pictographic# E0.7 [1] (โ›ด๏ธ) ferry
+26F5 ; Extended_Pictographic# E0.6 [1] (โ›ต) sailboat
+26F6 ; Extended_Pictographic# E0.0 [1] (โ›ถ) SQUARE FOUR CORNERS
+26F7..26F9 ; Extended_Pictographic# E0.7 [3] (โ›ท๏ธ..โ›น๏ธ) skier..person bouncing ball
+26FA ; Extended_Pictographic# E0.6 [1] (โ›บ) tent
+26FB..26FC ; Extended_Pictographic# E0.0 [2] (โ›ป..โ›ผ) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL
+26FD ; Extended_Pictographic# E0.6 [1] (โ›ฝ) fuel pump
+26FE..2701 ; Extended_Pictographic# E0.0 [4] (โ›พ..โœ) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS
+2702 ; Extended_Pictographic# E0.6 [1] (โœ‚๏ธ) scissors
+2703..2704 ; Extended_Pictographic# E0.0 [2] (โœƒ..โœ„) LOWER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Extended_Pictographic# E0.6 [1] (โœ…) check mark button
+2708..270C ; Extended_Pictographic# E0.6 [5] (โœˆ๏ธ..โœŒ๏ธ) airplane..victory hand
+270D ; Extended_Pictographic# E0.7 [1] (โœ๏ธ) writing hand
+270E ; Extended_Pictographic# E0.0 [1] (โœŽ) LOWER RIGHT PENCIL
+270F ; Extended_Pictographic# E0.6 [1] (โœ๏ธ) pencil
+2710..2711 ; Extended_Pictographic# E0.0 [2] (โœ..โœ‘) UPPER RIGHT PENCIL..WHITE NIB
+2712 ; Extended_Pictographic# E0.6 [1] (โœ’๏ธ) black nib
+2714 ; Extended_Pictographic# E0.6 [1] (โœ”๏ธ) check mark
+2716 ; Extended_Pictographic# E0.6 [1] (โœ–๏ธ) multiply
+271D ; Extended_Pictographic# E0.7 [1] (โœ๏ธ) latin cross
+2721 ; Extended_Pictographic# E0.7 [1] (โœก๏ธ) star of David
+2728 ; Extended_Pictographic# E0.6 [1] (โœจ) sparkles
+2733..2734 ; Extended_Pictographic# E0.6 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star
+2744 ; Extended_Pictographic# E0.6 [1] (โ„๏ธ) snowflake
+2747 ; Extended_Pictographic# E0.6 [1] (โ‡๏ธ) sparkle
+274C ; Extended_Pictographic# E0.6 [1] (โŒ) cross mark
+274E ; Extended_Pictographic# E0.6 [1] (โŽ) cross mark button
+2753..2755 ; Extended_Pictographic# E0.6 [3] (โ“..โ•) question mark..white exclamation mark
+2757 ; Extended_Pictographic# E0.6 [1] (โ—) exclamation mark
+2763 ; Extended_Pictographic# E1.0 [1] (โฃ๏ธ) heart exclamation
+2764 ; Extended_Pictographic# E0.6 [1] (โค๏ธ) red heart
+2765..2767 ; Extended_Pictographic# E0.0 [3] (โฅ..โง) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET
+2795..2797 ; Extended_Pictographic# E0.6 [3] (โž•..โž—) plus..divide
+27A1 ; Extended_Pictographic# E0.6 [1] (โžก๏ธ) right arrow
+27B0 ; Extended_Pictographic# E0.6 [1] (โžฐ) curly loop
+27BF ; Extended_Pictographic# E1.0 [1] (โžฟ) double curly loop
+2934..2935 ; Extended_Pictographic# E0.6 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down
+2B05..2B07 ; Extended_Pictographic# E0.6 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow
+2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (โฌ›..โฌœ) black large square..white large square
+2B50 ; Extended_Pictographic# E0.6 [1] (โญ) star
+2B55 ; Extended_Pictographic# E0.6 [1] (โญ•) hollow red circle
+3030 ; Extended_Pictographic# E0.6 [1] (ใ€ฐ๏ธ) wavy dash
+303D ; Extended_Pictographic# E0.6 [1] (ใ€ฝ๏ธ) part alternation mark
+3297 ; Extended_Pictographic# E0.6 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button
+3299 ; Extended_Pictographic# E0.6 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button
+1F000..1F003 ; Extended_Pictographic# E0.0 [4] (๐Ÿ€€..๐Ÿ€ƒ) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND
+1F004 ; Extended_Pictographic# E0.6 [1] (๐Ÿ€„) mahjong red dragon
+1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (๐Ÿ€…..๐ŸƒŽ) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS
+1F0CF ; Extended_Pictographic# E0.6 [1] (๐Ÿƒ) joker
+1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (๐Ÿƒ..๐Ÿƒฟ) <reserved-1F0D0>..<reserved-1F0FF>
+1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (๐Ÿ„..๐Ÿ„) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
+1F12F ; Extended_Pictographic# E0.0 [1] (๐Ÿ„ฏ) COPYLEFT SYMBOL
+1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (๐Ÿ…ฌ..๐Ÿ…ฏ) RAISED MR SIGN..CIRCLED HUMAN FIGURE
+1F170..1F171 ; Extended_Pictographic# E0.6 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (๐Ÿ…พ๏ธ..๐Ÿ…ฟ๏ธ) O button (blood type)..P button
+1F18E ; Extended_Pictographic# E0.6 [1] (๐Ÿ†Ž) AB button (blood type)
+1F191..1F19A ; Extended_Pictographic# E0.6 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button
+1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (๐Ÿ†ญ..๐Ÿ‡ฅ) MASK WORK SYMBOL..<reserved-1F1E5>
+1F201..1F202 ; Extended_Pictographic# E0.6 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button
+1F203..1F20F ; Extended_Pictographic# E0.0 [13] (๐Ÿˆƒ..๐Ÿˆ) <reserved-1F203>..<reserved-1F20F>
+1F21A ; Extended_Pictographic# E0.6 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button
+1F22F ; Extended_Pictographic# E0.6 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button
+1F232..1F23A ; Extended_Pictographic# E0.6 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button
+1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (๐Ÿˆผ..๐Ÿˆฟ) <reserved-1F23C>..<reserved-1F23F>
+1F249..1F24F ; Extended_Pictographic# E0.0 [7] (๐Ÿ‰‰..๐Ÿ‰) <reserved-1F249>..<reserved-1F24F>
+1F250..1F251 ; Extended_Pictographic# E0.6 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button
+1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (๐Ÿ‰’..๐Ÿ‹ฟ) <reserved-1F252>..<reserved-1F2FF>
+1F300..1F30C ; Extended_Pictographic# E0.6 [13] (๐ŸŒ€..๐ŸŒŒ) cyclone..milky way
+1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (๐ŸŒ..๐ŸŒŽ) globe showing Europe-Africa..globe showing Americas
+1F30F ; Extended_Pictographic# E0.6 [1] (๐ŸŒ) globe showing Asia-Australia
+1F310 ; Extended_Pictographic# E1.0 [1] (๐ŸŒ) globe with meridians
+1F311 ; Extended_Pictographic# E0.6 [1] (๐ŸŒ‘) new moon
+1F312 ; Extended_Pictographic# E1.0 [1] (๐ŸŒ’) waxing crescent moon
+1F313..1F315 ; Extended_Pictographic# E0.6 [3] (๐ŸŒ“..๐ŸŒ•) first quarter moon..full moon
+1F316..1F318 ; Extended_Pictographic# E1.0 [3] (๐ŸŒ–..๐ŸŒ˜) waning gibbous moon..waning crescent moon
+1F319 ; Extended_Pictographic# E0.6 [1] (๐ŸŒ™) crescent moon
+1F31A ; Extended_Pictographic# E1.0 [1] (๐ŸŒš) new moon face
+1F31B ; Extended_Pictographic# E0.6 [1] (๐ŸŒ›) first quarter moon face
+1F31C ; Extended_Pictographic# E0.7 [1] (๐ŸŒœ) last quarter moon face
+1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (๐ŸŒ..๐ŸŒž) full moon face..sun with face
+1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (๐ŸŒŸ..๐ŸŒ ) glowing star..shooting star
+1F321 ; Extended_Pictographic# E0.7 [1] (๐ŸŒก๏ธ) thermometer
+1F322..1F323 ; Extended_Pictographic# E0.0 [2] (๐ŸŒข..๐ŸŒฃ) BLACK DROPLET..WHITE SUN
+1F324..1F32C ; Extended_Pictographic# E0.7 [9] (๐ŸŒค๏ธ..๐ŸŒฌ๏ธ) sun behind small cloud..wind face
+1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito
+1F330..1F331 ; Extended_Pictographic# E0.6 [2] (๐ŸŒฐ..๐ŸŒฑ) chestnut..seedling
+1F332..1F333 ; Extended_Pictographic# E1.0 [2] (๐ŸŒฒ..๐ŸŒณ) evergreen tree..deciduous tree
+1F334..1F335 ; Extended_Pictographic# E0.6 [2] (๐ŸŒด..๐ŸŒต) palm tree..cactus
+1F336 ; Extended_Pictographic# E0.7 [1] (๐ŸŒถ๏ธ) hot pepper
+1F337..1F34A ; Extended_Pictographic# E0.6 [20] (๐ŸŒท..๐ŸŠ) tulip..tangerine
+1F34B ; Extended_Pictographic# E1.0 [1] (๐Ÿ‹) lemon
+1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (๐ŸŒ..๐Ÿ) banana..green apple
+1F350 ; Extended_Pictographic# E1.0 [1] (๐Ÿ) pear
+1F351..1F37B ; Extended_Pictographic# E0.6 [43] (๐Ÿ‘..๐Ÿป) peach..clinking beer mugs
+1F37C ; Extended_Pictographic# E1.0 [1] (๐Ÿผ) baby bottle
+1F37D ; Extended_Pictographic# E0.7 [1] (๐Ÿฝ๏ธ) fork and knife with plate
+1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn
+1F380..1F393 ; Extended_Pictographic# E0.6 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap
+1F394..1F395 ; Extended_Pictographic# E0.0 [2] (๐ŸŽ”..๐ŸŽ•) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS
+1F396..1F397 ; Extended_Pictographic# E0.7 [2] (๐ŸŽ–๏ธ..๐ŸŽ—๏ธ) military medal..reminder ribbon
+1F398 ; Extended_Pictographic# E0.0 [1] (๐ŸŽ˜) MUSICAL KEYBOARD WITH JACKS
+1F399..1F39B ; Extended_Pictographic# E0.7 [3] (๐ŸŽ™๏ธ..๐ŸŽ›๏ธ) studio microphone..control knobs
+1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (๐ŸŽœ..๐ŸŽ) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES
+1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (๐ŸŽž๏ธ..๐ŸŽŸ๏ธ) film frames..admission tickets
+1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing
+1F3C5 ; Extended_Pictographic# E1.0 [1] (๐Ÿ…) sports medal
+1F3C6 ; Extended_Pictographic# E0.6 [1] (๐Ÿ†) trophy
+1F3C7 ; Extended_Pictographic# E1.0 [1] (๐Ÿ‡) horse racing
+1F3C8 ; Extended_Pictographic# E0.6 [1] (๐Ÿˆ) american football
+1F3C9 ; Extended_Pictographic# E1.0 [1] (๐Ÿ‰) rugby football
+1F3CA ; Extended_Pictographic# E0.6 [1] (๐ŸŠ) person swimming
+1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car
+1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong
+1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (๐Ÿ ..๐Ÿฃ) house..Japanese post office
+1F3E4 ; Extended_Pictographic# E1.0 [1] (๐Ÿค) post office
+1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (๐Ÿฅ..๐Ÿฐ) hospital..castle
+1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (๐Ÿฑ..๐Ÿฒ) WHITE PENNANT..BLACK PENNANT
+1F3F3 ; Extended_Pictographic# E0.7 [1] (๐Ÿณ๏ธ) white flag
+1F3F4 ; Extended_Pictographic# E1.0 [1] (๐Ÿด) black flag
+1F3F5 ; Extended_Pictographic# E0.7 [1] (๐Ÿต๏ธ) rosette
+1F3F6 ; Extended_Pictographic# E0.0 [1] (๐Ÿถ) BLACK ROSETTE
+1F3F7 ; Extended_Pictographic# E0.7 [1] (๐Ÿท๏ธ) label
+1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (๐Ÿธ..๐Ÿบ) badminton..amphora
+1F400..1F407 ; Extended_Pictographic# E1.0 [8] (๐Ÿ€..๐Ÿ‡) rat..rabbit
+1F408 ; Extended_Pictographic# E0.7 [1] (๐Ÿˆ) cat
+1F409..1F40B ; Extended_Pictographic# E1.0 [3] (๐Ÿ‰..๐Ÿ‹) dragon..whale
+1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (๐ŸŒ..๐ŸŽ) snail..horse
+1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (๐Ÿ..๐Ÿ) ram..goat
+1F411..1F412 ; Extended_Pictographic# E0.6 [2] (๐Ÿ‘..๐Ÿ’) ewe..monkey
+1F413 ; Extended_Pictographic# E1.0 [1] (๐Ÿ“) rooster
+1F414 ; Extended_Pictographic# E0.6 [1] (๐Ÿ”) chicken
+1F415 ; Extended_Pictographic# E0.7 [1] (๐Ÿ•) dog
+1F416 ; Extended_Pictographic# E1.0 [1] (๐Ÿ–) pig
+1F417..1F429 ; Extended_Pictographic# E0.6 [19] (๐Ÿ—..๐Ÿฉ) boar..poodle
+1F42A ; Extended_Pictographic# E1.0 [1] (๐Ÿช) camel
+1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (๐Ÿซ..๐Ÿพ) two-hump camel..paw prints
+1F43F ; Extended_Pictographic# E0.7 [1] (๐Ÿฟ๏ธ) chipmunk
+1F440 ; Extended_Pictographic# E0.6 [1] (๐Ÿ‘€) eyes
+1F441 ; Extended_Pictographic# E0.7 [1] (๐Ÿ‘๏ธ) eye
+1F442..1F464 ; Extended_Pictographic# E0.6 [35] (๐Ÿ‘‚..๐Ÿ‘ค) ear..bust in silhouette
+1F465 ; Extended_Pictographic# E1.0 [1] (๐Ÿ‘ฅ) busts in silhouette
+1F466..1F46B ; Extended_Pictographic# E0.6 [6] (๐Ÿ‘ฆ..๐Ÿ‘ซ) boy..woman and man holding hands
+1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (๐Ÿ‘ฌ..๐Ÿ‘ญ) men holding hands..women holding hands
+1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (๐Ÿ‘ฎ..๐Ÿ’ฌ) police officer..speech balloon
+1F4AD ; Extended_Pictographic# E1.0 [1] (๐Ÿ’ญ) thought balloon
+1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (๐Ÿ’ฎ..๐Ÿ’ต) white flower..dollar banknote
+1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (๐Ÿ’ถ..๐Ÿ’ท) euro banknote..pound banknote
+1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (๐Ÿ’ธ..๐Ÿ“ซ) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (๐Ÿ“ฌ..๐Ÿ“ญ) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Extended_Pictographic# E0.6 [1] (๐Ÿ“ฎ) postbox
+1F4EF ; Extended_Pictographic# E1.0 [1] (๐Ÿ“ฏ) postal horn
+1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (๐Ÿ“ฐ..๐Ÿ“ด) newspaper..mobile phone off
+1F4F5 ; Extended_Pictographic# E1.0 [1] (๐Ÿ“ต) no mobile phones
+1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (๐Ÿ“ถ..๐Ÿ“ท) antenna bars..camera
+1F4F8 ; Extended_Pictographic# E1.0 [1] (๐Ÿ“ธ) camera with flash
+1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette
+1F4FD ; Extended_Pictographic# E0.7 [1] (๐Ÿ“ฝ๏ธ) film projector
+1F4FE ; Extended_Pictographic# E0.0 [1] (๐Ÿ“พ) PORTABLE STEREO
+1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (๐Ÿ“ฟ..๐Ÿ”‚) prayer beads..repeat single button
+1F503 ; Extended_Pictographic# E0.6 [1] (๐Ÿ”ƒ) clockwise vertical arrows
+1F504..1F507 ; Extended_Pictographic# E1.0 [4] (๐Ÿ”„..๐Ÿ”‡) counterclockwise arrows button..muted speaker
+1F508 ; Extended_Pictographic# E0.7 [1] (๐Ÿ”ˆ) speaker low volume
+1F509 ; Extended_Pictographic# E1.0 [1] (๐Ÿ”‰) speaker medium volume
+1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (๐Ÿ”Š..๐Ÿ””) speaker high volume..bell
+1F515 ; Extended_Pictographic# E1.0 [1] (๐Ÿ”•) bell with slash
+1F516..1F52B ; Extended_Pictographic# E0.6 [22] (๐Ÿ”–..๐Ÿ”ซ) bookmark..pistol
+1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (๐Ÿ”ฌ..๐Ÿ”ญ) microscope..telescope
+1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (๐Ÿ”ฎ..๐Ÿ”ฝ) crystal ball..downwards button
+1F546..1F548 ; Extended_Pictographic# E0.0 [3] (๐Ÿ•†..๐Ÿ•ˆ) WHITE LATIN CROSS..CELTIC CROSS
+1F549..1F54A ; Extended_Pictographic# E0.7 [2] (๐Ÿ•‰๏ธ..๐Ÿ•Š๏ธ) om..dove
+1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (๐Ÿ•‹..๐Ÿ•Ž) kaaba..menorah
+1F54F ; Extended_Pictographic# E0.0 [1] (๐Ÿ•) BOWL OF HYGIEIA
+1F550..1F55B ; Extended_Pictographic# E0.6 [12] (๐Ÿ•..๐Ÿ•›) one oโ€™clock..twelve oโ€™clock
+1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (๐Ÿ•œ..๐Ÿ•ง) one-thirty..twelve-thirty
+1F568..1F56E ; Extended_Pictographic# E0.0 [7] (๐Ÿ•จ..๐Ÿ•ฎ) RIGHT SPEAKER..BOOK
+1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (๐Ÿ•ฏ๏ธ..๐Ÿ•ฐ๏ธ) candle..mantelpiece clock
+1F571..1F572 ; Extended_Pictographic# E0.0 [2] (๐Ÿ•ฑ..๐Ÿ•ฒ) BLACK SKULL AND CROSSBONES..NO PIRACY
+1F573..1F579 ; Extended_Pictographic# E0.7 [7] (๐Ÿ•ณ๏ธ..๐Ÿ•น๏ธ) hole..joystick
+1F57A ; Extended_Pictographic# E3.0 [1] (๐Ÿ•บ) man dancing
+1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (๐Ÿ•ป..๐Ÿ–†) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE
+1F587 ; Extended_Pictographic# E0.7 [1] (๐Ÿ–‡๏ธ) linked paperclips
+1F588..1F589 ; Extended_Pictographic# E0.0 [2] (๐Ÿ–ˆ..๐Ÿ–‰) BLACK PUSHPIN..LOWER LEFT PENCIL
+1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (๐Ÿ–Š๏ธ..๐Ÿ–๏ธ) pen..crayon
+1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (๐Ÿ–Ž..๐Ÿ–) LEFT WRITING HAND..TURNED OK HAND SIGN
+1F590 ; Extended_Pictographic# E0.7 [1] (๐Ÿ–๏ธ) hand with fingers splayed
+1F591..1F594 ; Extended_Pictographic# E0.0 [4] (๐Ÿ–‘..๐Ÿ–”) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND
+1F595..1F596 ; Extended_Pictographic# E1.0 [2] (๐Ÿ–•..๐Ÿ––) middle finger..vulcan salute
+1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (๐Ÿ–—..๐Ÿ–ฃ) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX
+1F5A4 ; Extended_Pictographic# E3.0 [1] (๐Ÿ–ค) black heart
+1F5A5 ; Extended_Pictographic# E0.7 [1] (๐Ÿ–ฅ๏ธ) desktop computer
+1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (๐Ÿ–ฆ..๐Ÿ–ง) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS
+1F5A8 ; Extended_Pictographic# E0.7 [1] (๐Ÿ–จ๏ธ) printer
+1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (๐Ÿ–ฉ..๐Ÿ–ฐ) POCKET CALCULATOR..TWO BUTTON MOUSE
+1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (๐Ÿ–ฑ๏ธ..๐Ÿ–ฒ๏ธ) computer mouse..trackball
+1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (๐Ÿ–ณ..๐Ÿ–ป) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE
+1F5BC ; Extended_Pictographic# E0.7 [1] (๐Ÿ–ผ๏ธ) framed picture
+1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (๐Ÿ–ฝ..๐Ÿ—) FRAME WITH TILES..OPEN FOLDER
+1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (๐Ÿ—‚๏ธ..๐Ÿ—„๏ธ) card index dividers..file cabinet
+1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (๐Ÿ—…..๐Ÿ—) EMPTY NOTE..PAGES
+1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (๐Ÿ—‘๏ธ..๐Ÿ—“๏ธ) wastebasket..spiral calendar
+1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (๐Ÿ—”..๐Ÿ—›) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL
+1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (๐Ÿ—œ๏ธ..๐Ÿ—ž๏ธ) clamp..rolled-up newspaper
+1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (๐Ÿ—Ÿ..๐Ÿ— ) PAGE WITH CIRCLED TEXT..STOCK CHART
+1F5E1 ; Extended_Pictographic# E0.7 [1] (๐Ÿ—ก๏ธ) dagger
+1F5E2 ; Extended_Pictographic# E0.0 [1] (๐Ÿ—ข) LIPS
+1F5E3 ; Extended_Pictographic# E0.7 [1] (๐Ÿ—ฃ๏ธ) speaking head
+1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (๐Ÿ—ค..๐Ÿ—ง) THREE RAYS ABOVE..THREE RAYS RIGHT
+1F5E8 ; Extended_Pictographic# E2.0 [1] (๐Ÿ—จ๏ธ) left speech bubble
+1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (๐Ÿ—ฉ..๐Ÿ—ฎ) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE
+1F5EF ; Extended_Pictographic# E0.7 [1] (๐Ÿ—ฏ๏ธ) right anger bubble
+1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (๐Ÿ—ฐ..๐Ÿ—ฒ) MOOD BUBBLE..LIGHTNING MOOD
+1F5F3 ; Extended_Pictographic# E0.7 [1] (๐Ÿ—ณ๏ธ) ballot box with ballot
+1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (๐Ÿ—ด..๐Ÿ—น) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK
+1F5FA ; Extended_Pictographic# E0.7 [1] (๐Ÿ—บ๏ธ) world map
+1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai
+1F600 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜€) grinning face
+1F601..1F606 ; Extended_Pictographic# E0.6 [6] (๐Ÿ˜..๐Ÿ˜†) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Extended_Pictographic# E1.0 [2] (๐Ÿ˜‡..๐Ÿ˜ˆ) smiling face with halo..smiling face with horns
+1F609..1F60D ; Extended_Pictographic# E0.6 [5] (๐Ÿ˜‰..๐Ÿ˜) winking face..smiling face with heart-eyes
+1F60E ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜Ž) smiling face with sunglasses
+1F60F ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜) smirking face
+1F610 ; Extended_Pictographic# E0.7 [1] (๐Ÿ˜) neutral face
+1F611 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜‘) expressionless face
+1F612..1F614 ; Extended_Pictographic# E0.6 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face
+1F615 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜•) confused face
+1F616 ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜–) confounded face
+1F617 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜—) kissing face
+1F618 ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜˜) face blowing a kiss
+1F619 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜™) kissing face with smiling eyes
+1F61A ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜š) kissing face with closed eyes
+1F61B ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜›) face with tongue
+1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face
+1F61F ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜Ÿ) worried face
+1F620..1F625 ; Extended_Pictographic# E0.6 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face
+1F626..1F627 ; Extended_Pictographic# E1.0 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face
+1F628..1F62B ; Extended_Pictographic# E0.6 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face
+1F62C ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜ฌ) grimacing face
+1F62D ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜ญ) loudly crying face
+1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face
+1F630..1F633 ; Extended_Pictographic# E0.6 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face
+1F634 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜ด) sleeping face
+1F635 ; Extended_Pictographic# E0.6 [1] (๐Ÿ˜ต) dizzy face
+1F636 ; Extended_Pictographic# E1.0 [1] (๐Ÿ˜ถ) face without mouth
+1F637..1F640 ; Extended_Pictographic# E0.6 [10] (๐Ÿ˜ท..๐Ÿ™€) face with medical mask..weary cat
+1F641..1F644 ; Extended_Pictographic# E1.0 [4] (๐Ÿ™..๐Ÿ™„) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Extended_Pictographic# E0.6 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands
+1F680 ; Extended_Pictographic# E0.6 [1] (๐Ÿš€) rocket
+1F681..1F682 ; Extended_Pictographic# E1.0 [2] (๐Ÿš..๐Ÿš‚) helicopter..locomotive
+1F683..1F685 ; Extended_Pictographic# E0.6 [3] (๐Ÿšƒ..๐Ÿš…) railway car..bullet train
+1F686 ; Extended_Pictographic# E1.0 [1] (๐Ÿš†) train
+1F687 ; Extended_Pictographic# E0.6 [1] (๐Ÿš‡) metro
+1F688 ; Extended_Pictographic# E1.0 [1] (๐Ÿšˆ) light rail
+1F689 ; Extended_Pictographic# E0.6 [1] (๐Ÿš‰) station
+1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (๐ŸšŠ..๐Ÿš‹) tram..tram car
+1F68C ; Extended_Pictographic# E0.6 [1] (๐ŸšŒ) bus
+1F68D ; Extended_Pictographic# E0.7 [1] (๐Ÿš) oncoming bus
+1F68E ; Extended_Pictographic# E1.0 [1] (๐ŸšŽ) trolleybus
+1F68F ; Extended_Pictographic# E0.6 [1] (๐Ÿš) bus stop
+1F690 ; Extended_Pictographic# E1.0 [1] (๐Ÿš) minibus
+1F691..1F693 ; Extended_Pictographic# E0.6 [3] (๐Ÿš‘..๐Ÿš“) ambulance..police car
+1F694 ; Extended_Pictographic# E0.7 [1] (๐Ÿš”) oncoming police car
+1F695 ; Extended_Pictographic# E0.6 [1] (๐Ÿš•) taxi
+1F696 ; Extended_Pictographic# E1.0 [1] (๐Ÿš–) oncoming taxi
+1F697 ; Extended_Pictographic# E0.6 [1] (๐Ÿš—) automobile
+1F698 ; Extended_Pictographic# E0.7 [1] (๐Ÿš˜) oncoming automobile
+1F699..1F69A ; Extended_Pictographic# E0.6 [2] (๐Ÿš™..๐Ÿšš) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (๐Ÿš›..๐Ÿšก) articulated lorry..aerial tramway
+1F6A2 ; Extended_Pictographic# E0.6 [1] (๐Ÿšข) ship
+1F6A3 ; Extended_Pictographic# E1.0 [1] (๐Ÿšฃ) person rowing boat
+1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (๐Ÿšค..๐Ÿšฅ) speedboat..horizontal traffic light
+1F6A6 ; Extended_Pictographic# E1.0 [1] (๐Ÿšฆ) vertical traffic light
+1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (๐Ÿšง..๐Ÿšญ) construction..no smoking
+1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (๐Ÿšฎ..๐Ÿšฑ) litter in bin sign..non-potable water
+1F6B2 ; Extended_Pictographic# E0.6 [1] (๐Ÿšฒ) bicycle
+1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (๐Ÿšณ..๐Ÿšต) no bicycles..person mountain biking
+1F6B6 ; Extended_Pictographic# E0.6 [1] (๐Ÿšถ) person walking
+1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (๐Ÿšท..๐Ÿšธ) no pedestrians..children crossing
+1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (๐Ÿšน..๐Ÿšพ) menโ€™s room..water closet
+1F6BF ; Extended_Pictographic# E1.0 [1] (๐Ÿšฟ) shower
+1F6C0 ; Extended_Pictographic# E0.6 [1] (๐Ÿ›€) person taking bath
+1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (๐Ÿ›..๐Ÿ›…) bathtub..left luggage
+1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (๐Ÿ›†..๐Ÿ›Š) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL
+1F6CB ; Extended_Pictographic# E0.7 [1] (๐Ÿ›‹๏ธ) couch and lamp
+1F6CC ; Extended_Pictographic# E1.0 [1] (๐Ÿ›Œ) person in bed
+1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (๐Ÿ›๏ธ..๐Ÿ›๏ธ) shopping bags..bed
+1F6D0 ; Extended_Pictographic# E1.0 [1] (๐Ÿ›) place of worship
+1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart
+1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (๐Ÿ›“..๐Ÿ›”) STUPA..PAGODA
+1F6D5 ; Extended_Pictographic# E12.0 [1] (๐Ÿ›•) hindu temple
+1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (๐Ÿ›–..๐Ÿ›—) hut..elevator
+1F6D8..1F6DF ; Extended_Pictographic# E0.0 [8] (๐Ÿ›˜..๐Ÿ›Ÿ) <reserved-1F6D8>..<reserved-1F6DF>
+1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (๐Ÿ› ๏ธ..๐Ÿ›ฅ๏ธ) hammer and wrench..motor boat
+1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (๐Ÿ›ฆ..๐Ÿ›จ) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE
+1F6E9 ; Extended_Pictographic# E0.7 [1] (๐Ÿ›ฉ๏ธ) small airplane
+1F6EA ; Extended_Pictographic# E0.0 [1] (๐Ÿ›ช) NORTHEAST-POINTING AIRPLANE
+1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (๐Ÿ›ซ..๐Ÿ›ฌ) airplane departure..airplane arrival
+1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (๐Ÿ›ญ..๐Ÿ›ฏ) <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0 ; Extended_Pictographic# E0.7 [1] (๐Ÿ›ฐ๏ธ) satellite
+1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (๐Ÿ›ฑ..๐Ÿ›ฒ) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE
+1F6F3 ; Extended_Pictographic# E0.7 [1] (๐Ÿ›ณ๏ธ) passenger ship
+1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe
+1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer
+1F6F9 ; Extended_Pictographic# E11.0 [1] (๐Ÿ›น) skateboard
+1F6FA ; Extended_Pictographic# E12.0 [1] (๐Ÿ›บ) auto rickshaw
+1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (๐Ÿ›ป..๐Ÿ›ผ) pickup truck..roller skate
+1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (๐Ÿ›ฝ..๐Ÿ›ฟ) <reserved-1F6FD>..<reserved-1F6FF>
+1F774..1F77F ; Extended_Pictographic# E0.0 [12] (๐Ÿด..๐Ÿฟ) <reserved-1F774>..<reserved-1F77F>
+1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (๐ŸŸ•..๐ŸŸŸ) CIRCLED TRIANGLE..<reserved-1F7DF>
+1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square
+1F7EC..1F7FF ; Extended_Pictographic# E0.0 [20] (๐ŸŸฌ..๐ŸŸฟ) <reserved-1F7EC>..<reserved-1F7FF>
+1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (๐Ÿ Œ..๐Ÿ ) <reserved-1F80C>..<reserved-1F80F>
+1F848..1F84F ; Extended_Pictographic# E0.0 [8] (๐Ÿกˆ..๐Ÿก) <reserved-1F848>..<reserved-1F84F>
+1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (๐Ÿกš..๐ŸกŸ) <reserved-1F85A>..<reserved-1F85F>
+1F888..1F88F ; Extended_Pictographic# E0.0 [8] (๐Ÿขˆ..๐Ÿข) <reserved-1F888>..<reserved-1F88F>
+1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (๐Ÿขฎ..๐Ÿฃฟ) <reserved-1F8AE>..<reserved-1F8FF>
+1F90C ; Extended_Pictographic# E13.0 [1] (๐ŸคŒ) pinched fingers
+1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand
+1F910..1F918 ; Extended_Pictographic# E1.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns
+1F919..1F91E ; Extended_Pictographic# E3.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers
+1F91F ; Extended_Pictographic# E5.0 [1] (๐ŸคŸ) love-you gesture
+1F920..1F927 ; Extended_Pictographic# E3.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face
+1F928..1F92F ; Extended_Pictographic# E5.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head
+1F930 ; Extended_Pictographic# E3.0 [1] (๐Ÿคฐ) pregnant woman
+1F931..1F932 ; Extended_Pictographic# E5.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together
+1F933..1F93A ; Extended_Pictographic# E3.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing
+1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball
+1F93F ; Extended_Pictographic# E12.0 [1] (๐Ÿคฟ) diving mask
+1F940..1F945 ; Extended_Pictographic# E3.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net
+1F947..1F94B ; Extended_Pictographic# E3.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform
+1F94C ; Extended_Pictographic# E5.0 [1] (๐ŸฅŒ) curling stone
+1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc
+1F950..1F95E ; Extended_Pictographic# E3.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes
+1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food
+1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts
+1F971 ; Extended_Pictographic# E12.0 [1] (๐Ÿฅฑ) yawning face
+1F972 ; Extended_Pictographic# E13.0 [1] (๐Ÿฅฒ) smiling face with tear
+1F973..1F976 ; Extended_Pictographic# E11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face
+1F977..1F978 ; Extended_Pictographic# E13.0 [2] (๐Ÿฅท..๐Ÿฅธ) ninja..disguised face
+1F979 ; Extended_Pictographic# E0.0 [1] (๐Ÿฅน) <reserved-1F979>
+1F97A ; Extended_Pictographic# E11.0 [1] (๐Ÿฅบ) pleading face
+1F97B ; Extended_Pictographic# E12.0 [1] (๐Ÿฅป) sari
+1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe
+1F980..1F984 ; Extended_Pictographic# E1.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn
+1F985..1F991 ; Extended_Pictographic# E3.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid
+1F992..1F997 ; Extended_Pictographic# E5.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket
+1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan
+1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (๐Ÿฆฃ..๐Ÿฆค) mammoth..dodo
+1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster
+1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (๐Ÿฆซ..๐Ÿฆญ) beaver..seal
+1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..white cane
+1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain
+1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg
+1F9C0 ; Extended_Pictographic# E1.0 [1] (๐Ÿง€) cheese wedge
+1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt
+1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice
+1F9CB ; Extended_Pictographic# E13.0 [1] (๐Ÿง‹) bubble tea
+1F9CC ; Extended_Pictographic# E0.0 [1] (๐ŸงŒ) <reserved-1F9CC>
+1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person
+1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks
+1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet
+1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (๐Ÿจ€..๐Ÿฉฏ) NEUTRAL CHESS KING..<reserved-1FA6F>
+1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts
+1FA74 ; Extended_Pictographic# E13.0 [1] (๐Ÿฉด) thong sandal
+1FA75..1FA77 ; Extended_Pictographic# E0.0 [3] (๐Ÿฉต..๐Ÿฉท) <reserved-1FA75>..<reserved-1FA77>
+1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope
+1FA7B..1FA7F ; Extended_Pictographic# E0.0 [5] (๐Ÿฉป..๐Ÿฉฟ) <reserved-1FA7B>..<reserved-1FA7F>
+1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute
+1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (๐Ÿชƒ..๐Ÿช†) boomerang..nesting dolls
+1FA87..1FA8F ; Extended_Pictographic# E0.0 [9] (๐Ÿช‡..๐Ÿช) <reserved-1FA87>..<reserved-1FA8F>
+1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo
+1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (๐Ÿช–..๐Ÿชจ) military helmet..rock
+1FAA9..1FAAF ; Extended_Pictographic# E0.0 [7] (๐Ÿชฉ..๐Ÿชฏ) <reserved-1FAA9>..<reserved-1FAAF>
+1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (๐Ÿชฐ..๐Ÿชถ) fly..feather
+1FAB7..1FABF ; Extended_Pictographic# E0.0 [9] (๐Ÿชท..๐Ÿชฟ) <reserved-1FAB7>..<reserved-1FABF>
+1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (๐Ÿซ€..๐Ÿซ‚) anatomical heart..people hugging
+1FAC3..1FACF ; Extended_Pictographic# E0.0 [13] (๐Ÿซƒ..๐Ÿซ) <reserved-1FAC3>..<reserved-1FACF>
+1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (๐Ÿซ..๐Ÿซ–) blueberries..teapot
+1FAD7..1FAFF ; Extended_Pictographic# E0.0 [41] (๐Ÿซ—..๐Ÿซฟ) <reserved-1FAD7>..<reserved-1FAFF>
+1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (๐Ÿฐ€..๐Ÿฟฝ) <reserved-1FC00>..<reserved-1FFFD>
-# Total elements: 3793
+# Total elements: 3537
#EOF